WME Bookmarks

Bookmark, share your favourite places

  1. // ==UserScript==
  2. // @name WME Bookmarks
  3. // @description Bookmark, share your favourite places
  4. // @version 2024.08.26.001
  5. // @icon data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAGjElEQVR4nGJgGGAAAAAA//9ipETz3r17nf/8+RvDwsK8xNnZeS85ZgAAAAD//2KhxAE/f/3uYGZmNvn567cOAwODKTlmAAAAAP//YqLEAX///tURFRFh+PPnj8m+ffvEyTEDAAAA//8i2wG7d+/JZmNj4xAVFWHg4eFh+PP3bxo55gAAAAD//yLbAX/+/gkSEhJk4OLiYhASEmL48+evHznmAAAAAP//It8Bf/5aiQiLMLCwsDCIiUKigRxzAAAAAP//IssBe/bsCWdjY+Pg5eVhYGRkZODk5GTg4uJk2L17dzapZgEAAAD//yLLAb9//4ng4+NlYGFhYfj//z8DExMTg7CwMMPv33+CSDULAAAA//8iywG/fv+2ExYSYvj79y8c8/PzM/z6/duKVLMAAAAA//8i2QF79uxxZmJiEuLl5WX49+8f3AGcHBwMLCwsHLt27SIpGgAAAAD//yLZAT9//srh5+NjYGBgYPjz5w8cMzAwMAgICDD8+vWbpGgAAAAA//9iZGBgYFi/YePjv3//yhCrSUNdnUFAgB9F7P///wwfPn5kuHnzFtGWMzMzPwEAAAD//2zVsRGAIBAF0b3DFCNmPOtQ+69GAiwBhm8BGu+8eBeAMUbZYyMicHcww+1/E2ZGSone+6etOXOdB5J+rSTmnEiitYe71vICAAD//2JhYGBgEBTgN3vx8uXqZ89fqMvLyTIICQkx/IVqoBZghHro06dPDA8fPWb48/v3EwEBgQQAAAAA//9C8eaGDRsXfvr0KU5CUoJBRlqagYGBgeHv378UW87MzMzAxMTE8PTpU4anT58x8PHxLQoI8I9nYGBgAAAAAP//wgjnHTt3Or969XohOxubtKKiIgMHBzvD79+/4T4gBfz//5+BlZWV4fv37wwPHz1m+Pb163txcbFsT0/P5TA1AAAAAP//wmrq3r17xd+8eTvr48ePfjKyMgwS4uIMv3//Jik0mJiYGNjY2BjevH3L8PDBQwZuHu6D4mJi4c7Ozi+R1QEAAAD//8LrrS1bt0Y+fPBwHr+AAIeSogLD79+/Gf79+0e05ffu32f48P7DDxkZmTJ/f7/J2NQCAAAA//8iGK579uwRf/jo8favX74YysrJMnCwsxN0wO/ffxgeP3nMwMLCeltBQT7U3c3tIi61AAAAAP//IlgQubi4vOTi4jzKwcnJwMLMzPDjxw+C+P//fwxcXFwMHOzsN/FZzsDAwAAAAAD//yKqSfbyxYtgUVExhs+fPxOjnIGBAVIm3Lt/35aQOgAAAAD//yIYAtu3bzf49PmLJCw1I+OfP38ycHJyMvz+/RtD7s+fPwy/f/3m37x5ixs+8wEAAAD//yLogNevX6dyc3MxfPz4ASWYGRgYGPj5+RnevHnDwMvLy8DExIQi//HjRwYeHh6GZ8+eFeAzHwAAAP//IhgFjx4/DhIWEmb4+vUrXExYWJiBmZmF4dq16ww/fvz4+ezZc3ZVVVUGFhYWhvfv3zP8+/eP4ffv3wzcPDwMT58+w1tFAwAAAP//whsCW7dtM/z08ZMEIyMDvOwXFxdn+P7jB8OlS5cYBAUFdrS0NHNISkqsuHDhAsPnz18YREVFGZiYmBh+//7N8Of3H4ZfP3/wb9y40R2XHQAAAAD//8LrgOfPnqXz8PIyfP36lYGTk5NBXFyc4f79+wy3bt3+pa+vV5ydne3JwMDAkJaWFmlqahJ/7/79X/fv32cQFRVl4ObmZvjy5TMDLy8fw8NHjwpw2QEAAAD//8LrgPv37weys7Ey8PDwMHBxcTGcO3ee4dev3/cdHewtIiMj+5DVhoaGLnJ3c5X/9ev3/XPnzjOwsrIyCAgIMLCzszE8efwEZzQAAAAA///C6YAtW7YYfvz4SUxeXp7h67dvDGfOnGWQk5db1dBQr+Tt7X0emx5XV9cXDQ31SioqKrPOn7/A8P79ewYpKSmGP39+861bt84Tmx4AAAAA///C6YAHDx5m8/PzM1y8eInh+rVrvy0szNNzc3IicalHBunpaekODvYB9x88+HLmzBkGfn4BhocPHyZjUwsAAAD//1TOrQ7CMBQG0N37fbd6WIbiJ0tJikHwKogG1Ucupgo3kk0xOiwKwROc8xcQEaeqK5K7eX7VUkozTuMzhHBNKd2dcxczO5HsAWwBrAF0ADYAOpJ7kt7MzjHG6ej97V3rI+fcLMtnIHlQ1VZE7Gd+AQAA//8acAQAAAD//wMA0QVN81BfUzsAAAAASUVORK5CYII=
  6. // @include https://www.waze.com/editor*
  7. // @include https://www.waze.com/*/editor*
  8. // @include https://beta.waze.com/*
  9. // @exclude https://www.waze.com/user/*
  10. // @exclude https://www.waze.com/*/user/*
  11. // @namespace https://gf.qytechs.cn/fr/scripts/4515-wme-bookmarks
  12. // @connect limageenboite.fr
  13. // @grant GM_addElement
  14. // @grant GM_xmlhttpRequest
  15. // @author Sebiseba
  16. // @copyright Sebiseba 2014-2023
  17. // @require https://gf.qytechs.cn/scripts/24851-wazewrap/code/WazeWrap.js
  18. // ==/UserScript==
  19.  
  20. /* global W, WazeWrap, $, I18n, OpenLayers, require */
  21. /* jshint -W097 */
  22. 'use strict';
  23.  
  24. // Thanks
  25. // All beta testers
  26. // Bellhouse for German translation
  27.  
  28. /******** BOOKMARKS ***********/
  29.  
  30. const BKM_UPDATE_NOTES = `<b>NEW:</b><br>
  31. <b>FIXES:</b><br>
  32. - Update for new WME<br><br>`;
  33.  
  34. async function onWazeWrapReady() {
  35. var BKMversion = GM_info.script.version, timer, histoNavTimer, link={}, bookmarks_Layer=[], countries=[], countriesS=[], count = 0, debug = 0; // Script variables
  36. var lang, text1, text2, text3, tset; // Language variables
  37. var BKMusername, BKMcountryActive, BKMEditHandle, BKMmapSearch; // DOM variables
  38. var _oldP='', _newP='', _prev=[], _next=[], _cur='', _stopUpdPos=false; // Prev/Next variables
  39.  
  40. // *************
  41. // ** ICONS **
  42. // *************
  43.  
  44. var di = 'data:image/png;base64,';
  45. var iconAddLinkMap = di + 'iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAO4SURBVHjarJVbTBx1FMZ/MzvsbheXQEthy02DNPVlpUpKmgj2sgaykkrbUGolJqaYlIcaE9OGtighGtN6SV80xhgftGkffFAiTcEaaIwmNlqKdgtJoaQsl3Ip2AuwLOzuzPFhBhVlKS3+k8n/zMw53/edL/M/AytdL4qbCsmhVDQAdsmC1+qKCXTeeOxx+nFxHAQalf+XQBGMrFTwP8shdvE+CJTLCgnmbSiTFJwUBnphPASb8jlMBYfZZ+X55SHA59U9LxuUffJj5ZciaSdE8Il4G0SeqhOhSD5ARAFQHqqDUim0pdBYU0XGuSEIDgDjwCXI88E6FX46z0kCHFqcYIfA2TjcZbLRlcHPr5SzqikIQ0EgDNwCgkB/BG+lnelh6LtObfwOyuQoIXSEERRGmKEDF3s9G/nEvxWagzA2CkxZ4KOAgJYCsZ5JVq99hNvXh5awqELk1d0wK0SvdBMZHSOUlc7qZ7agne6Au7eBSWDMuuZAyQIJTII7qZjA+SBrnpT4BH7xr0rlbEUltow1kJ0Ed8LwXhtM37PA55VPAZnAkAFOtZxflCZKBL5X4nTwgkCTAltlr93DmWI/togDIhG4FYK+a8BNS/kUkAPKoCEyrR5nM29yE+GCCX3/r8gvfpuT5i07YTxmdjE8CMZF4B6QCspEBJnUfqDPtu3f5UscNJ+5tSgteg8nLn4LbmAuDOockA44wRYBuSu/02fbRu5/LV+CoA0Ah+Oruny6j+SGmWz/hqhHB6cKig2e2Ax630QXHsd2AG4oskwCU72mnTpWW1v59kefbcA1MZyktl8OXT1j8KgdEgwgCnhSe3EQjjcW1EVtoQ1V/Xx/Tc3L7+6pRG1uBs1hR/7omsGp7u9qnIrlrYUEQLFRwA3ctDzAUNC0U8cOHhS51CFSVy/yXOmM5OUFAvBSJgDr5qpI79Xzq0WcPpkiecSzDNgcACUh4XRdfb3oVztNcF/JtKxf3zkCmzIXpHulnOSAOAtmBXt79n3AC6z948IDB0Q6O0WOHDWVm+AkL7CwyPK7QHbg7u0mbSJtWdZ4vb3XBgdFGt4xwXNzrwT+Vu5bmFy07Fn/unnilE9PtraKtLaJUVI6I9nZv/aAL2tR8Adfe56urpbpgQGRqiqZhQ8b/vlXXAmyBijp6a/tNgwSi4svf9ff/9YX0PIbeLwQ04EYYIAWg1jUHMp6BMJzZkwMdN2KDYiKFf+lTnG5vk5KTExxj49vv2MeH08c1TGrUBcIG9ZDMe/n4+iCij8HAJTXkX9j47cVAAAAAElFTkSuQmCC';
  46.  
  47. // *********************
  48. // ** HELPER FUNCTION **
  49. // *********************
  50.  
  51. function getId(node) { return document.getElementById(node); }
  52. function getElementsByClassName(classname, node) {
  53. node || (node = document.getElementsByTagName('body') [0]);
  54. for (var a = [], re = new RegExp('\\b' + classname + '\\b'), els = node.getElementsByTagName('*'), i = 0, j = els.length; i < j; i++) { re.test(els[i].className) && a.push(els[i]); }
  55. return a;
  56. }
  57. function getLink(pl) {
  58. var a=pl.split('?'), b=a[1].split('&');
  59. link.MP="0"
  60. link.UR="0"
  61. link.MC="0";
  62. for (var i = 0; b[i]; i++) {
  63. var e = b[i].split('=');
  64. switch(e[0]){
  65. case 'env': link.env = e[1]; break;
  66. case "lat": link.lat = e[1]; break;
  67. case 'lon': link.lon = e[1]; break;
  68. case 'zoomLevel': link.zoom = e[1]; break;
  69. case "layers": link.layers = e[1]; break; // old format
  70. case "s": link.layers = e[1]; break; // new format
  71. case 'mapProblem': link.MP = e[1]; break;
  72. case 'mapUpdateRequest': link.UR = e[1]; break;
  73. case 'mapComments': link.MC = e[1]; break;
  74. case 'segments': link.segments = e[1]; break;
  75. case 'nodes': link.nodes = e[1]; break;
  76. case 'venues': link.venues = e[1]; break;
  77. default: break;
  78. }
  79. }
  80. //Object.keys(link).sort();
  81. }
  82. function getName() {
  83. var name, topCity = W.model.topCityId;
  84. if (topCity == null) { name = lang[16]; }
  85. else {
  86. name = W.model.cities.getObjectById(topCity).attributes.name;
  87. if (name === undefined) { name = lang[16]; }
  88. else { name = W.model.cities.getObjectById(topCity).attributes.name; }
  89. }
  90. return name;
  91. }
  92. function isJsonString(str) {
  93. try { JSON.parse(str); }
  94. catch (e) { return false; }
  95. return true;
  96. }
  97. function pad(str) {
  98. str = str.toString();
  99. return str.length < 2 ? pad('0' + str, 2) : str;
  100. }
  101. function toTimestamp(remDate,remTime){
  102. var d = remDate.split("-");
  103. var t = remTime.split(":");
  104. var datum = new Date(d[0], d[1]-1, d[2], t[0], t[1]).getTime();
  105. return datum;
  106. }
  107. function checkReminder() {
  108. var toSave=[], a = JSON.parse(localStorage.WMEBookmarks);
  109. for (var p in a) {
  110. if(!a.hasOwnProperty(p)) continue;
  111.  
  112. //Redo Bookmark
  113. var bNew={};
  114. bNew.country=a[p].country;
  115. bNew.name=a[p].name;
  116. bNew.perma=a[p].perma;
  117. bNew.comm=a[p].comm;
  118. bNew.share=a[p].share;
  119. bNew.reminder=a[p].reminder;
  120. if (a[p].reminder != null && a[p].reminder != "" && a[p].reminder < Date.now()) {
  121. if (debug) { console.log('WME Bookmarks: Check Reminder', a[p].reminder); }
  122. bNew.reminder=null;
  123. WazeWrap.Alerts.info("WME Bookmarks", a[p].name+"\n"+a[p].comm, true, false);
  124. if (getId('chkSynchro').checked === true) {
  125. if (debug) { console.log('WME Bookmarks: UPDATE', BKMusername, bNew); }
  126. BKMupdateBookmarks('UPDATE',BKMusername, bNew, '');
  127. }
  128. }
  129. //Store Bookmark
  130. toSave.push(bNew);
  131. }
  132. localStorage.setItem('WMEBookmarks', JSON.stringify(toSave));
  133. }
  134. function addScriptsMenu() {
  135. if (typeof getElementsByClassName('collapsible-GROUP__SCRIPTS', getId('layer-switcher-region')) [0] != 'object') {
  136. if ('undefined' === typeof localStorage.posScriptMenu) { localStorage.setItem('posScriptMenu', '["top"]'); }
  137.  
  138. var menuParent = getElementsByClassName('togglers', getId('layer-switcher-region')) [0];
  139.  
  140. var scriptMenu = document.createElement('li');
  141. scriptMenu.className="group";
  142.  
  143. var scriptMenuContent = document.createElement('div');
  144. scriptMenuContent.className='layer-switcher-toggler-tree-category';
  145. scriptMenuContent.innerHTML='<wz-button id="developScript" color="clear-icon" size="xs"><i class="toggle-category w-icon w-icon-caret-down"></i></wz-button>'+
  146. '<wz-toggle-switch disabled="false" checked id="layer-switcher-group__scripts" class="layer-switcher-group__scripts" tabindex="0" name="" value=""></wz-toggle-switch>'+
  147. '<label class="label-text" for="layer-switcher-group__scripts">Scripts</label>';
  148. scriptMenu.appendChild(scriptMenuContent);
  149. var groupScripts = document.createElement('ul');
  150. groupScripts.className="collapsible-GROUP__SCRIPTS";
  151. scriptMenu.appendChild(groupScripts);
  152.  
  153. if (JSON.parse(localStorage.posScriptMenu)[0] == 'top') { menuParent.insertBefore(scriptMenu, menuParent.firstChild); }
  154. else { menuParent.appendChild(scriptMenu); }
  155.  
  156. getId('developScript').addEventListener('click', function(e) {
  157. if (groupScripts.className == 'collapsible-GROUP__SCRIPTS') {
  158. groupScripts.className='collapsible-GROUP__SCRIPTS collapse-layer-switcher-group';
  159. this.innerHTML='<i class="toggle-category w-icon w-icon-caret-down upside-down"></i>';
  160. } else {
  161. groupScripts.className='collapsible-GROUP__SCRIPTS';
  162. this.innerHTML='<i class="toggle-category w-icon w-icon-caret-down"></i>';
  163. }
  164. });
  165. getId('layer-switcher-group__scripts').addEventListener('click', function(e) {
  166. if (groupScripts.className == 'collapsible-GROUP__SCRIPTS') {
  167. groupScripts.className='collapsible-GROUP__SCRIPTS collapse-layer-switcher-group';
  168. getId('developScript').innerHTML='<i class="toggle-category w-icon w-icon-caret-down upside-down"></i>';
  169. } else {
  170. groupScripts.className='collapsible-GROUP__SCRIPTS';
  171. getId('developScript').innerHTML='<i class="toggle-category w-icon w-icon-caret-down"></i>';
  172. }
  173. });
  174.  
  175. var lng = I18n.locale;
  176. if (lng == 'fr') { var title="Position menu des scripts", top="En haut", bottom="En bas"; }
  177. else if (lng == 'es') { var title="Posición del menú de script", top="En alto", bottom="Abajo"; }
  178. else { var title="Scripts menu position", top="On top", bottom="On bottom"; }
  179.  
  180. var optionPosMenu=document.createElement('div');
  181. optionPosMenu.className='settings__form-group';
  182. optionPosMenu.innerHTML='<wz-label html-for="">'+title+'</wz-label><span style="padding-right:15px;">'+bottom+' </span><wz-toggle-switch name="posScriptMenu" id="posScriptMenu" checked='+(JSON.parse(localStorage.posScriptMenu)[0] == 'top' ? "true":"false")+' class="alert-settings-visibility-toggle" tabindex="0" value=""> '+top+'<input type="checkbox" name="posScriptMenu" value="" style="display: none; visibility: hidden;"></wz-toggle-switch>';
  183. getElementsByClassName('settings__form', getId('sidepanel-prefs')) [0].appendChild(optionPosMenu);
  184. getId('posScriptMenu').addEventListener('click', function(e) {
  185. menuParent.removeChild(scriptMenu);
  186. if (getId('posScriptMenu').checked == true) {
  187. menuParent.insertBefore(scriptMenu, menuParent.firstChild);
  188. localStorage.setItem('posScriptMenu', JSON.stringify(["top"]));
  189. } else {
  190. menuParent.appendChild(scriptMenu);
  191. localStorage.setItem('posScriptMenu', JSON.stringify(["bottom"]));
  192. }
  193. })
  194.  
  195. if ('undefined' === typeof localStorage.posScriptMenu || !isJsonString(localStorage.posScriptMenu)) { localStorage.setItem('posScriptMenu', '[]'); }
  196. }
  197. }
  198.  
  199. // ****************
  200. // ** MAIN HTML **
  201. // ****************
  202. var waitforzoom = 1
  203. function BKMinit() {
  204. if (W.model.getTopCountry().attributes === null) {
  205. //Create content
  206. if (waitforzoom == 1) {
  207. waitforzoom = 0;
  208. var zoom = document.createElement('section');
  209. zoom.id = 'bookmarks-zoom';
  210. var content = '<div style="float:left;margin-left:5px;color:red;text-align: center;"><b><u>Zoom in to start WME Bookmarks</u></b></div>';
  211. zoom.innerHTML = content;
  212. zoom.id = 'sidepanel-bookmarks-zoom';
  213. zoom.className = 'sidepanel-bookmarks-zoom';
  214. tab.appendChild(zoom);
  215. }
  216. setTimeout(BKMinit, 500); return;
  217. } else if (waitforzoom == 0) {
  218. document.querySelector("#sidepanel-bookmarks-zoom > div").style.display = 'none';
  219. }
  220. BKMusername = W.loginManager.user.attributes.userName;
  221. BKMcountryActive = W.model.getTopCountry().attributes.name;
  222.  
  223. BKMEditHandle = getElementsByClassName('secondary-toolbar-actions', getId('toolbar')) [0];
  224. BKMmapSearch = getElementsByClassName('search-query', getId('search')) [0];
  225.  
  226. // Verify localStorages
  227. if ('undefined' === typeof localStorage.WMEBookmarks || !isJsonString(localStorage.WMEBookmarks)) { localStorage.setItem('WMEBookmarks', '[]'); }
  228. if ('undefined' === typeof localStorage.WMEBookmarksShared || !isJsonString(localStorage.WMEBookmarksShared)) { localStorage.setItem('WMEBookmarksShared', '[]'); }
  229. if ('undefined' === typeof localStorage.WMEHistoric || !isJsonString(localStorage.WMEHistoric)) { localStorage.setItem('WMEHistoric', '[]'); }
  230. if ('undefined' === typeof localStorage.WMECopyPastePOI || !isJsonString(localStorage.WMECopyPastePOI)) { localStorage.setItem('WMECopyPastePOI', '[]'); }
  231. if ('undefined' === typeof localStorage.WMEBookmarksSettings || !isJsonString(localStorage.WMEBookmarksSettings)) { localStorage.setItem('WMEBookmarksSettings', '{"version":'+null+',"zoom":true,"layers":true,"layersPaste":true,"server":false,"synchro":true,"backup":"ins","lclic":false,"lcopy":false}'); }
  232. if ('undefined' === typeof localStorage.WMEPrevNext || !isJsonString(localStorage.WMEPrevNext)) { localStorage.setItem('WMEPrevNext', '{"prev":[],"next":[]}'); }
  233. BMKcheckStorage();
  234.  
  235. // Translation
  236. var BKMLang = I18n.locale;
  237. if (BKMLang == 'fr') {
  238. lang = new Array('Favoris', 'Partage des amis', 'Partage ', 'Historique', 'Sauvegarde / Restauration', 'Synchroniser', 'Nom', 'Copier / Restaurer POI', 'Valider', 'Annuler', 'Ajouter', 'Supprimer', 'Partager', 'Relocaliser', 'Commentaire', 'Changer', 'Sans Nom', 'Chercher une adresse, un lieu, ID ou permalien', 'C\'est parti !', 'Erreur', 'Réussi !', 'Stop', 'Paramètres', 'Pseudos', 'Rappel');
  239. text1 = ' Copiez ces données dans un fichier TXT pour les conserver.<br/>Collez vos données pour les restaurer.';
  240. text2 = ' Écrivez les pseudos avec qui vous souhaitez partager le favoris. Le séparateur se mettra automatiquement.';
  241. text3 = ' Lorsque vous êtes synchronisé avec le serveur, le script envoie des données à celui-ci.<br>Les données sont: Pseudo, coordonnées, pays, nom du favoris, commentaires et pseudo des partages.<br>Effacer les données serveur du script supprime toutes traces de votre profil.';
  242. tset = new Array('Appliquer le zoom', 'Appliquer les calques (depuis les favoris)', 'Changement auto de serveur (usa/intl)', 'Synchroniser avec le serveur du script', 'Effacer les données locales', 'Effacer les données serveur du script', 'Tri : Favoris le plus récent en haut','Appliquer les calques (depuis la recherche)','Effacer l\'historique','Nouveau','Ajouter','Coloriser le dernier lien visité','Activer le copier/restaurer des POI','Activer l\'historique de navigation','Sélectionner les objets de l\'historique');
  243. }
  244. else if (BKMLang == 'de') {
  245. lang = new Array('Favoriten', 'Von Freunden geteilt', 'Teilen ', 'Verlauf', 'Sichern / Wiederherstellen', 'Synchronisieren', 'Name', 'POI kopieren / wiederherstellen', 'Abschicken', 'Abbrechen', 'Hinzufügen', 'Löschen', 'Teilen', 'Ort aktualisieren', 'Kommentar', 'Ändern', '(ohne Namen)', 'Adresse, Ort, ID oder Permalink suchen', 'Auf geht\'s!', 'Fehler', 'Erfolgreich!', 'Stop', 'Einstellungen', 'Usernamen','Erinnern');
  246. text1 = ' Daten zur Sicherung in eine TXT-Datei sichern.<br/>Zur Wiederherstellung Daten hier einfügen.';
  247. text2 = ' Usernamen des Users eintragen, mit dem du den Favoriten teilen willst. Trennzeichen werden automatisch eingefügt.';
  248. text3 = ' Beim Synchronisieren mit dem Server werden folgende Daten übermittelt:<br>Username, Koordinaten, Land, Name des Favoriten, Kommentare und Usernamen, mit denen geteilt wurde.<br>Server-Daten löschen entfernt alle deiner Spuren auf dem Server.';
  249. tset = new Array('Zoomstufe sichern', 'Ebenen sichern (da favoriten)', 'Server automatisch wechseln (US/ROW)', 'Mit Server synchronisieren', 'Lokale Daten löschen', 'Server-Daten löschen', 'Sortieren : Letzte Favoriten oben', 'Ebenen sichern (da suchleiste)','Verlauf löschen','Neue','Hinzufügen','Markiere den zuletzt besuchten Link','Aktivieren Sie Kopieren / Wiederherstellen POI','Browserverlauf aktivieren','Objektauswahl aus dem Verlauf zulassen');
  250. }
  251. else {
  252. lang = new Array('Bookmarks', 'Friends\'s Sharing', 'Sharing ', 'Historic', 'Backup / Restore', 'Synchronization', 'Name', 'Copy / Restore POI', 'Submit', 'Cancel', 'Add', 'Delete', 'Share', 'Relocate', 'Comment', 'Change', 'Unnamed', 'Search for an address, place, ID or permalink', 'Let\'s Go !', 'Error', 'Success !', 'Stop', 'Settings', 'Nicknames','Reminder');
  253. text1 = ' Copy data into a TXT file to preserve them.<br/>Paste your data to restore them.';
  254. text2 = ' Write the nick you want to share the bookmark. The separator will be inserted automatically';
  255. text3 = ' When you are synchronized with the server, the script sends data to it <br>Data is: Nickname, coordinates, country, name of bookmarks, comments and nicknames shares <br> Clear script data server deletes all traces of your profile.';
  256. tset = new Array('Apply Zoom', 'Apply Layers (from bookmarks)', 'Auto change Server (usa/intl)', 'Synchro with script server', 'Clear local storage data', 'Clear script server data', 'Sort : Bookmark more recent on top', 'Apply Layers (from searchbar)','Clear historic','New','Add','Highlight last visited link','Enable copying / restoring POIs','Activate browsing history','Allow objects selection from history');
  257. }
  258. // Then running
  259.  
  260. WazeWrap.Interface.ShowScriptUpdate(GM_info.script.name, BKMversion, BKM_UPDATE_NOTES, 'https://gf.qytechs.cn/scripts/4515-wme-bookmarks/', 'https://www.waze.com/forum/viewtopic.php?t=106910');
  261.  
  262. enhancedSearch();
  263. BKMtableCountries();
  264. BKMcss();
  265. checkPOI();
  266. checkReminder();
  267. W.map.events.register('moveend', W.map, mapLoaded);
  268. W.model.actionManager.events.register("afterclearactions", null, enhancedSearch);
  269. window.setInterval(checkPermaLink, 1000);
  270. window.setInterval(checkReminder, 60000);
  271.  
  272. function enhancedSearch(){
  273. setTimeout(function () {
  274. BKMmapSearch = getElementsByClassName('search-query', getId('search')) [0];
  275. if (typeof (BKMmapSearch) === 'undefined') { if (debug) { console.info('WME Bookmarks - BKMmapSearch : NOK'); } setTimeout(enhancedSearch, 500); return; }
  276. BKMmapSearch.placeholder = lang[17];
  277. BKMmapSearch.removeEventListener('paste', BKMPastePerma, false);
  278. BKMmapSearch.addEventListener('paste', BKMPastePerma, false);
  279. }, 100);
  280. }
  281. }
  282. function BKMtableCountries() {
  283. if (localStorage.WMEBookmarks) {
  284. var a = JSON.parse(localStorage.WMEBookmarks);
  285. for (var p in a) {
  286. if(!a.hasOwnProperty(p)) continue;
  287. var pays = a[p].country;
  288. if (pays && pays.length > 0) {
  289. if (countries.indexOf(pays) == - 1) { countries.push(pays); }
  290. }
  291. }
  292. if (debug) { console.log('WME Bookmarks : Mains Countries listed', countries); }
  293. select(countries, 'selectCountry');
  294. }
  295. if (localStorage.WMEBookmarksShared) {
  296. var b = JSON.parse(localStorage.WMEBookmarksShared);
  297. for (p in b) {
  298. if(!b.hasOwnProperty(p)) continue;
  299. pays = b[p].country;
  300. if (pays && pays.length > 0) {
  301. if (countriesS.indexOf(pays) == - 1) { countriesS.push(pays); }
  302. }
  303. }
  304. if (debug) { console.log('WME Bookmarks : Shared Countries listed', countriesS); }
  305. select(countriesS, 'selectCountryS');
  306. }
  307. }
  308. function BKMcss() {
  309. var Scss = document.createElement('style');
  310. Scss.type = 'text/css';
  311. var css = '.BKMbutton {float:left;margin-right:5px;color:#7f0;cursor:pointer;}';
  312. css += '#divContent {box-shadow: 0 4px 10px #aaa;width:98%}';
  313. css += '.BKMbuttonSync {padding:6px 10px;border-radius:5px;border:2px solid #C2C2C2;background-color:#CBCBCB;cursor:pointer;}';
  314. css += '.BKMbuttonSync:hover {background-color:#93C4D3;}';
  315. css += '.divHead {clear:both;height:28px;padding-left:5px;font-weight:bold;background-color:#CBCBCB;}';
  316. css += '.divHeadName {float:left;text-align:left;vertical-align:bottom;}';
  317. css += '.divHeadCountry {float:right;}';
  318. css += '#selectCountry, #selectCountryS {height:22px;background-color:#CBCBCB;border:0;}';
  319. css += '.divBKM {clear:both;line-height:21px;height:24px;border:1px solid #ededed;border-top:0;background-color:#ffffff;}';
  320. css += '.divName {float:left;text-align:left;padding-left:5px;padding-top:2px;}';
  321. css += '.divName a {text-decoration:none;}';
  322. css += '.divIcons {float:right;height:16px;}';
  323. css += '.divSubMenu {float:right;height:24px;min-width:60px;}';
  324. css += '#BKMedit {clear:both;display:none;margin-bottom:10px;height:133px;border:2px solid #C2C2C2;box-shadow: 0 4px 10px #aaa;}';
  325. css += '.divEditTitre {line-height:24px;height:24px;border-bottom:1px solid #C2C2C2;}';
  326. css += '.divEdit {float:left;width:50px;height:23px;text-align:left;padding-left:5px;font-weight:bold;background-color:#CBCBCB;}';
  327. css += '#divEditName {float:left;width:190px;height:22px;padding:0;padding-left:5px;border:0;margin:0;}';
  328. css += '#divComm {float:left;width:100%;line-height:24px;height:23px;padding-left:5px;text-align:left;font-weight:bold;background-color:#CBCBCB;border-bottom:1px solid #C2C2C2;}';
  329. css += '#divCommEdit {float:left;width:100%;height:81px;border:0;margin:0;padding:2px;resize:none;}';
  330. css += '#divBackupTxt, #divSettingsContent {width:279px;min-height:150px;margin:2px 0 10px;resize:none;background-color:white;border:2px solid #C2C2C2;font-size:12px;}';
  331. css += '#divShareTxt {float:left;width:100%;height:118px;resize:none;margin-bottom:5px;border:0;border-bottom:1px solid #C2C2C2;}';
  332. css += '.divComment {clear:both;position:relative;top:1px;display:none;padding:1px 0 3px 20px;text-align:left;background-color:#dddddd;border-bottom:1px solid #C2C2C2;}';
  333. css += '.BKMsync {padding: 5px 15px;}';
  334. css += '#divBackup p, #BKMedit p, #divSettings p {margin:0;line-height:20px;text-align:justify;padding:5px;font-size:11px;}';
  335. css += '.fabkm {font-size:16px;padding:6px 4px;}';
  336. css += '.iconPoint, .iconZone {float:left; margin-left:2px; background-image:url(//editor-assets.waze.com/production/img/toolbarcad3e904c322a28bc0d9d3f9a9b06f8c.png);}'
  337. css += '.iconPoint {background-position:-50px 0px; width:16px; height:16px; margin-top:2px;}'
  338. css += '.iconZone {background-position:0px 0px; width:17px; height:21px;}';
  339. Scss.innerHTML = css;
  340. document.body.appendChild(Scss);
  341. BKMmainHtml();
  342. }
  343. // Create a tab for Bookmarks
  344. async function addBookmarksTab() {
  345. const {tabLabel, tabPane} = W.userscripts.registerSidebarTab('Bookmarks');
  346.  
  347. tabLabel.innerHTML = '<span class="fa fa-star"></span>';
  348. tabLabel.title = 'Bookmarks';
  349. tabPane.id = 'sidepanel-Bookmarks';
  350.  
  351. await W.userscripts.waitForElementConnected(tabPane);
  352.  
  353. return Promise.resolve(tabPane);
  354. }
  355.  
  356. var tab = await addBookmarksTab();
  357.  
  358. function BKMmainHtml() {
  359. var settings = JSON.parse(localStorage.WMEBookmarksSettings);
  360. //Create content for Prev/Next actions
  361. var prev=document.createElement('div');
  362. prev.id='prevIcon';
  363. (settings.histonav === true ? prev.style.display='block' : prev.style.display='none');
  364. prev.className='toolbar-button toolbar-button-with-label ItemDisabled';
  365. prev.innerHTML='<div class="item-container"><div class="item-icon w-icon" title="Previous"><span class="fa fa-chevron-left"></span></div></div>';
  366. BKMEditHandle.append(prev)
  367. getId('prevIcon').onclick=NavPrev;
  368.  
  369. var next=document.createElement('div');
  370. next.id='nextIcon';
  371. (settings.histonav === true ? next.style.display='block' : next.style.display='none');
  372. next.className='toolbar-button toolbar-button-with-label ItemDisabled';
  373. next.innerHTML='<div class="item-container"><div class="item-icon w-icon" title="Next"><span class="fa fa-chevron-right"></span></div></div>';
  374. BKMEditHandle.append(next)
  375. getId('nextIcon').onclick=NavNext;
  376.  
  377. //Create content in favorite's tab
  378. var addon = document.createElement('section');
  379. addon.id = 'bookmarks-addon';
  380. // Bookmarks header
  381. var content = '<div style="float:left;margin-left:5px;"><b><a href="https://gf.qytechs.cn/scripts/4515-wme-bookmarks" target="_blank"><u>WME Bookmarks</u></a></b> v' + BKMversion + '</div>';
  382. content += '<div style="clear:both;float:left;width:100%;margin:5px;">';
  383. content += '<div style="float:left;width:34px;"><span id="iconBookmarks" class="fabkm fa fa-star" title="' + lang[0] + '" style="color:#36c;font-size:20px;"></span></div>';
  384. content += '<div id="shareButton" style="float:left;width:34px;"><span id="iconShare" class="fabkm fa fa-share-alt-square" title="' + lang[1] + '" style="color:#bbb;font-size:20px;"></span></div>';
  385. content += '<div style="float:left;width:34px;"><span id="iconHisto" class="fabkm fa fa-history" title="' + lang[3] + '" style="color:#bbb;font-size:20px;"></span></div>';
  386. content += '<div id="copypButton" style="float:left;width:34px;"><span id="iconCopy" class="fabkm fa fa-copy" title="' + lang[7] + '" style="color:#bbb;font-size:20px;"></span></div>';
  387. content += '<div style="float:left;width:34px;"><span id="iconBackup" class="fabkm fa fa-cube " title="' + lang[4] + '" style="color:#bbb;font-size:20px;"></span></div>';
  388. content += '<div style="float:left;width:34px;"><span id="iconSettings" class="fabkm fa fa-sliders" title="' + lang[22] + '" style="color:#bbb;font-size:20px;"></span></div>';
  389. content += '</div><div style="clear:both;"></div><div id="BKMedit"></div>'; // Edit and Share containers
  390. content += '<div id="divContent">'; // Principal container
  391. // Bookmarks tab
  392. content += '<div id="divBookmarks" style="margin-bottom:30px;visibility:hidden;"><div class="divHead" id="divBookmarksHead">';
  393. content += '<div class="divHeadName"><span class="fabkm fa fa-star"></span>' + lang[6] + 's</div>';
  394. content += '<div class="divHeadCountry"><select type="text" name="Country" id="selectCountry"></select></div>';
  395. content += '</div><div id="divBookmarksContent"></div></div>';
  396. // Friends Share tab
  397. content += '<div id="divShare" style="margin-bottom:10px;visibility:hidden;"><div class="divHead" id="divShareHead">';
  398. content += '<div class="divHeadName"><span class="fabkm fa fa-share-alt-square"></span>' + lang[1] + '</div>';
  399. content += '<div class="divHeadCountry"><select type="text" name="Country" id="selectCountryS"></select></div>';
  400. content += '</div><div id="divShareContent"></div></div>';
  401. // Historic tab
  402. content += '<div id="divHisto" style="margin-bottom:10px;visibility:hidden;"><div class="divHead">';
  403. content += '<div class="divHeadName"><span class="fabkm fa fa-history"></span>' + lang[3] + '</div>';
  404. content += '</div><div id="divHistoContent"></div></div>';
  405. // Copy/paste tab
  406. content += '<div id="divCopy" style="margin-bottom:10px;visibility:hidden;"><div class="divHead" id="divCopyHead">';
  407. content += '<div class="divHeadName"><span class="fabkm fa fa-copy"></span>'+lang[7]+'</div>';
  408. content += '</div><div id="divCopyContent"></div></div>';
  409. // Backup tab
  410. content += '<div id="divBackup" style="margin-bottom:10px;visibility:hidden;"><div class="divHead">';
  411. content += '<div class="divHeadName"><span class="fabkm fa fa-cube"></span>' + lang[4] + '</div>';
  412. content += '<div class="divIcons"><a href="#"><span id="backupValid" class="fabkm fa fa-check" title="' + lang[4] + '" style="color:#0b0;"></a></div></div>';
  413. content += '<input type="radio" id="bckNew" name="typeBck" ' + (settings.backup=="new" ? ' checked' : '') + ' value="new" style="margin-left: 40px;" /> '+ tset[9];
  414. content += '<input type="radio" id="bckAdd" name="typeBck" ' + (settings.backup=="add" ? ' checked' : '') + ' value="add" style="margin-left: 40px;" /> '+ tset[10];
  415. content += '<textarea id="divBackupTxt"></textarea><p><span class="fabkm fa fa-info-circle" style="padding:0;color:#36c;"></span>' + text1 + '</p></div>';
  416. // Settings tab
  417. content += '<div id="divSettings" style="margin-bottom:10px;visibility:hidden;"><div class="divHead">';
  418. content += '<div class="divHeadName"><span class="fabkm fa fa-sliders"></span>' + lang[22] + '</div>';
  419. content += '</div><div id="divSettingsContent" style="padding:3px;line-height:22px;">';
  420. content += '<input type="checkbox" id="chkSort" ' + (settings.sort ? ' checked' : '') + ' /> ' + tset[6] + '<br />';
  421. content += '<input type="checkbox" id="chkZoom" ' + (settings.zoom ? ' checked' : '') + ' /> ' + tset[0] + '<br />';
  422. content += '<input type="checkbox" id="chkLayers" ' + (settings.layers ? ' checked' : '') + ' /> ' + tset[1] + '<br />';
  423. content += '<input type="checkbox" id="chkLayersPaste" ' + (settings.layersPaste ? ' checked' : '') + ' /> ' + tset[7] + '<br />';
  424. content += '<input type="checkbox" id="chkServer" ' + (settings.server ? ' checked' : '') + ' /> ' + tset[2] + '<br />';
  425. content += '<input type="checkbox" id="chkSynchro" ' + (settings.synchro ? ' checked' : '') + ' /> ' + tset[3] + '<br />';
  426. content += '<input type="checkbox" id="chkLastClic" ' + (settings.lclic ? ' checked' : '') + ' /> ' + tset[11] + '<br />';
  427. content += '<input type="checkbox" id="chkCopyPaste" ' + (settings.lcopy ? ' checked' : '') + ' /> ' + tset[12] + '<br />';
  428. content += '<input type="button" id="razButton1" value="" style="height: 13px;" /> ' + tset[4] + '<br />';
  429. content += '<input type="button" id="razButton2" value="" style="height: 13px;" /> ' + tset[5] + '<br />';
  430. content += '<input type="button" id="razButton3" value="" style="height: 13px;" /> ' + tset[8] + '<br /><hr style="margin:5px 0;border-top:1px solid #ededed;" />';
  431. content += '<input type="checkbox" id="chkHistoNav" ' + (settings.histonav ? ' checked' : '') + ' /> ' + tset[13] + '<br />';
  432. content += '<input type="checkbox" id="chkHistoSelect" ' + (settings.histoselect ? ' checked' : '') + ' /> ' + tset[14] + '<br />';
  433.  
  434.  
  435. content += '</div><p><span class="fabkm fa fa-info-circle" style="padding:0;color:#36c;"></span>' + text3 + '</p></div></div>';
  436. addon.innerHTML = content;
  437. addon.id = 'sidepanel-bookmarks';
  438. addon.className = 'sidepanel-bookmarks';
  439. tab.appendChild(addon);
  440. // Tabs actions
  441. select(countries, 'selectCountry');
  442. select(countriesS, 'selectCountryS');
  443. bookmarksToggle();
  444. getId('iconBookmarks').onclick = (function () { bookmarksToggle(); });
  445. getId('iconShare').onclick = (function () { shareToggle(); });
  446. getId('iconHisto').onclick = (function () { histoToggle(); });
  447. getId('iconCopy').onclick = (function () { copyToggle(); });
  448. getId('iconBackup').onclick = (function () { backupToggle(); });
  449. getId('iconSettings').onclick = (function () { settingsToggle(); });
  450. // Buttons actions
  451. getId('bckNew').onclick = (function () {
  452. var a=JSON.parse(localStorage.WMEBookmarksSettings);
  453. a.backup="new";
  454. localStorage.setItem('WMEBookmarksSettings', JSON.stringify(a));
  455. });
  456. getId('bckAdd').onclick = (function () {
  457. var a=JSON.parse(localStorage.WMEBookmarksSettings);
  458. a.backup="add";
  459. localStorage.setItem('WMEBookmarksSettings', JSON.stringify(a));
  460. });
  461. getId('chkSort').onclick = (function () {
  462. var a=JSON.parse(localStorage.WMEBookmarksSettings);
  463. (getId('chkSort').checked ? a.sort=true : a.sort=false)
  464. localStorage.setItem('WMEBookmarksSettings', JSON.stringify(a));
  465. });
  466. getId('chkZoom').onclick = (function () {
  467. var a=JSON.parse(localStorage.WMEBookmarksSettings);
  468. (getId('chkZoom').checked ? a.zoom=true : a.zoom=false)
  469. localStorage.setItem('WMEBookmarksSettings', JSON.stringify(a));
  470. });
  471. getId('chkLayers').onclick = (function () {
  472. var a=JSON.parse(localStorage.WMEBookmarksSettings);
  473. (getId('chkLayers').checked ? a.layers=true : a.layers=false)
  474. localStorage.setItem('WMEBookmarksSettings', JSON.stringify(a));
  475. });
  476. getId('chkLayersPaste').onclick = (function () {
  477. var a=JSON.parse(localStorage.WMEBookmarksSettings);
  478. (getId('chkLayersPaste').checked ? a.layersPaste=true : a.layersPaste=false)
  479. localStorage.setItem('WMEBookmarksSettings', JSON.stringify(a));
  480. });
  481. getId('chkServer').onclick = (function () {
  482. var a=JSON.parse(localStorage.WMEBookmarksSettings);
  483. (getId('chkServer').checked ? a.server=true : a.server=false)
  484. localStorage.setItem('WMEBookmarksSettings', JSON.stringify(a));
  485. });
  486. getId('chkSynchro').onclick = (function () {
  487. var a=JSON.parse(localStorage.WMEBookmarksSettings);
  488. if (getId('chkSynchro').checked) {
  489. a.synchro=true;
  490. $('#iconShare').css('display', 'block');
  491. $('#shareButton').animate({ width: '34px' }, 250);
  492. } else {
  493. a.synchro=false;
  494. $('#shareButton').animate({ width: '0' }, 250);
  495. $('#iconShare').css('display', 'none');
  496. }
  497. localStorage.setItem('WMEBookmarksSettings', JSON.stringify(a));
  498. });
  499. getId('chkLastClic').onclick = (function () {
  500. var a=JSON.parse(localStorage.WMEBookmarksSettings);
  501. (getId('chkLastClic').checked ? a.lclic=true : a.lclic=false)
  502. localStorage.setItem('WMEBookmarksSettings', JSON.stringify(a));
  503. });
  504. getId('chkCopyPaste').onclick = (function () {
  505. var a=JSON.parse(localStorage.WMEBookmarksSettings);
  506. if (getId('chkCopyPaste').checked) {
  507. a.lcopy=true;
  508. $('#iconCopy').css('display', 'block');
  509. $('#copypButton').animate({ width: '34px' }, 250);
  510. } else {
  511. a.lcopy=false;
  512. $('#copypButton').animate({ width: '0' }, 250);
  513. $('#iconCopy').css('display', 'none');
  514. }
  515. localStorage.setItem('WMEBookmarksSettings', JSON.stringify(a));
  516. });
  517. getId('razButton1').onclick = (function () {
  518. var answer = window.confirm(tset[4] + ' ?');
  519. if (answer) {
  520. localStorage.setItem('WMEBookmarks', '[]');
  521. BKMtableCountries();
  522. select(countries, 'selectCountry');
  523. }
  524. });
  525. getId('razButton2').onclick = (function () {
  526. var answer = window.confirm(tset[5] + ' ?');
  527. if (answer) { initBookmarks(); }
  528. });
  529. getId('razButton3').onclick = (function () {
  530. var answer = window.confirm(tset[8] + ' ?');
  531. if (answer) { localStorage.setItem('WMEHistoric', '[]'); }
  532. });
  533. getId('chkHistoNav').onclick = (function () {
  534. var a=JSON.parse(localStorage.WMEBookmarksSettings);
  535. if (getId('chkHistoNav').checked) {
  536. a.histonav=true;
  537. $('#prevIcon').css('display', 'block');
  538. $('#nextIcon').css('display', 'block');
  539. } else {
  540. a.histonav=false;
  541. $('#prevIcon').css('display', 'none');
  542. $('#nextIcon').css('display', 'none');
  543. }
  544. localStorage.setItem('WMEBookmarksSettings', JSON.stringify(a));
  545. });
  546. getId('chkHistoSelect').onclick = (function () {
  547. var a=JSON.parse(localStorage.WMEBookmarksSettings);
  548. (getId('chkHistoSelect').checked ? a.histoselect=true : a.histoselect=false)
  549. localStorage.setItem('WMEBookmarksSettings', JSON.stringify(a));
  550. });
  551.  
  552. if (debug) { console.info('WME Bookmarks HTML loaded'); }
  553. // Button on the map
  554. setTimeout(function () {
  555. var addNodeButton = document.createElement('div');
  556. addNodeButton.id = 'addNodeButton';
  557. addNodeButton.className = 'fabkm fa fa-thumb-tack BKMbutton';
  558. addNodeButton.onclick = BKMinsertPermalink;
  559. getElementsByClassName('topbar')[0].insertBefore(addNodeButton,getElementsByClassName('location-info-region')[0]);
  560. getElementsByClassName('topbar')[0].style.padding = '0 10px';
  561. addNodeButton.onmouseover = (function () { getId('addNodeButton').style.opacity = '1'; });
  562. addNodeButton.onmouseout = (function () { getId('addNodeButton').style.opacity = '0.6'; });
  563. }, 1000);
  564.  
  565. if (getId('chkSynchro').checked === false) {
  566. $('#iconShare').css('display', 'none');
  567. $('#shareButton').animate({ width: '0' }, 250);
  568. }
  569.  
  570. if (getId('chkCopyPaste').checked === false) {
  571. $('#iconCopy').css('display', 'none');
  572. $('#copypButton').animate({ width: '0' }, 250);
  573. }
  574.  
  575. BMKcheckAutoSave();
  576. BKMaddButtonIfLoad();
  577. timer = setTimeout(BKMcheckActiveCountry, 5000);
  578.  
  579. //Bookmarks Layer
  580. addScriptsMenu();
  581. WazeWrap.Interface.AddLayerCheckbox("_scripts", "Bookmarks", true, LayerToggled);
  582. // createToggler();
  583. checklayer("__WME_Bookmarks");
  584. // (JSON.parse(localStorage.WMEBookmarksSettings).showBookmark == true ? getId('layer-switcher-item_bookmarks').checked=true : false);
  585. // bookmarks_Layer.setVisibility(JSON.parse(localStorage.WMEBookmarksSettings).showBookmark);
  586. bookmarks_Layer.setVisibility(true)
  587. }
  588. function autoSwitchToBKMTab() {
  589. var _restoreDrawerTab = $('#drawer').find('[selected="true"]').children('.w-icon')[0] || 'none-selected';
  590. if (!$(_restoreDrawerTab).hasClass('w-icon-script')) {
  591. document.querySelector('.w-icon-script').dispatchEvent(new MouseEvent('click', {
  592. view: (typeof unsafeWindow !== 'undefined' ? unsafeWindow : window), bubbles: true, cancelable: true, button: 0
  593. }));
  594. }
  595. document.querySelector('.fa-star').closest('a[href^="#userscript"').dispatchEvent(new MouseEvent('click', {
  596. view: (typeof unsafeWindow !== 'undefined' ? unsafeWindow : window), bubbles: true, cancelable: true, button: 0
  597. }));
  598. }
  599.  
  600. // ***************
  601. // ** BOOKMARKS **
  602. // ***************
  603.  
  604. function initBookmarks() {
  605. if (debug) { console.log('WME Bookmarks: Send: ' + BKMusername + ' to init'); }
  606. var url = 'https://limageenboite.fr/bkm.php?initbookmarks=' + BKMusername
  607. var datas = null
  608. var method = 'POST'
  609.  
  610. GM.xmlHttpRequest({
  611. method: method,
  612. url: url,
  613. data: datas,
  614. headers:{ "Content-Type": "application/x-www-form-urlencoded" },
  615. onload: function(data) {
  616. if (debug) { console.log('WME Bookmarks: Server Response: ', data.responseText); }
  617. if (data.responseText != 'Check') {
  618. getId('divBookmarksHead').innerHTML = '<div class="divHeadName"><span class="fabkm fa fa-random"></span><span style="color:red;">' + lang[19] + '</span></div>';
  619. setTimeout(getBookmarks, 1000);
  620. } else {
  621. getId('divBookmarksHead').innerHTML = '<div class="divHeadName"><span class="fabkm fa fa-random"></span><span style="color:darkgreen;">' + lang[20] + '</span></div>';
  622. BKMaddButtonIfLoad();
  623. setTimeout(reloadHtmlBookmarks, 1000);
  624. }
  625. }
  626. });
  627. }
  628. function getBookmarks() {
  629. var listFav = localStorage.WMEBookmarks;
  630. var url = 'https://limageenboite.fr/bkm.php?getbookmarks=' + BKMusername
  631. var datas = null
  632. var method = 'GET'
  633.  
  634. GM.xmlHttpRequest({
  635. method: method,
  636. url: url,
  637. headers:{ "Content-Type": "application/x-www-form-urlencoded" },
  638. onload: function(data) {
  639. if (isJsonString(data.responseText)) {
  640. var s1 = JSON.stringify(JSON.parse(data.responseText), Object.keys(JSON.parse(data.responseText)).sort());
  641. var s2 = JSON.stringify(JSON.parse(listFav), Object.keys(JSON.parse(listFav)).sort());
  642. if ((s1 == s2) !== true && data.responseText && getId('chkSynchro').checked === true) {
  643. if (debug) { console.log('WME Bookmarks: From BKM Server: ', decodeURIComponent(data.responseText.replace(/\\x/g, '%'))); }
  644. if (debug) { console.log('WME Bookmarks: From BKM local : ', listFav); }
  645. clearTimeout(timer);
  646. $('addNodeButton').hide();
  647. getId('addNodeButton').style.height='0';
  648. getId('divBookmarksHead').innerHTML = '<div class="divHeadName"><span class="fabkm fa fa-random"></span>' + lang[5] + '</div><div class="divIcons"><span id="SyncCancel" class="fabkm fa fa-window-close" title="' + lang[9] + '" style="color:red;"></span></div>';
  649. if (data.responseText != '[]') {
  650. var servToPC = '<div id="serv2Loc" class="BKMbuttonSync" style="float:left;"><span class="fabkm fa fa-cloud"></span> <span class="fabkm fa fa-chevron-circle-right" style="font-size:20px;color:#36c;"></span> <span class="fabkm fa fa-laptop"></span></div>';
  651. } else { servToPC = ''; }
  652. if (listFav != '[]') {
  653. var PCToServ = '<div id="loc2Serv" class="BKMbuttonSync" style="float:right;"><span class="fabkm fa fa-laptop"></span> <span class="fabkm fa fa-chevron-circle-right" style="font-size:20px;color:#36c;"></span> <span class="fabkm fa fa-cloud"></span></div>';
  654. } else { PCToServ = ''; }
  655. getId('divBookmarksContent').innerHTML = '<div class="BKMsync" style="clear:both;height:60px;"><div class="BKMsync">'+ servToPC + PCToServ +'</div>';
  656. if (getId('serv2Loc')) getId('serv2Loc').onclick = (function(){serv2Loc(data.responseText);});
  657. if (getId('loc2Serv')) getId('loc2Serv').onclick = (function(){loc2Serv();});
  658. }
  659. else {
  660. reloadHtmlBookmarks();
  661. if (debug) { console.log('WME Bookmarks: Bookmarks Sync !'); console.log(JSON.stringify(JSON.parse(listFav))); }
  662. }
  663. } else {
  664. if (debug) { console.log('WME Bookmarks: Server not responding or data corrupted'); }
  665. clearTimeout(timer);
  666. $('addNodeButton').hide();
  667. getId('addNodeButton').style.height='0';
  668. getId('divBookmarksHead').innerHTML = '<div class="divHeadName"><span class="fabkm fa fa-random"></span>' + lang[5] + '</div><div class="divIcons"><a href="#"><span id="SyncCancel" class="fabkm fa fa-window-close" title="' + lang[9] + '" style="color:red;"></span></a></div>';
  669. getId('divBookmarksContent').innerHTML = '<div class="BKMsync" style="padding-bottom:20px;"><div id="servhs" class="BKMbuttonSync" style="background-color:#F77;"><span style="color:red;">Error</span> <span style="font-size:10px;">Server not responding or data corrupted<br/>Click me for desync</span></div></div>';
  670. getId('servhs').onclick = (function () {
  671. var a=JSON.parse(localStorage.WMEBookmarksSettings);
  672. a.synchro=false;
  673. $('#iconShare').animate({ width: '0' }, 200);
  674. $('#shareButton').animate({ width: '0' }, 250);
  675. localStorage.setItem('WMEBookmarksSettings', JSON.stringify(a));
  676. reloadHtmlBookmarks();
  677. getId('chkSynchro').checked=false;
  678. });
  679. }
  680. }
  681. });
  682.  
  683. function serv2Loc(data) {
  684. localStorage.setItem('WMEBookmarks', data);
  685. BKMaddButtonIfLoad();
  686. reloadHtmlBookmarks();
  687. }
  688. function loc2Serv() {
  689. getId('divBookmarksContent').innerHTML = '';
  690. BKMaddButtonIfLoad();
  691. // BKMpostBookmarks();
  692. }
  693. }
  694. function reloadHtmlBookmarks() {
  695. var content = '<div class="divHeadName"><span class="fabkm fa fa-star" style="font-size:16px;padding:6px;"></span>' + lang[6] + 's</div>';
  696. content += '<div class="divHeadCountry"><select type="text" name="Country" id="selectCountry"></select></div>';
  697. getId('divBookmarksHead').innerHTML = content;
  698. select(countries, 'selectCountry');
  699. getId('selectCountry').addEventListener("change", (function () {
  700. clearTimeout(timer);
  701. // BKMcheckActiveCountry();
  702. BKMcountryActive = getId('selectCountry').value;
  703. getId('divBookmarksContent').innerHTML = '';
  704. loadBookmarks('WMEBookmarks', 'divBookmarksContent');
  705. }));
  706. getId('divBookmarksContent').innerHTML = '';
  707. loadBookmarks('WMEBookmarks', 'divBookmarksContent');
  708. BKMtableCountries();
  709. }
  710. function BKMpostBookmarks() {
  711. var a = JSON.parse(localStorage.WMEBookmarks), toSave=[];
  712. for (var p in a) {
  713. if(!a.hasOwnProperty(p)) continue;
  714. var bNew={};
  715. bNew.country=encodeURIComponent(a[p].country);
  716. bNew.name=encodeURIComponent(a[p].name);
  717. bNew.perma=a[p].perma;
  718. bNew.comm=encodeURIComponent(a[p].comm);
  719. bNew.share=a[p].share;
  720. bNew.reminder=a[p].reminder;
  721. toSave.push(bNew);
  722. }
  723. if (debug) { console.log('WME Bookmarks: Send Data: ', JSON.stringify(toSave)); }
  724. var url = "https://limageenboite.fr/bkm.php"
  725. var datas = "nickname="+BKMusername+"&postbookmarks=" + JSON.stringify(toSave)
  726. var method = 'POST'
  727.  
  728. GM.xmlHttpRequest({
  729. method: method,
  730. url: url,
  731. data: datas,
  732. headers:{ "Content-Type": "application/x-www-form-urlencoded" },
  733. onload: function(data) {
  734. if (debug) { console.log('WME Bookmarks: Server Response: ', data.responseText); }
  735. if (data.responseText != 'Check') {
  736. getId('divBookmarksHead').innerHTML = '<div class="divHeadName"><span class="fabkm fa fa-random"></span><span style="color:red;">' + lang[19] + '</span></div>';
  737. setTimeout(getBookmarks, 1000);
  738. } else {
  739. getId('divBookmarksHead').innerHTML = '<div class="divHeadName"><span class="fabkm fa fa-random"></span><span style="color:darkgreen;">' + lang[20] + '</span></div>';
  740. BKMaddButtonIfLoad();
  741. setTimeout(reloadHtmlBookmarks, 1000);
  742. }
  743. }
  744. });
  745. }
  746. function BKMupdateBookmarks(action, owner, data, arg) {
  747. var bNew = {};
  748. bNew.action=action;
  749. bNew.owner=owner;
  750. bNew.arg=arg;
  751. bNew.data=data;
  752. if (debug) { console.log('WME Bookmarks: Send Update: ', bNew); }
  753. var url = "https://limageenboite.fr/bkm.php"
  754. var datas = "addbookmark=" + JSON.stringify(bNew)
  755. var method = 'POST'
  756. if (debug) { console.log('WME Bookmarks: url: ' + url + 'data: ' + datas + 'method: ' + method); }
  757.  
  758. GM.xmlHttpRequest({
  759. method: method,
  760. url: url,
  761. data: datas,
  762. headers:{ "Content-Type": "application/x-www-form-urlencoded" },
  763. onload: function(data) {
  764. if (debug) { console.log('WME Bookmarks: Server Response: ', data.responseText); }
  765. if (data.responseText != 'Check') {
  766. getId('divBookmarksHead').innerHTML = '<div class="divHeadName"><span class="fabkm fa fa-random"></span><span style="color:red;">' + lang[19] + '</span></div>';
  767. setTimeout(getBookmarks, 1000);
  768. } else {
  769. getId('divBookmarksHead').innerHTML = '<div class="divHeadName"><span class="fabkm fa fa-random"></span><span style="color:darkgreen;">' + lang[20] + '</span></div>';
  770. BKMaddButtonIfLoad();
  771. setTimeout(reloadHtmlBookmarks, 1000);
  772. }
  773. }
  774. });
  775. }
  776. function BKMtableHtml(container, data, i) { // Bookmarks & Share table (HTML);
  777. var div = document.createElement('div');
  778. div.className = 'divBKM';
  779. div.id = container + i;
  780. //(data.comm != '' ? div.style.backgroundColor = '#e0fffc' : div.style.backgroundColor = '#ffffff');
  781. getId(container).appendChild(div);
  782. // if (debug) { console.log("xxx ",data); }
  783.  
  784. //NAME
  785. var divName = document.createElement('div');
  786. divName.className = 'divName';
  787. var divNameA = document.createElement('a');
  788. divNameA.href = '#';
  789. divNameA.id='link'+i;
  790. divNameA.innerHTML = '<b>' + data.name.substring(0, 26) + '</b>';
  791. divNameA.onclick = (function() { BKMjump(data.country,data.perma,divNameA.id); });
  792. if (getId('chkLastClic').checked) {
  793. var a=JSON.parse(localStorage.WMEBookmarksSettings);
  794. if (divNameA.id===a.lastclic) { divNameA.style.color='#26BAE8'; a.lastclic=divNameA.id; }
  795. localStorage.setItem('WMEBookmarksSettings', JSON.stringify(a));
  796. }
  797. if (data.comm != '') {
  798. divNameA.onmouseover = (function () {
  799. getId(container + i).style.backgroundColor = '#CBCBCB';
  800. getId(container + i).style.borderBottom = '1px dashed #ededed';
  801. getId(container + '_Comm_' + i).style.display = 'block';
  802. });
  803. divNameA.onmouseout = (function () {
  804. getId(container + i).style.backgroundColor = '#e0fffc';
  805. getId(container + i).style.borderBottom = '1px solid #ededed';
  806. getId(container + '_Comm_' + i).style.display = 'none';
  807. });
  808. }
  809. divName.appendChild(divNameA);
  810. div.appendChild(divName);
  811.  
  812. // SUBMENU
  813. var divSubMenu = document.createElement('div');
  814. divSubMenu.className = 'divSubMenu';
  815. divSubMenu.onmouseover = (function () {
  816. divMainMenu.style.display='block';
  817. divSubMenu.style.display='none';
  818. });
  819. div.appendChild(divSubMenu);
  820.  
  821. var divSubExpand = document.createElement('div');
  822. var divSubExpandA = document.createElement('a');
  823. divSubExpand.className = 'divIcons';
  824. divSubExpandA.innerHTML = '<span class="fabkm fa fa-ellipsis-v" style="color:#BBB;"></span>';
  825. divSubExpand.appendChild(divSubExpandA);
  826. divSubMenu.appendChild(divSubExpand);
  827. if (data.comm != '') {
  828. var divSubComment = document.createElement('div');
  829. var divSubCommentA = document.createElement('a');
  830. divSubComment.className = 'divIcons';
  831. divSubCommentA.innerHTML = '<span class="fabkm fa fa-sticky-note" title="' + data.comm + '" style="color:#36c;"></span>';
  832. divSubComment.appendChild(divSubCommentA);
  833. divSubMenu.appendChild(divSubComment);
  834. }
  835. if (typeof(data.reminder) != "undefined" && data.reminder != null && data.reminder != "") {
  836. var divSubReminder = document.createElement('div');
  837. var divSubReminderA = document.createElement('a');
  838. divSubReminder.className = 'divIcons';
  839. divSubReminderA.innerHTML = '<span class="fabkm fa fa-clock-o" title="'+lang[24]+'" style="color:#36c;" id="iconReminder_' + i + '"></span>';
  840. divSubReminder.appendChild(divSubReminderA);
  841. divSubMenu.appendChild(divSubReminder);
  842. }
  843. if (data.share != null && data.share != '') {
  844. var divSubShare = document.createElement('div');
  845. var divSubShareA = document.createElement('a');
  846. divSubShare.className = 'divIcons';
  847. divSubShareA.innerHTML = '<span class="fabkm fa fa-share-alt-square" title="' + lang[12] + '" style="color:#36c;"></span>';
  848. divSubShare.appendChild(divSubShareA);
  849. divSubMenu.appendChild(divSubShare);
  850. }
  851.  
  852. // MENU
  853. var divMainMenu = document.createElement('div');
  854. divMainMenu.className = 'divSubMenu';
  855. divMainMenu.style.display = 'none';
  856. divMainMenu.onmouseleave = (function () {
  857. divMainMenu.style.display='none';
  858. divSubMenu.style.display='block';
  859. });
  860. div.appendChild(divMainMenu);
  861.  
  862. // COMMENT
  863. var divComment = document.createElement('div');
  864. divComment.className = 'divIcons';
  865. var divCommentA = document.createElement('a');
  866. if (data.comm != '') {
  867. divCommentA.innerHTML = '<span class="fabkm fa fa-sticky-note" title="' + data.comm + '" style="color:#36c;"></span>';
  868. divCommentA.onmouseover = (function () {
  869. getId(container + i).style.backgroundColor = '#CBCBCB';
  870. getId(container + i).style.borderBottom = '1px dashed #77aacc';
  871. getId(container + '_Comm_' + i).style.display = 'block';
  872. });
  873. divCommentA.onmouseout = (function () {
  874. getId(container + i).style.backgroundColor = '#e0fffc';
  875. getId(container + i).style.borderBottom = '1px solid #ededed';
  876. getId(container + '_Comm_' + i).style.display = 'none';
  877. });
  878. }
  879. else {
  880. divCommentA.innerHTML = '<span class="fabkm fa fa-sticky-note" title="' + lang[10] + '" style="color:#bbb;"></span>';
  881. }
  882. divCommentA.href = '#';
  883. divCommentA.onclick = (function () {
  884. getId('BKMedit').style.height = '133px';
  885. BKMhtmlEditName(container, data);
  886. });
  887. divComment.appendChild(divCommentA);
  888. divMainMenu.appendChild(divComment);
  889.  
  890. // RELOCATE
  891. var divLocate = document.createElement('div');
  892. divLocate.className = 'divIcons';
  893. var divLocateA = document.createElement('a');
  894. divLocateA.innerHTML = '<span class="fabkm fa fa-map-marker" title="' + lang[13] + '" style="color:#bbb;" id="iconRelocate_' + i + '"></span>';
  895. divLocateA.href = '#';
  896. divLocateA.onclick = (function(){
  897. getId('iconRelocate_'+i).style.color="#36c";
  898. setTimeout(function(){ BKMrelocate(data.perma,data.name,i)}, 200);
  899. });
  900. divLocate.appendChild(divLocateA);
  901. divMainMenu.appendChild(divLocate);
  902.  
  903. // REMINDER
  904. var divReminder = document.createElement('div');
  905. divReminder.className = 'divIcons';
  906. var divReminderA = document.createElement('a');
  907. if (typeof(data.reminder) != "undefined" && data.reminder != null && data.reminder != "") {
  908. var d= new Date(parseInt(data.reminder)).toString(), t=d.split(" ");
  909. divReminderA.innerHTML = '<span class="fabkm fa fa-clock-o" title="'+t[3]+"-"+pad(new Date(t[1]+'01, 01').getMonth()+1)+"-"+t[2]+" "+t[4].slice(0,5)+'" style="color:#36c;" id="iconReminder_' + i + '"></span>';
  910. } else {
  911. divReminderA.innerHTML = '<span class="fabkm fa fa-clock-o" title="'+lang[24]+'" style="color:#bbb;" id="iconReminder_' + i + '"></span>';
  912. }
  913. divReminderA.href = '#';
  914. divReminderA.onclick = (function(){
  915. getId('iconReminder_'+i).style.color="#36c";
  916. getId('BKMedit').style.height = '60px';
  917. BKMhtmlReminder(container, data,i);
  918. });
  919. divReminder.appendChild(divReminderA);
  920. divMainMenu.appendChild(divReminder);
  921.  
  922. // SHARE
  923. if (container == 'divBookmarksContent' && getId('chkSynchro').checked === true) {
  924. var divShare = document.createElement('div');
  925. divShare.className = 'divIcons';
  926. var divShareA = document.createElement('a');
  927. if (data.share) { divShareA.innerHTML = '<span class="fabkm fa fa-share-alt-square" title="' + data.share + '" style="color:#36c;"></span>'; }
  928. else { divShareA.innerHTML = '<span class="fabkm fa fa-share-alt-square" title="' + lang[12] + '" style="color:#bbb;"></span>'; }
  929. divShareA.href = '#';
  930. divShareA.onclick = (function () {
  931. getId('BKMedit').style.height = '225px';
  932. BKMedit(data);
  933. });
  934. divShare.appendChild(divShareA);
  935. divMainMenu.appendChild(divShare);
  936. }
  937.  
  938. // SUPPR
  939. var divSuppr = document.createElement('div');
  940. divSuppr.className = 'divIcons';
  941. var divSupprA = document.createElement('a');
  942. if (container == 'divShareContent') { divSupprA.innerHTML = '<span class="fabkm fa fa-share-alt-square" title="' + lang[21] + '" style="color:red;"></span>'; }
  943. else { divSupprA.innerHTML = '<span class="fabkm fa fa-times" title="' + lang[11] + '" style="color:red;"></span>'; }
  944. divSupprA.href = '#';
  945. divSupprA.onclick = (function(){BKMsuppr(data.name,data.perma,container);});
  946. divSuppr.appendChild(divSupprA);
  947. divMainMenu.appendChild(divSuppr);
  948.  
  949. //COMMENT TEXT
  950. var divSeeComment = document.createElement('div');
  951. divSeeComment.className = 'divComment';
  952. divSeeComment.id = container + '_Comm_' + i;
  953. divSeeComment.innerHTML = data.comm;
  954. div.appendChild(divSeeComment);
  955. }
  956.  
  957. // ***************
  958. // ** SHARED **
  959. // ***************
  960.  
  961. function getShared() {
  962. var listFav = localStorage.WMEBookmarksShared;
  963. var url = 'https://limageenboite.fr/bkm.php?getshared='+ BKMusername
  964. var datas = null
  965. var method = 'GET'
  966.  
  967. GM.xmlHttpRequest({
  968. method: method,
  969. url: url,
  970. headers:{ "Content-Type": "application/x-www-form-urlencoded" },
  971. onload: function(data) {
  972. var s1 = JSON.stringify(JSON.parse(data.responseText), Object.keys(JSON.parse(data.responseText)).sort());
  973. var s2 = JSON.stringify(JSON.parse(listFav), Object.keys(JSON.parse(listFav)).sort());
  974. if ((s1 == s2) !== true && data.responseText && getId('chkSynchro').checked === true) {
  975. if (debug) { console.log('WME Bookmarks: From Share Server: ', JSON.parse(data.responseText)); }
  976. if (debug) { console.log('WME Bookmarks: From Share local: ', JSON.parse(listFav)); }
  977. localStorage.setItem('WMEBookmarksShared', data.responseText);
  978. reloadHtmlShared();
  979. } else {
  980. reloadHtmlShared();
  981. if (debug) { console.log('WME Bookmarks: Shared Sync !'); }
  982. }
  983. }
  984. });
  985. }
  986. function BKMedit(data) { //Show Share DIV
  987. clearTimeout(timer);
  988. $('#BKMedit').slideDown(200);
  989. $('#divContent').slideUp(1000);
  990. var content1 = '<div class="divEditTitre"><div class="divEdit" style="width:80px;">' + lang[6] + '</div><input type="text" id="divEditName" style="width:165px;" value="'+ data.name.replace(/"/g, '&quot;') +'" readonly /><input type="hidden" id="permalink" value="' + data.perma.lon +'|'+ data.perma.lat + '" />';
  991. content1 += '<div class="divIcons"><a href="#"><span id="shareValid" class="fabkm fa fa-check" title="' + lang[8] + '" style="font-size:16px;padding:6px;color:#0b0;"></a></div>';
  992. content1 += '</div><textarea id="divShareTxt"></textarea><p><span class="fabkm fa fa-info-circle" title="Info" style="font-size:16px;padding:6px;color:#36c;"></span>' + text2 + '</p>';
  993. getId('BKMedit').innerHTML = content1;
  994. if (!data.share) {
  995. data.share = lang[23];
  996. getId('divShareTxt').style.color = '#aaa';
  997. }
  998. getId('divShareTxt').onclick = (function () {
  999. if (getId('divShareTxt').value == lang[23]) {
  1000. getId('divShareTxt').value = '';
  1001. getId('divShareTxt').style.color = '#000';
  1002. }
  1003. });
  1004. getId('divShareTxt').innerHTML = data.share;
  1005. getId('divShareTxt').onkeyup = (function () {
  1006. var t = getId('divShareTxt').value;
  1007. if (t === '') { getId('divShareTxt').innerHTML = data.share; }
  1008. getId('divShareTxt').value = t.replace(',', ';').replace(' ', ';').replace(';;', ';');
  1009. });
  1010. getId('shareValid').onclick = (function () {
  1011. data.share = getId('divShareTxt').value;
  1012. if (data.share !== lang[23]) {
  1013. var toSave=[];
  1014. var a = JSON.parse(localStorage.WMEBookmarks);
  1015. for (var p in a) {
  1016. if(!a.hasOwnProperty(p)) continue;
  1017.  
  1018. //Redo Bookmark
  1019. var bNew={};
  1020. bNew.country=a[p].country;
  1021. bNew.name=a[p].name;
  1022. bNew.perma=a[p].perma;
  1023. bNew.comm=a[p].comm;
  1024. bNew.reminder=a[p].reminder;
  1025. if (getId('permalink').value == a[p].perma.lon+'|'+a[p].perma.lat) {
  1026. bNew.share=data.share;
  1027. if (getId('chkSynchro').checked === true) {
  1028. if (debug) { console.log('WME Bookmarks: SHARE', BKMusername, bNew); }
  1029. BKMupdateBookmarks('SHARE', BKMusername, bNew, '');
  1030. }
  1031. } else { bNew.share=a[p].share; }
  1032. //Store Bookmark
  1033. toSave.push(bNew);
  1034. }
  1035. localStorage.setItem('WMEBookmarks', JSON.stringify(toSave));
  1036. }
  1037. $('#divContent').slideDown(1000);
  1038. $('#BKMedit').slideUp(500);
  1039. });
  1040. // BKMcheckActiveCountry();
  1041. getId('divBookmarksContent').innerHTML = '';
  1042. loadBookmarks('WMEBookmarks', 'divBookmarksContent');
  1043. }
  1044. function reloadHtmlShared() {
  1045. var content = '<div class="divHeadName"><span class="fabkm fa fa-share-alt-square" style="font-size:16px;padding:6px;"></span>' + lang[1] + '</div>';
  1046. content += '<div class="divHeadCountry"><select type="text" name="Country" id="selectCountryS"></select></div>';
  1047. getId('divShareHead').innerHTML = content;
  1048. select(countriesS, 'selectCountryS');
  1049. getId('selectCountryS').addEventListener("change", (function () {
  1050. clearTimeout(timer);
  1051. // BKMcheckActiveCountry();
  1052. BKMcountryActive = getId('selectCountryS').value;
  1053. getId('divShareContent').innerHTML = '';
  1054. loadBookmarks('WMEBookmarksShared', 'divShareContent');
  1055. }));
  1056. getId('divShareContent').innerHTML = '';
  1057. loadBookmarks('WMEBookmarksShared', 'divShareContent');
  1058. }
  1059.  
  1060. // ***************
  1061. // ** HISTORY **
  1062. // ***************
  1063.  
  1064. function BKMaddHisto(perma) { // Add link in historic
  1065. var lStorage=JSON.parse(localStorage.WMEHistoric), bNew={};
  1066. if (Object.keys(lStorage).length >= 30) { lStorage.splice(0, 1); }
  1067. bNew.date=new Date().toLocaleString();
  1068. bNew.perma=perma;
  1069. bNew.name=getName();
  1070. lStorage.push(bNew);
  1071. localStorage.setItem('WMEHistoric', JSON.stringify(lStorage));
  1072. loadBookmarks('WMEHistoric', 'divHistoContent');
  1073. }
  1074. function BKMhistoHtml(data) { // Historic table (HTML)
  1075. var div = document.createElement('div');
  1076. div.className = 'divBKM';
  1077. var divName = document.createElement('div');
  1078. divName.className = 'divName';
  1079. var divNameA = document.createElement('a');
  1080. divNameA.href = '#';
  1081. divNameA.innerHTML = '<font size=-2>'+ data.date +' </font><b>'+ data.name.substring(0, 28) +'</b>';
  1082. divNameA.onclick = (function(){BKMjump(W.model.getTopCountry().attributes.name, data.perma,'');});
  1083. divName.appendChild(divNameA);
  1084. div.appendChild(divName);
  1085. // SUPPR
  1086. var divSuppr = document.createElement('div');
  1087. divSuppr.className = 'divIcons';
  1088. var divSupprA = document.createElement('a');
  1089. divSupprA.innerHTML = '<span class="fabkm fa fa-times" title="' + lang[11] + '" style="color:red;"></span>';
  1090. divSupprA.href = '#';
  1091. divSupprA.onclick = (function(){BKMsuppr(data.name,data.perma,'divHistoContent');});
  1092. divSuppr.appendChild(divSupprA);
  1093. div.appendChild(divSuppr);
  1094. getId('divHistoContent').appendChild(div);
  1095. }
  1096.  
  1097. // ***************
  1098. // ** BACKUP **
  1099. // ***************
  1100.  
  1101. function BKMbackup() {
  1102. var a = localStorage.WMEBookmarks, toshow = '';
  1103. getId('divBackupTxt').value='';
  1104. if (a) {
  1105. a = JSON.parse(a);
  1106. for (var p in a) {
  1107. if(!a.hasOwnProperty(p)) continue;
  1108. var permalink = a[p].perma.lon +"|"+ a[p].perma.lat;
  1109. if (typeof(a[p].perma.zoom) !== 'undefined') { permalink += "|"+ a[p].perma.zoom; } else { permalink += "|"; }
  1110. if (typeof(a[p].perma.layers) !== 'undefined') { permalink += "|"+ a[p].perma.layers; } else { permalink += "|"; }
  1111. // Objects
  1112. if (typeof(a[p].perma.segments) !== 'undefined') { permalink += "|s:"+ a[p].perma.segments; }
  1113. else if (typeof(a[p].perma.nodes) !== 'undefined') { permalink += "|n:"+ a[p].perma.nodes; }
  1114. else if (typeof(a[p].perma.venues) !== 'undefined') { permalink += "|v:"+ a[p].perma.venues; }
  1115. else { permalink += "|"; }
  1116. // New filters
  1117. if (typeof(a[p].perma.env) !== 'undefined') { permalink += "|"+ a[p].perma.env; } else { permalink += "|"; }
  1118. if (typeof(a[p].perma.MP) !== 'undefined') { permalink += "|"+ a[p].perma.MP; } else { permalink += "|"; }
  1119. if (typeof(a[p].perma.UR) !== 'undefined') { permalink += "|"+ a[p].perma.UR; } else { permalink += "|"; }
  1120. if (typeof(a[p].perma.MC) !== 'undefined') { permalink += "|"+ a[p].perma.MC; } else { permalink += "|"; }
  1121.  
  1122. if (typeof(a[p].comm) !== 'undefined') { permalink += ";"+ a[p].comm; } else { permalink += ";"; }
  1123. if (typeof(a[p].share) !== 'undefined') { permalink += ";"+ a[p].share; } else { permalink += ";"; }
  1124.  
  1125. //Push to generate CSV
  1126. toshow += a[p].country +";"+ a[p].name +";"+ permalink +"\n";
  1127. }
  1128. getId('divBackupTxt').value=toshow;
  1129. getId('divBackupTxt').onclick=(function () {
  1130. getId('divBackupTxt').focus();
  1131. getId('divBackupTxt').select();
  1132. });
  1133. }
  1134. getId('backupValid').onclick = backup;
  1135. function backup() {
  1136. if (getId('bckAdd').checked===true) {
  1137. var lStorage=JSON.parse(localStorage.WMEBookmarks);
  1138. } else { //bckNew
  1139. localStorage.setItem('WMEBookmarks', '[]');
  1140. lStorage=[];
  1141. }
  1142. var a = getId('divBackupTxt').value;
  1143. var b = a.split('\n');
  1144.  
  1145. for (var i=0; b[i]; i++){
  1146. var c = b[i].split(';');
  1147. var bNew ={};
  1148. bNew.country = c[0];
  1149. bNew.name = c[1];
  1150. bNew.perma=BKMconvertPermalink(c[2]);
  1151. bNew.comm = c[3];
  1152. bNew.share = c[4];
  1153. if (lStorage.map(function(e) { return e.perma.lon; }).indexOf(bNew.perma.lon) == -1 && lStorage.map(function(e) { return e.perma.lat; }).indexOf(bNew.perma.lat) == -1) { lStorage.push(bNew); } //Add new entry only
  1154. }
  1155. localStorage.setItem('WMEBookmarks', JSON.stringify(lStorage));
  1156. BKMtableCountries();
  1157. bookmarksToggle();
  1158. if (getId('chkSynchro').checked === true) { BKMpostBookmarks(); }
  1159. }
  1160. }
  1161.  
  1162. // ********************
  1163. // ** COPY/PASTE POI **
  1164. // ********************
  1165.  
  1166. function checkPOI(){
  1167. if ($('#venue-edit-general').length == 1 && getId('chkCopyPaste').checked) {
  1168. var editLM = $('#edit-panel > div > div > div > wz-section-header > div.header-actions');
  1169. if (editLM.length==1) {
  1170. var copyattribDiv = $('#wme-copyattrib-fr');
  1171. if (copyattribDiv.length==0) {
  1172. copyattribDiv=document.createElement('span');
  1173. copyattribDiv.id='wme-copyattrib-fr';
  1174. $(copyattribDiv).css({'float':'right','padding':'4px','border-radius':'5px','box-shadow':'rgba(0, 0, 0, 0.1) 0px 1px 6px 0px'});
  1175. editLM[0].append(copyattribDiv);
  1176.  
  1177. if (localStorage.WMECopyPastePOI.indexOf(WazeWrap.getSelectedFeatures()[0].WW.getObjectModel().attributes.id) == "-1") {
  1178. var copyBtn=document.createElement('div');
  1179. copyBtn.innerHTML='<button title="Copy attributes" style="border:none; background-color: transparent;"><i class="fa fa-copy" data-original-title="" title="Copy attributes" style="color:#fff;"></i></button>';
  1180. copyBtn.onclick=CopyAttrib;
  1181. $(copyattribDiv).css({'background-color':'#26bae8'});
  1182. copyattribDiv.appendChild(copyBtn);
  1183. } else {
  1184. var pasteBtn=document.createElement('span');
  1185. pasteBtn.innerHTML='<i class="fa fa-paste" data-original-title="" title="Restore attributes" style="color:#555;"></i>';
  1186. pasteBtn.style.margin='0 3px';
  1187. pasteBtn.onclick=PasteAttrib;
  1188. $(copyattribDiv).css({'background-color':'#ffc107'});
  1189. copyattribDiv.appendChild(pasteBtn);
  1190. }
  1191. }
  1192. }
  1193. }
  1194. setTimeout(checkPOI, 2000);
  1195. }
  1196. function CopyAttrib(){
  1197. //JSON for POI info
  1198. var PoiAttr={}, venue = WazeWrap.getSelectedFeatures()[0].WW.getObjectModel().attributes, lStorage = JSON.parse(localStorage.WMECopyPastePOI);
  1199.  
  1200. //Get geometry
  1201. if (typeof(WazeWrap.getSelectedFeatures()[0].WW.getObjectModel().getOLGeometry().components[0].clone().components) != 'undefined') {
  1202. var currentPOI = WazeWrap.getSelectedFeatures()[0].WW.getObjectModel().getOLGeometry().components[0].clone().components;
  1203. var coord, Geo = ""
  1204. for(var i=0; i<currentPOI.length;i++){
  1205. coord = currentPOI[i];
  1206. if(i < currentPOI.length-1){
  1207. coord = coord.transform(W.map.getProjectionObject(), W.map.getOLMap().displayProjection);
  1208. // coord = coord.transform(W.map.projection, W.map.displayProjection);
  1209. Geo += `${coord.x},${coord.y} `;
  1210. }
  1211. PoiAttr.geometry = Geo;
  1212. PoiAttr.geoX = venue.geometry.getBounds().right.toString();
  1213. PoiAttr.geoY = venue.geometry.getBounds().top.toString();
  1214. PoiAttr.type="zone";
  1215. }
  1216. } else {
  1217. currentPOI = WazeWrap.getSelectedFeatures()[0].WW.getObjectModel().attributes;
  1218. PoiAttr.geometry = "";
  1219. PoiAttr.geoX = currentPOI.geoJSONGeometry.coordinates[0].toString();
  1220. PoiAttr.geoY = currentPOI.geoJSONGeometry.coordinates[1].toString();
  1221. PoiAttr.type="point";
  1222. }
  1223. PoiAttr.id=venue.id;
  1224. PoiAttr.aliases=venue.aliases.toString();
  1225. (venue.brand==null ? PoiAttr.brand = 'null' : PoiAttr.brand = venue.brand)
  1226. PoiAttr.categories=venue.categories.toString();
  1227. PoiAttr.categoryAttributes=JSON.stringify(venue.categoryAttributes);
  1228. PoiAttr.description=venue.description;
  1229. //PoiAttr.entryExitPoints=venue.entryExitPoints.toString();
  1230. PoiAttr.externalProviderIDs=JSON.stringify(venue.externalProviderIDs).replace(/"/g,"");
  1231. (typeof(venue.houseNumber)=="undefined" ? PoiAttr.houseNumber = 'null' : PoiAttr.houseNumber = venue.houseNumber)
  1232. PoiAttr.name=venue.name;
  1233. PoiAttr.openingHours="";
  1234. //for (var i=0; venue.openingHours[i]; i++) { PoiAttr.openingHours = PoiAttr.openingHours + JSON.stringify(venue.openingHours[i]).replace(/"/g,"") + ";"; }
  1235. PoiAttr.openingHours=venue.openingHours.toString();
  1236. (venue.phone==null ? PoiAttr.phone = 'null' : PoiAttr.phone = venue.phone)
  1237. PoiAttr.services=venue.services.toString();
  1238. (venue.url==null ? PoiAttr.url = 'null' : PoiAttr.url = venue.url)
  1239.  
  1240. //Add in localStorage
  1241. lStorage.push(PoiAttr);
  1242. localStorage.setItem('WMECopyPastePOI', JSON.stringify(lStorage));
  1243.  
  1244. // if (getId('chkSynchro').checked === true) {
  1245. // if (debug) { console.log('WME Bookmarks: ADD Copy Cloud', PoiAttr); }
  1246. // BKMupdateCopy('ADD', BKMusername, PoiAttr);
  1247. // }
  1248. W.selectionManager.unselectAll();
  1249. autoSwitchToBKMTab();
  1250. getId('iconCopy').click();
  1251. }
  1252. function PasteAttrib(){
  1253. var a = JSON.parse(localStorage.WMECopyPastePOI);
  1254. var toSave=[];
  1255. for (var i = 0; a[i]; i++) {
  1256. if (JSON.stringify(a[i].id) == JSON.stringify(WazeWrap.getSelectedFeatures()[0].WW.getObjectModel().attributes.id)) {
  1257. try {
  1258. var geom=a[i].geometry; delete(a[i].geometry);
  1259. delete(a[i].geoX);
  1260. delete(a[i].geoY);
  1261.  
  1262. if (a[i].aliases.length == 0) { delete(a[i].aliases); }
  1263. else { var m=[], n=a[i].aliases.split(","); for (var j = 0; n[j]; j++) { m.push(n[j]); } a[i].aliases = m; }
  1264.  
  1265. m=[]
  1266. n=a[i].categories.split(","); for (j = 0; n[j]; j++) { m.push(n[j]); }
  1267. if(m == WazeWrap.getSelectedFeatures()[0].WW.getObjectModel().attributes.categories) { delete(a[i].categories); }
  1268. else { a[i].categories = m; }
  1269.  
  1270. if (a[i].categoryAttributes == '{}' || a[i].categoryAttributes == 'null') { delete(a[i].categoryAttributes); }
  1271. if (a[i].brand == 'null') { delete(a[i].brand); }
  1272. if (a[i].houseNumber == 'null') { delete(a[i].houseNumber); }
  1273. delete(a[i].externalProviderIDs);
  1274. delete(a[i].openingHours);
  1275. if (a[i].phone == 'null') { delete(a[i].phone); }
  1276.  
  1277. if (a[i].services.length == 0) { delete(a[i].services); }
  1278. else { m=[]
  1279. n=a[i].services.split(","); for ( j = 0; n[j]; j++) { m.push(n[j]); } a[i].services = m; }
  1280.  
  1281. if (a[i].url == 'null') { delete(a[i].url); }
  1282.  
  1283. if (a[i].type == "zone") { //restore geometry if zone
  1284. var lines = geom.split(' ');
  1285. for(var k=0; k < lines.length; k++){
  1286. if (lines[k] !== "") {
  1287. var t=lines[k].split(',');
  1288. // var pt = WazeWrap.Geometry.ConvertTo900913(t[0], t[1]);
  1289. lines[k] = new OpenLayers.Geometry.Point(t[0], t[1]);
  1290. // lines[k] = new OpenLayers.Geometry.Point(pt.lon, pt.lat);
  1291. }
  1292. }
  1293. saveNewPlaceGeometry(lines);
  1294. }
  1295. delete(a[i].type);
  1296.  
  1297. if (debug) { console.log('WME Bookmarks: Paste Attrib', a[i]); }
  1298. W.model.actionManager.add(new (require("Waze/Action/UpdateObject"))(WazeWrap.getSelectedFeatures()[0].WW.getObjectModel(), a[i]));
  1299. // if (getId('chkSynchro').checked === true){ BKMupdateCopy('DELETE', BKMusername, a[i].id); }
  1300. delete(a[i].id);
  1301.  
  1302. autoSwitchToBKMTab();
  1303. getId('iconCopy').click();
  1304. }
  1305. catch (err) {
  1306. console.log("Copy Venue Attributes : Problem", err);
  1307. }
  1308. }
  1309. else {
  1310. toSave.push(a[i]);
  1311. }
  1312. }
  1313. W.selectionManager.unselectAll();
  1314. localStorage.setItem('WMECopyPastePOI', JSON.stringify(toSave));
  1315. loadBookmarks('WMECopyPastePOI', 'divCopyContent');
  1316.  
  1317. function saveNewPlaceGeometry(newGeom){
  1318. let selected = WazeWrap.getSelectedFeatures()[0].WW.getObjectModel();
  1319. let originalGeometry = selected.getOLGeometry().clone();
  1320. let ls = new OpenLayers.Geometry.LineString(newGeom);
  1321. let newGeometry = new OpenLayers.Geometry.Polygon(new OpenLayers.Geometry.LinearRing(ls.components));
  1322.  
  1323. let UFG = require("Waze/Action/UpdateFeatureGeometry");
  1324. console.log(originalGeometry)
  1325. console.log(newGeometry)
  1326. W.model.actionManager.add(new UFG(selected, W.model.venues, W.userscripts.toGeoJSONGeometry(originalGeometry), W.userscripts.toGeoJSONGeometry(newGeometry)));
  1327. }
  1328. }
  1329. function getCopyPaste() {
  1330. var listFav = localStorage.WMECopyPastePOI;
  1331. var url = 'https://limageenboite.fr/bkm.php?getcopypaste=' + BKMusername
  1332. var datas = null
  1333. var method = 'GET'
  1334.  
  1335. GM.xmlHttpRequest({
  1336. method: method,
  1337. url: url,
  1338. headers:{ "Content-Type": "application/x-www-form-urlencoded" },
  1339. onload: function(data) {
  1340. if (isJsonString(data.responseText)) {
  1341. var s1 = JSON.stringify(JSON.parse(data.responseText), Object.keys(JSON.parse(data.responseText)).sort());
  1342. var s2 = JSON.stringify(JSON.parse(listFav), Object.keys(JSON.parse(listFav)).sort());
  1343. if ((s1 == s2) !== true && data.responseText && getId('chkSynchro').checked === true) {
  1344. if (debug) { console.log('WME Bookmarks: From Copy Server: ', data.responseText.replace(/\\/g, "")); }
  1345. if (debug) { console.log('WME Bookmarks: From Copy local : ', listFav); }
  1346. clearTimeout(timer);
  1347. $('addNodeButton').hide();
  1348. getId('addNodeButton').style.height='0';
  1349. getId('divCopyHead').innerHTML = '<div class="divHeadName"><span class="fabkm fa fa-random"></span>' + lang[5] + '</div><div class="divIcons"><span id="SyncCancel" class="fabkm fa fa-window-close" title="' + lang[9] + '" style="color:red;"></span></div>';
  1350. if (data.responseText != '[]') {
  1351. var servToPC = '<div id="serv2Loc" class="BKMbuttonSync" style="float:left;"><span class="fabkm fa fa-cloud"></span> <span class="fabkm fa fa-chevron-circle-right" style="font-size:20px;color:#36c;"></span> <span class="fabkm fa fa-laptop"></span></div>';
  1352. } else { servToPC = ''; }
  1353. if (listFav != '[]') {
  1354. var PCToServ = '<div id="loc2Serv" class="BKMbuttonSync" style="float:right;"><span class="fabkm fa fa-laptop"></span> <span class="fabkm fa fa-chevron-circle-right" style="font-size:20px;color:#36c;"></span> <span class="fabkm fa fa-cloud"></span></div>';
  1355. } else { PCToServ = ''; }
  1356. getId('divCopyContent').innerHTML = '<div class="BKMsync" style="clear:both;height:60px;"><div class="BKMsync">'+ servToPC + PCToServ +'</div>';
  1357. if (getId('serv2Loc')) getId('serv2Loc').onclick = (function(){serv2LocCP(data.responseText);});
  1358. if (getId('loc2Serv')) getId('loc2Serv').onclick = (function(){loc2ServCP();});
  1359. }
  1360. else {
  1361. reloadHtmlCopy();
  1362. if (debug) { console.log('WME Bookmarks: Copy Paste POI Sync !'); }
  1363. }
  1364. } else {
  1365. if (debug) { console.log('WME Bookmarks: Server not responding or data corrupted'); }
  1366. clearTimeout(timer);
  1367. $('addNodeButton').hide();
  1368. getId('addNodeButton').style.height='0';
  1369. getId('divCopyHead').innerHTML = '<div class="divHeadName"><span class="fabkm fa fa-random"></span>' + lang[5] + '</div><div class="divIcons"><a href="#"><span id="SyncCancel" class="fabkm fa fa-window-close" title="' + lang[9] + '" style="color:red;"></span></a></div>';
  1370. getId('divCopyContent').innerHTML = '<div class="BKMsync" style="padding-bottom:20px;"><div id="servhs" class="BKMbuttonSync" style="background-color:#F77;"><span style="color:red;">Error</span> <span style="font-size:10px;">Server not responding or data corrupted<br/>Click me for desync</span></div></div>';
  1371. getId('servhs').onclick = (function () {
  1372. var a=JSON.parse(localStorage.WMEBookmarksSettings);
  1373. a.synchro=false;
  1374. $('#iconCopy').css('display', 'none');
  1375. $('#copypButton').animate({ width: '0' }, 250);
  1376. localStorage.setItem('WMEBookmarksSettings', JSON.stringify(a));
  1377. reloadHtmlCopy();
  1378. getId('chkSynchro').checked=false;
  1379. });
  1380. }
  1381. }
  1382. });
  1383. function serv2LocCP(data) {
  1384. localStorage.setItem('WMECopyPastePOI', data);
  1385. BKMaddButtonIfLoad();
  1386. reloadHtmlCopy();
  1387. }
  1388. function loc2ServCP() {
  1389. getId('divCopyContent').innerHTML = '';
  1390. BKMaddButtonIfLoad();
  1391. // BKMpostCopy();
  1392. }
  1393. }
  1394. function reloadHtmlCopy() {
  1395. var content = '<div class="divHeadName"><span class="fabkm fa fa-star" style="font-size:16px;padding:6px;"></span>' + lang[6] + 's</div>';
  1396. getId('divCopyHead').innerHTML = content;
  1397. getId('divCopyContent').innerHTML = '';
  1398. loadBookmarks('WMECopyPastePOI', 'divCopyContent');
  1399. }
  1400. function BKMpostCopy() {
  1401. var listFav = localStorage.WMECopyPastePOI;
  1402. if (debug) { console.log('WME Copy POI: Send Data: ', JSON.parse(listFav)); }
  1403. var url = "https://limageenboite.fr/bkm.php"
  1404. var datas = "nickname="+BKMusername+"&postcopypaste=" + listFav
  1405. var method = 'POST'
  1406.  
  1407. GM.xmlHttpRequest({
  1408. method: method,
  1409. url: url,
  1410. data: datas,
  1411. headers:{ "Content-Type": "application/x-www-form-urlencoded" },
  1412. onload: function(data) {
  1413. if (debug) { console.log('WME Bookmarks: Server Response: ', data.responseText); }
  1414. if (data.responseText != 'Check') {
  1415. getId('divCopyHead').innerHTML = '<div class="divHeadName"><span class="fabkm fa fa-random"></span><span style="color:red;">' + lang[19] + '</span></div>';
  1416. setTimeout(getCopyPaste, 1000);
  1417. } else {
  1418. getId('divCopyHead').innerHTML = '<div class="divHeadName"><span class="fabkm fa fa-random"></span><span style="color:darkgreen;">' + lang[20] + '</span></div>';
  1419. BKMaddButtonIfLoad();
  1420. setTimeout(reloadHtmlCopy, 1000);
  1421. }
  1422. }
  1423. });
  1424. }
  1425. function BKMupdateCopy(action, owner, data) {
  1426. var bNew = {};
  1427. bNew.action=action;
  1428. bNew.owner=owner;
  1429. bNew.data=data;
  1430. if (debug) { console.log('WME Copy POI: Send Update: ', bNew); }
  1431. var url = "https://limageenboite.fr/bkm.php"
  1432. var datas = "addcopypaste=" + JSON.stringify(bNew)
  1433. var method = 'POST'
  1434.  
  1435. GM.xmlHttpRequest({
  1436. method: method,
  1437. url: url,
  1438. data: datas,
  1439. headers:{ "Content-Type": "application/x-www-form-urlencoded" },
  1440. onload: function(data) {
  1441. if (debug) { console.log('WME Bookmarks: Server Response: ', data); }
  1442. if (data.responseText != 'Check') {
  1443. getId('divCopyHead').innerHTML = '<div class="divHeadName"><span class="fabkm fa fa-random"></span><span style="color:red;">' + lang[19] + '</span></div>';
  1444. setTimeout(getCopyPaste, 1000);
  1445. } else {
  1446. getId('divCopyHead').innerHTML = '<div class="divHeadName"><span class="fabkm fa fa-random"></span><span style="color:darkgreen;">' + lang[20] + '</span></div>';
  1447. BKMaddButtonIfLoad();
  1448. setTimeout(reloadHtmlCopy, 1000);
  1449. }
  1450. }
  1451. });
  1452. }
  1453. function BKMcopyPasteHtml(data) { // copy paste table (HTML)
  1454. if (data.name ==="") { data.name = '<b>Sans Nom</b> <font size=-2>(ID: '+data.id+')</font>'; }
  1455. else { data.name = '<b>'+ data.name.substring(0, 37) +'</b>' }
  1456. var div = document.createElement('div');
  1457.  
  1458. //Icon
  1459. var icon = document.createElement('div');
  1460. (data.type=="point" ? icon.className = 'iconPoint' : icon.className = 'iconZone')
  1461. div.appendChild(icon);
  1462.  
  1463. //Text
  1464. div.className = 'divBKM';
  1465. var divName = document.createElement('div');
  1466. divName.className = 'divName';
  1467. var divNameA = document.createElement('a');
  1468. divNameA.href = '#';
  1469. divNameA.innerHTML = data.name;
  1470. divNameA.onclick = (function(){
  1471. W.map.setCenter(new OpenLayers.LonLat(parseFloat(data.geoX), parseFloat(data.geoY)));
  1472. objectsIsLoaded('vn:'+ data.id);
  1473. });
  1474. divName.appendChild(divNameA);
  1475. div.appendChild(divName);
  1476.  
  1477. // Suppr
  1478. var divSuppr = document.createElement('div');
  1479. divSuppr.className = 'divIcons';
  1480. var divSupprA = document.createElement('a');
  1481. divSupprA.innerHTML = '<span class="fabkm fa fa-times" title="' + lang[11] + '" style="color:red;"></span>';
  1482. divSupprA.href = '#';
  1483. divSupprA.onclick = (function(){ BKMsuppr(data.name,data,'divCopyContent'); });
  1484. divSuppr.appendChild(divSupprA);
  1485. div.appendChild(divSuppr);
  1486.  
  1487. getId('divCopyContent').appendChild(div);
  1488. }
  1489.  
  1490. // ***************************
  1491. // ** ACTIONS WITH BOOKMARK **
  1492. // ****************************
  1493.  
  1494. function BKMhtmlEditName(container, data) { //Show Edit DIV
  1495. clearTimeout(timer);
  1496. $('#BKMedit').slideDown(200);
  1497. if (container == 'divBookmarksContent') { getId('BKMedit').style.height = '133px'; }
  1498. var content1 = '<div class="divEditTitre"><div class="divEdit">' + lang[6] + '</div><input type="text" id="divEditName" value="' + data.name + '" /><input type="hidden" id="permalink" value="' + data.perma.lon +'|'+ data.perma.lat + '" />';
  1499. content1 += '<div class="divIcons"><a href="#"><span id="EditValid" class="fabkm fa fa-check" title="' + lang[8] + '" style="font-size:16px;padding:6px;color:#0b0;"></a></div>';
  1500. content1 += '</div><div id="divComm">' + lang[14] + '</div></div><textarea id="divCommEdit">';
  1501. if (data.comm === '') { content1 += ''; } else { content1 += data.comm; }
  1502. content1 += '</textarea>';
  1503. getId('BKMedit').innerHTML = content1;
  1504. getId('divEditName').focus();
  1505. getId('divEditName').select();
  1506. getId('EditValid').onclick = (function(){ BKMeditName(container,"name"); });
  1507. }
  1508. function BKMhtmlReminder(container, data,i) { //Show Edit DIV
  1509. clearTimeout(timer);
  1510. $('#BKMedit').slideDown(200);
  1511. var content1 = '<div class="divEditTitre"><div class="divEdit">' + lang[6] + '</div><div>' + data.name + '</div><input type="hidden" id="permalink" value="' + data.perma.lon +'|'+ data.perma.lat + '" />'
  1512. + '<div class="divIcons"><a href="#"><span id="RemCancel" class="fabkm fa fa-close" title="' + lang[9] + '" style="font-size:16px;color:#f00;"></a>'
  1513. + '<a href="#"><span id="RemValid" class="fabkm fa fa-check" title="' + lang[8] + '" style="font-size:16px;color:#0b0;"></a></div><input style="width:135px;" id="remDate" type="date" /><input id="remTime" type="time" /></div></div>';
  1514. getId('BKMedit').innerHTML = content1;
  1515. if (typeof(data.reminder) != "undefined" && data.reminder != null && data.reminder != "") { var d=new Date(parseInt(data.reminder)).toString(); }
  1516. else { d=new Date().toString(); }
  1517. var t=d.split(" ");
  1518. getId('remDate').value = t[3] + "-" + pad(new Date(t[1]+'01, 01').getMonth()+1) + "-" + t[2];
  1519. getId('remTime').value = t[4].slice(0,5);
  1520. getId('RemValid').onclick = (function(){
  1521. if (getId('remDate').value == "") {
  1522. getId('remDate').value = t[3] + "-" + pad(new Date(t[1]+'01, 01').getMonth()+1) + "-" + t[2];
  1523. }
  1524. if (getId('remDate').value != "") {
  1525. if (getId('remTime').value == "") { getId('remTime').value = "00:00"; }
  1526. BKMeditName(container,"date");
  1527. } else { $('#BKMedit').slideUp(200); }
  1528. });
  1529. getId('RemCancel').onclick = (function(){
  1530. $('#BKMedit').slideUp(200);
  1531. getId('iconReminder_'+i).style.color='#bbb';
  1532. });
  1533. }
  1534. function BKMeditName(container,type) { //Action after editing name or comment (DB)
  1535. $('#BKMedit').slideUp(200);
  1536. var toSave=[];
  1537.  
  1538. //Bookmarks list update
  1539. if (container === 'divBookmarksContent') {
  1540. var a = JSON.parse(localStorage.WMEBookmarks);
  1541. for (var p in a) {
  1542. if(!a.hasOwnProperty(p)) continue;
  1543.  
  1544. //Redo Bookmark
  1545. var bNew={};
  1546. bNew.country=a[p].country;
  1547. bNew.name=a[p].name;
  1548. bNew.perma=a[p].perma;
  1549. bNew.comm=a[p].comm;
  1550. bNew.share=a[p].share;
  1551. bNew.reminder=a[p].reminder;
  1552. if (getId('permalink').value == a[p].perma.lon+'|'+a[p].perma.lat) {
  1553. if (type == "name") {
  1554. bNew.name=getId('divEditName').value;
  1555. bNew.comm=getId('divCommEdit').value;
  1556. } else { // type = date
  1557. bNew.reminder=toTimestamp(getId('remDate').value, getId('remTime').value);
  1558. }
  1559. if (getId('chkSynchro').checked === true) {
  1560. if (debug) { console.log('WME Bookmarks: UPDATE', BKMusername, bNew); }
  1561. BKMupdateBookmarks('UPDATE',BKMusername, bNew, '');
  1562. }
  1563. }
  1564. //Store Bookmark
  1565. toSave.push(bNew);
  1566. }
  1567. localStorage.setItem('WMEBookmarks', JSON.stringify(toSave));
  1568. }
  1569.  
  1570. //Sharing list update
  1571. else {
  1572. a = JSON.parse(localStorage.WMEBookmarksShared);
  1573. for (p in a) {
  1574. if(!a.hasOwnProperty(p)) continue;
  1575.  
  1576. //Redo Bookmark
  1577. bNew={};
  1578. bNew.owner=a[p].owner;
  1579. bNew.country=a[p].country;
  1580. bNew.name=a[p].name;
  1581. bNew.perma=a[p].perma;
  1582. bNew.comm=a[p].comm;
  1583. bNew.share=a[p].share;
  1584. bNew.reminder=a[p].reminder;
  1585. if (getId('permalink').value == a[p].perma.lon+'|'+a[p].perma.lat) {
  1586. bNew.name=getId('divEditName').value;
  1587. bNew.comm=getId('divCommEdit').value;
  1588. if (getId('chkSynchro').checked === true) {
  1589. if (debug) { console.log('WME Bookmarks: UPDATE', a[p].owner, bNew); }
  1590. BKMupdateBookmarks('UPDATE',a[p].owner, bNew, '');
  1591. }
  1592. }
  1593. //Store Bookmark
  1594. toSave.push(bNew);
  1595. }
  1596. localStorage.setItem('WMEBookmarksShared', JSON.stringify(toSave));
  1597. }
  1598. //Reload HTML
  1599.  
  1600. // BKMcheckActiveCountry();
  1601. if (container == 'divBookmarksContent') {
  1602. getId('divBookmarksContent').innerHTML = '';
  1603. loadBookmarks('WMEBookmarks', 'divBookmarksContent');
  1604. } else {
  1605. getId('divShareContent').innerHTML = '';
  1606. loadBookmarks('WMEBookmarksShared', 'divShareContent');
  1607. }
  1608. }
  1609. function BKMsuppr(name, id, container) { //Action after delete a bookmark (DB)
  1610. clearTimeout(timer);
  1611. if (debug) { console.info('WME Bookmarks Suppr: ', id); }
  1612. var answer = window.confirm(lang[11] + ' ' + name.replace(/<\/?[^>]+(>|$)/g, "") + ' ?');
  1613. if (answer) {
  1614. var toSave=[];
  1615. if (container === 'divHistoContent') {
  1616. var a = JSON.parse(localStorage.WMEHistoric);
  1617. for (var i = 0; a[i]; i++) {
  1618. var bNew={};
  1619. bNew.date=a[i].date;
  1620. bNew.perma=a[i].perma;
  1621. bNew.name=a[i].name;
  1622. if (JSON.stringify(bNew.perma) !== JSON.stringify(id)) { toSave.push(bNew); }
  1623. }
  1624. localStorage.setItem('WMEHistoric', JSON.stringify(toSave));
  1625. getId('divHistoContent').innerHTML = '';
  1626. loadBookmarks('WMEHistoric', 'divHistoContent');
  1627. }
  1628. else if (container === 'divCopyContent') {
  1629. a = JSON.parse(localStorage.WMECopyPastePOI);
  1630. for (i = 0; a[i]; i++) {
  1631. if (a[i].id != id.id) { toSave.push(a[i]); }
  1632. else {
  1633. // if (getId('chkSynchro').checked === true) {
  1634. // if (debug) { console.log('WME Copy POI: DELETE', BKMusername, bNew); }
  1635. // BKMupdateCopy('DELETE', BKMusername, id.id);
  1636. // }
  1637. }
  1638. }
  1639. localStorage.setItem('WMECopyPastePOI', JSON.stringify(toSave));
  1640. getId('divCopyContent').innerHTML = '';
  1641. loadBookmarks('WMECopyPastePOI', 'divCopyContent');
  1642. }
  1643. else if (container === 'divBookmarksContent') { // Suppr own bookmark
  1644. a = JSON.parse(localStorage.WMEBookmarks);
  1645. for (i = 0; a[i]; i++) {
  1646. bNew={};
  1647. bNew.country=a[i].country;
  1648. bNew.name=a[i].name;
  1649. bNew.perma=a[i].perma;
  1650. bNew.comm=a[i].comm;
  1651. bNew.share=a[i].share;
  1652. bNew.reminder=a[i].reminder;
  1653. if (JSON.stringify(bNew.perma) !== JSON.stringify(id)) { toSave.push(bNew); }
  1654. else {
  1655. if (getId('chkSynchro').checked === true) {
  1656. if (debug) { console.log('WME Bookmarks: DELETE', BKMusername, bNew); }
  1657. BKMupdateBookmarks('DELETE', BKMusername, bNew, '');
  1658. }
  1659. }
  1660. }
  1661. localStorage.setItem('WMEBookmarks', JSON.stringify(toSave));
  1662. getId('divBookmarksContent').innerHTML = '';
  1663. loadBookmarks('WMEBookmarks', 'divBookmarksContent');
  1664. }
  1665. else { // Unshare a bookmark
  1666. a = JSON.parse(localStorage.WMEBookmarksShared);
  1667. for (i = 0; a[i]; i++) {
  1668. bNew={};
  1669. bNew.owner = a[i].owner;
  1670. bNew.country = a[i].country;
  1671. bNew.name = a[i].name;
  1672. bNew.perma = a[i].perma;
  1673. bNew.comm = a[i].comm;
  1674. bNew.share = a[i].share;
  1675. bNew.reminder=a[i].reminder;
  1676. if (JSON.stringify(bNew.perma) !== JSON.stringify(id)) { toSave.push(bNew); }
  1677. else {
  1678. if (getId('chkSynchro').checked === true) {
  1679. if (debug) { console.log('WME Bookmarks: UNSHARE', a[i].owner, bNew); }
  1680. BKMupdateBookmarks('UNSHARE', BKMusername, bNew, '');
  1681. }
  1682. }
  1683. }
  1684. localStorage.setItem('WMEBookmarksShared', JSON.stringify(toSave));
  1685. getId('divShareContent').innerHTML = '';
  1686. loadBookmarks('WMEBookmarksShared', 'divShareContent');
  1687. }
  1688. getId('BKMedit').style.display = 'none';
  1689. }
  1690. // BKMcheckActiveCountry();
  1691. }
  1692. function BKMrelocate(oldPerma, name, iconId) { // Action after relocate a bookmark (DB)
  1693. clearTimeout(timer);
  1694. var answer = window.confirm(lang[13] + ' Lon/Lat/Zoom ? (' + name + ')');
  1695. if (answer) {
  1696. var toSave=[];
  1697. link={}; getLink(document.getElementsByClassName('WazeControlPermalink')[0].getElementsByClassName('permalink')[0].href);
  1698. //Bookmarks list update
  1699. if (getId('divBookmarks').style.visibility == 'visible') {
  1700. var a = JSON.parse(localStorage.WMEBookmarks);
  1701. for (var i = 0; a[i]; i++) {
  1702. var bNew={};
  1703. bNew.country = a[i].country;
  1704. bNew.name = a[i].name;
  1705. bNew.perma = a[i].perma;
  1706. bNew.comm = a[i].comm;
  1707. bNew.share = a[i].share;
  1708. bNew.reminder=a[i].reminder;
  1709. if (JSON.stringify(bNew.perma) === JSON.stringify(oldPerma)) {
  1710. bNew.perma = link;
  1711. if (getId('chkSynchro').checked === true) {
  1712. if (debug) { console.log('WME Bookmarks: RELOCATE New', BKMusername, bNew.perma, oldPerma); }
  1713. BKMupdateBookmarks('RELOCATE', BKMusername, bNew, oldPerma);
  1714. }
  1715. }
  1716. toSave.push(bNew);
  1717. }
  1718. localStorage.setItem('WMEBookmarks', JSON.stringify(toSave));
  1719. getId('divBookmarksContent').innerHTML = '';
  1720. loadBookmarks('WMEBookmarks', 'divBookmarksContent');
  1721. }
  1722. //Sharing list update
  1723. if (getId('divShare').style.visibility == 'visible') {
  1724. a = JSON.parse(localStorage.WMEBookmarksShared);
  1725. for (i = 0; a[i]; i++) {
  1726. bNew={};
  1727. bNew.owner = a[i].owner;
  1728. bNew.country = a[i].country;
  1729. bNew.name = a[i].name;
  1730. bNew.perma = a[i].perma;
  1731. bNew.comm = a[i].comm;
  1732. bNew.share = a[i].share;
  1733. bNew.reminder=a[i].reminder;
  1734. if (JSON.stringify(bNew.perma) === JSON.stringify(oldPerma)) {
  1735. bNew.perma = link;
  1736. if (getId('chkSynchro').checked === true) {
  1737. if (debug) { console.log('WME Bookmarks: RELOCATE',a[i].owner, bNew, oldPerma); }
  1738. BKMupdateBookmarks('RELOCATE', a[i].owner, bNew, oldPerma);
  1739. }
  1740. }
  1741. toSave.push(bNew);
  1742. }
  1743. localStorage.setItem('WMEBookmarksShared', JSON.stringify(toSave));
  1744. getId('divBookmarksContent').innerHTML = '';
  1745. loadBookmarks('WMEBookmarksShared', 'divBookmarksContent');
  1746. }
  1747. }
  1748. getId('iconRelocate_'+iconId).style.color="#bbb";
  1749. // BKMcheckActiveCountry();
  1750. }
  1751. function BKMinsertPermalink() { // Action when you add a new permalink (DB)
  1752. BKMcountryActive = W.model.getTopCountry().attributes.name;
  1753. link={}; getLink(document.getElementsByClassName('WazeControlPermalink')[0].getElementsByClassName('permalink')[0].href);
  1754.  
  1755. //JSON for new permalink
  1756. var bNew={};
  1757. bNew.country=BKMcountryActive;
  1758. bNew.name=getName();
  1759. bNew.perma=link;
  1760. bNew.comm='';
  1761. bNew.share='';
  1762.  
  1763. //Add in localStorage
  1764. var lStorage = JSON.parse(localStorage.WMEBookmarks);
  1765. lStorage.push(bNew);
  1766. localStorage.setItem('WMEBookmarks', JSON.stringify(lStorage));
  1767. if (getId('chkSynchro').checked === true) {
  1768. if (debug) { console.log('WME Bookmarks: ADD', BKMusername, bNew); }
  1769. BKMupdateBookmarks('ADD', BKMusername, bNew, '');
  1770. }
  1771.  
  1772. //Add in HTML table
  1773. BKMtableHtml ('divBookmarksContent', bNew, 9999);
  1774. BKMhtmlEditName('divBookmarksContent', bNew);
  1775.  
  1776. //Reload Select list if new country
  1777. if (countries.indexOf(BKMcountryActive) == - 1) {
  1778. BKMtableCountries();
  1779. select(countries, 'selectCountry');
  1780. }
  1781. W.selectionManager.unselectAll();
  1782. autoSwitchToBKMTab();
  1783. }
  1784. function BKMPastePerma() { // Action when you paste a permalink
  1785. setTimeout(function () {
  1786. var exp = new RegExp('/(https?://(?:www.|beta.|(?!www))[^s.]+.[^s]{2,}|www.[^s]+.[^s]{2,})', 'g');
  1787. var a = BKMmapSearch.value;
  1788. var b = BKMmapSearch.innerHTML;
  1789. link={};
  1790. //console.log("a",a, a.match(exp));
  1791. //console.log("b",b, b.match(exp));
  1792.  
  1793. //Paste a permalink
  1794. if (a.match(/waze/g) && a.match(/editor/g) && a.match(/lon/g) && a.match(/lat/g)) { // WME
  1795. getLink(a);
  1796. if (debug) { console.log('WME Bookmarks WME link: ', link); }
  1797. BKMjump(BKMcountryActive,link,'paste');
  1798. setTimeout((function(){BKMaddHisto(link);}), 2500);
  1799. }
  1800. else if (a.match(/waze/g) && a.match(/livemap/g) && a.match(/latlng/g)) { // Livemap before 2021
  1801. b=a.split('?')
  1802. var c=b[1].split('&')
  1803. var d=c[0].split('=')
  1804. var e=d[1].split('%2C')
  1805. var f=c[2].split('=');
  1806. link.lat = e[0]; link.lon = e[1]; link.zoom = (f[1]-12);
  1807. if (debug) { console.log('WME Bookmarks Livemap link: ', link); }
  1808. BKMjump(BKMcountryActive,link,'paste');
  1809. setTimeout((function(){BKMaddHisto(link);}), 2500);
  1810. }
  1811. else if (a.match(/waze/g) && (a.match(/live-map/g) && a.match(/to/g) || a.match(/ul/g))) { // Livemap 2021
  1812. b=a.split('=ll.')
  1813. c=b[1].split('%2C');
  1814. link.lat = c[0]; link.lon = c[1];
  1815. if (debug) { console.log('WME Bookmarks Livemap link 2021: ', link); }
  1816. BKMjump(BKMcountryActive,link,'paste');
  1817. setTimeout((function(){BKMaddHisto(link);}), 2500);
  1818. }
  1819. else if (a.match(exp) && a.match(/google/g) && a.match(/map/g) && a.match(/@/g)) { // Google Map URL
  1820. b=a.split('@')
  1821. c=b[1].split('/')
  1822. d=c[0].split(',');
  1823. link.lat = d[0]; link.lon = d[1]; link.zoom = (d[2].substring(0, d[2].length-1));
  1824. if (debug) { console.log('WME Bookmarks Google link: ', link); }
  1825. BKMjump(BKMcountryActive,link,'paste');
  1826. setTimeout((function(){BKMaddHisto(link);}), 2500);
  1827. }
  1828. //Paste an ID
  1829. else if (a.match(/\./g) && isNaN(a.replace(".",""))===false && a.length > 20) { //venue
  1830. if (debug) { console.log('WME Bookmarks paste a venue: ', a); }
  1831. objectsIsLoaded('vn:'+ a);
  1832. }
  1833. else if (isNaN(a)===false && a.length > 7) { //Segment or node
  1834. if (debug) { console.log('WME Bookmarks paste a segment or node: ', a); }
  1835. objectsIsLoaded('sg:'+ a);
  1836. }
  1837. //Reinit search-query
  1838. }, 100);
  1839. }
  1840. function BKMjump(country,data,action) { // Action when you click a link
  1841. //lastclic
  1842. if (/link/.test(action) && getId('chkLastClic')) {
  1843. for (var i=1; getId("link"+i); i++) {
  1844. getId("link"+i).style.color='#59899e';
  1845. if ("link"+i===action) {
  1846. getId("link"+i).style.color='#26bae8';
  1847. var a=JSON.parse(localStorage.WMEBookmarksSettings);
  1848. a.lastclic=action;
  1849. localStorage.setItem('WMEBookmarksSettings', JSON.stringify(a));
  1850. }
  1851. }
  1852. }
  1853. //Move to
  1854. W.map.setCenter(OpenLayers.Layer.SphericalMercator.forwardMercator(parseFloat(data.lon), parseFloat(data.lat)));
  1855. if (debug) { console.log('BKMjump',country,data,action); }
  1856. //Options
  1857. if (getId('chkZoom').checked && data.zoom) { W.map.getOLMap().zoomTo(data.zoom); }
  1858. if (getId('chkServer').checked) { W.model.events.register("mergeend", null, mapLoaded); }
  1859. if (action != 'paste' && getId('chkLayers').checked && data.layers) { layersLoaded(data.layers); } // layers when bookmarks
  1860. if (action === 'paste' && getId('chkLayersPaste').checked && data.layers) { layersLoaded(data.layers); } // layers when paste form searchbar
  1861. if (typeof (data.segments) != 'undefined') { objectsIsLoaded('sg:'+ data.segments); }
  1862. else if (typeof (data.nodes) != 'undefined') { objectsIsLoaded('nd:'+ data.nodes); }
  1863. else if (typeof (data.venues)!= 'undefined') { objectsIsLoaded('vn:'+ data.venues); }
  1864. else if (typeof (data.MC) != 'undefined' && data.MC != 0) { objectsIsLoaded('mc:'+ data.MC); }
  1865. else if (typeof (data.UR) != 'undefined' && data.UR != 0) { objectsIsLoaded('ur:'+ data.UR); }
  1866. else if (typeof (data.MP) != 'undefined' && data.MP != 0) { objectsIsLoaded('mp:'+ data.MP); }
  1867. else { colorSearch(); }
  1868. //Reload list if country is changed
  1869. if (country != W.model.getTopCountry().attributes.name) {
  1870. getId('divBookmarksContent').innerHTML = '';
  1871. loadBookmarks('WMEBookmarks', 'divBookmarksContent');
  1872. }
  1873. BKMaddButtonIfLoad();
  1874. }
  1875.  
  1876. // ************
  1877. // ** MISC **
  1878. // ************
  1879.  
  1880. function loadBookmarks(storage, dContainer) { //Fill HTML with localstorage
  1881. var lStorage = localStorage.getItem(storage), bookmarkList=[];
  1882. if (lStorage) {
  1883. getId(dContainer).innerHTML = '';
  1884. var a = JSON.parse(lStorage);
  1885. if (getId('chkSort').checked) { a.reverse(); }
  1886. var i=1;
  1887. for (var p in a) {
  1888. if(!a.hasOwnProperty(p)) continue;
  1889. if (dContainer == 'divCopyContent') { BKMcopyPasteHtml(a[p]); }
  1890. else if (dContainer == 'divHistoContent') { BKMhistoHtml(a[p]); }
  1891. if (a[p].country == BKMcountryActive) {
  1892. BKMtableHtml(dContainer, a[p], i);
  1893. bookmarkList.push({name:a[p].name, lon:a[p].perma.lon, lat:a[p].perma.lat});
  1894. i++;
  1895. }
  1896. }
  1897. update_bookmarks_layer(bookmarkList);
  1898. }
  1899. }
  1900. function BKMaddButtonIfLoad() { //Show Pin if WME (permalink) is ready
  1901. var a = getElementsByClassName('WazeControlPermalink') [0].innerHTML;
  1902. if (!a.match(/lon/g)) {
  1903. getId('addNodeButton').style.height='0';
  1904. $('addNodeButton').hide();
  1905. setTimeout(BKMaddButtonIfLoad, 500);
  1906. return;
  1907. } else {
  1908. $('addNodeButton').show();
  1909. }
  1910. }
  1911. function BMKcheckStorage() {
  1912. var settings = JSON.parse(localStorage.WMEBookmarksSettings);
  1913. if (!settings.version) {
  1914. //Convert
  1915. if (debug) { console.info('WME Bookmarks : Convert old data to new JSON'); }
  1916.  
  1917. var a = JSON.parse(localStorage.getItem('WMEBookmarks')), lStorage=[];
  1918. localStorage.setItem('WMEBookmarksShared', '[]');
  1919. localStorage.setItem('WMEBookmarks', '[]');
  1920. localStorage.setItem('WMEHistoric', '[]');
  1921. for (var p in a) {
  1922. if(!a.hasOwnProperty(p)) continue;
  1923.  
  1924. //Redo Bookmark
  1925. var bNew={};
  1926. bNew.country=a[p].country;
  1927. bNew.name=a[p].name;
  1928. bNew.perma=BKMconvertPermalink(a[p].coord);
  1929. bNew.comm=a[p].comm;
  1930. bNew.share=a[p].share;
  1931. bNew.reminder=a[p].reminder;
  1932.  
  1933. //Store Bookmark
  1934. lStorage.push(bNew);
  1935. }
  1936. localStorage.setItem('WMEBookmarks', JSON.stringify(lStorage));
  1937. if (debug) { console.info('WME Bookmarks : New JSON > localStorage Ok !'); }
  1938.  
  1939. // Memorize version
  1940. settings.version=BKMversion;
  1941. localStorage.WMEBookmarksSettings=JSON.stringify(settings);
  1942. }
  1943.  
  1944. }
  1945. function BKMcheckActiveCountry() { // Check Country and update select
  1946. var BKMcountryActiveWME = W.model.getTopCountry().attributes.name;
  1947. if (BKMcountryActive != BKMcountryActiveWME) {
  1948. if (debug) { console.log('WME Bookmarks Country changed : ' + BKMcountryActive + ' > ' + BKMcountryActiveWME); }
  1949. BKMcountryActive = BKMcountryActiveWME;
  1950. select(countries, 'selectCountry');
  1951. select(countriesS, 'selectCountryS');
  1952. loadBookmarks('WMEBookmarks', 'divBookmarksContent');
  1953. loadBookmarks('WMEBookmarksShared', 'divShareContent');
  1954. getId('selectCountry').addEventListener("change",(function () {
  1955. clearTimeout(timer);
  1956. BKMcheckActiveCountry();
  1957. BKMcountryActive = getId('selectCountry').value;
  1958. getId('divBookmarksContent').innerHTML = '';
  1959. loadBookmarks('WMEBookmarks', 'divBookmarksContent');
  1960. getId('iconBookmarks').click();
  1961. }));
  1962. getId('selectCountryS').addEventListener("change",(function () {
  1963. clearTimeout(timer);
  1964. BKMcheckActiveCountry();
  1965. BKMcountryActive = getId('selectCountryS').value;
  1966. getId('divShareContent').innerHTML = '';
  1967. loadBookmarks('WMEBookmarksShared', 'divShareContent');
  1968. getId('iconShare').click();
  1969. }));
  1970. }
  1971. clearTimeout(timer);
  1972. setTimeout(timer = setTimeout(BKMcheckActiveCountry, 5000),100);
  1973. }
  1974. function BMKcheckAutoSave() { //Show shared if sync with server
  1975. if (getId('chkSynchro').checked === true) {
  1976. $('#iconShare').animate({ width: '24px' }, 200);
  1977. }
  1978. else { $('#iconShare').animate({ width: '0' }, 200);
  1979. }
  1980. }
  1981. function select(cArray, selectlist) { // Fill select
  1982. //Add countries in select
  1983. BKMcountryActive = W.model.getTopCountry().attributes.name;
  1984. var CSelect = getId(selectlist);
  1985. if (CSelect !== null) {
  1986. CSelect.innerHTML = '';
  1987. for (var k = 0; cArray[k]; k++) {
  1988. var cList = document.createElement('option');
  1989. cList.value =cArray[k];
  1990. cList.text = cArray[k];
  1991. if (cArray[k] == BKMcountryActive) cList.selected = true;
  1992. CSelect.appendChild(cList);
  1993. }
  1994. //If country not listed
  1995. if (cArray.indexOf(BKMcountryActive) == - 1) {
  1996. cList = document.createElement('option');
  1997. cList.value = BKMcountryActive;
  1998. cList.text = BKMcountryActive;
  1999. cList.selected = true;
  2000. CSelect.appendChild(cList);
  2001. }
  2002. }
  2003. }
  2004. function mapLoaded() { // Test map server and change it if necessary
  2005. if(typeof(W.model.getTopCountry().attributes) === 'undefined' || W.model.getTopCountry().attributes === null) { setTimeout(mapLoaded, 500); return; }
  2006. var loc=W.model.getTopCountry().attributes.env.replace('NA','usa').toLowerCase();
  2007. if (getId('chkServer').checked && loc !== W.app.getAppRegionCode()) {
  2008. var a = JSON.parse(localStorage.mapLocation);
  2009. a[loc]=a[W.app.getAppRegionCode()];
  2010. localStorage.setItem('mapLocation', JSON.stringify(a));
  2011. // W.map.mapState.updateMapLocation(loc);
  2012. W.app.changeAppRegion(loc)
  2013. }
  2014. }
  2015. function layersLoaded(layers) { // Load layers when jump
  2016. var num = Number(layers).toString(2);
  2017. num = num.split('').reverse().join('');
  2018. // First : groups
  2019. layerCheck("group_issues", num.charAt(0));
  2020. layerCheck("group_map_issues", num.charAt(1));
  2021. layerCheck("group_parking_issues", num.charAt(7));
  2022. layerCheck("group_places", num.charAt(11));
  2023. layerCheck("group_road", num.charAt(15));
  2024. layerCheck("group_display", num.charAt(20));
  2025. layerCheck("group_cities", num.charAt(27));
  2026. // Second : items
  2027. layerCheck("item_map_problems", num.charAt(2));
  2028. layerCheck("item_closed_map_problems", num.charAt(3));
  2029. layerCheck("item_update_requests", num.charAt(4));
  2030. layerCheck("item_closed_update_requests", num.charAt(5));
  2031. layerCheck("item_place_update_requests", num.charAt(6));
  2032. layerCheck("item_residential_place_update_requests", num.charAt(30));
  2033. layerCheck("item_parking_map_problems", num.charAt(8));
  2034. layerCheck("item_parking_closed_map_problems", num.charAt(9));
  2035. layerCheck("item_parking_place_update_requests", num.charAt(10));
  2036. layerCheck("item_venues", num.charAt(12));
  2037. layerCheck("item_residential_places", num.charAt(13));
  2038. layerCheck("item_parking_places", num.charAt(14));
  2039. layerCheck("item_road", num.charAt(16));
  2040. layerCheck("item_junction_boxes", num.charAt(17));
  2041. layerCheck("item_closures", num.charAt(18));
  2042. layerCheck("item_speed_cameras", num.charAt(19));
  2043. layerCheck("item_railroad_crossings", num.charAt(34));
  2044. layerCheck("item_house_numbers", num.charAt(31));
  2045. layerCheck("item_satellite_imagery", num.charAt(21));
  2046. layerCheck("item_area_managers", num.charAt(22));
  2047. layerCheck("item_gps_points", num.charAt(23));
  2048. layerCheck("item_editable_areas", num.charAt(25));
  2049. layerCheck("item_live_users", num.charAt(24));
  2050. layerCheck("item_disallowed_turns", num.charAt(29));
  2051. layerCheck("item_map_comments", num.charAt(26));
  2052. layerCheck("item_city_names", num.charAt(28));
  2053.  
  2054. function layerCheck(layerName, state) {
  2055. try {
  2056. if ($('#layer-switcher-'+layerName).prop('checked') && state==0 || $('#layer-switcher-'+layerName).prop('checked')===false && state==1) { $('#layer-switcher-'+layerName).click(); }
  2057. } catch (e) { console.log("error while check layers: ", e); }
  2058. }
  2059. }
  2060. function objectsIsLoaded(selObjects) {
  2061. if (debug) { console.log('objectsIsLoaded',selObjects); }
  2062. if (selObjects) {
  2063. var objectsList = [], idObj=selObjects.substring(3).split(',');
  2064. try {
  2065. for (var i=0; idObj[i]; i++) {
  2066. // Identify type
  2067. switch (selObjects.substring(0, 2)) {
  2068. case 'sg':
  2069. var objType = W.selectionManager.model.segments.objects[idObj[i]];
  2070. var type = I18n.translations[I18n.locale].layers.name.segments;
  2071. break;
  2072. case 'nd':
  2073. objType = W.selectionManager.model.nodes.objects[idObj[i]];
  2074. type = I18n.translations[I18n.locale].layers.name.nodes;
  2075. break;
  2076. case 'vn':
  2077. objType = W.selectionManager.model.venues.objects[idObj[i]];
  2078. type = I18n.translations[I18n.locale].layers.name.landmarks;
  2079. break;
  2080. case 'ur':
  2081. objType = "ur";
  2082. type = I18n.translations[I18n.locale].layers.name.update_requests;
  2083. break;
  2084. case 'mp':
  2085. objType = "mp";
  2086. type = I18n.translations[I18n.locale].layers.name.problems;
  2087. break;
  2088. case 'mc':
  2089. objType = W.selectionManager.model.mapComments.objects[idObj[i]];
  2090. type = I18n.translations[I18n.locale].layers.name.comments;
  2091. break;
  2092. default : break;
  2093. }
  2094. // Try to select
  2095. if ((typeof objType === 'undefined' || typeof objType === 'string') &&
  2096. typeof W.map.updateRequestLayer.featureMarkers[idObj[i]] === 'undefined' &&
  2097. typeof W.map.problemLayer.featureMarkers[String(idObj[i].replace('%2F','/'))] === 'undefined'
  2098. ) {
  2099. count++;
  2100. if (debug) { console.info('LOOP (' + count + '): try to select '+type+' :' + idObj[i]); }
  2101. if (count >= 10) {
  2102. alert(type +'\n'+ I18n.translations[I18n.locale].problems.panel.more_info.not_available);
  2103. count=0;
  2104. setTimeout(function () {
  2105. BKMmapSearch.style.backgroundColor = '';
  2106. BKMmapSearch.style.color='';
  2107. BKMmapSearch.value='';
  2108. BKMmapSearch.placeholder=lang[17];
  2109. }, 2000);
  2110. return;
  2111. }
  2112. setTimeout((function(){ objectsIsLoaded(selObjects); }), 750);
  2113. return;
  2114. }
  2115. else {
  2116. if (debug) { console.info('LOOP : found '+type+' :' + idObj[i]); }
  2117. if (selObjects.substring(0, 2) === 'ur') { W.map.updateRequestLayer.featureMarkers[idObj[i]].marker.icon.$div[0].click(); }
  2118. else if (selObjects.substring(0, 2) === 'mp') { W.map.problemLayer.featureMarkers[String(idObj[i].replace('%2F','/'))].marker.icon.$div[0].click(); }
  2119. else if (selObjects.substring(0, 2) === 'vn') { objectsList.push(W.model.venues.objects[idObj[i]]); }
  2120. else if (selObjects.substring(0, 2) === 'nd') { objectsList.push(W.model.nodes.objects[idObj[i]]); }
  2121. else if (selObjects.substring(0, 2) === 'mc') { objectsList.push(W.model.mapComments.objects[idObj[i]]); }
  2122. else { objectsList.push(W.model.segments.objects[idObj[i]]); }
  2123. count=0;
  2124. setTimeout(function () {
  2125. BKMmapSearch.style.backgroundColor = '';
  2126. BKMmapSearch.style.color='';
  2127. BKMmapSearch.value='';
  2128. BKMmapSearch.placeholder=lang[17];
  2129. }, 2000);
  2130. }
  2131. }
  2132. } catch (e) {
  2133. console.log("error while getting selected item: ", e);
  2134. }
  2135. selObjects = '';
  2136. if (objType !== "none") {
  2137. W.selectionManager.unselectAll();
  2138. W.selectionManager.setSelectedModels(objectsList);
  2139. }
  2140. colorSearch(type);
  2141. }
  2142. }
  2143. function BKMconvertPermalink(data) { //Redo permalink
  2144. if (data) {
  2145. var l=data.split("|"), link = {};
  2146. link.env=l[5];
  2147. link.lat=l[1];
  2148. link.lon=l[0];
  2149. link.zoom=l[2];
  2150. link.layers=l[3];
  2151. link.MP=l[6];
  2152. link.UR=l[7];
  2153. link.MC=l[8];
  2154. if (l[4]) {
  2155. switch (l[4].substring(0, 1)) {
  2156. case 's': link.segments = l[4].substring(2); break;
  2157. case 'n': link.nodes = l[4].substring(2); break;
  2158. case 'v': link.venues = l[4].substring(2); break;
  2159. }
  2160. }
  2161. Object.keys(link).sort();
  2162. return link;
  2163. }
  2164. }
  2165. function colorSearch(msg) {
  2166. setTimeout(function () {
  2167. BKMmapSearch.style.backgroundColor='#4d4d4d';
  2168. BKMmapSearch.style.color='white';
  2169. (msg ? msg=msg+': ' : msg='')
  2170. BKMmapSearch.value=msg+lang[18];
  2171. }, 500);
  2172. setTimeout(function () {
  2173. BKMmapSearch.style.backgroundColor = '';
  2174. BKMmapSearch.style.color='';
  2175. BKMmapSearch.value='';
  2176. BKMmapSearch.placeholder=lang[17];
  2177. }, 2000);
  2178. }
  2179.  
  2180. // ***********************
  2181. // ** ANIMATE FUNCTIONS **
  2182. // ***********************
  2183.  
  2184. function bookmarksToggle() {
  2185. $('#divBookmarks').css('visibility', 'visible');
  2186. $('#divContent').css('display', 'block');
  2187. $('#divBookmarks').slideDown(); $('#iconBookmarks').css('color', '#36c');
  2188. $('#divShare').slideUp(); $('#iconShare').css('color', '#bbb');
  2189. $('#divHisto').slideUp(); $('#iconHisto').css('color', '#bbb');
  2190. $('#divCopy').slideUp(); $('#iconCopy').css('color', '#bbb');
  2191. $('#divBackup').slideUp(); $('#iconBackup').css('color', '#bbb');
  2192. $('#divSettings').slideUp(); $('#iconSettings').css('color', '#bbb');
  2193. $('#BKMedit').slideUp(200);
  2194. // BKMcheckActiveCountry();
  2195. reloadHtmlBookmarks();
  2196. if (getId('chkSynchro').checked === true) { getBookmarks(); }
  2197. }
  2198. function shareToggle() {
  2199. $('#divShare').css('visibility', 'visible');
  2200. $('#divContent').css('display', 'block');
  2201. $('#divBookmarks').slideUp(); $('#iconBookmarks').css('color', '#bbb');
  2202. $('#divShare').slideDown(); $('#iconShare').css('color', '#36c');
  2203. $('#divHisto').slideUp(); $('#iconHisto').css('color', '#bbb');
  2204. $('#divCopy').slideUp(); $('#iconCopy').css('color', '#bbb');
  2205. $('#divBackup').slideUp(); $('#iconBackup').css('color', '#bbb');
  2206. $('#divSettings').slideUp(); $('#iconSettings').css('color', '#bbb');
  2207. $('#BKMedit').slideUp(200);
  2208. // BKMcheckActiveCountry();
  2209. getShared();
  2210. }
  2211. function histoToggle() {
  2212. $('#divHisto').css('visibility', 'visible');
  2213. $('#divContent').css('display', 'block');
  2214. $('#divBookmarks').slideUp(); $('#iconBookmarks').css('color', '#bbb');
  2215. $('#divShare').slideUp(); $('#iconShare').css('color', '#bbb');
  2216. $('#divHisto').slideDown(); $('#iconHisto').css('color', '#36c');
  2217. $('#divCopy').slideUp(); $('#iconCopy').css('color', '#bbb');
  2218. $('#divBackup').slideUp(); $('#iconBackup').css('color', '#bbb');
  2219. $('#divSettings').slideUp(); $('#iconSettings').css('color', '#bbb');
  2220. $('#BKMedit').slideUp(200);
  2221. loadBookmarks('WMEHistoric', 'divHistoContent');
  2222. }
  2223. function copyToggle() {
  2224. $('#divCopy').css('visibility', 'visible');
  2225. $('#divContent').css('display', 'block');
  2226. $('#divBookmarks').slideUp(); $('#iconBookmarks').css('color', '#bbb');
  2227. $('#divShare').slideUp(); $('#iconShare').css('color', '#bbb');
  2228. $('#divHisto').slideUp(); $('#iconHisto').css('color', '#bbb');
  2229. $('#divCopy').slideDown(); $('#iconCopy').css('color', '#36c');
  2230. $('#divBackup').slideUp(); $('#iconBackup').css('color', '#bbb');
  2231. $('#divSettings').slideUp(); $('#iconSettings').css('color', '#bbb');
  2232. $('#BKMedit').slideUp(200);
  2233. reloadHtmlCopy();
  2234. // if (getId('chkSynchro').checked === true) { getCopyPaste(); }
  2235. }
  2236. function backupToggle() {
  2237. $('#divBackup').css('visibility', 'visible');
  2238. $('#divContent').css('display', 'block');
  2239. $('#divBookmarks').slideUp(); $('#iconBookmarks').css('color', '#bbb');
  2240. $('#divShare').slideUp(); $('#iconShare').css('color', '#bbb');
  2241. $('#divHisto').slideUp(); $('#iconHisto').css('color', '#bbb');
  2242. $('#divCopy').slideUp(); $('#iconCopy').css('color', '#bbb');
  2243. $('#divBackup').slideDown(); $('#iconBackup').css('color', '#36c');
  2244. $('#divSettings').slideUp(); $('#iconSettings').css('color', '#bbb');
  2245. $('#BKMedit').slideUp(200);
  2246. BKMbackup();
  2247. }
  2248. function settingsToggle() {
  2249. $('#divSettings').css('visibility', 'visible');
  2250. $('#divContent').css('display', 'block');
  2251. $('#divBookmarks').slideUp(); $('#iconBookmarks').css('color', '#bbb');
  2252. $('#divShare').slideUp(); $('#iconShare').css('color', '#bbb');
  2253. $('#divHisto').slideUp(); $('#iconHisto').css('color', '#bbb');
  2254. $('#divCopy').slideUp(); $('#iconCopy').css('color', '#bbb');
  2255. $('#divBackup').slideUp(); $('#iconBackup').css('color', '#bbb');
  2256. $('#divSettings').slideDown(); $('#iconSettings').css('color', '#36c');
  2257. $('#BKMedit').slideUp(200);
  2258. }
  2259.  
  2260. // ********************
  2261. // ** BOOKMARK LAYER **
  2262. // ********************
  2263.  
  2264. function checklayer(layer) {
  2265. if(W.map.getLayersBy("uniqueName",layer).length === 0) {
  2266. var LU_style=new OpenLayers.Style({
  2267. pointRadius: 2,
  2268. fontWeight: "normal",
  2269. label : "${labelText}",
  2270. fontFamily: "Tahoma, Courier New",
  2271. labelOutlineColor: "#FFFFFF",
  2272. labelOutlineWidth: 2,
  2273. fontColor: '#000000',
  2274. fontSize: "10px"
  2275. });
  2276. if (layer=="__WME_Bookmarks") {
  2277. bookmarks_Layer=new OpenLayers.Layer.Vector("Bookmarks", {
  2278. displayInLayerSwitcher: true,
  2279. uniqueName: layer,
  2280. shortcutKey: "S+b"
  2281. //styleMap: new OpenLayers.StyleMap(LU_style)
  2282. });
  2283. bookmarks_Layer.setVisibility(true);
  2284. W.map.addLayer(bookmarks_Layer);
  2285. I18n.translations[I18n.locale].layers.name[layer]="Bookmarks";
  2286. }
  2287. }
  2288. }
  2289. function createToggler(){
  2290. // Layers switcher
  2291. // test with script toggler----------------
  2292. var oldTogglers=document.querySelectorAll('.togglers');
  2293. oldTogglers.forEach(function(elt,indx){
  2294. if(elt.id != "toolboxUl"){
  2295. if (oldTogglers[indx].querySelector('.layer-switcher-group_scripts') === null) {
  2296. var newScriptsToggler=document.createElement('li');
  2297. newScriptsToggler.className='group';
  2298. newScriptsToggler.innerHTML='<div class="controls-container main toggler">\<input class="layer-switcher-group_scripts toggle" id="layer-switcher-group_scripts" type="checkbox">\<label for="layer-switcher-group_scripts">\<span class="label-text">Scripts</span>\</label>\</div>\<ul class="children">\</ul>';
  2299. oldTogglers[indx].appendChild(newScriptsToggler);
  2300. }
  2301.  
  2302. var groupScripts=document.querySelector('.layer-switcher-group_scripts').parentNode.parentNode;
  2303. var newScriptsChildren=getElementsByClassName("children", groupScripts)[0];
  2304.  
  2305. var WMECS_toggleUser=document.createElement('li');
  2306. WMECS_toggleUser.innerHTML='<div class="controls-container toggler">\<input class="layer-switcher-item_WME_bookmarks toggle" id="layer-switcher-item_WME_bookmarks" type="checkbox">\<label for="layer-switcher-item_WME_bookmarks">\<span class="label-text">Bookmarks</span>\</label>\</div>';
  2307. newScriptsChildren.appendChild(WMECS_toggleUser);
  2308. var toggleUser=getId('layer-switcher-item_WME_bookmarks');
  2309.  
  2310. newScriptsChildren.appendChild(WMECS_toggleUser);
  2311.  
  2312. var groupToggler=getId('layer-switcher-group_scripts');
  2313. groupToggler.checked=(typeof(localStorage.groupScriptsToggler) !=="undefined" ?
  2314. JSON.parse(localStorage.groupScriptsToggler) : true);
  2315.  
  2316. toggleUser.disabled=!groupToggler.checked;
  2317. toggleUser.addEventListener('click', function(e) {
  2318. bookmarks_Layer.setVisibility(e.target.checked);
  2319. var a=JSON.parse(localStorage.WMEBookmarksSettings);
  2320. a.showBookmark=e.target.checked;
  2321. localStorage.setItem('WMEBookmarksSettings', JSON.stringify(a));
  2322. });
  2323.  
  2324. groupToggler.addEventListener('click', function(e) {
  2325. toggleUser.disabled=!e.target.checked;
  2326. bookmarks_Layer.setVisibility(toggleUser.checked ? e.target.checked : toggleUser.checked);
  2327. localStorage.setItem('groupScriptsToggler', e.target.checked);
  2328. });
  2329. }
  2330. });
  2331. }
  2332.  
  2333. function LayerToggled(checked){
  2334. bookmarks_Layer.setVisibility(checked);
  2335. // var a=JSON.parse(localStorage.WMEBookmarksSettings);
  2336. // a.showBookmark=checked;
  2337. // localStorage.setItem('WMEBookmarksSettings', JSON.stringify(a));
  2338. }
  2339.  
  2340. function update_bookmarks_layer(bookmarkList) {
  2341. if (bookmarks_Layer.visibility == true && bookmarkList.length != 0) {
  2342. bookmarks_Layer.destroyFeatures();
  2343. for (var k=0; k < bookmarkList.length; k++) {
  2344. var marker=new OpenLayers.Feature.Vector(Geometrize(bookmarkList[k].lon, bookmarkList[k].lat), null, {
  2345. fillOpacity: 1,
  2346. fontSize: 15,
  2347. fontColor: "#ffff00",
  2348. label: bookmarkList[k].name,
  2349. labelYOffset: 22,
  2350. labelOutlineColor: "#ff0000",
  2351. labelOutlineWidth: 5,
  2352. stroke: true,
  2353. strokeColor: "#ff0000",
  2354. strokeWidth: 15,
  2355. strokeDashstyle: "solid"
  2356. });
  2357. var showBookmarks_Layer=W.map.layers.find(function (l) { return l.uniqueName == "__WME_Bookmarks"; });
  2358. showBookmarks_Layer.addFeatures(marker);
  2359. }
  2360. }
  2361. }
  2362. function Geometrize(lat, lon) {
  2363. var polyPoints= new OpenLayers.Geometry.Point(lat,lon).transform( new OpenLayers.Projection("EPSG:4326") , W.map.getProjectionObject());
  2364. var polygon=new OpenLayers.Geometry.Polygon(new OpenLayers.Geometry.LinearRing(polyPoints));
  2365. return polygon;
  2366. }
  2367.  
  2368. // *************************
  2369. // ** PREV/NEXT FUNCTIONS **
  2370. // *************************
  2371.  
  2372. function updatePos(){
  2373. if(_stopUpdPos)return;
  2374. var perma = getPermalink();
  2375. var DPerma = DecodePermalink(perma);
  2376. if(DPerma.zoom < 4) return;
  2377. if(_cur == perma) return;
  2378.  
  2379. if(_cur !== ''){
  2380. var newDPerma = DecodePermalink(perma);
  2381. var oldDPerma = DecodePermalink(_cur);
  2382. if(oldDPerma['lat'] == newDPerma['lat'] && oldDPerma['lon'] == newDPerma['lon'] && oldDPerma['zoom'] == newDPerma['zoom']){
  2383. function checkElm(type, patt){
  2384. _cur = _cur.replace(patt, '');
  2385. if(typeof(newDPerma[type]) !== 'undefined'){
  2386. _cur = _cur + perma.match(patt)[1];
  2387. }
  2388. }
  2389. checkElm('layers', /(&s=[\d]+)/);
  2390. checkElm('segments', /(&segments=[\d,]+)/);
  2391. checkElm('nodes', /(&nodes=[\d]+)/);
  2392. checkElm('venues', /(&venues=[\d.-]+)/);
  2393. checkElm('mapComments', /(&mapComments=[\d.-]+)/);
  2394. return;
  2395. }
  2396. _prev.unshift(_cur);
  2397. }
  2398. _cur = perma;
  2399. if(_prev.length > 0) { getId('prevIcon').className='toolbar-button toolbar-button-with-label'; }
  2400. if(_next.length == 0) { getId('nextIcon').className='toolbar-button toolbar-button-with-label ItemDisabled'; }
  2401. else { getId('nextIcon').className='toolbar-button toolbar-button-with-label'; }
  2402.  
  2403. // Limit historic to 20
  2404. while(_prev.length > 19)_prev.pop();
  2405. var a={}; a.prev=_prev; a.next=_next;
  2406. localStorage.setItem('WMEPrevNext', JSON.stringify(a));
  2407. }
  2408. function NavNext(e){
  2409. if(e.ctrlKey || e.altKey){
  2410. clearHistoric(e,false);
  2411. return;
  2412. }
  2413. if(_next.length > 0){
  2414. _prev.unshift(_cur);
  2415. _cur = _next.shift();
  2416. getId('prevIcon').className='toolbar-button toolbar-button-with-label';
  2417. if(_next.length === 0) { getId('nextIcon').className='toolbar-button toolbar-button-with-label ItemDisabled'; }
  2418. var a={}; a.prev=_prev; a.next=_next;
  2419. localStorage.setItem('WMEPrevNext', JSON.stringify(a));
  2420. RelocateMap();
  2421. }
  2422. else getId('nextIcon').className='toolbar-button toolbar-button-with-label ItemDisabled';
  2423. }
  2424. function NavPrev(e){
  2425. if(e.ctrlKey || e.altKey){
  2426. clearHistoric(e, true);
  2427. return;
  2428. }
  2429. if(_prev.length > 0){
  2430. _next.unshift(_cur);
  2431. _cur = _prev.shift();
  2432. getId('nextIcon').className='toolbar-button toolbar-button-with-label';
  2433. if(_prev.length === 0) { getId('prevIcon').className='toolbar-button toolbar-button-with-label ItemDisabled'; }
  2434. var a={}; a.prev=_prev; a.next=_next;
  2435. localStorage.setItem('WMEPrevNext', JSON.stringify(a));
  2436. RelocateMap();
  2437. }
  2438. else getId('prevIcon').className='toolbar-button toolbar-button-with-label ItemDisabled';
  2439. }
  2440. function clearHistoric(e, isPrev){
  2441. if(e.altKey){
  2442. _prev.splice(0, _prev.length);
  2443. getId('prevIcon').className='toolbar-button toolbar-button-with-label ItemDisabled';
  2444. _next.splice(0, _next.length);
  2445. getId('nextIcon').className='toolbar-button toolbar-button-with-label ItemDisabled';
  2446. }
  2447. else{
  2448. if(isPrev){
  2449. _prev.splice(0, _prev.length);
  2450. getId('prevIcon').className='toolbar-button toolbar-button-with-label ItemDisabled';
  2451. }
  2452. else{
  2453. _next.splice(0, _next.length);
  2454. getId('nextIcon').innerHTML='<i class="fa fa-arrow-circle-right"></i>';
  2455. }
  2456. }
  2457. }
  2458. function getPermalink(){
  2459. return document.getElementsByClassName('WazeControlPermalink')[0].getElementsByClassName('permalink')[0].href;
  2460. }
  2461. function checkPermaLink(){
  2462. _newP = getPermalink();
  2463. if(_newP != _oldP){
  2464. _oldP = _newP;
  2465. updatePos();
  2466. }
  2467. }
  2468. function DecodePermalink(perma){
  2469. var DecodedPerma = [];
  2470. perma = perma.replace(/#$/, '');
  2471. var patt = /[?&](\w+)=([\w\d-.,]+)/g;
  2472. var res = perma.match(patt);
  2473. for(var i=0; i < res.length; i++){
  2474. patt = /[?&](\w+)=([\w\d-.,]+)/;
  2475. var nres = res[i].match(patt);
  2476. DecodedPerma[nres[1]] = nres[2];
  2477. }
  2478. return DecodedPerma;
  2479. }
  2480. function RelocateMap(){
  2481. _stopUpdPos = true;
  2482. if (getId('chkHistoSelect').checked) { W.selectionManager.unselectAll(); }
  2483. var DecodedPerma = DecodePermalink(_cur);
  2484. W.map.setCenter(OpenLayers.Layer.SphericalMercator.forwardMercator(parseFloat(DecodedPerma.lon), parseFloat(DecodedPerma.lat)));
  2485. W.map.getOLMap().zoomTo(DecodedPerma.zoom);
  2486. updateSelectedItems();
  2487. }
  2488. function updateSelectedItems(){
  2489. if(_cur == '')return;
  2490. _stopUpdPos = true;
  2491. var DecodedPerma = DecodePermalink(_cur);
  2492. var tmp;
  2493. if(typeof(DecodedPerma['segments']) !== 'undefined'){
  2494. if(!selectSegments(DecodedPerma['segments'].split(",")))return;
  2495. }
  2496. else if(typeof(DecodedPerma['venues']) !== 'undefined'){
  2497. tmp = W.model.venues.getObjectById(DecodedPerma['venues']);
  2498. if(tmp === 'undefined')return;
  2499. selectItem([tmp]);
  2500. }
  2501. else if(typeof(DecodedPerma['nodes']) !== 'undefined'){
  2502. tmp = W.model.nodes.getObjectById(DecodedPerma['nodes']);
  2503. if(tmp === 'undefined')return;
  2504. selectItem([tmp]);
  2505. }
  2506. else if(typeof(DecodedPerma['mapComments']) !== 'undefined'){
  2507. TMP + W.model.mapComments.getObjectById(DecodedPerma['mapComments']);
  2508. if(tmp === 'undefined')return;
  2509. selectItem([tmp]);
  2510. }
  2511. _stopUpdPos = false;
  2512.  
  2513. function selectSegments(segList){
  2514. var segObj = [];
  2515. for(var i=0; i<segList.length; i++){
  2516. var theSeg = W.model.segments.getObjectById(segList[i]);
  2517. if(typeof(theSeg) !== 'undefined')segObj.push(theSeg);
  2518. }
  2519. if(segObj.length > 0){
  2520. selectItem(segObj);
  2521. return true;
  2522. }
  2523. return false;
  2524. }
  2525.  
  2526. function selectItem(obj){
  2527. if(getId('chkHistoNav').checked && getId('chkHistoSelect').checked) { W.selectionManager.setSelectedModels(obj); }
  2528. }
  2529. }
  2530.  
  2531. console.log('WME Bookmarks : ' + BKMversion + ' starting');
  2532. BKMinit();
  2533. }
  2534.  
  2535. const _timeouts = {
  2536. onWmeReady: undefined,
  2537. }
  2538.  
  2539. function checkTimeout(obj) {
  2540. if (obj.toIndex) {
  2541. if (_timeouts[obj.timeout]?.[obj.toIndex]) {
  2542. window.clearTimeout(_timeouts[obj.timeout][obj.toIndex]);
  2543. delete (_timeouts[obj.timeout][obj.toIndex]);
  2544. }
  2545. }
  2546. else {
  2547. if (_timeouts[obj.timeout]) {
  2548. window.clearTimeout(_timeouts[obj.timeout]);
  2549. }
  2550. _timeouts[obj.timeout] = undefined;
  2551. }
  2552. }
  2553.  
  2554. function log(message) {
  2555. if (typeof message === 'string') {
  2556. console.log('%cWME Bookmarks: %c' + message, 'color:black', 'color:#d97e00');
  2557. } else {
  2558. console.log('%cWME Bookmarks:', 'color:black', message);
  2559. }
  2560. }
  2561.  
  2562. function onWmeReady(tries = 1) {
  2563. if (typeof tries === 'object') {
  2564. tries = 1;
  2565. }
  2566. checkTimeout({ timeout: 'onWmeReady' });
  2567. if (WazeWrap?.Ready) {
  2568. log('WazeWrap is ready. Proceeding with initialization.');
  2569. onWazeWrapReady();
  2570. }
  2571. else if (tries < 1000) {
  2572. log(`WazeWrap is not in Ready state. Retrying ${tries} of 1000.`);
  2573. _timeouts.onWmeReady = window.setTimeout(onWmeReady, 500, ++tries);
  2574. }
  2575. else {
  2576. log('onWmeReady timed out waiting for WazeWrap Ready state.');
  2577. }
  2578. }
  2579.  
  2580. function onWmeInitialized() {
  2581. if (W.userscripts?.state?.isReady) {
  2582. log('W is ready and in "wme-ready" state. Proceeding with initialization.');
  2583. onWmeReady();
  2584. } else {
  2585. log('W is ready, but not in "wme-ready" state. Adding event listener.');
  2586. document.addEventListener('wme-ready', onWmeReady, { once: true });
  2587. }
  2588. }
  2589.  
  2590. function bootstrap() {
  2591. if (!W) {
  2592. log('W is not available. Adding event listener.');
  2593. document.addEventListener('wme-initialized', onWmeInitialized, { once: true });
  2594. } else {
  2595. onWmeInitialized();
  2596. }
  2597. }
  2598.  
  2599. bootstrap();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址