├── .github └── workflows │ └── docker.yml ├── .gitignore ├── .htaccess.example ├── Dockerfile ├── README.md ├── assets ├── map-header.png ├── settings-button.png └── settings.png ├── config ├── .htpasswd └── config.env.php ├── css ├── leaflet-search.css ├── multi.select.css └── pick-a-color-1.2.3.min.css ├── docker-compose.example.yml ├── index.php └── other ├── de.js ├── en.js ├── fr.js ├── leaflet-search.js ├── loader.gif ├── multi.select.js ├── pick-a-color-1.2.3.min.js ├── salesman.js ├── search-icon.png └── tinycolor-0.9.15.min.js /.github/workflows/docker.yml: -------------------------------------------------------------------------------- 1 | name: Docker 2 | on: [push] 3 | 4 | env: 5 | REGISTRY: ghcr.io 6 | IMAGE_NAME: ${{ github.repository }} 7 | 8 | jobs: 9 | Docker: 10 | runs-on: ubuntu-latest 11 | steps: 12 | - uses: actions/checkout@v3 13 | - name: Log in to the Container registry 14 | uses: docker/login-action@v2 15 | with: 16 | registry: ${{ env.REGISTRY }} 17 | username: ${{ github.actor }} 18 | password: ${{ secrets.GITHUB_TOKEN }} 19 | 20 | - name: Extract metadata (tags, labels) for Docker 21 | id: meta 22 | uses: docker/metadata-action@v4 23 | with: 24 | images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} 25 | 26 | - name: Build and push Docker image 27 | uses: docker/build-push-action@v3 28 | with: 29 | context: . 30 | push: true 31 | tags: ${{ steps.meta.outputs.tags }} 32 | labels: ${{ steps.meta.outputs.labels }} 33 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /config/* 2 | /tools_config/* 3 | .DS_Store -------------------------------------------------------------------------------- /.htaccess.example: -------------------------------------------------------------------------------- 1 | Options -Indexes 2 | AuthType Basic 3 | AuthName "Restricted content" 4 | AuthUserFile /var/www/html/config/.htpasswd 5 | Require valid-user -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM php:7.2.2-apache 2 | 3 | # Remove folders from the html-folder (in case of an update) 4 | WORKDIR /var/www/html/ 5 | RUN rm -rf /var/www/html/* 6 | 7 | # Copy all files over to the working directory 8 | COPY ./css/* /var/www/html/css/ 9 | COPY ./other/* /var/www/html/other/ 10 | COPY ./index.php /var/www/html/ 11 | 12 | # Copy config-files over to the working directory 13 | # Uncomment the lines if you have set up a password 14 | COPY ./config/config.env.php /var/www/html/config/config.php 15 | #COPY ./config/.htpasswd /var/www/html/config/.htpasswd 16 | #COPY ./.htaccess.example /var/www/html/.htaccess 17 | 18 | # Run the application 19 | RUN docker-php-ext-install pdo pdo_mysql 20 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # RealDeviceMap-tools 2 | Tools for managing RealDeviceMap data 3 | ![RealDeviceMap-tools](assets/map-header.png?raw=true) 4 | 5 | ## Changes 6 | * Added more details to the import of administrative boundaries 7 | * Distance between points on routes is colored 8 | * Option to show routes for instances, generate new routes for instances or drawn circles and visualize it directly 9 | * Added Dockerfile to generate a local image 10 | * Autogeneration of the correct circle size for raid instances depending on the specific latitude, option in settings to choose between iv-, raid- or own radius 11 | * Color Picker built in for instance- and polygon-import 12 | 13 | ## Installation 14 | 1. `git clone https://github.com/PickleRickVE/RealDeviceMap-tools` 15 | 2. Enter the new folder `cd RealDeviceMap-tools` and go to the config folder `cd config` 16 | 2. Edit `nano config.env.php` and add your credentials for the RDM and/or Nest database. 17 | 3. Edit `nano .htpasswd` to set a username and password. The default user is **admin** with password **admin**, you can generate one [here](https://www.web2generators.com/apache-tools/htpasswd-generator). 18 | 19 | ### Optional: when running Docker 20 | 1. Paste the contents from docker-compose.example.yml in the files where RDM & it's database is located and edit where needed 21 | 2. Check Dockerfile and uncomment the line with .htaccess if you want to use a password 22 | 3. Run `docker-compose up -d --build rdm_tools` 23 | 24 | ## Updates 25 | 1. Use git pull in the folder 26 | 2. When using Docker, re-run `docker-compose up -d --build rdm_tools` 27 | 28 | ## Usage 29 | For more info please use the [wiki](https://github.com/PickleRickVE/RealDeviceMap-tools/wiki). 30 | 31 | ## Thanks 32 | * Credit to [abakedapplepie](https://github.com/abakedapplepie) and his creditors for the base 33 | * Credit to [lovasoa](https://github.com/lovasoa) for the traveling salesman script 34 | * Credit to [leevo](https://github.com/xxleevo) for various ideas 35 | -------------------------------------------------------------------------------- /assets/map-header.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PickleRickVE/RealDeviceMap-tools/d223339344019f2ab414cf331aa8e834dc360f8e/assets/map-header.png -------------------------------------------------------------------------------- /assets/settings-button.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PickleRickVE/RealDeviceMap-tools/d223339344019f2ab414cf331aa8e834dc360f8e/assets/settings-button.png -------------------------------------------------------------------------------- /assets/settings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PickleRickVE/RealDeviceMap-tools/d223339344019f2ab414cf331aa8e834dc360f8e/assets/settings.png -------------------------------------------------------------------------------- /config/.htpasswd: -------------------------------------------------------------------------------- 1 | admin:$apr1$1edgsm5o$xGC./.P3PARUp1x56wEIx/ -------------------------------------------------------------------------------- /config/config.env.php: -------------------------------------------------------------------------------- 1 | 22 | -------------------------------------------------------------------------------- /css/leaflet-search.css: -------------------------------------------------------------------------------- 1 | /* 2 | * Leaflet Control Search v2.9.7 - 2019-01-14 3 | * 4 | * Copyright 2019 Stefano Cudini 5 | * stefano.cudini@gmail.com 6 | * http://labs.easyblog.it/ 7 | * 8 | * Licensed under the MIT license. 9 | * 10 | * Demo: 11 | * http://labs.easyblog.it/maps/leaflet-search/ 12 | * 13 | * Source: 14 | * git@github.com:stefanocudini/leaflet-search.git 15 | * 16 | */ 17 | 18 | .leaflet-container .leaflet-control-search { 19 | position:relative; 20 | float:left; 21 | background:#fff; 22 | color:#1978cf; 23 | border: 2px solid rgba(0,0,0,0.2); 24 | background-clip: padding-box; 25 | -moz-border-radius: 4px; 26 | -webkit-border-radius: 4px; 27 | border-radius: 4px; 28 | background-color: rgba(255, 255, 255, 0.8); 29 | z-index:1000; 30 | margin-left: 10px; 31 | margin-top: 10px; 32 | } 33 | .leaflet-control-search.search-exp {/*expanded*/ 34 | background: #fff; 35 | border: 2px solid rgba(0,0,0,0.2); 36 | background-clip: padding-box; 37 | } 38 | .leaflet-control-search .search-input { 39 | display:block; 40 | float:left; 41 | background: #fff; 42 | border:1px solid #666; 43 | border-radius:2px; 44 | height:22px; 45 | padding:0 20px 0 2px; 46 | margin:4px 0 4px 4px; 47 | } 48 | .leaflet-control-search.search-load .search-input { 49 | background: url('../other/loader.gif') no-repeat center right #fff; 50 | } 51 | .leaflet-control-search.search-load .search-cancel { 52 | visibility:hidden; 53 | } 54 | .leaflet-control-search .search-cancel { 55 | display:block; 56 | width:22px; 57 | height:22px; 58 | position:absolute; 59 | right:28px; 60 | margin:6px 0; 61 | background: url('../other/search-icon.png') no-repeat 0 -46px; 62 | text-decoration:none; 63 | filter: alpha(opacity=80); 64 | opacity: 0.8; 65 | } 66 | .leaflet-control-search .search-cancel:hover { 67 | filter: alpha(opacity=100); 68 | opacity: 1; 69 | } 70 | .leaflet-control-search .search-cancel span { 71 | display:none;/* comment for cancel button imageless */ 72 | font-size:18px; 73 | line-height:20px; 74 | color:#ccc; 75 | font-weight:bold; 76 | } 77 | .leaflet-control-search .search-cancel:hover span { 78 | color:#aaa; 79 | } 80 | .leaflet-control-search .search-button { 81 | display:block; 82 | float:left; 83 | width:30px; 84 | height:30px; 85 | background: url('../other/search-icon.png') no-repeat 4px 4px #fff; 86 | border-radius:4px; 87 | } 88 | .leaflet-control-search .search-button:hover { 89 | background: url('../other/search-icon.png') no-repeat 4px -20px #fafafa; 90 | } 91 | .leaflet-control-search .search-tooltip { 92 | position:absolute; 93 | top:100%; 94 | left:0; 95 | float:left; 96 | list-style: none; 97 | padding-left: 0; 98 | min-width:120px; 99 | max-height:122px; 100 | box-shadow: 1px 1px 6px rgba(0,0,0,0.4); 101 | background-color: rgba(0, 0, 0, 0.25); 102 | z-index:1010; 103 | overflow-y:auto; 104 | overflow-x:hidden; 105 | cursor: pointer; 106 | } 107 | .leaflet-control-search .search-tip { 108 | margin:2px; 109 | padding:2px 4px; 110 | display:block; 111 | color:black; 112 | background: #eee; 113 | border-radius:.25em; 114 | text-decoration:none; 115 | white-space:nowrap; 116 | vertical-align:center; 117 | } 118 | .leaflet-control-search .search-button:hover { 119 | background-color: #f4f4f4; 120 | } 121 | .leaflet-control-search .search-tip-select, 122 | .leaflet-control-search .search-tip:hover { 123 | background-color: #fff; 124 | } 125 | .leaflet-control-search .search-alert { 126 | cursor:pointer; 127 | clear:both; 128 | font-size:.75em; 129 | margin-bottom:5px; 130 | padding:0 .25em; 131 | color:#e00; 132 | font-weight:bold; 133 | border-radius:.25em; 134 | } -------------------------------------------------------------------------------- /css/multi.select.css: -------------------------------------------------------------------------------- 1 | .wrapper{float:left;width:100%;margin:20px 0} 2 | .fill{color:#fff!important} 3 | .button-blue.fill{background-color:#367fa9} 4 | .button-green.fill{background-color:#5F9323} 5 | .button-aqua.fill{background-color:#00acd6}.button-red.fill{background-color:#d73925} 6 | .button-yellow.fill{background-color:#e08e0b}.button-maroon.fill{background-color:#b20e48} 7 | .button-purple.fill{background-color:#555299}.button-grey.fill{background-color:#5d636e} 8 | .multi-button, 9 | .button{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:600;line-height:1.42857143;text-align:left;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-image:none;border:1px solid transparent;border-radius:1px;background-color:#fff}.multi-button::after{background-color:transparent;border-left:none;box-sizing:border-box;color:#fff;content:"\2207";display:inline-block;font-family:"FontAwesome";height:100%;margin-left:-17px;padding:4px 4px 0 3px;pointer-events:none;position:absolute;right:0;text-align:center;top:0;vertical-align:middle;width:23px;z-index:2;transition:transform .25s linear;-webkit-transition:-webkit-transform .25s linear}.multi-button.open::after{font-weight:700;-webkit-transform:rotate(180deg);transform:rotate(180deg);padding:6px 4px 0 3px}.test-values{border-radius:4px;margin-left:10px}.button-xsmall{padding:1px 5px;font-size:12px;line-height:1.5;color:#333}.button-small{padding:5px 10px;font-size:12px;line-height:1.5;color:#333}.button-big{padding:10px 16px;font-size:18px;line-height:1.5;color:#333}.multi-button.button-file{position:relative;overflow:hidden}.button-blue{border-color:#367fa9}.button-blue:hover,.button-blue:active{border-color:#367fa9}.button-green{border-color:#5F9323}.button-green:hover,.button-green:active{border-color:#5F9323}.button-aqua{border-color:#00acd6}.button-aqua:hover,.button-aqua:active{border-color:#00acd6}.button-red{border-color:#d73925}.button-red:hover,.button-red:active{border-color:#d73925}.button-yellow{border-color:#e08e0b}.button-yellow:hover,.button-yellow:active{border-color:#e08e0b}.button-maroon{border-color:#b20e48}.button-maroon:hover,.button-maroon:active{border-color:#b20e48}.button-purple{border-color:#555299}.button-purple:hover,.button-purple:active{border-color:#302c85}.button-grey{border-color:#5d636e}.button-grey:hover,.button-grey:active{border-color:#5d636e}.button-file input[type=file]{position:absolute;top:0;right:0;min-width:100%;min-height:100%;font-size:100px;text-align:right;filter:alpha(opacity=0);opacity:0;outline:none;background:white;cursor:inherit;display:block}.multi-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:0 0 1px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175);width:100%}.open>.multi-menu{display:block}.multi-menu li{position:relative;padding:5px 10px;margin-top:1px}.multi-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.multi-menu li a span.text{display:inline-block;position:relative}.multi-menu li a span.check-mark{display:none}.multi-menu li.selected a span.check-mark{position:absolute;display:inline-block;right:15px;margin-top:0}.multi-menu li .searchbox{padding:4px 8px}.multi-menu li .searchbox .search-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;margin-bottom:0;width:100%;float:none}.multi-menu li.control,.multi-menu li.control:hover{background-color:#fff!important}.multi-menu li.control a.select-all-none{color:#000!important}.multi-menu li.control:hover a.select-all-none{color:#444!important}.multi-button .multi-menu li:hover{background-color:#efefef}.button-blue .multi-menu li.selected,.button-blue .multi-menu li.selected:hover,.button-blue .multi-menu li.controls{background-color:#3c8dbc}.button-blue .multi-menu li.selected a{color:#fff}.button-green .multi-menu li.selected,.button-green .multi-menu li.selected:hover,.button-green .multi-menu li.controls{background-color:#67a028}.button-green .multi-menu li.selected a{color:#fff}.button-aqua .multi-menu li.selected,.button-aqua .multi-menu li.selected:hover,.button-aqua .multi-menu li.controls{background-color:#00c0ef}.button-aqua .multi-menu li.selected a{color:#fff}.button-red .multi-menu li.selected,.button-red .multi-menu li.selected:hover,.button-red .multi-menu li.controls{background-color:#dd4b39}.button-red .multi-menu li.selected a{color:#fff}.button-yellow .multi-menu li.selected,.button-yellow .multi-menu li.selected:hover,.button-yellow .multi-menu li.controls{background-color:#f39c12}.button-yellow .multi-menu li.selected a{color:#fff}.button-maroon .multi-menu li.selected,.button-maroon .multi-menu li.selected:hover,.button-maroon .multi-menu li.controls{background-color:#B7174F}.button-maroon .multi-menu li.selected a{color:#fff}.button-purple .multi-menu li.selected,.button-purple .multi-menu li.selected:hover,.button-purple .multi-menu li.controls{background-color:#555299}.button-purple .multi-menu li.selected a{color:#fff}.button-grey .multi-menu li.selected,.button-grey .multi-menu li.selected:hover,.button-grey .multi-menu li.controls{background-color:#80848c}.button-grey .multi-menu li.selected a{color:#fff}.multi-button .button-text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:94%;display:inline-block;vertical-align:bottom}ol,ul{margin-top:10px;margin-bottom:10px}.list-wrapper{padding-left:0;margin-bottom:20px}.list-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.list-item .file-name{max-width:90%;width:auto;white-space:nowrap;overflow:hidden!important;text-overflow:ellipsis;display:inline-block}.overflow-list{max-height:302px;overflow-y:auto;overflow-x:hidden;width:20%}.float-left{float:left!important}.float-right{float:right!important}.icon-upload{background-attachment:scroll;background-repeat:no-repeat;background-image:url(../images/icons/upload-up-white.svg);background-position:0 0;background-size:100% auto;margin:0;padding:0;display:inline-block;min-height:15px;min-width:16px}.icon-upload-o{background-attachment:scroll;background-repeat:no-repeat;background-image:url(../images/icons/upload-button.svg);background-position:0 0;background-size:100% auto;margin:0;padding:0;display:inline-block;min-height:14px;min-width:16px}.remove-file{font-weight:700}.remove-icon{position:absolute;bottom:-9px;right:-9px;font-weight:700}.data-display{display:block;float:left;list-style:none}.data-display li{border:1px solid #ccc;margin-left:-1px;float:left;padding:5px 10px;margin-top:-1px;min-width:30px;text-align:center} 10 | -------------------------------------------------------------------------------- /css/pick-a-color-1.2.3.min.css: -------------------------------------------------------------------------------- 1 | 2 | .pick-a-color-markup *{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box} 3 | .pick-a-color-markup .hex-pound{padding-left:8px;padding-right:8px}@media screen and (max-width:991px){.pick-a-color-markup .hex-pound{padding:3px 5px 0px 5px;min-height:30px}} 4 | .pick-a-color-markup .pick-a-color{padding:5px}@media screen and (max-width:991px){.pick-a-color-markup .pick-a-color{width:100%;font-size:18px;padding:9px;min-width:222px;height:47px}} 5 | .pick-a-color-markup .input-group-btn .color-dropdown{padding:6px 5px}.pick-a-color-markup .input-group-btn .color-dropdown.no-hex{border-bottom-left-radius:4px;border-top-left-radius:4px} 6 | .pick-a-color-markup .input-group-btn .color-dropdown:focus{background-color:#fff} 7 | @media screen and (max-width:991px){.pick-a-color-markup .input-group-btn .color-dropdown{height:47px}} 8 | .pick-a-color-markup .color-preview{border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 0 2px 2px rgba(0,0,0,0.075);box-shadow:inset 0 0 2px 2px rgba(0,0,0,0.075);height:1.429em;width:1.429em;display:inline-block;cursor:pointer;margin-right:5px}.pick-a-color-markup .color-preview.current-color{margin-bottom:-5px} 9 | @media screen and (max-width:991px){.pick-a-color-markup .color-preview{height:1.875em;width:1.875em}} 10 | .pick-a-color-markup .color-menu{text-align:left;padding:5px 0px;width:330px;font-size:14px;left:auto;}.pick-a-color-markup .color-menu.color-menu--inline{left:-285px}@media screen and (max-width:991px){.pick-a-color-markup .color-menu.color-menu--inline{left:-242px}} 11 | @media screen and (max-width:991px){.pick-a-color-markup .color-menu{left:-242px;width:293px}}.pick-a-color-markup .color-menu.small{width:100px}@media screen and (max-width:991px){.pick-a-color-markup .color-menu.small{left:-105px}} 12 | .pick-a-color-markup .color-menu.no-hex{left:0px} 13 | .pick-a-color-markup .color-menu ul{padding:0px;margin:0px} 14 | .pick-a-color-markup .color-menu li{list-style-type:none;padding:5px 0px;margin:0px} 15 | .pick-a-color-markup .color-menu .color-preview{vertical-align:middle;margin:0px}@media screen and (max-width:991px){.pick-a-color-markup .color-menu .color-preview{height:35px;width:35px}}.pick-a-color-markup .color-menu .color-preview.current-color,.pick-a-color-markup .color-menu .color-preview.white{background-color:#fff} 16 | .pick-a-color-markup .color-menu .color-preview.red{background-color:#f00} 17 | .pick-a-color-markup .color-menu .color-preview.orange{background-color:#f60} 18 | .pick-a-color-markup .color-menu .color-preview.yellow{background-color:#ff0} 19 | .pick-a-color-markup .color-menu .color-preview.green{background-color:#008000} 20 | .pick-a-color-markup .color-menu .color-preview.blue{background-color:#00f} 21 | .pick-a-color-markup .color-menu .color-preview.indigo{background-color:#4a0080} 22 | .pick-a-color-markup .color-menu .color-preview.violet{background-color:#ee81ee} 23 | .pick-a-color-markup .color-menu .color-preview.purple{background-color:#80007f} 24 | .pick-a-color-markup .color-menu .color-preview.black{background-color:#000} 25 | .pick-a-color-markup .color-menu .basicColors-content li>a,.pick-a-color-markup .color-menu .savedColors-content li>a{padding:5px 15px 3px 15px;cursor:default;min-height:25px;color:#333}.pick-a-color-markup .color-menu .basicColors-content li>a:hover,.pick-a-color-markup .color-menu .savedColors-content li>a:hover{background-color:#fff} 26 | @media screen and (max-width:991px){.pick-a-color-markup .color-menu .basicColors-content li>a,.pick-a-color-markup .color-menu .savedColors-content li>a{min-height:40px}} 27 | .pick-a-color-markup .color-menu .basicColors-content li:hover a,.pick-a-color-markup .color-menu .savedColors-content li:hover a{color:#333;background-image:none;filter:none;text-decoration:none;font-weight:bold}@media screen and (max-width:991px){.pick-a-color-markup .color-menu .basicColors-content li:hover a,.pick-a-color-markup .color-menu .savedColors-content li:hover a{background-color:#fff;font-weight:normal}} 28 | .pick-a-color-markup .color-menu .btn.color-select{margin:0px 5px;height:20px;padding:0px 5px;margin-top:0px;line-height:1.5px;border-radius:4px}@media screen and (max-width:991px){.pick-a-color-markup .color-menu .btn.color-select{height:35px}} 29 | .pick-a-color-markup .caret{margin-bottom:3px} 30 | .pick-a-color-markup .color-menu-instructions,.pick-a-color-markup .advanced-instructions{text-align:center;padding:0px 6px;margin:0px;font-size:14px;font-weight:normal}@media screen and (min-width:992px){.pick-a-color-markup .color-menu-instructions,.pick-a-color-markup .advanced-instructions{display:none}} 31 | .pick-a-color-markup .color-label{vertical-align:middle;margin:0px;margin-left:10px;cursor:pointer}@media screen and (max-width:991px){.pick-a-color-markup .color-label{margin-left:8px}} 32 | .pick-a-color-markup .color-box{height:20px;width:200px;position:absolute;left:115px;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 0 2px 2px rgba(0,0,0,0.075);box-shadow:inset 0 0 2px 2px rgba(0,0,0,0.075);cursor:pointer}@media screen and (max-width:991px){.pick-a-color-markup .color-box{width:160px;height:35px}} 33 | .pick-a-color-markup .black .highlight-band-stripe{background-color:#fff} 34 | .pick-a-color-markup .spectrum-white{background-image:-webkit-gradient(linear, 0 top, 100% top, from(#fff), to(#808080));background-image:-webkit-linear-gradient(left, color-stop(#fff 0), color-stop(#808080 100%));background-image:-moz-linear-gradient(left, #fff 0, #808080 100%);background-image:linear-gradient(to right, #fff 0, #808080 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ff808080', GradientType=1)}.pick-a-color-markup .spectrum-white .highlight-band{left:0px} 35 | .pick-a-color-markup .spectrum-red{background-image:-webkit-gradient(linear, left top, right top, color-stop(0, #fff), color-stop(.5, #f00), color-stop(1, #000));background-image:-moz-linear-gradient(left center, #fff 0, #f00 50%, #000 100%);background-image:-webkit-linear-gradient(left, #fff 0, #f00 50%, #000 100%);background-image:-o-linear-gradient(left, #fff 0, #f00 50%, #000 100%);background-image:linear-gradient(to right, #fff 0, #f00 50%, #000 100%);background-repeat:repeat-x} 36 | .pick-a-color-markup .spectrum-orange{background-image:-webkit-gradient(linear, left top, right top, color-stop(0, #fff), color-stop(.5, #f60), color-stop(1, #000));background-image:-moz-linear-gradient(left center, #fff 0, #f60 50%, #000 100%);background-image:-webkit-linear-gradient(left, #fff 0, #f60 50%, #000 100%);background-image:-o-linear-gradient(left, #fff 0, #f60 50%, #000 100%);background-image:linear-gradient(to right, #fff 0, #f60 50%, #000 100%);background-repeat:repeat-x} 37 | .pick-a-color-markup .spectrum-yellow{background-image:-webkit-gradient(linear, left top, right top, color-stop(0, #fff), color-stop(.5, #ff0), color-stop(1, #000));background-image:-moz-linear-gradient(left center, #fff 0, #ff0 50%, #000 100%);background-image:-webkit-linear-gradient(left, #fff 0, #ff0 50%, #000 100%);background-image:-o-linear-gradient(left, #fff 0, #ff0 50%, #000 100%);background-image:linear-gradient(to right, #fff 0, #ff0 50%, #000 100%);background-repeat:repeat-x} 38 | .pick-a-color-markup .spectrum-green{background-image:-webkit-gradient(linear, left top, right top, color-stop(0, #80ff80), color-stop(.5, #008000), color-stop(1, #000));background-image:-moz-linear-gradient(left center, #80ff80 0, #008000 50%, #000 100%);background-image:-webkit-linear-gradient(left, #80ff80 0, #008000 50%, #000 100%);background-image:-o-linear-gradient(left, #80ff80 0, #008000 50%, #000 100%);background-image:linear-gradient(to right, #80ff80 0, #008000 50%, #000 100%);background-repeat:repeat-x} 39 | .pick-a-color-markup .spectrum-blue{background-image:-webkit-gradient(linear, left top, right top, color-stop(0, #fff), color-stop(.5, #00f), color-stop(1, #000));background-image:-moz-linear-gradient(left center, #fff 0, #00f 50%, #000 100%);background-image:-webkit-linear-gradient(left, #fff 0, #00f 50%, #000 100%);background-image:-o-linear-gradient(left, #fff 0, #00f 50%, #000 100%);background-image:linear-gradient(to right, #fff 0, #00f 50%, #000 100%);background-repeat:repeat-x} 40 | .pick-a-color-markup .spectrum-purple{background-image:-webkit-gradient(linear, left top, right top, color-stop(0, #ff80ff), color-stop(.5, #80007f), color-stop(1, #000));background-image:-moz-linear-gradient(left center, #ff80ff 0, #80007f 50%, #000 100%);background-image:-webkit-linear-gradient(left, #ff80ff 0, #80007f 50%, #000 100%);background-image:-o-linear-gradient(left, #ff80ff 0, #80007f 50%, #000 100%);background-image:linear-gradient(to right, #ff80ff 0, #80007f 50%, #000 100%);background-repeat:repeat-x} 41 | .pick-a-color-markup .spectrum-black{background-image:-webkit-gradient(linear, 0 top, 100% top, from(#000), to(#808080));background-image:-webkit-linear-gradient(left, color-stop(#000 0), color-stop(#808080 100%));background-image:-moz-linear-gradient(left, #000 0, #808080 100%);background-image:linear-gradient(to right, #000 0, #808080 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff000000', endColorstr='#ff808080', GradientType=1)}.pick-a-color-markup .spectrum-black .highlight-band{left:0px;border:1px solid #808080} 42 | .pick-a-color-markup .ie-spectrum{height:20px;width:100px;display:inline-block;top:-1}.pick-a-color-markup .ie-spectrum.hue{width:50.5px}@media screen and (max-width:991px){.pick-a-color-markup .ie-spectrum.hue{width:45.5px}} 43 | @media screen and (max-width:991px){.pick-a-color-markup .ie-spectrum{width:80px;height:35px}} 44 | .pick-a-color-markup .red-spectrum-0,.pick-a-color-markup .lightness-spectrum-0{background-image:-webkit-gradient(linear, 0 top, 100% top, from(#fff), to(#f00));background-image:-webkit-linear-gradient(left, color-stop(#fff 0), color-stop(#f00 100%));background-image:-moz-linear-gradient(left, #fff 0, #f00 100%);background-image:linear-gradient(to right, #fff 0, #f00 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffff0000', GradientType=1);border-bottom-left-radius:4px;border-top-left-radius:4px} 45 | .pick-a-color-markup .red-spectrum-1,.pick-a-color-markup .lightness-spectrum-1{background-image:-webkit-gradient(linear, 0 top, 100% top, from(#f00), to(#000));background-image:-webkit-linear-gradient(left, color-stop(#f00 0), color-stop(#000 100%));background-image:-moz-linear-gradient(left, #f00 0, #000 100%);background-image:linear-gradient(to right, #f00 0, #000 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffff0000', endColorstr='#ff000000', GradientType=1);border-bottom-right-radius:4px;border-top-right-radius:4px} 46 | .pick-a-color-markup .lightness-spectrum-0,.pick-a-color-markup .lightness-spectrum-1{width:150px}@media screen and (max-width:991px){.pick-a-color-markup .lightness-spectrum-0,.pick-a-color-markup .lightness-spectrum-1{width:135px}} 47 | .pick-a-color-markup .orange-spectrum-0{background-image:-webkit-gradient(linear, 0 top, 100% top, from(#fff), to(#f60));background-image:-webkit-linear-gradient(left, color-stop(#fff 0), color-stop(#f60 100%));background-image:-moz-linear-gradient(left, #fff 0, #f60 100%);background-image:linear-gradient(to right, #fff 0, #f60 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffff6600', GradientType=1);border-bottom-left-radius:4px;border-top-left-radius:4px} 48 | .pick-a-color-markup .orange-spectrum-1{background-image:-webkit-gradient(linear, 0 top, 100% top, from(#f60), to(#000));background-image:-webkit-linear-gradient(left, color-stop(#f60 0), color-stop(#000 100%));background-image:-moz-linear-gradient(left, #f60 0, #000 100%);background-image:linear-gradient(to right, #f60 0, #000 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffff6600', endColorstr='#ff000000', GradientType=1);border-bottom-right-radius:4px;border-top-right-radius:4px} 49 | .pick-a-color-markup .yellow-spectrum-0{background-image:-webkit-gradient(linear, 0 top, 100% top, from(#fff), to(#ff0));background-image:-webkit-linear-gradient(left, color-stop(#fff 0), color-stop(#ff0 100%));background-image:-moz-linear-gradient(left, #fff 0, #ff0 100%);background-image:linear-gradient(to right, #fff 0, #ff0 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffffff00', GradientType=1);border-bottom-left-radius:4px;border-top-left-radius:4px} 50 | .pick-a-color-markup .yellow-spectrum-1{background-image:-webkit-gradient(linear, 0 top, 100% top, from(#ff0), to(#000));background-image:-webkit-linear-gradient(left, color-stop(#ff0 0), color-stop(#000 100%));background-image:-moz-linear-gradient(left, #ff0 0, #000 100%);background-image:linear-gradient(to right, #ff0 0, #000 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff00', endColorstr='#ff000000', GradientType=1);border-bottom-right-radius:4px;border-top-right-radius:4px} 51 | .pick-a-color-markup .green-spectrum-0{background-image:-webkit-gradient(linear, 0 top, 100% top, from(#80ff80), to(#008000));background-image:-webkit-linear-gradient(left, color-stop(#80ff80 0), color-stop(#008000 100%));background-image:-moz-linear-gradient(left, #80ff80 0, #008000 100%);background-image:linear-gradient(to right, #80ff80 0, #008000 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff80ff80', endColorstr='#ff008000', GradientType=1);border-bottom-left-radius:4px;border-top-left-radius:4px} 52 | .pick-a-color-markup .green-spectrum-1{background-image:-webkit-gradient(linear, 0 top, 100% top, from(#008000), to(#000));background-image:-webkit-linear-gradient(left, color-stop(#008000 0), color-stop(#000 100%));background-image:-moz-linear-gradient(left, #008000 0, #000 100%);background-image:linear-gradient(to right, #008000 0, #000 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff008000', endColorstr='#ff000000', GradientType=1);border-bottom-right-radius:4px;border-top-right-radius:4px} 53 | .pick-a-color-markup .blue-spectrum-0{background-image:-webkit-gradient(linear, 0 top, 100% top, from(#fff), to(#00f));background-image:-webkit-linear-gradient(left, color-stop(#fff 0), color-stop(#00f 100%));background-image:-moz-linear-gradient(left, #fff 0, #00f 100%);background-image:linear-gradient(to right, #fff 0, #00f 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ff0000ff', GradientType=1);border-bottom-left-radius:4px;border-top-left-radius:4px} 54 | .pick-a-color-markup .blue-spectrum-1{background-image:-webkit-gradient(linear, 0 top, 100% top, from(#00f), to(#000));background-image:-webkit-linear-gradient(left, color-stop(#00f 0), color-stop(#000 100%));background-image:-moz-linear-gradient(left, #00f 0, #000 100%);background-image:linear-gradient(to right, #00f 0, #000 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0000ff', endColorstr='#ff000000', GradientType=1);border-bottom-right-radius:4px;border-top-right-radius:4px} 55 | .pick-a-color-markup .purple-spectrum-0{background-image:-webkit-gradient(linear, 0 top, 100% top, from(#ff80ff), to(#80007f));background-image:-webkit-linear-gradient(left, color-stop(#ff80ff 0), color-stop(#80007f 100%));background-image:-moz-linear-gradient(left, #ff80ff 0, #80007f 100%);background-image:linear-gradient(to right, #ff80ff 0, #80007f 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffff80ff', endColorstr='#ff80007f', GradientType=1);border-bottom-left-radius:4px;border-top-left-radius:4px} 56 | .pick-a-color-markup .purple-spectrum-1{background-image:-webkit-gradient(linear, 0 top, 100% top, from(#80007f), to(#000));background-image:-webkit-linear-gradient(left, color-stop(#80007f 0), color-stop(#000 100%));background-image:-moz-linear-gradient(left, #80007f 0, #000 100%);background-image:linear-gradient(to right, #80007f 0, #000 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff80007f', endColorstr='#ff000000', GradientType=1);border-bottom-right-radius:4px;border-top-right-radius:4px} 57 | .pick-a-color-markup .saturation-spectrum-0{background-image:-webkit-gradient(linear, 0 top, 100% top, from(#808080), to(#bf4040));background-image:-webkit-linear-gradient(left, color-stop(#808080 0), color-stop(#bf4040 100%));background-image:-moz-linear-gradient(left, #808080 0, #bf4040 100%);background-image:linear-gradient(to right, #808080 0, #bf4040 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff808080', endColorstr='#ffbf4040', GradientType=1);border-bottom-left-radius:4px;border-top-left-radius:4px;width:150px}@media screen and (max-width:991px){.pick-a-color-markup .saturation-spectrum-0{width:135px}} 58 | .pick-a-color-markup .saturation-spectrum-1{background-image:-webkit-gradient(linear, 0 top, 100% top, from(#bf4040), to(#f00));background-image:-webkit-linear-gradient(left, color-stop(#bf4040 0), color-stop(#f00 100%));background-image:-moz-linear-gradient(left, #bf4040 0, #f00 100%);background-image:linear-gradient(to right, #bf4040 0, #f00 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffbf4040', endColorstr='#ffff0000', GradientType=1);border-bottom-right-radius:4px;border-top-right-radius:4px;width:150px}@media screen and (max-width:991px){.pick-a-color-markup .saturation-spectrum-1{width:135px}} 59 | .pick-a-color-markup .hue-spectrum-0{background-image:-webkit-gradient(linear, 0 top, 100% top, from(#f00), to(#ff0));background-image:-webkit-linear-gradient(left, color-stop(#f00 0), color-stop(#ff0 100%));background-image:-moz-linear-gradient(left, #f00 0, #ff0 100%);background-image:linear-gradient(to right, #f00 0, #ff0 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffff0000', endColorstr='#ffffff00', GradientType=1)} 60 | .pick-a-color-markup .hue-spectrum-1{background-image:-webkit-gradient(linear, 0 top, 100% top, from(#ff0), to(#0f0));background-image:-webkit-linear-gradient(left, color-stop(#ff0 0), color-stop(#0f0 100%));background-image:-moz-linear-gradient(left, #ff0 0, #0f0 100%);background-image:linear-gradient(to right, #ff0 0, #0f0 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff00', endColorstr='#ff00ff00', GradientType=1)} 61 | .pick-a-color-markup .hue-spectrum-2{background-image:-webkit-gradient(linear, 0 top, 100% top, from(#0f0), to(#0ff));background-image:-webkit-linear-gradient(left, color-stop(#0f0 0), color-stop(#0ff 100%));background-image:-moz-linear-gradient(left, #0f0 0, #0ff 100%);background-image:linear-gradient(to right, #0f0 0, #0ff 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff00ff00', endColorstr='#ff00ffff', GradientType=1);left:-1px;position:relative} 62 | .pick-a-color-markup .hue-spectrum-3{background-image:-webkit-gradient(linear, 0 top, 100% top, from(#0ff), to(#00f));background-image:-webkit-linear-gradient(left, color-stop(#0ff 0), color-stop(#00f 100%));background-image:-moz-linear-gradient(left, #0ff 0, #00f 100%);background-image:linear-gradient(to right, #0ff 0, #00f 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff00ffff', endColorstr='#ff0000ff', GradientType=1);left:-1px;position:relative} 63 | .pick-a-color-markup .hue-spectrum-4{background-image:-webkit-gradient(linear, 0 top, 100% top, from(#00f), to(#f0f));background-image:-webkit-linear-gradient(left, color-stop(#00f 0), color-stop(#f0f 100%));background-image:-moz-linear-gradient(left, #00f 0, #f0f 100%);background-image:linear-gradient(to right, #00f 0, #f0f 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0000ff', endColorstr='#ffff00ff', GradientType=1);left:-1px;position:relative} 64 | .pick-a-color-markup .hue-spectrum-5{background-image:-webkit-gradient(linear, 0 top, 100% top, from(#f0f), to(#f00));background-image:-webkit-linear-gradient(left, color-stop(#f0f 0), color-stop(#f00 100%));background-image:-moz-linear-gradient(left, #f0f 0, #f00 100%);background-image:linear-gradient(to right, #f0f 0, #f00 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffff00ff', endColorstr='#ffff0000', GradientType=1);left:-2px;position:relative} 65 | .pick-a-color-markup .highlight-band{border:1px solid #222;border-radius:2px;-webkit-box-shadow:1px 1px 1px #333;box-shadow:1px 1px 1px #333;height:19px;width:11px;display:inline-block;cursor:pointer;cursor:-webkit-grab;cursor:-moz-grab;position:absolute;top:-1px;left:94.5px;text-align:center}@media screen and (max-width:991px){.pick-a-color-markup .highlight-band{width:21px;left:69.5px;height:34px}} 66 | .pick-a-color-markup .highlight-band-stripe{min-height:80%;min-width:1px;background-color:#000;opacity:0.40;margin:2px 1px;display:inline-block;-webkit-box-shadow:1px 0 2px 0 #fff;box-shadow:1px 0 2px 0 #fff}@media screen and (max-width:991px){.pick-a-color-markup .highlight-band-stripe{margin:4px 2px}} 67 | .pick-a-color-markup .color-menu-tabs{padding:5px 3px 3px 10px;font-size:12px;color:#333;border-bottom:1px solid #ccc;margin-bottom:5px}.pick-a-color-markup .color-menu-tabs .tab{padding:4px 5px;margin:5px;border-left:1px solid #fff;border-right:1px solid #fff;cursor:pointer;background-color:#fff}.pick-a-color-markup .color-menu-tabs .tab:hover{padding-bottom:6px;border-top:1px solid #ccc;border-right:1px solid #ccc;border-left:1px solid #ccc;border-top-right-radius:4px;border-top-left-radius:4px} 68 | .pick-a-color-markup .color-menu-tabs a{color:#333;text-decoration:none} 69 | .pick-a-color-markup .color-menu-tabs .tab-active{border-bottom:3px solid #fff;padding-bottom:5px;border-top:1px solid #ccc;border-right:1px solid #ccc;border-left:1px solid #ccc;border-top-right-radius:4px;border-top-left-radius:4px} 70 | .pick-a-color-markup .active-content{display:block} 71 | .pick-a-color-markup .inactive-content{display:none} 72 | .pick-a-color-markup .savedColors-content{padding:5px 15px;white-space:normal}.pick-a-color-markup .savedColors-content li.color-item>a{margin-left:7px;padding-left:8px;border-radius:4px} 73 | .pick-a-color-markup .saved-color-col{position:relative;left:-15px;float:left;width:149px}@media screen and (max-width:991px){.pick-a-color-markup .saved-color-col{width:130px}} 74 | .pick-a-color-markup .advanced-content ul{margin-top:10px} 75 | .pick-a-color-markup .advanced-content li{padding:5px 15px 3px 15px;cursor:default;min-height:25px;height:50px;position:relative}@media screen and (max-width:991px){.pick-a-color-markup .advanced-content li{min-height:70px}} 76 | .pick-a-color-markup .advanced-content .color-preview{height:50px;width:300px;float:left;margin:0px 0px 10px 0px;background-color:#f00;text-align:center}.pick-a-color-markup .advanced-content .color-preview .color-select.btn.advanced{margin-top:15px;display:none}@media screen and (max-width:991px){.pick-a-color-markup .advanced-content .color-preview .color-select.btn.advanced{display:inline;margin-top:7px}} 77 | .pick-a-color-markup .advanced-content .color-preview:hover .color-select.btn.advanced{display:inline} 78 | @media screen and (max-width:991px){.pick-a-color-markup .advanced-content .color-preview{width:270px;margin-left:-10px}} 79 | .pick-a-color-markup .advanced-content .spectrum-hue{background-image:-webkit-gradient(linear, left top, right top, color-stop(0, #f00), color-stop(17%, #ff0), color-stop(34%, #0f0), color-stop(51%, #0ff), color-stop(68%, #00f), color-stop(85%, #f0f), color-stop(100%, #f00));background-image:-moz-linear-gradient(left center, #f00 0, #ff0 17%, #0f0 24%, #0ff 51%, #00f 68%, #f0f 85%, #f00 100%);background-image:-webkit-linear-gradient(left, #f00 0, #ff0 17%, #0f0 24%, #0ff 51%, #00f 68%, #f0f 85%, #f00 100%);background-image:-o-linear-gradient(left, #f00 0, #ff0 17%, #0f0 24%, #0ff 51%, #00f 68%, #f0f 85%, #f00 100%);background-image:linear-gradient(to right, #f00 0, #ff0 17%, #0f0 24%, #0ff 51%, #00f 68%, #f0f 85%, #f00 100%);background-repeat:repeat-x}.pick-a-color-markup .advanced-content .spectrum-hue .highlight-band{left:0px} 80 | .pick-a-color-markup .advanced-content .spectrum-lightness{background-image:-webkit-gradient(linear, left top, right top, color-stop(0, #fff), color-stop(.5, #f00), color-stop(1, #000));background-image:-moz-linear-gradient(left center, #fff 0, #f00 50%, #000 100%);background-image:-webkit-linear-gradient(left, #fff 0, #f00 50%, #000 100%);background-image:-o-linear-gradient(left, #fff 0, #f00 50%, #000 100%);background-image:linear-gradient(to right, #fff 0, #f00 50%, #000 100%);background-repeat:repeat-x} 81 | .pick-a-color-markup .advanced-content .spectrum-saturation{background-image:-webkit-gradient(linear, left top, right top, color-stop(0, #808080), color-stop(.5, #f00), color-stop(1, #f00));background-image:-moz-linear-gradient(left center, #808080 0, #f00 50%, #f00 100%);background-image:-webkit-linear-gradient(left, #808080 0, #f00 50%, #f00 100%);background-image:-o-linear-gradient(left, #808080 0, #f00 50%, #f00 100%);background-image:linear-gradient(to right, #808080 0, #f00 50%, #f00 100%);background-repeat:repeat-x}.pick-a-color-markup .advanced-content .spectrum-saturation .highlight-band{left:287px}@media screen and (max-width:991px){.pick-a-color-markup .advanced-content .spectrum-saturation .highlight-band{left:247px}} 82 | .pick-a-color-markup .advanced-content .spectrum-lightness .highlight-band{left:143.5px}@media screen and (max-width:991px){.pick-a-color-markup .advanced-content .spectrum-lightness .highlight-band{left:123.5px}} 83 | .pick-a-color-markup .advanced-content .lightness-text,.pick-a-color-markup .advanced-content .hue-text,.pick-a-color-markup .advanced-content .saturation-text,.pick-a-color-markup .advanced-content .preview-text{vertical-align:middle;text-align:center;display:block} 84 | .pick-a-color-markup .advanced-content .color-box{left:15px;top:25px;width:300px}@media screen and (max-width:991px){.pick-a-color-markup .advanced-content .color-box{width:270px;left:10px}} 85 | .pick-a-color-markup .advanced-content .preview-item{height:80px} 86 | @-moz-document url-prefix(){@media screen and (max-width:991px){div.pick-a-color-markup .color-menu{left:0px}}} 87 | -------------------------------------------------------------------------------- /docker-compose.example.yml: -------------------------------------------------------------------------------- 1 | version: '3.1' 2 | services: 3 | rdm_tools: 4 | image: ghcr.io/picklerickve/realdevicemap-tools:master 5 | # You can remove this option if you are not using Traefik as reverse proxy 6 | labels: 7 | - traefik.enable=true 8 | # Change yourdomain to your own domain 9 | - traefik.http.routers.rdmtools.rule=Host(`rdm-tools.yourdomain.com`) 10 | # Change your-network to your specified network below 11 | - traefik.http.routers.rdmtools.entrypoints=your-network 12 | container_name: rdm_tools 13 | depends_on: 14 | - rdm_db 15 | volumes: 16 | # Uncomment this if you want to use a password on your RDM Tools frontend 17 | # - ./RealDeviceMap-tools/.htpasswd:/var/www/html/config/.htpasswd 18 | # - ./RealDeviceMap-tools/.htaccess.example:/var/www/html/.htaccess 19 | - /etc/localtime:/etc/localtime:ro 20 | environment: 21 | DB_HOST: rdm-db 22 | DB_NAME: rdmdb 23 | DB_PORT: 3306 24 | DB_USER: root 25 | DB_PSWD: password 26 | # MDB_ACTIVE: false 27 | # MDB_HOST: 127.0.0.1 28 | # MDB_NAME: manualdb 29 | # MDB_PORT: 3306 30 | # MDB_USER: mdbuser 31 | # MDB_PSWD: password 32 | # OWN_TS: https://IP:PORT/tile/STYLE/{z}/{x}/{y}/1/png 33 | ports: 34 | #Change according to your own port-mapping 35 | - 9006:80 36 | networks: 37 | # Change to your own network 38 | - your-network 39 | -------------------------------------------------------------------------------- /other/de.js: -------------------------------------------------------------------------------- 1 | //de 2 | let deSubs = { 3 | "nest": "Nest", 4 | "polygon": "Polygon", 5 | "getSpawnReport": "Spawn-Bericht", 6 | "removeMap": "Entfernen", 7 | "exportPolygon": "Polygon exportieren", 8 | "exportVP": "sichtbare Punkte exportieren", 9 | "countVP": "sichtbare Punkte zählen", 10 | "copyClipboard": "Kopieren", 11 | "poiViewer": "Wayfarer Modus", 12 | "routeGenerator": "Planungsmodus", 13 | "hideGyms": "Arenen aus", 14 | "showGyms": "Arenen an", 15 | "hidePokestops": "Pokestops aus", 16 | "showPokestops": "Pokestops an", 17 | "hidePokestopRange": "Pokestop Umkreis aus", 18 | "showPokestopRange": "Pokestop Umkreis an", 19 | "hideSpawnpoints": "Spawnpoints aus", 20 | "showSpawnpoints": "Spawnpoints an", 21 | "showAllPOIS": "Alle Punkte", 22 | "showUnknownPOIS": "Nur unbekannte Punkte", 23 | "hideViewingCells": "S2 Zellen aus", 24 | "showViewingCells": "S2 Zellen an", 25 | "enableManualCircle": "Kreise zeichnen an", 26 | "disableManualCircle": "Kreise zeichnen aus", 27 | "importOSM": "Nester von OSM importieren", 28 | "importPolygon": "Polygon importieren", 29 | "importInstance": "Instanz importieren", 30 | "importAdBounds": "Verwaltungsgrenzen importieren", 31 | "importSubmissions": "POIs importieren", 32 | "poiData": "Daten der POI im Format: lat, lng, Titel", 33 | "csvOpener": "oder Datei im CSV-Format auswählen:", 34 | "submissionRangeCheck": "20m-Radius für Wayfarer Vorschläge anzeigen", 35 | "clearRoute": "Route löschen", 36 | "clearShapes": "Alle Formen löschen", 37 | "clearSubs": "POIs löschen", 38 | "generateRoute": "Kreise generieren (Bootstrap)", 39 | "generateOptimizedRoute": "Optimierte Kreise generieren", 40 | "getOutput": "Ausgabe generieren", 41 | "openSettings": "Einstellungen öffnen", 42 | "delete": "Löschen", 43 | "noData": "Keine Daten verfügbar.", 44 | "exEligible": " (ex-fähig)", 45 | "despawnTime": " Despawn-Zeit: ", 46 | "unknownDespawnTime": " unbekannte Despawn-Zeit ", 47 | "count": "Anzahl: ", 48 | "countTotal": "Gesamtzahl: ", 49 | "countGyms": "Anzahl Arenen: ", 50 | "countStops": "Anzahl Pokestops: ", 51 | "countSpawnpoints": "Anzahl Spawnpoints: ", 52 | "spawnReport": "Spawn-Bericht - ", 53 | "unnamed": "unbenannt", 54 | "at": "bei", 55 | "skipped": " übersprungen, keine Daten", 56 | "nestReport": "Nest-Bericht für alle sichtbaren Nester", 57 | "settings": "Einstellungen", 58 | "routeOptAtt": "Routen-Optimierungsversuche:", 59 | "tries": "Versuche", 60 | "s2cells0": "Rot, Level:", 61 | "s2cells1": "Blau, Level 14", 62 | "s2cells2": "Grün, Level 17", 63 | "s2CountPOI": "POIs zählen", 64 | "circleRadius": "Kreis Radius:", 65 | "other": "anderer:", 66 | "lastNestMigration": "Letzter Nestwechsel:", 67 | "spawnReportLimit": "Spawn-Bericht Grenze:", 68 | "spawnReportLimitExp": "Pokemon (0 für unbegrenzt)", 69 | "selectLanguage": "Wähle die Sprache aus:", 70 | "chooseTileset": "Wähle den Kartenstil:", 71 | "ownTileset": "Eigenes Tileset", 72 | "close": "Schließen", 73 | "output": "Ausgabe", 74 | "generatedRoute": "Generierte Route:", 75 | "getAllNests": "Alle Nest-Berichte", 76 | "countPoints": "Punkte in Kreisen zählen", 77 | "optimize": "Optimiere!", 78 | "optimizeGyms": "Optimiere für Arenen", 79 | "optimizePokestops": "Optimiere für Pokestops", 80 | "optimizeSpawnpoints": "Optimiere für Spawnpoints", 81 | "optimizeUnknownSpawnpoints": "Optimiere für Spawnpoints ohne TTH", 82 | "on": "An", 83 | "off": "Aus", 84 | "optimizePiP": "Optimiere Punkte in Polygonen", 85 | "optimizePiNP": "Optimiere Punkte in Nestpolygonen", 86 | "optimizePiC": "Optimiere Punkte in Kreisen", 87 | "getOptimization": "Generiere Optimierung", 88 | "copied": "Kopiert!", 89 | "selectInstance": "Instanz auswählen:", 90 | "instanceColor": "Instanz-Farbe:", 91 | "polygonColor": "Polygon-Farbe:", 92 | "polygonDataType": "Polygon Datentyp:", 93 | "coordinateList": "Koordinatenliste (latitude,longitude in neue Zeile)", 94 | "geoJson": "GeoJSON", 95 | "poracle": "PoracleJS-Format", 96 | "polygonData": "Polygon-Daten:", 97 | "import": "Importieren", 98 | "importNest": "Als Nest importieren", 99 | "exportPolygonPoints": "Polygon-Punkte exportieren", 100 | "gyms": "Arenen:", 101 | "pokestops": "Pokestops:", 102 | "spawnpoints": "Spawnpoints:", 103 | "pokemon": "Pokémon", 104 | "getOwnLocation": "Zu meiner Position!", 105 | "coordTypeUnsorted": "unsortiert", 106 | "coordTypeSorted": "autosortiert", 107 | "countCircles": "Anzahl der Kreise:", 108 | "adBoundsHeader": "Auswahl der Verwaltungsebene", 109 | "adBounds1": "Kreise", 110 | "adBounds2": "Städte/Gemeinden", 111 | "adBounds3": "Ortsteile", 112 | "getAdBounds": "Erzeuge Polygone", 113 | "hideOldSpawnpoints": "Alte Spawnpoints einblenden", 114 | "showOldSpawnpoints": "Alte Spawnpoints ausblenden", 115 | "oldSpawnpointsTitle": "Keine Spawnpoints älter als:", 116 | "instanceMode": "Kreise als passiv importieren: ", 117 | "enableNewPOI": "Neuen POI setzen an", 118 | "disableNewPOI": "Neuen POI setzen aus", 119 | "exportPOIs": "Exportieren", 120 | "exportPOILabel": "Dein POI hat die folgenden Koordinaten:", 121 | "outputAvgPt": "durchschnittliche Punkte/Kreis: ", 122 | "exportListCount": "Polygone zum Exportieren: ", 123 | "chooseName": "Bitte wähle einen Namen!", 124 | "addToExport": "Zum Export hinzufügen", 125 | "removeFromExport": "Aus dem Export entfernen", 126 | "name": "Name:", 127 | "saveFile": "Als Datei speichern", 128 | "ownRadius": "eigener Radius", 129 | "drawnCircles": "eigene Kreise", 130 | "selectInstances": "Instanzen auswählen", 131 | "importCirclesIns": "importierte Kreise", 132 | "importCirclesHl": "Eigene Koordinaten: (latitude,longitude in neue Zeile)", 133 | "importCirclesBtn": "Kreise importieren", 134 | "showRoute": "Route anzeigen", 135 | "hideRoute": "Route ausblenden", 136 | "newRoute": "Neue Route", 137 | "hideQuests": "Stops ohne Quest ausblenden", 138 | "showQuests": "Stops ohne Quest einblenden", 139 | "questCheck": "Zu prüfende Instanzen:", 140 | "questCheckButton": "Anzeigen!", 141 | "showBorders": "Grenzen der Instanzen anzeigen", 142 | "generateWithS2Cells": "Bootstrap mit S2 Zellen", 143 | "lastUpdate": "Letzte Aktualisierung (UTC): ", 144 | "stop_deleted": "als gelöscht markiert", 145 | "coords": "Koordinaten", 146 | "drawPolygon": "Polygon zeichnen", 147 | "drawCircle": "Freien Kreis zeichnen", 148 | "searchErr": "Ort nicht gefunden", 149 | "searchCancel": "Abbrechen", 150 | "searchPlaceholder": "Suchen...", 151 | "editEdit": "Layer bearbeiten", 152 | "editEditDisabled": "Keine Layer vorhanden", 153 | "v2": "v2.0 (1100m)", 154 | "circleID": "Kreis ID:", 155 | "manualdbHint": "nur mit manualdb nutzbar:", 156 | "importFromDB": "Nester aus DB importieren", 157 | "writeAllToDB": "Nester in DB aktualisieren", 158 | "nestOptions": "Nestoptionen", 159 | "writeSuccess": "Nest(er) erfolgreich eingetragen/aktualisiert!", 160 | "writeToDB": "In DB eintragen", 161 | "instanceLength": "Instanzlänge:", 162 | "area": "Fläche", 163 | "osmOptions": "OSM Optionen", 164 | "osmPark": "Park", 165 | "osmMeadow": "Wiese", 166 | "osmRecGround": "Erholungsgebiet", 167 | "osmGrass": "Grasland", 168 | "osmPitch": "Spielfeld", 169 | "osmGolf": "Golfkurs", 170 | "osmPlayground": "Spielplatz", 171 | "osmScrub": "Brachland", 172 | "osmImport": "Nester von OSM importieren", 173 | "mergePolygons": "Sichtbare Polygone zusammenfassen", 174 | "enableCellScan": "cell scan tool aktivieren", 175 | "disableCellScan": "cell scan tool deaktivieren", 176 | "coordsS2": "Koordinaten der S2 Zellenmitte:", 177 | "circleS2Cells": "Zeichne S2 Zellen" 178 | }; 179 | let dePokemon = ["Bisasam","Bisaknosp","Bisaflor","Glumanda","Glutexo","Glurak","Schiggy","Schillok","Turtok","Raupy","Safcon","Smettbo","Hornliu","Kokuna","Bibor","Taubsi","Tauboga","Tauboss","Rattfratz","Rattikarl","Habitak","Ibitak","Rettan","Arbok","Pikachu","Raichu","Sandan","Sandamer","Nidoran♀","Nidorina","Nidoqueen","Nidoran♂","Nidorino","Nidoking","Piepi","Pixi","Vulpix","Vulnona","Pummeluff","Knuddeluff","Zubat","Golbat","Myrapla","Duflor","Giflor","Paras","Parasek","Bluzuk","Omot","Digda","Digdri","Mauzi","Snobilikat","Enton","Entoron","Menki","Rasaff","Fukano","Arkani","Quapsel","Quaputzi","Quappo","Abra","Kadabra","Simsala","Machollo","Maschock","Machomei","Knofensa","Ultrigaria","Sarzenia","Tentacha","Tentoxa","Kleinstein","Georok","Geowaz","Ponita","Gallopa","Flegmon","Lahmus","Magnetilo","Magneton","Porenta","Dodu","Dodri","Jurob","Jugong","Sleima","Sleimok","Muschas","Austos","Nebulak","Alpollo","Gengar","Onix","Traumato","Hypno","Krabby","Kingler","Voltobal","Lektrobal","Owei","Kokowei","Tragosso","Knogga","Kicklee","Nockchan","Schlurp","Smogon","Smogmog","Rihorn","Rizeros","Chaneira","Tangela","Kangama","Seeper","Seemon","Goldini","Golking","Sterndu","Starmie","Pantimos","Sichlor","Rossana","Elektek","Magmar","Pinsir","Tauros","Karpador","Garados","Lapras","Ditto","Evoli","Aquana","Blitza","Flamara","Porygon","Amonitas","Amoroso","Kabuto","Kabutops","Aerodactyl","Relaxo","Arktos","Zapdos","Lavados","Dratini","Dragonir","Dragoran","Mewtu","Mew","Endivie","Lorblatt","Meganie","Feurigel","Igelavar","Tornupto","Karnimani","Tyracroc","Impergator","Wiesor","Wiesenior","Hoothoot","Noctuh","Ledyba","Ledian","Webarak","Ariados","Iksbat","Lampi","Lanturn","Pichu","Pii","Fluffeluff","Togepi","Togetic","Natu","Xatu","Voltilamm","Waaty","Ampharos","Blubella","Marill","Azumarill","Mogelbaum","Quaxo","Hoppspross","Hubelupf","Papungha","Griffel","Sonnkern","Sonnflora","Yanma","Felino","Morlord","Psiana","Nachtara","Kramurx","Laschoking","Traunfugil","Icognito","Woingenau","Girafarig","Tannza","Forstellka","Dummisel","Skorgla","Stahlos","Snubbull","Granbull","Baldorfish","Scherox","Pottrott","Skaraborn","Sniebel","Teddiursa","Ursaring","Schneckmag","Magcargo","Quiekel","Keifel","Corasonn","Remoraid","Octillery","Botogel","Mantax","Panzaeron","Hunduster","Hundemon","Seedraking","Phanpy","Donphan","Porygon2","Damhirplex","Farbeagle","Rabauz","Kapoera","Kussilla","Elekid","Magby","Miltank","Heiteira","Raikou","Entei","Suicune","Larvitar","Pupitar","Despotar","Lugia","Ho-Oh","Celebi","Geckarbor","Reptain","Gewaldro","Flemmli","Jungglut","Lohgock","Hydropi","Moorabbel","Sumpex","Fiffyen","Magnayen","Zigzachs","Geradaks","Waumpel","Schaloko","Papinella","Panekon","Pudox","Loturzel","Lombrero","Kappalores","Samurzel","Blanas","Tengulist","Schwalbini","Schwalboss","Wingull","Pelipper","Trasla","Kirlia","Guardevoir","Gehweiher","Maskeregen","Knilz","Kapilz","Bummelz","Muntier","Letarking","Nincada","Ninjask","Ninjatom","Flurmel","Krakeelo","Krawumms","Makuhita","Hariyama","Azurill","Nasgnet","Eneco","Enekoro","Zobiris","Flunkifer","Stollunior","Stollrak","Stolloss","Meditie","Meditalis","Frizelbliz","Voltenso","Plusle","Minun","Volbeat","Illumise","Roselia","Schluppuck","Schlukwech","Kanivanha","Tohaido","Wailmer","Wailord","Camaub","Camerupt","Qurtel","Spoink","Groink","Pandir","Knacklion","Vibrava","Libelldra","Tuska","Noktuska","Wablu","Altaria","Sengo","Vipitis","Lunastein","Sonnfel","Schmerbe","Welsar","Krebscorps","Krebutack","Puppance","Lepumentas","Liliep","Wielie","Anorith","Armaldo","Barschwa","Milotic","Formeo","Kecleon","Shuppet","Banette","Zwirrlicht","Zwirrklop","Tropius","Palimpalim","Absol","Isso","Schneppke","Firnontor","Seemops","Seejong","Walraisa","Perlu","Aalabyss","Saganabyss","Relicanth","Liebiskus","Kindwurm","Draschel","Brutalanda","Tanhel","Metang","Metagross","Regirock","Regice","Registeel","Latias","Latios","Kyogre","Groudon","Rayquaza","Jirachi","Deoxys","Chelast","Chelcarain","Chelterrar","Panflam","Panpyro","Panferno","Plinfa","Pliprin","Impoleon","Staralili","Staravia","Staraptor","Bidiza","Bidifas","Zirpurze","Zirpeise","Sheinux","Luxio","Luxtra","Knospi","Roserade","Koknodon","Rameidon","Schilterus","Bollterus","Burmy","Burmadame","Moterpel","Wadribie","Honweisel","Pachirisu","Bamelin","Bojelin","Kikugi","Kinoso","Schalellos","Gastrodon","Ambidiffel","Driftlon","Drifzepeli","Haspiror","Schlapor","Traunmagil","Kramshef","Charmian","Shnurgarst","Klingplim","Skunkapuh","Skuntank","Bronzel","Bronzong","Mobai","Pantimimi","Wonneira","Plaudagei","Kryppuk","Kaumalat","Knarksel","Knakrack","Mampfaxo","Riolu","Lucario","Hippopotas","Hippoterus","Pionskora","Piondragi","Glibunkel","Toxiquak","Venuflibis","Finneon","Lumineon","Mantirps","Shnebedeck","Rexblisar","Snibunna","Magnezone","Schlurplek","Rihornior","Tangoloss","Elevoltek","Magbrant","Togekiss","Yanmega","Folipurba","Glaziola","Skorgro","Mamutel","Porygon-Z","Galagladi","Voluminas","Zwirrfinst","Frosdedje","Rotom","Selfe","Vesprit","Tobutz","Dialga","Palkia","Heatran","Regigigas","Giratina","Cresselia","Phione","Manaphy","Darkrai","Shaymin","Arceus","Victini","Serpifeu","Efoserp","Serpiroyal","Floink","Ferkokel","Flambirex","Ottaro","Zwottronin","Admurai","Nagelotz","Kukmarda","Yorkleff","Terribark","Bissbark","Felilou","Kleoparda","Vegimak","Vegichita","Grillmak","Grillchita","Sodamak","Sodachita","Somniam","Somnivora","Dusselgurr","Navitaub","Fasasnob","Elezeba","Zebritz","Kiesling","Sedimantur","Brockoloss","Fleknoil","Fletiamo","Rotomurf","Stalobor","Ohrdoch","Praktibalk","Strepoli","Meistagrif","Schallquap","Mebrana","Branawarz","Jiutesto","Karadonis","Strawickl","Folikon","Matrifol","Toxiped","Rollum","Cerapendra","Waumboll","Elfun","Lilminip","Dressella","Barschuft","Ganovil","Rokkaiman","Rabigator","Flampion","Flampivian","Maracamba","Lithomith","Castellith","Zurrokex","Irokex","Symvolara","Makabaja","Echnatoll","Galapaflos","Karippas","Flapteryx","Aeropteryx","Unratütox","Deponitox","Zorua","Zoroark","Picochilla","Chillabell","Mollimorba","Hypnomorba","Morbitesse","Monozyto","Mitodos","Zytomega","Piccolente","Swaroness","Gelatini","Gelatroppo","Gelatwino","Sesokitz","Kronjuwild","Emolga","Laukaps","Cavalanzas","Tarnpignon","Hutsassa","Quabbel","Apoquallyp","Mamolida","Wattzapf","Voltula","Kastadur","Tentantel","Klikk","Kliklak","Klikdiklak","Zapplardin","Zapplalek","Zapplarang","Pygraulon","Megalon","Lichtel","Laternecto","Skelabra","Milza","Sharfax","Maxax","Petznief","Siberio","Frigometri","Schnuthelm","Hydragil","Flunschlik","Lin-Fu","Wie-Shu","Shardrago","Golbit","Golgantes","Gladiantri","Caesurio","Bisofank","Geronimatz","Washakwil","Skallyk","Grypheldis","Furnifraß","Fermicula","Kapuno","Duodino","Trikephalo","Ignivor","Ramoth","Kobalium","Terrakium","Viridium","Boreos","Voltolos","Reshiram","Zekrom","Demeteros","Kyurem","Keldeo","Meloetta","Genesect","Igamaro","Igastarnish","Brigaron","Fynx","Rutena","Fennexis","Froxy","Amphizel","Quajutsu","Scoppel","Grebbit","Dartiri","Dartignis","Fiaro","Purmel","Puponcho","Vivillon","Leufeo","Pyroleo","Flabébé","Floette","Florges","Mähikel","Chevrumm","Pam-Pam","Pandagro","Coiffwaff","Psiau","Psiaugon","Gramokles","Duokles","Durengard","Parfi","Parfinesse","Flauschling","Sabbaione","Iscalar","Calamanero","Bithora","Thanathora","Algitt","Tandrak","Scampisto","Wummer","Eguana","Elezard","Balgoras","Monargoras","Amarino","Amagarga","Feelinara","Resladero","Dedenne","Rocara","Viscora","Viscargot","Viscogon","Clavion","Paragoni","Trombork","Irrbis","Pumpdjinn","Arktip","Arktilas","eF-eM","UHaFnir","Xerneas","Yveltal","Zygarde","Diancie","Hoopa","Volcanion","Bauz","Arboretoss","Silvarro","Flamiau","Miezunder","Fuegro","Robball","Marikeck","Primarene","Peppeck","Trompeck","Tukanon","Mangunior","Manguspektor","Mabula","Akkup","Donarion","Krabbox","Krawell","Choreogel","Wommel","Bandelby","Wuffels","Wolwerock","Lusardin","Garstella","Aggrostella","Pampuli","Pampross","Araqua","Aranestro","Imantis","Mantidea","Bubungus","Lamellux","Molunk","Amfira","Velursi","Kosturso","Frubberl","Frubaila","Fruyal","Curelei","Kommandutan","Quartermak","Reißlaus","Tectass","Sankabuh","Colossand","Gufa","Typ:Null","Amigento","Meteno","Koalelu","Tortunator","Togedemaru","Mimigma","Knirfish","Sen-Long","Moruda","Miniras","Mediras","Grandiras","Kapu-Riki","Kapu-Fala","Kapu-Toro","Kapu-Kime","Cosmog","Cosmovum","Solgaleo","Lunala","Anego","Masskito","Schabelle","Voltriant","Kaguron","Katagami","Schlingking","Necrozma","Magearna","Marshadow"]; 180 | -------------------------------------------------------------------------------- /other/en.js: -------------------------------------------------------------------------------- 1 | //en 2 | let enSubs = { 3 | "nest": "Nest", 4 | "polygon": "Polygon", 5 | "getSpawnReport": "Get spawn report", 6 | "removeMap": "Remove from map", 7 | "exportPolygon": "Export polygon", 8 | "exportVP": "Export visible points (CSV)", 9 | "countVP": "Count Visible points", 10 | "copyClipboard": "Copy to clipboard", 11 | "poiViewer": "Wayfarer mode", 12 | "routeGenerator": "Planning mode", 13 | "hideGyms": "Hide gyms", 14 | "showGyms": "Show gyms", 15 | "hidePokestops": "Hide pokestops", 16 | "showPokestops": "Show pokestops", 17 | "hidePokestopRange": "Hide pokestop range", 18 | "showPokestopRange": "Show pokestop range", 19 | "hideSpawnpoints": "Hide spawnpoints", 20 | "showSpawnpoints": "Show spawnpoints", 21 | "showAllPOIS": "Show all points", 22 | "showUnknownPOIS": "Show unknown points only", 23 | "hideViewingCells": "Hide viewing cells", 24 | "showViewingCells": "Show viewing cells", 25 | "enableManualCircle": "Enable manual circle mode", 26 | "disableManualCircle": "Disable manual circle mode", 27 | "importOSM": "Import nests from OSM", 28 | "importPolygon": "Import polygon", 29 | "importInstance": "Import instance", 30 | "importAdBounds": "Import administrative boundaries", 31 | "importSubmissions": "Import POIs", 32 | "poiData": "POI data in format: lat, lng, title", 33 | "csvOpener": "or select a CSV file:", 34 | "submissionRangeCheck": "Show 20m range for Wayfarer submissions", 35 | "clearRoute": "Clear route", 36 | "clearShapes": "Clear all shapes", 37 | "clearSubs": "Delete POIs", 38 | "generateRoute": "Generate circles (bootstrap)", 39 | "generateOptimizedRoute": "Generate optimized circles", 40 | "getOutput": "Get output", 41 | "openSettings": "Open settings", 42 | "delete": "Delete", 43 | "noData": "No data available.", 44 | "exEligible": " (ex-eligible)", 45 | "despawnTime": " Despawn time: ", 46 | "unknownDespawnTime": " unknown despawn time ", 47 | "count": "Count: ", 48 | "countTotal": "Count total: ", 49 | "countGyms": "Count gyms: ", 50 | "countStops": "Count stops: ", 51 | "countSpawnpoints": "Count spawnpoints: ", 52 | "spawnReport": "Spawn report - ", 53 | "unnamed": "unnamed", 54 | "at": "at", 55 | "skipped": " skipped, no data", 56 | "nestReport": "Nest report - all nests in view", 57 | "settings": "Settings", 58 | "routeOptAtt": "Route optimization attempts:", 59 | "tries": "Tries", 60 | "s2cells0": "Red, level:", 61 | "s2cells1": "Blue, level 14", 62 | "s2cells2": "Green, level 17", 63 | "s2CountPOI": "Show POI count", 64 | "circleRadius": "Circle radius:", 65 | "other": "other:", 66 | "lastNestMigration": "Last nest migration:", 67 | "spawnReportLimit": "Spawn report limit:", 68 | "spawnReportLimitExp": "Pokemon (0 for unlimited)", 69 | "selectLanguage": "Select language:", 70 | "chooseTileset": "Choose tileset:", 71 | "ownTileset": "Own tileset", 72 | "close": "Close", 73 | "output": "Output", 74 | "generatedRoute": "Generated route:", 75 | "getAllNests": "Get all nest reports", 76 | "countPoints": "Count points in circles", 77 | "optimize": "Optimize!", 78 | "optimizeGyms": "Optimize for gyms", 79 | "optimizePokestops": "Optimize for pokestops", 80 | "optimizeSpawnpoints": "Optimize for all spawnpoints", 81 | "optimizeUnknownSpawnpoints": "Optimize for spawnpoints without TTH", 82 | "on": "On", 83 | "off": "Off", 84 | "optimizePiP": "Optimize points in polygons", 85 | "optimizePiNP": "Optimize points in nest polygons", 86 | "optimizePiC": "Optimize points in circles", 87 | "getOptimization": "Get optimization", 88 | "copied": "Copied!", 89 | "selectInstance": "Select an instance:", 90 | "instanceColor": "Instance color:", 91 | "polygonColor": "Polygon color:", 92 | "polygonDataType": "Polygon data type:", 93 | "coordinateList": "Coordinate list: (latitude,longitude on each new line)", 94 | "geoJson": "GeoJSON", 95 | "poracle": "PoracleJS format", 96 | "polygonData": "Polygon data:", 97 | "import": "Import", 98 | "importNest": "Import as nest", 99 | "exportPolygonPoints": "Export polygon points (CSV)", 100 | "gyms": "Gyms:", 101 | "pokestops": "Pokestops:", 102 | "spawnpoints": "Spawnpoints:", 103 | "pokemon": "Pokémon", 104 | "getOwnLocation": "Get to my location!", 105 | "coordTypeUnsorted": "unsorted", 106 | "coordTypeSorted": "auto-sorted", 107 | "countCircles": "Number of circles:", 108 | "adBoundsHeader": "Select level of administrative boundaries", 109 | "adBounds1": "Counties", 110 | "adBounds2": "Cities", 111 | "adBounds3": "Wards", 112 | "getAdBounds": "Get polygons", 113 | "hideOldSpawnpoints": "Show old spawnpoints", 114 | "showOldSpawnpoints": "Hide old spawnpoints", 115 | "oldSpawnpointsTitle": "No spawnpoints last updated before:", 116 | "instanceMode": "Import circles in passive mode: ", 117 | "enableNewPOI": "Enable new POI", 118 | "disableNewPOI": "Disable new POI", 119 | "exportPOIs": "Export", 120 | "exportPOILabel": "Your POI has the following coordinates:", 121 | "outputAvgPt": "Average points per circle: ", 122 | "exportListCount": "Objects on exportlist: ", 123 | "chooseName": "Please choose a name!", 124 | "addToExport": "Add to exportlist", 125 | "removeFromExport": "Remove from exportlist", 126 | "name": "Name:", 127 | "saveFile": "Save as File", 128 | "ownRadius": "own radius", 129 | "drawnCircles": "drawn circles", 130 | "selectInstances": "Select instances", 131 | "importCirclesIns": "imported circles", 132 | "importCirclesHl": "Own coordinates: (latitude,longitude on each new line)", 133 | "importCirclesBtn": "Import circles", 134 | "showRoute": "Show route", 135 | "hideRoute": "Hide route", 136 | "newRoute": "New route", 137 | "hideQuests": "Hide stops with missing quests", 138 | "showQuests": "Show stops with missing quests", 139 | "questCheck": "Quest instances to be checked:", 140 | "questCheckButton": "Show it!", 141 | "showBorders": "Show instance borders", 142 | "generateWithS2Cells": "bootstrap with s2 cells", 143 | "lastUpdate": "Last update (UTC): ", 144 | "stop_deleted": "marked as deleted", 145 | "coords": "Coordinates", 146 | "drawPolygon": "Draw a polygon", 147 | "drawCircle": "Draw a free circle", 148 | "searchErr": "Location not found", 149 | "searchCancel": "Cancel", 150 | "searchPlaceholder": "Search...", 151 | "editEdit": "Edit layers", 152 | "editEditDisabled": "No layers to edit", 153 | "v2": "v2.0 (1100m)", 154 | "circleID": "Circle ID:", 155 | "manualdbHint": "only usable with manualdb:", 156 | "importFromDB": "Import nests from db", 157 | "writeAllToDB": "Update nests in db", 158 | "nestOptions": "Nestoptions", 159 | "writeSuccess": "Nest(s) successfully added/updated!", 160 | "writeToDB": "Write to db", 161 | "instanceLength": "Length of instance:", 162 | "area": "Area", 163 | "osmOptions": "OSM Options", 164 | "osmPark": "Park", 165 | "osmMeadow": "Meadow", 166 | "osmRecGround": "Recreation Ground", 167 | "osmGrass": "Grass", 168 | "osmPitch": "Pitch", 169 | "osmGolf": "Golf course", 170 | "osmPlayground": "Playground", 171 | "osmScrub": "Scrub", 172 | "osmImport": "Import nests from OSM", 173 | "mergePolygons": "Merge visible polygons", 174 | "enableCellScan": "activate cell scan tool", 175 | "disableCellScan": "deactivate cell scan tool", 176 | "coordsS2": "S2 cell center coordinates:", 177 | "circleS2Cells": "Draw circle S2 cells" 178 | }; 179 | let enPokemon = ["Bulbasaur","Ivysaur","Venusaur","Charmander","Charmeleon","Charizard","Squirtle","Wartortle","Blastoise","Caterpie","Metapod","Butterfree","Weedle","Kakuna","Beedrill","Pidgey","Pidgeotto","Pidgeot","Rattata","Raticate","Spearow","Fearow","Ekans","Arbok","Pikachu","Raichu","Sandshrew","Sandslash","Nidoran\u2640","Nidorina","Nidoqueen","Nidoran\u2642","Nidorino","Nidoking","Clefairy","Clefable","Vulpix","Ninetales","Jigglypuff","Wigglytuff","Zubat","Golbat","Oddish","Gloom","Vileplume","Paras","Parasect","Venonat","Venomoth","Diglett","Dugtrio","Meowth","Persian","Psyduck","Golduck","Mankey","Primeape","Growlithe","Arcanine","Poliwag","Poliwhirl","Poliwrath","Abra","Kadabra","Alakazam","Machop","Machoke","Machamp","Bellsprout","Weepinbell","Victreebel","Tentacool","Tentacruel","Geodude","Graveler","Golem","Ponyta","Rapidash","Slowpoke","Slowbro","Magnemite","Magneton","Farfetch\u2019d","Doduo","Dodrio","Seel","Dewgong","Grimer","Muk","Shellder","Cloyster","Gastly","Haunter","Gengar","Onix","Drowzee","Hypno","Krabby","Kingler","Voltorb","Electrode","Exeggcute","Exeggutor","Cubone","Marowak","Hitmonlee","Hitmonchan","Lickitung","Koffing","Weezing","Rhyhorn","Rhydon","Chansey","Tangela","Kangaskhan","Horsea","Seadra","Goldeen","Seaking","Staryu","Starmie","Mr. Mime","Scyther","Jynx","Electabuzz","Magmar","Pinsir","Tauros","Magikarp","Gyarados","Lapras","Ditto","Eevee","Vaporeon","Jolteon","Flareon","Porygon","Omanyte","Omastar","Kabuto","Kabutops","Aerodactyl","Snorlax","Articuno","Zapdos","Moltres","Dratini","Dragonair","Dragonite","Mewtwo","Mew","Chikorita","Bayleef","Meganium","Cyndaquil","Quilava","Typhlosion","Totodile","Croconaw","Feraligatr","Sentret","Furret","Hoothoot","Noctowl","Ledyba","Ledian","Spinarak","Ariados","Crobat","Chinchou","Lanturn","Pichu","Cleffa","Igglybuff","Togepi","Togetic","Natu","Xatu","Mareep","Flaaffy","Ampharos","Bellossom","Marill","Azumarill","Sudowoodo","Politoed","Hoppip","Skiploom","Jumpluff","Aipom","Sunkern","Sunflora","Yanma","Wooper","Quagsire","Espeon","Umbreon","Murkrow","Slowking","Misdreavus","Unown","Wobbuffet","Girafarig","Pineco","Forretress","Dunsparce","Gligar","Steelix","Snubbull","Granbull","Qwilfish","Scizor","Shuckle","Heracross","Sneasel","Teddiursa","Ursaring","Slugma","Magcargo","Swinub","Piloswine","Corsola","Remoraid","Octillery","Delibird","Mantine","Skarmory","Houndour","Houndoom","Kingdra","Phanpy","Donphan","Porygon2","Stantler","Smeargle","Tyrogue","Hitmontop","Smoochum","Elekid","Magby","Miltank","Blissey","Raikou","Entei","Suicune","Larvitar","Pupitar","Tyranitar","Lugia","Ho-Oh","Celebi","Treecko","Grovyle","Sceptile","Torchic","Combusken","Blaziken","Mudkip","Marshtomp","Swampert","Poochyena","Mightyena","Zigzagoon","Linoone","Wurmple","Silcoon","Beautifly","Cascoon","Dustox","Lotad","Lombre","Ludicolo","Seedot","Nuzleaf","Shiftry","Taillow","Swellow","Wingull","Pelipper","Ralts","Kirlia","Gardevoir","Surskit","Masquerain","Shroomish","Breloom","Slakoth","Vigoroth","Slaking","Nincada","Ninjask","Shedinja","Whismur","Loudred","Exploud","Makuhita","Hariyama","Azurill","Nosepass","Skitty","Delcatty","Sableye","Mawile","Aron","Lairon","Aggron","Meditite","Medicham","Electrike","Manectric","Plusle","Minun","Volbeat","Illumise","Roselia","Gulpin","Swalot","Carvanha","Sharpedo","Wailmer","Wailord","Numel","Camerupt","Torkoal","Spoink","Grumpig","Spinda","Trapinch","Vibrava","Flygon","Cacnea","Cacturne","Swablu","Altaria","Zangoose","Seviper","Lunatone","Solrock","Barboach","Whiscash","Corphish","Crawdaunt","Baltoy","Claydol","Lileep","Cradily","Anorith","Armaldo","Feebas","Milotic","Castform","Kecleon","Shuppet","Banette","Duskull","Dusclops","Tropius","Chimecho","Absol","Wynaut","Snorunt","Glalie","Spheal","Sealeo","Walrein","Clamperl","Huntail","Gorebyss","Relicanth","Luvdisc","Bagon","Shelgon","Salamence","Beldum","Metang","Metagross","Regirock","Regice","Registeel","Latias","Latios","Kyogre","Groudon","Rayquaza","Jirachi","Deoxys","Turtwig","Grotle","Torterra","Chimchar","Monferno","Infernape","Piplup","Prinplup","Empoleon","Starly","Staravia","Staraptor","Bidoof","Bibarel","Kricketot","Kricketune","Shinx","Luxio","Luxray","Budew","Roserade","Cranidos","Rampardos","Shieldon","Bastiodon","Burmy","Wormadam","Mothim","Combee","Vespiquen","Pachirisu","Buizel","Floatzel","Cherubi","Cherrim","Shellos","Gastrodon","Ambipom","Drifloon","Drifblim","Buneary","Lopunny","Mismagius","Honchkrow","Glameow","Purugly","Chingling","Stunky","Skuntank","Bronzor","Bronzong","Bonsly","Mime Jr.","Happiny","Chatot","Spiritomb","Gible","Gabite","Garchomp","Munchlax","Riolu","Lucario","Hippopotas","Hippowdon","Skorupi","Drapion","Croagunk","Toxicroak","Carnivine","Finneon","Lumineon","Mantyke","Snover","Abomasnow","Weavile","Magnezone","Lickilicky","Rhyperior","Tangrowth","Electivire","Magmortar","Togekiss","Yanmega","Leafeon","Glaceon","Gliscor","Mamoswine","Porygon-Z","Gallade","Probopass","Dusknoir","Froslass","Rotom","Uxie","Mesprit","Azelf","Dialga","Palkia","Heatran","Regigigas","Giratina","Cresselia","Phione","Manaphy","Darkrai","Shaymin","Arceus","Victini","Snivy","Servine","Serperior","Tepig","Pignite","Emboar","Oshawott","Dewott","Samurott","Patrat","Watchog","Lillipup","Herdier","Stoutland","Purrloin","Liepard","Pansage","Simisage","Pansear","Simisear","Panpour","Simipour","Munna","Musharna","Pidove","Tranquill","Unfezant","Blitzle","Zebstrika","Roggenrola","Boldore","Gigalith","Woobat","Swoobat","Drilbur","Excadrill","Audino","Timburr","Gurdurr","Conkeldurr","Tympole","Palpitoad","Seismitoad","Throh","Sawk","Sewaddle","Swadloon","Leavanny","Venipede","Whirlipede","Scolipede","Cottonee","Whimsicott","Petilil","Lilligant","Basculin","Sandile","Krokorok","Krookodile","Darumaka","Darmanitan","Maractus","Dwebble","Crustle","Scraggy","Scrafty","Sigilyph","Yamask","Cofagrigus","Tirtouga","Carracosta","Archen","Archeops","Trubbish","Garbodor","Zorua","Zoroark","Minccino","Cinccino","Gothita","Gothorita","Gothitelle","Solosis","Duosion","Reuniclus","Ducklett","Swanna","Vanillite","Vanillish","Vanilluxe","Deerling","Sawsbuck","Emolga","Karrablast","Escavalier","Foongus","Amoonguss","Frillish","Jellicent","Alomomola","Joltik","Galvantula","Ferroseed","Ferrothorn","Klink","Klang","Klinklang","Tynamo","Eelektrik","Eelektross","Elgyem","Beheeyem","Litwick","Lampent","Chandelure","Axew","Fraxure","Haxorus","Cubchoo","Beartic","Cryogonal","Shelmet","Accelgor","Stunfisk","Mienfoo","Mienshao","Druddigon","Golett","Golurk","Pawniard","Bisharp","Bouffalant","Rufflet","Braviary","Vullaby","Mandibuzz","Heatmor","Durant","Deino","Zweilous","Hydreigon","Larvesta","Volcarona","Cobalion","Terrakion","Virizion","Tornadus","Thundurus","Reshiram","Zekrom","Landorus","Kyurem","Keldeo","Meloetta","Genesect","Chespin","Quilladin","Chesnaught","Fennekin","Braixen","Delphox","Froakie","Frogadier","Greninja","Bunnelby","Diggersby","Fletchling","Fletchinder","Talonflame","Scatterbug","Spewpa","Vivillon","Litleo","Pyroar","Flabébé","Floette","Florges","Skiddo","Gogoat","Pancham","Pangoro","Furfrou","Espurr","Meowstic","Honedge","Doublade","Aegislash","Spritzee","Aromatisse","Swirlix","Slurpuff","Inkay","Malamar","Binacle","Barbaracle","Skrelp","Dragalge","Clauncher","Clawitzer","Helioptile","Heliolisk","Tyrunt","Tyrantrum","Amaura","Aurorus","Sylveon","Hawlucha","Dedenne","Carbink","Goomy","Sliggoo","Goodra","Klefki","Phantump","Trevenant","Pumpkaboo","Gourgeist","Bergmite","Avalugg","Noibat","Noivern","Xerneas","Yveltal","Zygarde","Diancie","Hoopa","Volcanion","Rowlet","Dartrix","Decidueye","Litten","Torracat","Incineroar","Popplio","Brionne","Primarina","Pikipek","Trumbeak","Toucannon","Yungoos","Gumshoos","Grubbin","Charjabug","Vikavolt","Crabrawler","Crabominable","Oricorio","Cutiefly","Ribombee","Rockruff","Lycanroc","Wishiwashi","Mareanie","Toxapex","Mudbray","Mudsdale","Dewpider","Araquanid","Fomantis","Lurantis","Morelull","Shiinotic","Salandit","Salazzle","Stufful","Bewear","Bounsweet","Steenee","Tsareena","Comfey","Oranguru","Passimian","Wimpod","Golisopod","Sandygast","Palossand","Pyukumuku","Type: Null","Silvally","Minior","Komala","Turtonator","Togedemaru","Mimikyu","Bruxish","Drampa","Dhelmise","Jangmo-o","Hakamo-o","Kommo-o","Tapu Koko","Tapu Lele","Tapu Bulu","Tapu Fini","Cosmog","Cosmoem","Solgaleo","Lunala","Nihilego","Buzzwole","Pheromosa","Xurkitree","Celesteela","Kartana","Guzzlord","Necrozma","Magearna","Marshadow"]; 180 | -------------------------------------------------------------------------------- /other/fr.js: -------------------------------------------------------------------------------- 1 | //fr 2 | let frSubs = { 3 | "nest": "Nid", 4 | "polygon": "Polygone", 5 | "getSpawnReport": "Rapport de spawns", 6 | "removeMap": "Supprime du plan", 7 | "exportPolygon": "Exporte polygone", 8 | "exportVP": "Exporte points visibles", 9 | "countVP": "Compte points visibles", 10 | "copyClipboard": "Copier", 11 | "poiViewer": "Mode Wayfarer", 12 | "routeGenerator": "Mode de planification", 13 | "hideGyms": "Cache les arènes", 14 | "showGyms": "Montre les arènes", 15 | "hidePokestops": "Cache les pokéstops", 16 | "showPokestops": "Montre les pokéstops", 17 | "hidePokestopRange": "Cache la zone des pokéstops", 18 | "showPokestopRange": "Montre la zone des pokéstops", 19 | "hideSpawnpoints": "Cache les spawnpoints", 20 | "showSpawnpoints": "Montre les spawnpoints", 21 | "showAllPOIS": "Montre tous les POIs", 22 | "showUnknownPOIS": "Montre seulement les points inconnus", 23 | "hideViewingCells": "Cache cells s2", 24 | "showViewingCells": "Montre cells s2", 25 | "enableManualCircle": "Active le mode manuel du cercle", 26 | "disableManualCircle": "Désactive le mode manuel du cercle", 27 | "importOSM": "Importer les nests d'OSM", 28 | "importPolygon": "Importe polygone", 29 | "importInstance": "Importe d'instances", 30 | "importAdBounds": "Importe de frontières administratives", 31 | "importSubmissions": "Importe de POIs", 32 | "poiData": "POI data en format: lat, lng, title", 33 | "csvOpener": "ou selectionne un fichier CSV:", 34 | "submissionRangeCheck": "Montre la zone de 20m pour soumissions Wayfarer", 35 | "clearRoute": "Dégage la route", 36 | "clearShapes": "Dégage tous", 37 | "clearSubs": "Supprime les POIs", 38 | "generateRoute": "Génère des cercles (bootstrap)", 39 | "generateOptimizedRoute": "Génère des cercles optimisés", 40 | "getOutput": "Obtiens le résultat", 41 | "openSettings": "Ouvre les paramètres", 42 | "delete": "Supprime", 43 | "noData": "aucune donnée disponible.", 44 | "exEligible": " (ex-eligible)", 45 | "despawnTime": " Moment de despawn: ", 46 | "unknownDespawnTime": " moment de despawn inconnu ", 47 | "count": "Compte: ", 48 | "countTotal": "Compte total: ", 49 | "countGyms": "Compte d'arènes: ", 50 | "countStops": "Compte de stops: ", 51 | "countSpawnpoints": "Compte des spawnpoints: ", 52 | "spawnReport": "Rapport de spawns - ", 53 | "unnamed": "sans nom", 54 | "at": "à", 55 | "skipped": " sauté, pas de données", 56 | "nestReport": "Rapport de nids - tous les nids en vue", 57 | "settings": "Paramètres", 58 | "routeOptAtt": "Essais d'optimisation de la route:", 59 | "tries": "Essais", 60 | "s2cells0": "Rouge, level:", 61 | "s2cells1": "Bleu, level 14", 62 | "s2cells2": "Vert, level 17", 63 | "s2CountPOI": "Montre compte de POIs", 64 | "circleRadius": "Rayon du cercle:", 65 | "other": "autres:", 66 | "lastNestMigration": "Dernières migration de nids:", 67 | "spawnReportLimit": "limit du rapport des spawns:", 68 | "spawnReportLimitExp": "Pokémon (0 pour illimité)", 69 | "selectLanguage": "Choisis une langue:", 70 | "chooseTileset": "Choisis un tileset:", 71 | "ownTileset": "Tileset propre", 72 | "close": "Ferme", 73 | "output": "Résultat", 74 | "generatedRoute": "Route générée:", 75 | "getAllNests": "Obtiens tous les rapports de nids", 76 | "countPoints": "Compte les points à l'intérieur des cercles", 77 | "optimize": "Optimise!", 78 | "optimizeGyms": "Optimise pour les arènes", 79 | "optimizePokestops": "Optimise pour les pokéstops", 80 | "optimizeSpawnpoints": "Optimise pour tous les spawnpoints", 81 | "optimizeUnknownSpawnpoints": "Optimise pour les spawnpoints sans TTH", 82 | "on": "Activé", 83 | "off": "Desactivé", 84 | "optimizePiP": "Optimise les points dans les polygons", 85 | "optimizePiNP": "Optimise les points dans les polygons de nid", 86 | "optimizePiC": "Optimise les points dans les cercles", 87 | "getOptimization": "Obtiens l'optimisation", 88 | "copied": "Copié!", 89 | "selectInstance": "Choisis une instance:", 90 | "instanceColor": "Couleur de l'instance:", 91 | "polygonColor": "Couleur du polygone:", 92 | "polygonDataType": "Type de données de polygone:", 93 | "coordinateList": "List des coordinates: (latitude,longitude sur une ligne)", 94 | "geoJson": "GeoJSON", 95 | "poracle": "Format PoracleJS", 96 | "polygonData": "Données de polygone:", 97 | "import": "Importe", 98 | "importNest": "Importe comme nid", 99 | "exportPolygonPoints": "Exporte les points du polygone (CSV)", 100 | "gyms": "Arènes:", 101 | "pokestops": "Pokéstops:", 102 | "spawnpoints": "Spawnpoints:", 103 | "pokemon": "Pokémon", 104 | "getOwnLocation": "Localise moi!", 105 | "coordTypeUnsorted": "non triés", 106 | "coordTypeSorted": "auto-triés", 107 | "countCircles": "Compte de cercles:", 108 | "adBoundsHeader": "Choisis le niveau de frontières administratives", 109 | "adBounds1": "Départements", 110 | "adBounds2": "Villes", 111 | "adBounds3": "Quartiers", 112 | "getAdBounds": "Obtiens les polygons", 113 | "hideOldSpawnpoints": "Montre les vieux spawnpoints", 114 | "showOldSpawnpoints": "Cache les vieux spawnpoints", 115 | "oldSpawnpointsTitle": "Pas de spawnpoints actualisés avant:", 116 | "instanceMode": "Importe les cercles en mode passive: ", 117 | "enableNewPOI": "Active nouveau POI", 118 | "disableNewPOI": "Désactive nouveau POI", 119 | "exportPOIs": "Exporte", 120 | "exportPOILabel": "Ton POI a les coordinates suivants:", 121 | "outputAvgPt": "Points par cercle en moyenne: ", 122 | "exportListCount": "Objets sur la liste d'export: ", 123 | "chooseName": "Choisis un nom!", 124 | "addToExport": "Ajoute sur la liste d'export", 125 | "removeFromExport": "Supprime de la liste d'export", 126 | "name": "Nom:", 127 | "saveFile": "Sauver comme fichier", 128 | "ownRadius": "rayon propre", 129 | "drawnCircles": "cercles dessinés", 130 | "selectInstances": "Choisis les instances", 131 | "importCirclesIns": "cercles importés", 132 | "importCirclesHl": "Coordinates propre: (latitude,longitude on each new line)", 133 | "importCirclesBtn": "Cercles importés", 134 | "showRoute": "Montre route", 135 | "hideRoute": "Cache route", 136 | "newRoute": "Nouveau route", 137 | "hideQuests": "Montre stops sans quest", 138 | "showQuests": "Cache stops sans quest", 139 | "questCheck": "Instances à vérifier:", 140 | "questCheckButton": "Montre!", 141 | "showBorders": "Montre les frontières des instances", 142 | "generateWithS2Cells": "Bootstrap avec cells s2", 143 | "lastUpdate": "Dernière actualisation (UTC): ", 144 | "stop_deleted": "marqué pour suppression", 145 | "coords": "Coordinates", 146 | "drawPolygon": "Tire un polygon", 147 | "drawCircle": "Tire un cercle libre", 148 | "searchErr": "Location pas connu", 149 | "searchCancel": "Annuler", 150 | "searchPlaceholder": "Chercher...", 151 | "editEdit": "Editer les couches", 152 | "editEditDisabled": "Pas de couche à éditer", 153 | "v2": "v2.0 (1100m)", 154 | "circleID": "ID du cercle:", 155 | "manualdbHint": "seulement utilisable avec manualdb:", 156 | "importFromDB": "Importer les nids de la bd", 157 | "writeAllToDB": "Actualise les nids en bd", 158 | "nestOptions": "Options de nid", 159 | "writeSuccess": "Réussi à actualiser/inscrire le(s) nid(s)", 160 | "writeToDB": "Inscrire en bd", 161 | "instanceLength": "Longueur de l'instance:", 162 | "area": "Superficie", 163 | "osmOptions": "Options OSM", 164 | "osmPark": "Parc", 165 | "osmMeadow": "Prairie", 166 | "osmRecGround": "Terrain de loisirs", 167 | "osmGrass": "Pâturage", 168 | "osmPitch": "Terrain de jeu", 169 | "osmGolf": "Parcours de golf", 170 | "osmPlayground": "Terrain de jeux", 171 | "osmScrub": "Broussailles", 172 | "osmImport": "Importer les nids d'OSM", 173 | "mergePolygons": "Fussioner les polygons visibles", 174 | "circleS2Cells": "Dessiner les cellules S2" 175 | }; 176 | let frPokemon = ["Bulbasaur","Ivysaur","Venusaur","Charmander","Charmeleon","Charizard","Squirtle","Wartortle","Blastoise","Caterpie","Metapod","Butterfree","Weedle","Kakuna","Beedrill","Pidgey","Pidgeotto","Pidgeot","Rattata","Raticate","Spearow","Fearow","Ekans","Arbok","Pikachu","Raichu","Sandshrew","Sandslash","Nidoran\u2640","Nidorina","Nidoqueen","Nidoran\u2642","Nidorino","Nidoking","Clefairy","Clefable","Vulpix","Ninetales","Jigglypuff","Wigglytuff","Zubat","Golbat","Oddish","Gloom","Vileplume","Paras","Parasect","Venonat","Venomoth","Diglett","Dugtrio","Meowth","Persian","Psyduck","Golduck","Mankey","Primeape","Growlithe","Arcanine","Poliwag","Poliwhirl","Poliwrath","Abra","Kadabra","Alakazam","Machop","Machoke","Machamp","Bellsprout","Weepinbell","Victreebel","Tentacool","Tentacruel","Geodude","Graveler","Golem","Ponyta","Rapidash","Slowpoke","Slowbro","Magnemite","Magneton","Farfetch\u2019d","Doduo","Dodrio","Seel","Dewgong","Grimer","Muk","Shellder","Cloyster","Gastly","Haunter","Gengar","Onix","Drowzee","Hypno","Krabby","Kingler","Voltorb","Electrode","Exeggcute","Exeggutor","Cubone","Marowak","Hitmonlee","Hitmonchan","Lickitung","Koffing","Weezing","Rhyhorn","Rhydon","Chansey","Tangela","Kangaskhan","Horsea","Seadra","Goldeen","Seaking","Staryu","Starmie","Mr. Mime","Scyther","Jynx","Electabuzz","Magmar","Pinsir","Tauros","Magikarp","Gyarados","Lapras","Ditto","Eevee","Vaporeon","Jolteon","Flareon","Porygon","Omanyte","Omastar","Kabuto","Kabutops","Aerodactyl","Snorlax","Articuno","Zapdos","Moltres","Dratini","Dragonair","Dragonite","Mewtwo","Mew","Chikorita","Bayleef","Meganium","Cyndaquil","Quilava","Typhlosion","Totodile","Croconaw","Feraligatr","Sentret","Furret","Hoothoot","Noctowl","Ledyba","Ledian","Spinarak","Ariados","Crobat","Chinchou","Lanturn","Pichu","Cleffa","Igglybuff","Togepi","Togetic","Natu","Xatu","Mareep","Flaaffy","Ampharos","Bellossom","Marill","Azumarill","Sudowoodo","Politoed","Hoppip","Skiploom","Jumpluff","Aipom","Sunkern","Sunflora","Yanma","Wooper","Quagsire","Espeon","Umbreon","Murkrow","Slowking","Misdreavus","Unown","Wobbuffet","Girafarig","Pineco","Forretress","Dunsparce","Gligar","Steelix","Snubbull","Granbull","Qwilfish","Scizor","Shuckle","Heracross","Sneasel","Teddiursa","Ursaring","Slugma","Magcargo","Swinub","Piloswine","Corsola","Remoraid","Octillery","Delibird","Mantine","Skarmory","Houndour","Houndoom","Kingdra","Phanpy","Donphan","Porygon2","Stantler","Smeargle","Tyrogue","Hitmontop","Smoochum","Elekid","Magby","Miltank","Blissey","Raikou","Entei","Suicune","Larvitar","Pupitar","Tyranitar","Lugia","Ho-Oh","Celebi","Treecko","Grovyle","Sceptile","Torchic","Combusken","Blaziken","Mudkip","Marshtomp","Swampert","Poochyena","Mightyena","Zigzagoon","Linoone","Wurmple","Silcoon","Beautifly","Cascoon","Dustox","Lotad","Lombre","Ludicolo","Seedot","Nuzleaf","Shiftry","Taillow","Swellow","Wingull","Pelipper","Ralts","Kirlia","Gardevoir","Surskit","Masquerain","Shroomish","Breloom","Slakoth","Vigoroth","Slaking","Nincada","Ninjask","Shedinja","Whismur","Loudred","Exploud","Makuhita","Hariyama","Azurill","Nosepass","Skitty","Delcatty","Sableye","Mawile","Aron","Lairon","Aggron","Meditite","Medicham","Electrike","Manectric","Plusle","Minun","Volbeat","Illumise","Roselia","Gulpin","Swalot","Carvanha","Sharpedo","Wailmer","Wailord","Numel","Camerupt","Torkoal","Spoink","Grumpig","Spinda","Trapinch","Vibrava","Flygon","Cacnea","Cacturne","Swablu","Altaria","Zangoose","Seviper","Lunatone","Solrock","Barboach","Whiscash","Corphish","Crawdaunt","Baltoy","Claydol","Lileep","Cradily","Anorith","Armaldo","Feebas","Milotic","Castform","Kecleon","Shuppet","Banette","Duskull","Dusclops","Tropius","Chimecho","Absol","Wynaut","Snorunt","Glalie","Spheal","Sealeo","Walrein","Clamperl","Huntail","Gorebyss","Relicanth","Luvdisc","Bagon","Shelgon","Salamence","Beldum","Metang","Metagross","Regirock","Regice","Registeel","Latias","Latios","Kyogre","Groudon","Rayquaza","Jirachi","Deoxys","Turtwig","Grotle","Torterra","Chimchar","Monferno","Infernape","Piplup","Prinplup","Empoleon","Starly","Staravia","Staraptor","Bidoof","Bibarel","Kricketot","Kricketune","Shinx","Luxio","Luxray","Budew","Roserade","Cranidos","Rampardos","Shieldon","Bastiodon","Burmy","Wormadam","Mothim","Combee","Vespiquen","Pachirisu","Buizel","Floatzel","Cherubi","Cherrim","Shellos","Gastrodon","Ambipom","Drifloon","Drifblim","Buneary","Lopunny","Mismagius","Honchkrow","Glameow","Purugly","Chingling","Stunky","Skuntank","Bronzor","Bronzong","Bonsly","Mime Jr.","Happiny","Chatot","Spiritomb","Gible","Gabite","Garchomp","Munchlax","Riolu","Lucario","Hippopotas","Hippowdon","Skorupi","Drapion","Croagunk","Toxicroak","Carnivine","Finneon","Lumineon","Mantyke","Snover","Abomasnow","Weavile","Magnezone","Lickilicky","Rhyperior","Tangrowth","Electivire","Magmortar","Togekiss","Yanmega","Leafeon","Glaceon","Gliscor","Mamoswine","Porygon-Z","Gallade","Probopass","Dusknoir","Froslass","Rotom","Uxie","Mesprit","Azelf","Dialga","Palkia","Heatran","Regigigas","Giratina","Cresselia","Phione","Manaphy","Darkrai","Shaymin","Arceus","Victini","Snivy","Servine","Serperior","Tepig","Pignite","Emboar","Oshawott","Dewott","Samurott","Patrat","Watchog","Lillipup","Herdier","Stoutland","Purrloin","Liepard","Pansage","Simisage","Pansear","Simisear","Panpour","Simipour","Munna","Musharna","Pidove","Tranquill","Unfezant","Blitzle","Zebstrika","Roggenrola","Boldore","Gigalith","Woobat","Swoobat","Drilbur","Excadrill","Audino","Timburr","Gurdurr","Conkeldurr","Tympole","Palpitoad","Seismitoad","Throh","Sawk","Sewaddle","Swadloon","Leavanny","Venipede","Whirlipede","Scolipede","Cottonee","Whimsicott","Petilil","Lilligant","Basculin","Sandile","Krokorok","Krookodile","Darumaka","Darmanitan","Maractus","Dwebble","Crustle","Scraggy","Scrafty","Sigilyph","Yamask","Cofagrigus","Tirtouga","Carracosta","Archen","Archeops","Trubbish","Garbodor","Zorua","Zoroark","Minccino","Cinccino","Gothita","Gothorita","Gothitelle","Solosis","Duosion","Reuniclus","Ducklett","Swanna","Vanillite","Vanillish","Vanilluxe","Deerling","Sawsbuck","Emolga","Karrablast","Escavalier","Foongus","Amoonguss","Frillish","Jellicent","Alomomola","Joltik","Galvantula","Ferroseed","Ferrothorn","Klink","Klang","Klinklang","Tynamo","Eelektrik","Eelektross","Elgyem","Beheeyem","Litwick","Lampent","Chandelure","Axew","Fraxure","Haxorus","Cubchoo","Beartic","Cryogonal","Shelmet","Accelgor","Stunfisk","Mienfoo","Mienshao","Druddigon","Golett","Golurk","Pawniard","Bisharp","Bouffalant","Rufflet","Braviary","Vullaby","Mandibuzz","Heatmor","Durant","Deino","Zweilous","Hydreigon","Larvesta","Volcarona","Cobalion","Terrakion","Virizion","Tornadus","Thundurus","Reshiram","Zekrom","Landorus","Kyurem","Keldeo","Meloetta","Genesect","Chespin","Quilladin","Chesnaught","Fennekin","Braixen","Delphox","Froakie","Frogadier","Greninja","Bunnelby","Diggersby","Fletchling","Fletchinder","Talonflame","Scatterbug","Spewpa","Vivillon","Litleo","Pyroar","Flabébé","Floette","Florges","Skiddo","Gogoat","Pancham","Pangoro","Furfrou","Espurr","Meowstic","Honedge","Doublade","Aegislash","Spritzee","Aromatisse","Swirlix","Slurpuff","Inkay","Malamar","Binacle","Barbaracle","Skrelp","Dragalge","Clauncher","Clawitzer","Helioptile","Heliolisk","Tyrunt","Tyrantrum","Amaura","Aurorus","Sylveon","Hawlucha","Dedenne","Carbink","Goomy","Sliggoo","Goodra","Klefki","Phantump","Trevenant","Pumpkaboo","Gourgeist","Bergmite","Avalugg","Noibat","Noivern","Xerneas","Yveltal","Zygarde","Diancie","Hoopa","Volcanion","Rowlet","Dartrix","Decidueye","Litten","Torracat","Incineroar","Popplio","Brionne","Primarina","Pikipek","Trumbeak","Toucannon","Yungoos","Gumshoos","Grubbin","Charjabug","Vikavolt","Crabrawler","Crabominable","Oricorio","Cutiefly","Ribombee","Rockruff","Lycanroc","Wishiwashi","Mareanie","Toxapex","Mudbray","Mudsdale","Dewpider","Araquanid","Fomantis","Lurantis","Morelull","Shiinotic","Salandit","Salazzle","Stufful","Bewear","Bounsweet","Steenee","Tsareena","Comfey","Oranguru","Passimian","Wimpod","Golisopod","Sandygast","Palossand","Pyukumuku","Type: Null","Silvally","Minior","Komala","Turtonator","Togedemaru","Mimikyu","Bruxish","Drampa","Dhelmise","Jangmo-o","Hakamo-o","Kommo-o","Tapu Koko","Tapu Lele","Tapu Bulu","Tapu Fini","Cosmog","Cosmoem","Solgaleo","Lunala","Nihilego","Buzzwole","Pheromosa","Xurkitree","Celesteela","Kartana","Guzzlord","Necrozma","Magearna","Marshadow"]; 177 | -------------------------------------------------------------------------------- /other/leaflet-search.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Leaflet Control Search v2.9.7 - 2019-01-14 3 | * 4 | * Copyright 2019 Stefano Cudini 5 | * stefano.cudini@gmail.com 6 | * http://labs.easyblog.it/ 7 | * 8 | * Licensed under the MIT license. 9 | * 10 | * Demo: 11 | * http://labs.easyblog.it/maps/leaflet-search/ 12 | * 13 | * Source: 14 | * git@github.com:stefanocudini/leaflet-search.git 15 | * 16 | */ 17 | /* 18 | Name Data passed Description 19 | 20 | Managed Events: 21 | search:locationfound {latlng, title, layer} fired after moved and show markerLocation 22 | search:expanded {} fired after control was expanded 23 | search:collapsed {} fired after control was collapsed 24 | search:cancel {} fired after cancel button clicked 25 | 26 | Public methods: 27 | setLayer() L.LayerGroup() set layer search at runtime 28 | showAlert() 'Text message' show alert message 29 | searchText() 'Text searched' search text by external code 30 | */ 31 | 32 | //TODO implement can do research on multiple sources layers and remote 33 | //TODO history: false, //show latest searches in tooltip 34 | //FIXME option condition problem {autoCollapse: true, markerLocation: true} not show location 35 | //FIXME option condition problem {autoCollapse: false } 36 | // 37 | //TODO here insert function search inputText FIRST in _recordsCache keys and if not find results.. 38 | // run one of callbacks search(sourceData,jsonpUrl or options.layer) and run this.showTooltip 39 | // 40 | //TODO change structure of _recordsCache 41 | // like this: _recordsCache = {"text-key1": {loc:[lat,lng], ..other attributes.. }, {"text-key2": {loc:[lat,lng]}...}, ...} 42 | // in this mode every record can have a free structure of attributes, only 'loc' is required 43 | //TODO important optimization!!! always append data in this._recordsCache 44 | // now _recordsCache content is emptied and replaced with new data founded 45 | // always appending data on _recordsCache give the possibility of caching ajax, jsonp and layersearch! 46 | // 47 | //TODO here insert function search inputText FIRST in _recordsCache keys and if not find results.. 48 | // run one of callbacks search(sourceData,jsonpUrl or options.layer) and run this.showTooltip 49 | // 50 | //TODO change structure of _recordsCache 51 | // like this: _recordsCache = {"text-key1": {loc:[lat,lng], ..other attributes.. }, {"text-key2": {loc:[lat,lng]}...}, ...} 52 | // in this way every record can have a free structure of attributes, only 'loc' is required 53 | 54 | (function (factory) { 55 | if(typeof define === 'function' && define.amd) { 56 | //AMD 57 | define(['leaflet'], factory); 58 | } else if(typeof module !== 'undefined') { 59 | // Node/CommonJS 60 | module.exports = factory(require('leaflet')); 61 | } else { 62 | // Browser globals 63 | if(typeof window.L === 'undefined') 64 | throw 'Leaflet must be loaded first'; 65 | factory(window.L); 66 | } 67 | })(function (L) { 68 | 69 | 70 | L.Control.Search = L.Control.extend({ 71 | 72 | includes: L.version[0]==='1' ? L.Evented.prototype : L.Mixin.Events, 73 | 74 | options: { 75 | url: '', //url for search by ajax request, ex: "search.php?q={s}". Can be function to returns string for dynamic parameter setting 76 | layer: null, //layer where search markers(is a L.LayerGroup) 77 | sourceData: null, //function to fill _recordsCache, passed searching text by first param and callback in second 78 | //TODO implements uniq option 'sourceData' to recognizes source type: url,array,callback or layer 79 | jsonpParam: null, //jsonp param name for search by jsonp service, ex: "callback" 80 | propertyLoc: 'loc', //field for remapping location, using array: ['latname','lonname'] for select double fields(ex. ['lat','lon'] ) support dotted format: 'prop.subprop.title' 81 | propertyName: 'title', //property in marker.options(or feature.properties for vector layer) trough filter elements in layer, 82 | formatData: null, //callback for reformat all data from source to indexed data object 83 | filterData: null, //callback for filtering data from text searched, params: textSearch, allRecords 84 | moveToLocation: null, //callback run on location found, params: latlng, title, map 85 | buildTip: null, //function to return row tip html node(or html string), receive text tooltip in first param 86 | container: '', //container id to insert Search Control 87 | zoom: null, //default zoom level for move to location 88 | minLength: 1, //minimal text length for autocomplete 89 | initial: true, //search elements only by initial text 90 | casesensitive: false, //search elements in case sensitive text 91 | autoType: true, //complete input with first suggested result and select this filled-in text. 92 | delayType: 400, //delay while typing for show tooltip 93 | tooltipLimit: -1, //limit max results to show in tooltip. -1 for no limit, 0 for no results 94 | tipAutoSubmit: true, //auto map panTo when click on tooltip 95 | firstTipSubmit: false, //auto select first result con enter click 96 | autoResize: true, //autoresize on input change 97 | collapsed: true, //collapse search control at startup 98 | autoCollapse: false, //collapse search control after submit(on button or on tips if enabled tipAutoSubmit) 99 | autoCollapseTime: 1200, //delay for autoclosing alert and collapse after blur 100 | textErr: 'Location not found', //error message 101 | textCancel: 'Cancel', //title in cancel button 102 | textPlaceholder: 'Search...', //placeholder value 103 | hideMarkerOnCollapse: false, //remove circle and marker on search control collapsed 104 | position: 'topleft', 105 | marker: { //custom L.Marker or false for hide 106 | icon: false, //custom L.Icon for maker location or false for hide 107 | animate: true, //animate a circle over location found 108 | circle: { //draw a circle in location found 109 | radius: 10, 110 | weight: 3, 111 | color: '#e03', 112 | stroke: true, 113 | fill: false 114 | } 115 | } 116 | }, 117 | 118 | _getPath: function(obj, prop) { 119 | var parts = prop.split('.'), 120 | last = parts.pop(), 121 | len = parts.length, 122 | cur = parts[0], 123 | i = 1; 124 | 125 | if(len > 0) 126 | while((obj = obj[cur]) && i < len) 127 | cur = parts[i++]; 128 | 129 | if(obj) 130 | return obj[last]; 131 | }, 132 | 133 | _isObject: function(obj) { 134 | return Object.prototype.toString.call(obj) === "[object Object]"; 135 | }, 136 | 137 | initialize: function(options) { 138 | L.Util.setOptions(this, options || {}); 139 | this._inputMinSize = this.options.textPlaceholder ? this.options.textPlaceholder.length : 10; 140 | this._layer = this.options.layer || new L.LayerGroup(); 141 | this._filterData = this.options.filterData || this._defaultFilterData; 142 | this._formatData = this.options.formatData || this._defaultFormatData; 143 | this._moveToLocation = this.options.moveToLocation || this._defaultMoveToLocation; 144 | this._autoTypeTmp = this.options.autoType; //useful for disable autoType temporarily in delete/backspace keydown 145 | this._countertips = 0; //number of tips items 146 | this._recordsCache = {}; //key,value table! to store locations! format: key,latlng 147 | this._curReq = null; 148 | }, 149 | 150 | onAdd: function (map) { 151 | this._map = map; 152 | this._container = L.DomUtil.create('div', 'leaflet-control-search'); 153 | this._input = this._createInput(this.options.textPlaceholder, 'search-input'); 154 | this._tooltip = this._createTooltip('search-tooltip'); 155 | this._cancel = this._createCancel(this.options.textCancel, 'search-cancel'); 156 | this._button = this._createButton(this.options.textPlaceholder, 'search-button'); 157 | this._alert = this._createAlert('search-alert'); 158 | 159 | if(this.options.collapsed===false) 160 | this.expand(this.options.collapsed); 161 | 162 | if(this.options.marker) { 163 | 164 | if(this.options.marker instanceof L.Marker || this.options.marker instanceof L.CircleMarker) 165 | this._markerSearch = this.options.marker; 166 | 167 | else if(this._isObject(this.options.marker)) 168 | this._markerSearch = new L.Control.Search.Marker([0,0], this.options.marker); 169 | 170 | this._markerSearch._isMarkerSearch = true; 171 | } 172 | 173 | this.setLayer( this._layer ); 174 | 175 | map.on({ 176 | // 'layeradd': this._onLayerAddRemove, 177 | // 'layerremove': this._onLayerAddRemove 178 | 'resize': this._handleAutoresize 179 | }, this); 180 | return this._container; 181 | }, 182 | addTo: function (map) { 183 | 184 | if(this.options.container) { 185 | this._container = this.onAdd(map); 186 | this._wrapper = L.DomUtil.get(this.options.container); 187 | this._wrapper.style.position = 'relative'; 188 | this._wrapper.appendChild(this._container); 189 | } 190 | else 191 | L.Control.prototype.addTo.call(this, map); 192 | 193 | return this; 194 | }, 195 | 196 | onRemove: function(map) { 197 | this._recordsCache = {}; 198 | // map.off({ 199 | // 'layeradd': this._onLayerAddRemove, 200 | // 'layerremove': this._onLayerAddRemove 201 | // }, this); 202 | map.off({ 203 | // 'layeradd': this._onLayerAddRemove, 204 | // 'layerremove': this._onLayerAddRemove 205 | 'resize': this._handleAutoresize 206 | }, this); 207 | }, 208 | 209 | // _onLayerAddRemove: function(e) { 210 | // //without this, run setLayer also for each Markers!! to optimize! 211 | // if(e.layer instanceof L.LayerGroup) 212 | // if( L.stamp(e.layer) != L.stamp(this._layer) ) 213 | // this.setLayer(e.layer); 214 | // }, 215 | 216 | setLayer: function(layer) { //set search layer at runtime 217 | //this.options.layer = layer; //setting this, run only this._recordsFromLayer() 218 | this._layer = layer; 219 | this._layer.addTo(this._map); 220 | return this; 221 | }, 222 | 223 | showAlert: function(text) { 224 | var self = this; 225 | text = text || this.options.textErr; 226 | this._alert.style.display = 'block'; 227 | this._alert.innerHTML = text; 228 | clearTimeout(this.timerAlert); 229 | 230 | this.timerAlert = setTimeout(function() { 231 | self.hideAlert(); 232 | },this.options.autoCollapseTime); 233 | return this; 234 | }, 235 | 236 | hideAlert: function() { 237 | this._alert.style.display = 'none'; 238 | return this; 239 | }, 240 | 241 | cancel: function() { 242 | this._input.value = ''; 243 | this._handleKeypress({ keyCode: 8 });//simulate backspace keypress 244 | this._input.size = this._inputMinSize; 245 | this._input.focus(); 246 | this._cancel.style.display = 'none'; 247 | this._hideTooltip(); 248 | this.fire('search:cancel'); 249 | return this; 250 | }, 251 | 252 | expand: function(toggle) { 253 | toggle = typeof toggle === 'boolean' ? toggle : true; 254 | this._input.style.display = 'block'; 255 | L.DomUtil.addClass(this._container, 'search-exp'); 256 | if ( toggle !== false ) { 257 | this._input.focus(); 258 | this._map.on('dragstart click', this.collapse, this); 259 | } 260 | this.fire('search:expanded'); 261 | return this; 262 | }, 263 | 264 | collapse: function() { 265 | this._hideTooltip(); 266 | this.cancel(); 267 | this._alert.style.display = 'none'; 268 | this._input.blur(); 269 | if(this.options.collapsed) 270 | { 271 | this._input.style.display = 'none'; 272 | this._cancel.style.display = 'none'; 273 | L.DomUtil.removeClass(this._container, 'search-exp'); 274 | if (this.options.hideMarkerOnCollapse) { 275 | this._map.removeLayer(this._markerSearch); 276 | } 277 | this._map.off('dragstart click', this.collapse, this); 278 | } 279 | this.fire('search:collapsed'); 280 | return this; 281 | }, 282 | 283 | collapseDelayed: function() { //collapse after delay, used on_input blur 284 | var self = this; 285 | if (!this.options.autoCollapse) return this; 286 | clearTimeout(this.timerCollapse); 287 | this.timerCollapse = setTimeout(function() { 288 | self.collapse(); 289 | }, this.options.autoCollapseTime); 290 | return this; 291 | }, 292 | 293 | collapseDelayedStop: function() { 294 | clearTimeout(this.timerCollapse); 295 | return this; 296 | }, 297 | 298 | ////start DOM creations 299 | _createAlert: function(className) { 300 | var alert = L.DomUtil.create('div', className, this._container); 301 | alert.style.display = 'none'; 302 | 303 | L.DomEvent 304 | .on(alert, 'click', L.DomEvent.stop, this) 305 | .on(alert, 'click', this.hideAlert, this); 306 | 307 | return alert; 308 | }, 309 | 310 | _createInput: function (text, className) { 311 | var self = this; 312 | var label = L.DomUtil.create('label', className, this._container); 313 | var input = L.DomUtil.create('input', className, this._container); 314 | input.type = 'text'; 315 | input.size = this._inputMinSize; 316 | input.value = ''; 317 | input.autocomplete = 'off'; 318 | input.autocorrect = 'off'; 319 | input.autocapitalize = 'off'; 320 | input.placeholder = text; 321 | input.style.display = 'none'; 322 | input.role = 'search'; 323 | input.id = input.role + input.type + input.size; 324 | 325 | label.htmlFor = input.id; 326 | label.style.display = 'none'; 327 | label.value = text; 328 | 329 | L.DomEvent 330 | .disableClickPropagation(input) 331 | .on(input, 'keyup', this._handleKeypress, this) 332 | .on(input, 'paste', function(e) { 333 | setTimeout(function(e) { 334 | self._handleKeypress(e); 335 | },10,e); 336 | }, this) 337 | .on(input, 'blur', this.collapseDelayed, this) 338 | .on(input, 'focus', this.collapseDelayedStop, this); 339 | 340 | return input; 341 | }, 342 | 343 | _createCancel: function (title, className) { 344 | var cancel = L.DomUtil.create('a', className, this._container); 345 | cancel.href = '#'; 346 | cancel.title = title; 347 | cancel.style.display = 'none'; 348 | cancel.innerHTML = "";//imageless(see css) 349 | 350 | L.DomEvent 351 | .on(cancel, 'click', L.DomEvent.stop, this) 352 | .on(cancel, 'click', this.cancel, this); 353 | 354 | return cancel; 355 | }, 356 | 357 | _createButton: function (title, className) { 358 | var button = L.DomUtil.create('a', className, this._container); 359 | button.href = '#'; 360 | button.title = title; 361 | 362 | L.DomEvent 363 | .on(button, 'click', L.DomEvent.stop, this) 364 | .on(button, 'click', this._handleSubmit, this) 365 | .on(button, 'focus', this.collapseDelayedStop, this) 366 | .on(button, 'blur', this.collapseDelayed, this); 367 | 368 | return button; 369 | }, 370 | 371 | _createTooltip: function(className) { 372 | var self = this; 373 | var tool = L.DomUtil.create('ul', className, this._container); 374 | tool.style.display = 'none'; 375 | L.DomEvent 376 | .disableClickPropagation(tool) 377 | .on(tool, 'blur', this.collapseDelayed, this) 378 | .on(tool, 'mousewheel', function(e) { 379 | self.collapseDelayedStop(); 380 | L.DomEvent.stopPropagation(e);//disable zoom map 381 | }, this) 382 | .on(tool, 'mouseover', function(e) { 383 | self.collapseDelayedStop(); 384 | }, this); 385 | return tool; 386 | }, 387 | 388 | _createTip: function(text, val) {//val is object in recordCache, usually is Latlng 389 | var tip; 390 | 391 | if(this.options.buildTip) 392 | { 393 | tip = this.options.buildTip.call(this, text, val); //custom tip node or html string 394 | if(typeof tip === 'string') 395 | { 396 | var tmpNode = L.DomUtil.create('div'); 397 | tmpNode.innerHTML = tip; 398 | tip = tmpNode.firstChild; 399 | } 400 | } 401 | else 402 | { 403 | tip = L.DomUtil.create('li', ''); 404 | tip.innerHTML = text; 405 | } 406 | 407 | L.DomUtil.addClass(tip, 'search-tip'); 408 | tip._text = text; //value replaced in this._input and used by _autoType 409 | 410 | if(this.options.tipAutoSubmit) 411 | L.DomEvent 412 | .disableClickPropagation(tip) 413 | .on(tip, 'click', L.DomEvent.stop, this) 414 | .on(tip, 'click', function(e) { 415 | this._input.value = text; 416 | this._handleAutoresize(); 417 | this._input.focus(); 418 | this._hideTooltip(); 419 | this._handleSubmit(); 420 | }, this); 421 | 422 | return tip; 423 | }, 424 | 425 | //////end DOM creations 426 | 427 | _getUrl: function(text) { 428 | return (typeof this.options.url === 'function') ? this.options.url(text) : this.options.url; 429 | }, 430 | 431 | _defaultFilterData: function(text, records) { 432 | 433 | var I, icase, regSearch, frecords = {}; 434 | 435 | text = text.replace(/[.*+?^${}()|[\]\\]/g, ''); //sanitize remove all special characters 436 | if(text==='') 437 | return []; 438 | 439 | I = this.options.initial ? '^' : ''; //search only initial text 440 | icase = !this.options.casesensitive ? 'i' : undefined; 441 | 442 | regSearch = new RegExp(I + text, icase); 443 | 444 | //TODO use .filter or .map 445 | for(var key in records) { 446 | if( regSearch.test(key) ) 447 | frecords[key]= records[key]; 448 | } 449 | 450 | return frecords; 451 | }, 452 | 453 | showTooltip: function(records) { 454 | 455 | 456 | this._countertips = 0; 457 | this._tooltip.innerHTML = ''; 458 | this._tooltip.currentSelection = -1; //inizialized for _handleArrowSelect() 459 | 460 | if(this.options.tooltipLimit) 461 | { 462 | for(var key in records)//fill tooltip 463 | { 464 | if(this._countertips === this.options.tooltipLimit) 465 | break; 466 | 467 | this._countertips++; 468 | 469 | this._tooltip.appendChild( this._createTip(key, records[key]) ); 470 | } 471 | } 472 | 473 | if(this._countertips > 0) 474 | { 475 | this._tooltip.style.display = 'block'; 476 | 477 | if(this._autoTypeTmp) 478 | this._autoType(); 479 | 480 | this._autoTypeTmp = this.options.autoType;//reset default value 481 | } 482 | else 483 | this._hideTooltip(); 484 | 485 | this._tooltip.scrollTop = 0; 486 | 487 | return this._countertips; 488 | }, 489 | 490 | _hideTooltip: function() { 491 | this._tooltip.style.display = 'none'; 492 | this._tooltip.innerHTML = ''; 493 | return 0; 494 | }, 495 | 496 | _defaultFormatData: function(json) { //default callback for format data to indexed data 497 | var self = this, 498 | propName = this.options.propertyName, 499 | propLoc = this.options.propertyLoc, 500 | i, jsonret = {}; 501 | 502 | if( L.Util.isArray(propLoc) ) 503 | for(i in json) 504 | jsonret[ self._getPath(json[i],propName) ]= L.latLng( json[i][ propLoc[0] ], json[i][ propLoc[1] ] ); 505 | else 506 | for(i in json) 507 | jsonret[ self._getPath(json[i],propName) ]= L.latLng( self._getPath(json[i],propLoc) ); 508 | //TODO throw new Error("propertyName '"+propName+"' not found in JSON data"); 509 | return jsonret; 510 | }, 511 | 512 | _recordsFromJsonp: function(text, callAfter) { //extract searched records from remote jsonp service 513 | L.Control.Search.callJsonp = callAfter; 514 | var script = L.DomUtil.create('script','leaflet-search-jsonp', document.getElementsByTagName('body')[0] ), 515 | url = L.Util.template(this._getUrl(text)+'&'+this.options.jsonpParam+'=L.Control.Search.callJsonp', {s: text}); //parsing url 516 | //rnd = '&_='+Math.floor(Math.random()*10000); 517 | //TODO add rnd param or randomize callback name! in recordsFromJsonp 518 | script.type = 'text/javascript'; 519 | script.src = url; 520 | return { abort: function() { script.parentNode.removeChild(script); } }; 521 | }, 522 | 523 | _recordsFromAjax: function(text, callAfter) { //Ajax request 524 | if (window.XMLHttpRequest === undefined) { 525 | window.XMLHttpRequest = function() { 526 | try { return new ActiveXObject("Microsoft.XMLHTTP.6.0"); } 527 | catch (e1) { 528 | try { return new ActiveXObject("Microsoft.XMLHTTP.3.0"); } 529 | catch (e2) { throw new Error("XMLHttpRequest is not supported"); } 530 | } 531 | }; 532 | } 533 | var IE8or9 = ( L.Browser.ie && !window.atob && document.querySelector ), 534 | request = IE8or9 ? new XDomainRequest() : new XMLHttpRequest(), 535 | url = L.Util.template(this._getUrl(text), {s: text}); 536 | 537 | //rnd = '&_='+Math.floor(Math.random()*10000); 538 | //TODO add rnd param or randomize callback name! in recordsFromAjax 539 | 540 | request.open("GET", url); 541 | 542 | 543 | request.onload = function() { 544 | callAfter( JSON.parse(request.responseText) ); 545 | }; 546 | request.onreadystatechange = function() { 547 | if(request.readyState === 4 && request.status === 200) { 548 | this.onload(); 549 | } 550 | }; 551 | 552 | request.send(); 553 | return request; 554 | }, 555 | 556 | _searchInLayer: function(layer, retRecords, propName) { 557 | var self = this, loc; 558 | 559 | if(layer instanceof L.Control.Search.Marker) return; 560 | 561 | if(layer instanceof L.Marker || layer instanceof L.CircleMarker) 562 | { 563 | if(self._getPath(layer.options,propName)) 564 | { 565 | loc = layer.getLatLng(); 566 | loc.layer = layer; 567 | retRecords[ self._getPath(layer.options,propName) ] = loc; 568 | } 569 | else if(self._getPath(layer.feature.properties,propName)) 570 | { 571 | loc = layer.getLatLng(); 572 | loc.layer = layer; 573 | retRecords[ self._getPath(layer.feature.properties,propName) ] = loc; 574 | } 575 | else { 576 | //throw new Error("propertyName '"+propName+"' not found in marker"); 577 | console.warn("propertyName '"+propName+"' not found in marker"); 578 | } 579 | } 580 | else if(layer instanceof L.Path || layer instanceof L.Polyline || layer instanceof L.Polygon) 581 | { 582 | if(self._getPath(layer.options,propName)) 583 | { 584 | loc = layer.getBounds().getCenter(); 585 | loc.layer = layer; 586 | retRecords[ self._getPath(layer.options,propName) ] = loc; 587 | } 588 | else if(self._getPath(layer.feature.properties,propName)) 589 | { 590 | loc = layer.getBounds().getCenter(); 591 | loc.layer = layer; 592 | retRecords[ self._getPath(layer.feature.properties,propName) ] = loc; 593 | } 594 | else { 595 | //throw new Error("propertyName '"+propName+"' not found in shape"); 596 | console.warn("propertyName '"+propName+"' not found in shape"); 597 | } 598 | } 599 | else if(layer.hasOwnProperty('feature'))//GeoJSON 600 | { 601 | if(layer.feature.properties.hasOwnProperty(propName)) 602 | { 603 | if(layer.getLatLng && typeof layer.getLatLng === 'function') { 604 | loc = layer.getLatLng(); 605 | loc.layer = layer; 606 | retRecords[ layer.feature.properties[propName] ] = loc; 607 | } else if(layer.getBounds && typeof layer.getBounds === 'function') { 608 | loc = layer.getBounds().getCenter(); 609 | loc.layer = layer; 610 | retRecords[ layer.feature.properties[propName] ] = loc; 611 | } else { 612 | console.warn("Unknown type of Layer"); 613 | } 614 | } 615 | else { 616 | //throw new Error("propertyName '"+propName+"' not found in feature"); 617 | console.warn("propertyName '"+propName+"' not found in feature"); 618 | } 619 | } 620 | else if(layer instanceof L.LayerGroup) 621 | { 622 | layer.eachLayer(function (layer) { 623 | self._searchInLayer(layer, retRecords, propName); 624 | }); 625 | } 626 | }, 627 | 628 | _recordsFromLayer: function() { //return table: key,value from layer 629 | var self = this, 630 | retRecords = {}, 631 | propName = this.options.propertyName; 632 | 633 | this._layer.eachLayer(function (layer) { 634 | self._searchInLayer(layer, retRecords, propName); 635 | }); 636 | 637 | return retRecords; 638 | }, 639 | 640 | _autoType: function() { 641 | 642 | //TODO implements autype without selection(useful for mobile device) 643 | 644 | var start = this._input.value.length, 645 | firstRecord = this._tooltip.firstChild ? this._tooltip.firstChild._text : '', 646 | end = firstRecord.length; 647 | 648 | if (firstRecord.indexOf(this._input.value) === 0) { // If prefix match 649 | this._input.value = firstRecord; 650 | this._handleAutoresize(); 651 | 652 | if (this._input.createTextRange) { 653 | var selRange = this._input.createTextRange(); 654 | selRange.collapse(true); 655 | selRange.moveStart('character', start); 656 | selRange.moveEnd('character', end); 657 | selRange.select(); 658 | } 659 | else if(this._input.setSelectionRange) { 660 | this._input.setSelectionRange(start, end); 661 | } 662 | else if(this._input.selectionStart) { 663 | this._input.selectionStart = start; 664 | this._input.selectionEnd = end; 665 | } 666 | } 667 | }, 668 | 669 | _hideAutoType: function() { // deselect text: 670 | 671 | var sel; 672 | if ((sel = this._input.selection) && sel.empty) { 673 | sel.empty(); 674 | } 675 | else if (this._input.createTextRange) { 676 | sel = this._input.createTextRange(); 677 | sel.collapse(true); 678 | var end = this._input.value.length; 679 | sel.moveStart('character', end); 680 | sel.moveEnd('character', end); 681 | sel.select(); 682 | } 683 | else { 684 | if (this._input.getSelection) { 685 | this._input.getSelection().removeAllRanges(); 686 | } 687 | this._input.selectionStart = this._input.selectionEnd; 688 | } 689 | }, 690 | 691 | _handleKeypress: function (e) { //run _input keyup event 692 | var self = this; 693 | 694 | switch(e.keyCode) 695 | { 696 | case 27://Esc 697 | this.collapse(); 698 | break; 699 | case 13://Enter 700 | if(this._countertips == 1 || (this.options.firstTipSubmit && this._countertips > 0)) { 701 | if(this._tooltip.currentSelection == -1) { 702 | this._handleArrowSelect(1); 703 | } 704 | } 705 | this._handleSubmit(); //do search 706 | break; 707 | case 38://Up 708 | this._handleArrowSelect(-1); 709 | break; 710 | case 40://Down 711 | this._handleArrowSelect(1); 712 | break; 713 | case 8://Backspace 714 | case 45://Insert 715 | case 46://Delete 716 | this._autoTypeTmp = false;//disable temporarily autoType 717 | break; 718 | case 37://Left 719 | case 39://Right 720 | case 16://Shift 721 | case 17://Ctrl 722 | case 35://End 723 | case 36://Home 724 | break; 725 | default://All keys 726 | if(this._input.value.length) 727 | this._cancel.style.display = 'block'; 728 | else 729 | this._cancel.style.display = 'none'; 730 | 731 | if(this._input.value.length >= this.options.minLength) 732 | { 733 | clearTimeout(this.timerKeypress); //cancel last search request while type in 734 | this.timerKeypress = setTimeout(function() { //delay before request, for limit jsonp/ajax request 735 | 736 | self._fillRecordsCache(); 737 | 738 | }, this.options.delayType); 739 | } 740 | else 741 | this._hideTooltip(); 742 | } 743 | 744 | this._handleAutoresize(); 745 | }, 746 | 747 | searchText: function(text) { 748 | var code = text.charCodeAt(text.length); 749 | 750 | this._input.value = text; 751 | 752 | this._input.style.display = 'block'; 753 | L.DomUtil.addClass(this._container, 'search-exp'); 754 | 755 | this._autoTypeTmp = false; 756 | 757 | this._handleKeypress({keyCode: code}); 758 | }, 759 | 760 | _fillRecordsCache: function() { 761 | 762 | var self = this, 763 | inputText = this._input.value, records; 764 | 765 | if(this._curReq && this._curReq.abort) 766 | this._curReq.abort(); 767 | //abort previous requests 768 | 769 | L.DomUtil.addClass(this._container, 'search-load'); 770 | 771 | if(this.options.layer) 772 | { 773 | //TODO _recordsFromLayer must return array of objects, formatted from _formatData 774 | this._recordsCache = this._recordsFromLayer(); 775 | 776 | records = this._filterData( this._input.value, this._recordsCache ); 777 | 778 | this.showTooltip( records ); 779 | 780 | L.DomUtil.removeClass(this._container, 'search-load'); 781 | } 782 | else 783 | { 784 | if(this.options.sourceData) 785 | this._retrieveData = this.options.sourceData; 786 | 787 | else if(this.options.url) //jsonp or ajax 788 | this._retrieveData = this.options.jsonpParam ? this._recordsFromJsonp : this._recordsFromAjax; 789 | 790 | this._curReq = this._retrieveData.call(this, inputText, function(data) { 791 | 792 | self._recordsCache = self._formatData.call(self, data); 793 | 794 | //TODO refact! 795 | if(self.options.sourceData) 796 | records = self._filterData( self._input.value, self._recordsCache ); 797 | else 798 | records = self._recordsCache; 799 | 800 | self.showTooltip( records ); 801 | 802 | L.DomUtil.removeClass(self._container, 'search-load'); 803 | }); 804 | } 805 | }, 806 | 807 | _handleAutoresize: function() { 808 | var maxWidth; 809 | 810 | if (this._input.style.maxWidth !== this._map._container.offsetWidth) { 811 | maxWidth = this._map._container.clientWidth; 812 | 813 | // other side margin + padding + width border + width search-button + width search-cancel 814 | maxWidth -= 10 + 20 + 1 + 30 + 22; 815 | 816 | this._input.style.maxWidth = maxWidth.toString() + 'px'; 817 | } 818 | 819 | if (this.options.autoResize && (this._container.offsetWidth + 20 < this._map._container.offsetWidth)) { 820 | this._input.size = this._input.value.length < this._inputMinSize ? this._inputMinSize : this._input.value.length; 821 | } 822 | }, 823 | 824 | _handleArrowSelect: function(velocity) { 825 | 826 | var searchTips = this._tooltip.hasChildNodes() ? this._tooltip.childNodes : []; 827 | 828 | for (i=0; i= (searchTips.length - 1))) {// If at end of list. 832 | L.DomUtil.addClass(searchTips[this._tooltip.currentSelection], 'search-tip-select'); 833 | } 834 | else if ((velocity == -1 ) && (this._tooltip.currentSelection <= 0)) { // Going back up to the search box. 835 | this._tooltip.currentSelection = -1; 836 | } 837 | else if (this._tooltip.style.display != 'none') { 838 | this._tooltip.currentSelection += velocity; 839 | 840 | L.DomUtil.addClass(searchTips[this._tooltip.currentSelection], 'search-tip-select'); 841 | 842 | this._input.value = searchTips[this._tooltip.currentSelection]._text; 843 | 844 | // scroll: 845 | var tipOffsetTop = searchTips[this._tooltip.currentSelection].offsetTop; 846 | 847 | if (tipOffsetTop + searchTips[this._tooltip.currentSelection].clientHeight >= this._tooltip.scrollTop + this._tooltip.clientHeight) { 848 | this._tooltip.scrollTop = tipOffsetTop - this._tooltip.clientHeight + searchTips[this._tooltip.currentSelection].clientHeight; 849 | } 850 | else if (tipOffsetTop <= this._tooltip.scrollTop) { 851 | this._tooltip.scrollTop = tipOffsetTop; 852 | } 853 | } 854 | }, 855 | 856 | _handleSubmit: function() { //button and tooltip click and enter submit 857 | 858 | this._hideAutoType(); 859 | 860 | this.hideAlert(); 861 | this._hideTooltip(); 862 | 863 | if(this._input.style.display == 'none') //on first click show _input only 864 | this.expand(); 865 | else 866 | { 867 | if(this._input.value === '') //hide _input only 868 | this.collapse(); 869 | else 870 | { 871 | var loc = this._getLocation(this._input.value); 872 | 873 | if(loc===false) 874 | this.showAlert(); 875 | else 876 | { 877 | this.showLocation(loc, this._input.value); 878 | this.fire('search:locationfound', { 879 | latlng: loc, 880 | text: this._input.value, 881 | layer: loc.layer ? loc.layer : null 882 | }); 883 | } 884 | } 885 | } 886 | }, 887 | 888 | _getLocation: function(key) { //extract latlng from _recordsCache 889 | 890 | if( this._recordsCache.hasOwnProperty(key) ) 891 | return this._recordsCache[key];//then after use .loc attribute 892 | else 893 | return false; 894 | }, 895 | 896 | _defaultMoveToLocation: function(latlng, title, map) { 897 | if(this.options.zoom) 898 | this._map.setView(latlng, this.options.zoom); 899 | else 900 | this._map.panTo(latlng); 901 | }, 902 | 903 | showLocation: function(latlng, title) { //set location on map from _recordsCache 904 | var self = this; 905 | 906 | self._map.once('moveend zoomend', function(e) { 907 | 908 | if(self._markerSearch) { 909 | self._markerSearch.addTo(self._map).setLatLng(latlng); 910 | } 911 | 912 | }); 913 | 914 | self._moveToLocation(latlng, title, self._map); 915 | //FIXME autoCollapse option hide self._markerSearch before visualized!! 916 | if(self.options.autoCollapse) 917 | self.collapse(); 918 | 919 | return self; 920 | } 921 | }); 922 | 923 | L.Control.Search.Marker = L.Marker.extend({ 924 | 925 | includes: L.version[0]==='1' ? L.Evented.prototype : L.Mixin.Events, 926 | 927 | options: { 928 | icon: new L.Icon.Default(), 929 | animate: true, 930 | circle: { 931 | radius: 10, 932 | weight: 3, 933 | color: '#e03', 934 | stroke: true, 935 | fill: false 936 | } 937 | }, 938 | 939 | initialize: function (latlng, options) { 940 | L.setOptions(this, options); 941 | 942 | if(options.icon === true) 943 | options.icon = new L.Icon.Default(); 944 | 945 | L.Marker.prototype.initialize.call(this, latlng, options); 946 | 947 | if( L.Control.Search.prototype._isObject(this.options.circle) ) 948 | this._circleLoc = new L.CircleMarker(latlng, this.options.circle); 949 | }, 950 | 951 | onAdd: function (map) { 952 | L.Marker.prototype.onAdd.call(this, map); 953 | if(this._circleLoc) { 954 | map.addLayer(this._circleLoc); 955 | if(this.options.animate) 956 | this.animate(); 957 | } 958 | }, 959 | 960 | onRemove: function (map) { 961 | L.Marker.prototype.onRemove.call(this, map); 962 | if(this._circleLoc) 963 | map.removeLayer(this._circleLoc); 964 | }, 965 | 966 | setLatLng: function (latlng) { 967 | L.Marker.prototype.setLatLng.call(this, latlng); 968 | if(this._circleLoc) 969 | this._circleLoc.setLatLng(latlng); 970 | return this; 971 | }, 972 | 973 | _initIcon: function () { 974 | if(this.options.icon) 975 | L.Marker.prototype._initIcon.call(this); 976 | }, 977 | 978 | _removeIcon: function () { 979 | if(this.options.icon) 980 | L.Marker.prototype._removeIcon.call(this); 981 | }, 982 | 983 | animate: function() { 984 | //TODO refact animate() more smooth! like this: http://goo.gl/DDlRs 985 | if(this._circleLoc) 986 | { 987 | var circle = this._circleLoc, 988 | tInt = 200, //time interval 989 | ss = 5, //frames 990 | mr = parseInt(circle._radius/ss), 991 | oldrad = this.options.circle.radius, 992 | newrad = circle._radius * 2, 993 | acc = 0; 994 | 995 | circle._timerAnimLoc = setInterval(function() { 996 | acc += 0.5; 997 | mr += acc; //adding acceleration 998 | newrad -= mr; 999 | 1000 | circle.setRadius(newrad); 1001 | 1002 | if(newrad]+)>)/ig,"")};var m={_init:function(b,d){var c=this;this.settings=a.extend({},a.fn.multi_select.defaults,d);this.$el=a(b);this.selectedValues=[];this.basicClass="multi-button";this.selectColors="green blue aqua red yellow maroon purple".split(" ");var e=this.settings;a(b).each(function(){a(this).css({position:"relative",width:e.buttonWidth});$wrapper=c._styleElement(a(this));$list=c._createList(a(this));a(this).append($list); 10 | a(this).data("list",$list);c._addEvents(this);c._setSelected()})},init:function(){this._init.call(this,this.$el,this.settings)},_createList:function(b){var d=this,c=d.settings,e=this.getData(),g=c.selectedIndexes;c=c.listMaxHeight;var h={};c&&(h={"overflow-x":"hidden","overflow-y":"auto",display:"none","max-height":c});var f=a("