您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
This script make a Check for Roads naming (Only for french editors)
当前为
// ==UserScript== // @name WME Check Road Name // @author buchet37 // @description This script make a Check for Roads naming (Only for french editors) // @namespace https://greasyfork.org/users/4062 // @match https://world.waze.com/editor/* // @match https://*.waze.com/editor/* // @match https://*.waze.com/*/editor/* // @match https://world.waze.com/map-editor/* // @match https://world.waze.com/beta_editor/* // @match https://www.waze.com/map-editor/* // @grant GM_xmlhttpRequest // @include https://editor-beta.waze.com/* // @include https://*.waze.com/editor/editor/* // @include https://*.waze.com/*/editor/* // @version 1.7.15 // ==/UserScript== // Based on Street to River ( https://greasyfork.org/scripts/1879-wme-street-to-river-plus ) // GreatThanks to aeytom if ('undefined' == typeof WME_CRN_onload) { // le script n'est a pas encore chargé unsafeWindow.WME_CRN_onload = "In Progress"; unsafeWindow.WME_CRN_1_wordGenericState = "In Progress"; unsafeWindow.WME_CRN_1_roadGenericState = "In Progress"; unsafeWindow.WME_CRN_1_IncorrectCitiesState = "In Progress"; unsafeWindow.WME_CRN_1_citiesDoublonsState = "In Progress"; GM_xmlhttpRequest({ method: 'GET', url: 'https://www.dropbox.com/s/nfrrfe04vdl2kvw/CorrectMots.txt?dl=1', headers: {"User-Agent": "Mozilla/5.0", // If not specified, navigator.userAgent will be used. "Accept": "text/plain" }, // If not specified, browser defaults will be used. synchronous: false, onload: function (wordDetails) { unsafeWindow.WME_CRN_1_wordGenericTxt = wordDetails.responseText; unsafeWindow.WME_CRN_1_wordGenericState = "Ready"; } }); GM_xmlhttpRequest({ method: 'GET', url: 'https://www.dropbox.com/s/g1y7rrvthgxrx0p/CorrectRue.txt?dl=1', headers: {"User-Agent": "Mozilla/5.0", "Accept": "text/plain" }, synchronous: false, onload: function (roadDetails) { unsafeWindow.WME_CRN_1_roadGenericTxt = roadDetails.responseText; unsafeWindow.WME_CRN_1_roadGenericState = "Ready"; } }); GM_xmlhttpRequest({ method: 'GET', url: 'https://www.dropbox.com/s/e1pojw81quth43u/citiesIncorrectes.txt?dl=1', headers: {"User-Agent": "Mozilla/5.0", "Accept": "text/plain" }, synchronous: false, onload: function (responseIncorrectCities) { unsafeWindow.WME_CRN_1_IncorrectCitiesTxt = responseIncorrectCities.responseText; unsafeWindow.WME_CRN_1_IncorrectCitiesState = "Ready"; } }); GM_xmlhttpRequest({ method: 'GET', url: 'https://www.dropbox.com/s/dklv3al61o1sx86/citiesDoublons.txt?dl=1', headers: {"User-Agent": "Mozilla/5.0", "Accept": "text/plain"}, synchronous: false, onload: function (responseDoublons) { unsafeWindow.WME_CRN_1_citiesDoublonsTxt = responseDoublons.responseText; unsafeWindow.WME_CRN_1_citiesDoublonsState = "Ready"; } }); } if ('undefined' == typeof __RTLM_PAGE_SCOPE_RUN__) { (function page_scope_runner() { // If we're _not_ already running in the page, grab the full source // of this script. var my_src = "(" + page_scope_runner.caller.toString() + ")();"; // Create a script node holding this script, plus a marker that lets us // know we are running in the page scope (not the Greasemonkey sandbox). // Note that we are intentionally *not* scope-wrapping here. var script = document.createElement('script'); script.setAttribute("type", "text/javascript"); script.textContent = "var __RTLM_PAGE_SCOPE_RUN__ = true;\n" + my_src; // Insert the script node into the page, so it will run, and immediately // remove it to clean up. Use setTimeout to force execution "outside" of // the user script scope completely. setTimeout(function() { document.body.appendChild(script); document.body.removeChild(script); }, 0); })(); // Stop running, because we know Greasemonkey actually runs us in // an anonymous wrapper. return; } function CheckRoadName() { var WME_CRN_wordGeneric = []; // déclaration Hors "loadFiles" pour compatibilité Chrome var WME_CRN_roadGeneric = []; var WME_CRN_citiesDoublons = []; var WME_CRN_IncorrectCities = []; //alert ( WME_CRN_onload ); // ***************** COMPATIBILITY WITH NEW EDITOR *********** var WazeActionCreateObject = require("Waze/Action/CreateObject"); var WazeActionMultiAction = require("Waze/Action/MultiAction"); var WazeActionUpdateObject = require("Waze/Action/UpdateObject"); var WazeModelObjectType = require("Waze/Model/ObjectType"); // ***************************************************************** loadFiles (); function loadFiles () { // Passage en variable locales if (WME_CRN_onload != "Ready" ) { var i = 0; // compteur if (WME_CRN_1_wordGenericState == "Ready") { WME_CRN_wordGeneric = traiteGeneric (WME_CRN_1_wordGenericTxt); i++; } if (WME_CRN_1_roadGenericState == "Ready") { WME_CRN_roadGeneric = traiteGeneric (WME_CRN_1_roadGenericTxt); i++; } if (WME_CRN_1_citiesDoublonsState == "Ready") { WME_CRN_citiesDoublons = WME_CRN_1_citiesDoublonsTxt.split(/\n|\r|\r\n/); i++; } if (WME_CRN_1_IncorrectCitiesState == "Ready"){ WME_CRN_IncorrectCities = WME_CRN_1_IncorrectCitiesTxt.split(/\n|\r|\r\n/); i++; } if ( i == 4) { // tout est chargé WME_CRN_onload = "Ready"; // Flag = OK et purge variables globales delete WME_CRN_1_wordGenericState;delete WME_CRN_1_roadGenericState;delete WME_CRN_1_citiesDoublonsState;delete WME_CRN_1_IncorrectCitiesState; delete WME_CRN_1_wordGenericTxt; delete WME_CRN_1_roadGenericTxt; delete WME_CRN_1_citiesDoublonsTxt; delete WME_CRN_1_IncorrectCitiesTxt; insertButton(); // les fichiers sont chargés = > on met en place les boutons } else { setTimeout (function () {loadFiles();}, 1000); } } } function traiteGeneric(texte) { var generic = texte.replace (/\t\t/g,"\t"); // supprime les doubles tabulation var genericSplit = generic.split(/\n|\r|\r\n/); // split var inter1 = []; for(var i = 0; i < genericSplit.length; i++) { genericSplit[i] = genericSplit[i].replace (/^[ ]*\t/g,"\/\/"); if (!(/^[ ]*\/\//.test(genericSplit[i])) && genericSplit[i] !="") { var inter2 = genericSplit[i].split(/\t/); inter2[0]=inter2[0].replace (/[ ]*$/g,""); inter2[1]="("+inter2[1].replace (/[ ]*$/g,"")+")"; var inter3 = inter2[0].split("/"); if (!inter3[2]) {inter3[2]="";} inter1.push({toVerify: inter3[1],flags: inter3[2], corrected : inter2[1]}); } } return inter1; } String.prototype.capitalize = function() { return this.charAt(0).toUpperCase() + this.slice(1); }; function insertButton() { if(document.getElementById('WME_CRN_All') == null) { var chk1 = $('<Label style="font-weight:normal;margin-right:10px"><input type="checkbox"; style="vertical-align: middle;margin: 0px;" id="WME_CRN_enable" title="Enable or Disable WME CRN">On-Off</input></Label>'); var cnt1 = $ ('<section id="WME_CRN_link" style="padding-top:2px;;display: inline;"/>'); cnt1.append(chk1);cnt1.append(" "); cnt1.append('<div style="font-size:12px;display: inline;"> <u><i><a href="https://greasyfork.org/scripts/3776-wme-check-road-name" target="_blank">Check Road Name V1.7.15</a></i></u>'); var btn1 = $('<button class="btn btn-default" style="padding:0px 10px; height:22px" id="WME_CRN_chk" title="Click this button to Check Road Names">Check Road</button>'); btn1.click(rename_Road); var btn2 = $('<button class="btn btn-default" style="padding:0px 10px; margin:0px 5px; height:22px" id="WME_CRN_stop" title="Click this button to stop">Stop</button>'); btn2.click(stop_check); var chk2 = $('<Label style="font-weight:normal"><input type="checkbox"; style="vertical-align: middle;margin: 0px;" id="WME_CRN_CheckRoadName" title="Click for automatic check of road name (and landmark if layer On)"> Auto </input></Label>'); var btn3 = $('<button class="btn btn-default" style="padding:0px 10px; margin-left:5px; height:22px" id="WME_CRN_raz" title="Click this button to Clear stored roads">RAZ</button>'); btn3.click(RAZ); var cnt2 = $ ('<section id="WME_CRN_rename" style="padding-top:2px"/>'); cnt2.append(btn1); cnt2.append(btn2); cnt2.append(chk2); cnt2.append(btn3); var WME_CRN_Menu = $ ('<div id="WME_CRN_All" style="height: auto;width:100%;"/>'); WME_CRN_Menu.append(cnt1); WME_CRN_Menu.append(cnt2); //Boite de dialogue City Change var myDialogBox = $ ('<div id="WME_CRN_ChangeCity" style="display :none; padding:10px; z-index: 1500;position: absolute;top :80px; left : 80px;background-color:#FFFFFF; border-width:3px; border-style:double;border-color: rgb(147, 196, 211); border-radius:10px"/>'); var txt0 = $('<div id= "WME_CRN_ChangeCityTitle" style="text-align:center;padding:0px 0px"><b>Incorrect City Name Detected</b>'); myDialogBox.append(txt0); var cnt11 = $('<section style="text-align: center; padding-top:2px; font-weight: bold" id="WME_CRN_OldCity"/>'); var txt1 = $('<div id= "WME_CRN_CityIDtoChange" style="display:inline;padding:0px 0px">City ID/'); var txt2 = $('<div id= "WME_CRN_nametoChange" style="display:inline;padding:0px 0px">City Name/>'); cnt11.append("ID: ");cnt11.append(txt1); cnt11.append(" "); cnt11.append(txt2); myDialogBox.append(cnt11); myDialogBox.append('<hr style="margin-bottom:5px; margin-top:5px" width="100%">'); myDialogBox.append('<label style="font-weight:normal">Correct it or select in the list</label> : <input class="form-control" style="padding:0px; margin-bottom: 10px;height:22px" type="text" value="My Default City Name" id="WME_CRN_newCityName" />'); var dplist4 = $('<select class="form-control" style="display: block; margin-bottom: 10px;padding:0px; height:22px" id="WME_CRN_cityList"> <option value="0">Strict</option><option value="1">Large</option></select>'); myDialogBox.append(dplist4); var cnt10 = $('<section style="padding-top:2px"/>'); var btn8 = $('<button class="btn btn-default" style="padding:0px 10px;margin-right: 5px; height:22px" title="Click this button to clear City Name on selected Roads">Cancel </button>'); var btn9 = $('<button class="btn btn-default" style="padding:0px 10px; height:22px" title="Click this button to clear City Name on selected Roads">Validate Change</button>'); btn8.click(cancel_Change_city_Name); btn9.click(valid_Change_city_Name); cnt10.append(btn8); cnt10.append(btn9); myDialogBox.append(cnt10); // ******* Mise en place des buttons var WME_CRN_MenuFlag = false, myAlertBoxFlag = false, myDialogBoxFlag = false; function put_WME_CRN_Menu() { // wait for 'sidebar' if (document.getElementById('sidebar')!=null) { if (document.getElementById('WME_JCB_All')!=null) { // si mon menu existe $("#WME_JCB_All").append('<hr style="margin-bottom:5px; margin-top:5px;width=100%;color:SkyBlue; background-color:SkyBlue; height:1px;">'); } // on ajoute une barre else { var WME_JCB_Menu = $ ('<div id="WME_JCB_All" style="padding:2px 5px 2px 5px;margin:5px 0px 30px 0px;width:295px; border-width:3px; border-style:double;border-color: SkyBlue; border-radius:10px"/>'); $("#sidebar").append(WME_JCB_Menu); // sinon on le créé } $("#WME_JCB_All").append(WME_CRN_Menu); // on ajoute le menu CRN WME_CRN_MenuFlag = true; } else { setTimeout (function () {put_WME_CRN_Menu();}, 500); } } put_WME_CRN_Menu(); // Boite d'alerte function put_myAlertBox() { if (document.getElementById('map-search')!=null) { if (document.getElementById('WME_JCB_AlertBox')==null) { var myAlertBox = $('<div id="WME_JCB_AlertBox" class="form-control search-query" style="opacity : 0.8;display :none; height: auto;min-height: 30px; position: absolute;top :16px; margin-left: 350px; margin-right: auto; "/>'); var myAlertTxt = $('<div id="WME_JCB_AlertTxt" style=" opacity : 1;display:inline;padding:0px 0px">City ID/'); myAlertBox.append(myAlertTxt); $("#map-search").append(myAlertBox); } myAlertBoxFlag = true; } else {setTimeout (function () {put_myAlertBox();}, 501);} } put_myAlertBox(); // Boite d'alerte function put_myDialogBox() { if (document.getElementById('map')!=null) { $("#map").append(myDialogBox); myDialogBoxFlag = true;} else {setTimeout (function () {put_myDialogBox();}, 501);} } put_myDialogBox(); function start_init_WME_CRN() { // si tous les boutons sont chargés on démarre le script if (WME_CRN_MenuFlag && myAlertBoxFlag && myDialogBoxFlag) {init_WME_CRN();} else {setTimeout(function () {start_init_WME_CRN();}, 501);} } start_init_WME_CRN(); } console_log("Check Road Name initialized"); } var WME_CRN_badStreet = []; var WME_CRN_goodStreet = []; var WME_CRN_badAlternateStreet = []; var listSegIDs = []; var cityIds = []; var listLmrkIDs = []; function RAZ (ev) { WME_CRN_badStreet.length = 0; WME_CRN_goodStreet.length = 0; WME_CRN_badAlternateStreet.length = 0; document.getElementById('WME_CRN_raz').disabled = true; // on desactive le bouton RAZ puisque les tableaux sont vides return; } function stop_check (ev) { listSegIDs.length = 0; cityIds.length = 0; listLmrkIDs.length = 0; document.getElementById ('WME_CRN_CheckRoadName').checked = 0; document.getElementById ('WME_CRN_CheckRoadName').disabled = false; document.getElementById ('WME_CRN_chk').disabled = false; return; } function cancel_Change_city_Name(ev) { WME_CRN_badStreet.push (document.getElementById ('WME_CRN_nametoChange').innerHTML); // stocke l'annulation si on est en détction automatique document.getElementById ('WME_CRN_raz').disabled = false; document.getElementById ('WME_CRN_ChangeCity').style.display = "none"; } function valid_Change_city_Name(ev) { if (findPending().length==0) { // wait for loading var CityIDtoChange = document.getElementById ('WME_CRN_CityIDtoChange').innerHTML; var CityToChange = Waze.model.cities.objects[CityIDtoChange]; var oldCityName = document.getElementById ('WME_CRN_nametoChange').innerHTML; var CityID = document.getElementById ('WME_CRN_cityList').value; var newCityName = document.getElementById ('WME_CRN_newCityName').value; if ((newCityName == oldCityName) && (CityID !="00")) { // Traitement par le menu déroulant newCityName = Waze.model.cities.objects[CityID].name; } var newCityID = SearchCityID(CityToChange.countryID, CityToChange.stateID, newCityName); if (newCityID!= null && CityIDtoChange!="" && newCityName != oldCityName){ for (var roadID in Waze.model.segments.objects) { var sel = Waze.model.segments.objects[roadID]; if (sel!= null && sel.type == "segment" && sel.state != "Delete" && sel.attributes.primaryStreetID!= null && sel.isAllowed(sel.PERMISSIONS.EDIT_GEOMETRY) ) { var street = Waze.model.streets.objects[sel.attributes.primaryStreetID]; if (street && street.cityID == CityIDtoChange && limitForSaveNotReach() ) { var newPrimaryID = SearchPrimaryID (street.id, newCityName, street.name); if (newPrimaryID!= null) { Waze.model.actionManager.add (new WazeActionUpdateObject(sel, {primaryStreetID: newPrimaryID})); } } if (sel.attributes.streetIDs) { // traitement des alternate names var altName = sel.attributes.streetIDs; var AltNameAdd =[]; var modif = false; for (var i = 0; i < altName.length;i++) { var street = Waze.model.streets.objects[altName[i]]; if (street && street.cityID == CityIDtoChange) { var newPrimaryID = SearchPrimaryID (street.id, newCityName, street.name); if (newPrimaryID!= null) { modif =true altName.splice (i,1); // on retire l'ancien i = 0; // et on positionne l'index pour un rebalayage du tableau if (notInArray(newPrimaryID,altName) && notInArray(newPrimaryID,AltNameAdd)) { AltNameAdd.push(newPrimaryID); //et on ajoute l'autre s'il n'existe pas } } } } if (modif) {Waze.model.actionManager.add (new WazeActionUpdateObject(sel, {streetIDs: altName.concat (AltNameAdd)}));} } } } for (var ldmkID in Waze.model.venues.objects) { var ldmk = Waze.model.venues.objects[ldmkID]; if (ldmk!= null && ldmk.state != "Delete" && ldmk.attributes.streetID!= null && ldmk.isAllowed(ldmk.PERMISSIONS.EDIT_GEOMETRY)) { var street = ldmk.model.streets.get(ldmk.attributes.streetID); if (street && street.cityID == CityIDtoChange && limitForSaveNotReach() ) { var newPrimaryID = SearchPrimaryID (street.id, newCityName, street.name); if (newPrimaryID!= null) { Waze.model.actionManager.add (new WazeActionUpdateObject(ldmk,{streetID: newPrimaryID})); } } } } } document.getElementById ('WME_CRN_ChangeCity').style.display = "none"; } if (!limitForSaveNotReach()){myAlert ("<FONT color='red'><b>Please save and retry</b></FONT>");} } function rename_Road(ev) { //console_log (Math.random()); var name, oldName, newName; var modif = false; var road, ldmk, street, city; var roadID,ldmkID,cityID,goodstreet; listLmrkIDs.length = 0; listSegIDs.length = 0; cityIds.length = 0; if (findPending().length==0 && Waze.map.zoom > 1 && limitForSaveNotReach() && document.getElementById ('WME_CRN_ChangeCity').style.display != "block" ) { // wait for loading var date = new Date(); var myWazeSegments = []; myWazeSegments = Waze.model.segments.objects; var myWazeStreets = []; myWazeStreets = Waze.model.streets.objects; var myWazeCities = []; myWazeCities = Waze.model.cities.objects; if (Object.keys(myWazeSegments).length > 1000 && document.getElementById ('WME_CRN_CheckRoadName').checked ==1) { document.getElementById ('WME_CRN_CheckRoadName').checked = 0; myAlert ("Too many segments (>1000)"); myAlert ("Auto Check has been disabled"); } document.getElementById('WME_CRN_chk').disabled = true; // on désactive le bouton "check" durant le check document.getElementById('WME_CRN_CheckRoadName').disabled = true; for (roadID in myWazeSegments) { road = myWazeSegments[roadID]; if (onScreen(road) && road.isAllowed(road.PERMISSIONS.EDIT_GEOMETRY)) { // la rue existe et "on a les droits";) //cleanAlternativeStreet (road); street = myWazeStreets[road.attributes.primaryStreetID]; if (street && street.cityID != null) { city = myWazeCities[street.cityID]; if (city && city.name!=null && city.countryID =="73") { if (city.name!="" ) { cityIds.push (street.cityID); // alimente la base de villes } if (notInArray(road.attributes.primaryStreetID,WME_CRN_badStreet) && notInArray(road.attributes.primaryStreetID,WME_CRN_goodStreet)) { // Le segment remplit toutes les conditions pour analyse ultérieure listSegIDs.push (roadID); // alimente la bsase des rues a tester } } } } } listSegIDs = delete_multi_Ids (listSegIDs); modif = checkRoadName (listSegIDs); // vérfication de noms en prodécure externe if (checkLayerState ("landmarks")) { var myWazeVenues = []; myWazeVenues = Waze.model.venues.objects; for (ldmkID in myWazeVenues) { ldmk = myWazeVenues[ldmkID]; if (ldmk!= null && ldmk.state != "Delete" && onScreen(ldmk) && (ldmk.attributes.streetID!= null) && ldmk.isAllowed(ldmk.PERMISSIONS.EDIT_GEOMETRY)) { street = myWazeStreets[ldmk.attributes.streetID]; if (street && street.cityID != null) { city = myWazeCities[street.cityID]; if (city && city.name!=null && city.countryID =="73" && city.name!="" ) { cityIds.push (street.cityID); // alimente la base de villes } oldName = ldmk.attributes.name; if (oldName && oldName!="" && notInArray(oldName,WME_CRN_badStreet) && notInArray(oldName,WME_CRN_goodStreet)) { // Le segment remplit toutes les conditions pour analyse ultérieure listLmrkIDs.push (ldmkID); // alimente la bsase des rues a tester } } } } listLmrkIDs = delete_multi_Ids (listLmrkIDs); modif = checkLandmarkName (listLmrkIDs); } cityIds = delete_multi_Ids (cityIds); // for (var i = 0, len_i = cityIds.length; i<len_i;i++) { // cityID = cityIds[i]; // city = myWazeCities[cityID]; // if (document.getElementById ('WME_CRN_ChangeCity').style.display != "block" && notInArray(city.name, WME_CRN_badStreet) && testCityName (city.name) ) { // verification du nom de ville // init_WME_CRN_ChangeCity(cityID,"red"); // document.getElementById ('WME_CRN_ChangeCity').style.display = "block"; // } // } checkAlternateRoad (myWazeSegments); // vérification des DXXX - Rue xxx hors ville if (!limitForSaveNotReach()){myAlert ("<FONT color='red'><b>Please save and retry</b></FONT>");} } setTimeout (function(){manage_CheckRoadName();},4001); } function checkAlternateRoad (myWazeSegments) { for (roadID in myWazeSegments) { road = myWazeSegments[roadID]; if (onScreen(road) && notInArray(road.attributes.primaryStreetID,WME_CRN_badAlternateStreet) && road.isAllowed(road.PERMISSIONS.EDIT_GEOMETRY) && limitForSaveNotReach() ) { // la rue existe et "on a les droits";) street = Waze.model.streets.objects[road.attributes.primaryStreetID]; if (street && street.cityID != null ) { city = Waze.model.cities.objects[street.cityID]; if (city && city.countryID == "73" && (city.name == null || city.isEmpty)) { createAlternateStreet(road,street.name); } } } } } function createAlternateStreet(seg, name ) { if (/^[A|D|N|M][0-9]+/.test(name) && /( - [a-zA-ZéÉ][a-zA-Zéèê'])/.test(name)) { // c'est une route nommée et il y a un mot de 2 lettres après le séparateur var match = /( - [a-zA-Z][a-zA-Z'])/.exec(name); // position de la coupure var name1 = name.substr(0,match.index); var name2 = name.substr(match.index+3); var message = "Wrong Street Name Detected\n\n City : None\n Street name: "+name+"\n"; if (seg.attributes.streetIDs) { var altName =seg.attributes.streetIDs; for (var i = 0; i<altName.length;i++) { if (i == 0) { message = message + " Alternate names :\n" ;} street = Waze.model.streets.objects[altName[i]]; message = message + " "+street.name + "\n"; } } message = message + "\n New name : "+ name1 + "\n New alternate name : "+name2; Waze.selectionManager.select([seg]); if (confirm (message)) { var name1ID = SearchPrimaryID (seg.attributes.primaryStreetID, "", name1); if (name1ID!=null) { Waze.model.actionManager.add (new WazeActionUpdateObject(seg, {primaryStreetID: name1ID}));} var name2ID = SearchPrimaryID (seg.attributes.primaryStreetID, "", name2); if (name2ID!=null) { addAlternativeStreet(seg,name2ID);} } else { WME_CRN_badAlternateStreet.push (seg.attributes.primaryStreetID); // on stocke l'entrée rejectée; } Waze.selectionManager.select([]); } } function addAlternativeStreet (sel,newPrimaryID) { if (!sel) {return null;} if (sel.attributes.streetIDs) {var altName =sel.attributes.streetIDs;} else {var altName=[];} if (notInArray(newPrimaryID,altName)) { Waze.model.actionManager.add (new WazeActionUpdateObject(sel, {streetIDs: altName.concat ([newPrimaryID])})); } } function cleanAlternativeStreet (sel) { if (sel && sel.attributes.streetIDs) { var newAltName =[]; var altName = sel.attributes.streetIDs; for (var i = 0; i <altName.length;i++) { var street = Waze.model.streets.objects[altName[i]]; if (!street && street.name && street.name !="") { //if (street.name && street.name !="") { newAltName.push(altName[i]); } } if (newAltName.length != altName.length) { Waze.model.actionManager.add (new WazeActionUpdateObject(sel, {streetIDs: newAltName})); myAlert ("Segment :"+sel.getID()+" has incorrect alternate Street. it's now corrected"); //myAlert ("it's now corrected"); } } } function init_WME_CRN_ChangeCity(cityID,color) { document.getElementById ('WME_CRN_OldCity').style.color = color; document.getElementById ('WME_CRN_CityIDtoChange').innerHTML = cityID; var cityName = ""; if (cityID!="") {cityName = Waze.model.cities.objects[cityID].name;} document.getElementById ('WME_CRN_nametoChange').innerHTML = encodeHTML(cityName); document.getElementById ('WME_CRN_newCityName').value = cityName; document.getElementById ('WME_CRN_cityList').innerHTML = feedCityList(); document.getElementById ('WME_CRN_ChangeCity').style.display = "block"; document.getElementById ('WME_CRN_ChangeCityTitle').innerHTML = "<b>Incorrect City Name Detected</b>"; } function onScreen(obj){ if (obj.geometry){ return(Waze.map.getExtent().intersectsBounds(obj.geometry.getBounds()));} return false; } function testCityName (Name) { if (isInArray (Name,WME_CRN_IncorrectCities)) {return true; } // test with confirmed incorrect city if (Name.length==1 && Name !="Y") {return true;} // ville d'une seule lettre et diff de "Y" (Somme) if (/^[a-z0-9]/.test(Name)) {return true;} // commence par une minuscule ou un chiffre if (/[A-Z][A-Z]/.test(Name)) {return true;} // à 2 majuscules consécutives if (/(')[a-z]/.test(Name)) {return true;} // minuscule après apostrophe if (/[.,#@"]/.test(Name)) {return true;} // présence de point ou de virgule ou autres if (/([-][ ]|[ ][-])/.test(Name)) {return true;} // Espace avant ou après tiret if (/[ ][ ]/.test(Name)) {return true;} // double espace if (/[ -]$/.test(Name)) {return true;} // espace ou tiret à la fin //if (/[o][e]/.test(Name)) {return true;} // e dans l'o // Parenthèses if ((/[(]/.test(Name))!= (/[)]/.test(Name))) {return true;} // Parenthèse ouvrante sans parenthèse fermante (et vice versa) if ((/[(]/.test(Name))&& !(/[ ][(][ÉA-Z0-9]/.test(Name))) {return true;} // Parenthèse ouvrante sans espace avant ou sans majuscule ou chiffre après if ((/[)]/.test(Name))&& !(/[ûéa-z0-9)][)]/.test(Name))) {return true;} // Parenthèse fermante sans minuscule, chiffre ou ")" avant if ((/.*[ ].*[ ].*[ ].*/.test(Name))&& !(/[(]/.test(Name))) {return true;} // 3 espaces ou plus dans le nom et pas de parentèses // Voire réduire à 2 // Chiffres if (/[0-9][0-9][0-9][0-9][0-9]/.test(Name)) {return true;} // 5 Chiffres consécutifs dans le nom (Code postal)) if (/[0-9][0-9][0-9][0-9]/.test(Name) && !/[123][0-9][0-9][0-9]/.test(Name)) {return true;} // 4 chiffres mais une altitude (Station de ski) if (/[0-9][0-9][0-9]/.test(Name) && !/[0-9][0-9][0-9][0-9]/.test(Name)) {return true;} // 3 chiffres mais pas 4 if (/(^Rue |^Avenue )/.test(Name)) {return true;} if ((/[ ](sur|sous|en|le|de|du|aux)[ ]/.test(Name)) && !(/[(]/.test(Name))) {return true;} // "sur" précédé et suivi d'un espace et ce n'est pas un lieudit if (/(Saint[e]*[ ])/.test(Name)) {return true;} // Saint suivi d'un espace var doublons = WME_CRN_citiesDoublons; var lenDoublons = doublons.length; var testDoublons; for (var i = 0; i < lenDoublons;i++) { testDoublons = (doublons[i] == Name); if (testDoublons && !(/[(][0-9][0-9][)]/.test(Name))) {return true;} // Ville en doublon sans département et parenthèses } var nameToTest = Name.replace (/[ ]*[(][0-9][0-9][)]*/,""); //supprime le numéro en fin de nom if (/[(]/.test(nameToTest)) { nameToTest = nameToTest.replace (/^(.)*[(]/,""); //supprime ce qu'il y a avant la parenthèses ouvrante (cas des lieux-dits) } if (/[(][0-9][0-9][)]/.test(Name)){ // ville supposée en doublon car avec (XX) for (var j = 0; j <lenDoublons;j++) { if (nameToTest == doublons[j]) {return false;} // Ville en doublon sans parenthèses } return true; } return false; } function feedCityList() { var cityIds= []; for (var cityID in Waze.model.cities.objects) { cityIds.push(cityID); } return doCityList (cityIds); } function doCityList (CityIds) { CityIds = delete_multi_Ids (CityIds); var city = sortCityIDs (CityIds); var dplist= '<select><option value="00">-----------------------------------------</option>'; //build street menu for (var i = 0; i <city.length;i++) { dplist = dplist +'<option value='+ city[i].ID +'>'+city[i].name+'</option>'; } dplist = dplist + '</select>'; return dplist; } function sortCityIDs (CityIds) { var city = []; var nameArray = []; var newName = []; for (var i = 0,len_i = CityIds.length; i <len_i;i++) { var CityId = CityIds[i]; nameArray[i] = Waze.model.cities.objects[CityId].name; newName[i] = Waze.model.cities.objects[CityId].name; } newName.sort(); for (var i = 0; i < newName.length;i++) { for (var j = 0; j < nameArray.length;j++) { if (newName[i] == nameArray[j]) { city[i]={name: nameArray[j], ID:CityIds[j]}; } } } return city; } function checkLandmarkName (listLmrkIDs) { var modif = false; var street,city,ldmark; var oldName, newName, cityName, ldmarkID; if (Waze.model.venues.objects.length ==0 ) { myAlert ("No landmark in memory");} for (var i = 0; i < listLmrkIDs.length; i++) { ldmark = Waze.model.venues.objects[listLmrkIDs[i]]; if (ldmark!=null && onScreen(ldmark)) { oldName = ldmark.attributes.name; if (oldName !=null && oldName !="" && !isInArray(oldName,WME_CRN_badStreet)) { newName = rename2 (oldName); newName = newName.replace (/ *: */g," - "); // remplacement des ":"par "-" pour les landmark if (newName !=oldName && limitForSaveNotReach() ) { Waze.selectionManager.select([ldmark]); street = Waze.model.streets.objects [ldmark.attributes.streetID]; city = Waze.model.cities.objects [street.cityID]; if (typeof(city) === 'undefined' || city == null) {cityName ="";} else {cityName= city.name;} newName = prompt (" Landmark to rename \n\nCity :"+cityName+"\nOld name is : "+oldName+"\n\nConfirm the new name or change it",newName); if (newName == null) { WME_CRN_badStreet.push (ldmark.attributes.name); document.getElementById('WME_CRN_raz').disabled = false; } else if (newName != oldName) { Waze.model.actionManager.add (new WazeActionUpdateObject(ldmark,{name: newName})); modif = true; } Waze.selectionManager.select([]); } } } } return modif; } function checkRoadName (listSegIDs) { var modif = false; while (listSegIDs.length > 0) { var sel = Waze.model.segments.objects[listSegIDs[0]]; if (notInArray(sel.attributes.primaryStreetID,WME_CRN_goodStreet)) { var idemRoadIDs = []; for (var i = 0,len_i =listSegIDs.length; i < len_i; i++) { //Search for identical PrimaryStreetID (same name road) var sel1 = Waze.model.segments.objects[listSegIDs[i]]; if (sel1.attributes.primaryStreetID == sel.attributes.primaryStreetID) { idemRoadIDs.push (listSegIDs[i]); } } var street = Waze.model.streets.objects [sel.attributes.primaryStreetID]; var name = street.name; if (name !=null) { var newName = rename2 (name); if (newName !=name && limitForSaveNotReach()) { selectSegments (idemRoadIDs); // on selectionne les segments a modifier var city = Waze.model.cities.objects[street.cityID]; newName = prompt (idemRoadIDs.length+" segment(s) to rename : \n"+idemRoadIDs+"\n\nCity :"+city.name+"\nOld name is : "+name+"\n\nConfirm the new name or change it",newName); if (newName == null) { WME_CRN_badStreet.push (sel.attributes.primaryStreetID); document.getElementById('WME_CRN_raz').disabled = false; } else if (newName != name) { var newPrimaryID = SearchPrimaryID (sel.attributes.primaryStreetID, city.name, newName); if (newPrimaryID!=null) { var action = []; for (var k = 0; k < Waze.selectionManager.selectedItems.length; k++) { action.push (new WazeActionUpdateObject(Waze.selectionManager.selectedItems[k].model, {primaryStreetID: newPrimaryID})); } Waze.model.actionManager.add (new WazeActionMultiAction(action)); modif = true; } } selectSegments ([]); // on efface la selection } } else { WME_CRN_goodStreet.push(sel.attributes.primaryStreetID); WME_CRN_goodStreet = delete_multi_Ids (WME_CRN_goodStreet); } listSegIDs = soustraitArray(listSegIDs,idemRoadIDs); } } return modif; } function soustraitArray (array1,array2) { var newArray = []; for (var i = 0, len = array1.length; i<len;i++) { if (notInArray (array1[i] , array2)) { newArray.push (array1[i]); } } return newArray; } function traiteNumero (name) { name = name.replace (/(➘|➚| vers |[ ]*:|>)/gi,"> "); // supprime flèche montante et descendante name = name.replace (/(^[ ]*vers )/gi,"> "); // standardise ">" name = name.replace (/([a-z])[-]([0-9]+)/gi,"$1.$2"); // remplace - par . dans les numéros name = name.replace (/[.][0]*/gi,"."); // supprime des 0 inutiles name = name.replace (/([ -])[R]?([A|D|E|N|M])[ 0]*([1-9][0-9]+)/gi,"$1$2$3"); //supprime les "R"," "&"0" inutiles dans le nom name = name.replace (/^[R]?([A|D|E|N|M])[ 0]*([1-9][0-9]+)/gi,"$1$2"); //supprime les "R" & "0" inutiles au début //name = name.replace (/([A|D|E|N|M])([1-9][0-9a-zA-Z.]*)/gi, function (a,x,y) {return (x.toUpperCase()+y); }); name = name.replace (/([A|D|E|N|M])([1-9][0-9a-zA-Z.]*)/gi, function (a,x,y) {return (x.toUpperCase()+y.toLowerCase()); }); // minuscules - majuscules if (!(/^[D]/.test(name))) {name = name.replace (/(.*)[- ,]+(D[1-9][0-9a-zA-Z.]*)[- ]*$/,"$2 - $1");} // permutation des départementales à la fin name = name.replace (/([A|D|E|N|M][1-9][0-9a-zA-Z.]*)[;, -]+/g,"$1 - "); // mets en place les tirets name = name.replace (/^[>][ ]*([A|D|E|N|M][1-9][0-9a-zA-Z.]*)[, -]+/,"$1> "); // permute les directions if (/[E][0-9]/.test(name)) {name = triExx(name);} // tri des routes européennes // name = triExx(name); if (/[>]/.test(name)) { // si indication de sortie name = name.replace (/[ -]+[E][0-9]+[ -]*/gi," - ");} // pas de route européenne name = name.replace (/[> ]*Sortie[n° O]*([1-9][0-9a-zA-Z.]*)/gi, function (a,x) {return ("Sortie "+x.toLowerCase()+"> "); }); name = name.replace (/[ ]*[>][ ]*[>]*[ ]*/g,": "); // traite les directions name = name.replace (/[ ]*[,\/]+[ ]*/g," / "); // traite les séparateurs name = name.replace (/[ ]*[:][ ]*[:][ ]*/gi,": "); // supprime les doubles "Deux points" name = name.replace (/[ ]*[:][ ]*[/][ ]*/gi," / "); // traite ": /" en " / " name = name.replace (/[-][ ]*[/]/gi,"/"); // supprime les - name = name.replace (/[ ]*[-][ ]*[-][ ]*/gi," - "); // supprime les doubles tirets name = name.replace (/[ ]+/gi," "); // supprime les doubles espaces name = name.replace (/^[- ,:]*/gi,""); // nettoyage début name = name.replace (/[- ,:]*$/gi,""); // nettoyage fin return name; } function triExx(name) { // Tri les routes européennes var part_name = name.split(" "); var europe = []; for (var i=0;i<part_name.length;i++) { if (/^[E][0-9]/.test(part_name[i])) { var chaine = part_name[i]; while (chaine.length <6) { // complète les chaines pour le tri chaine = chaine.substring(0,1)+"0"+chaine.substring(1,chaine.length);} europe.push (chaine); // extrait le tableau des routes européennes } } europe.sort(); // tri le tableau des chaine européennes for (var j=0;j<part_name.length;j++) { if (/^[E][0-9]/.test(part_name[j])) { part_name[j] = europe.shift().replace (/^[E][0]*/,"E");} // remet les routes européennes et supprime les zéros inutiles } return part_name.join(" "); } function rename2(name) { var new_name = name; new_name = new_name.replace (/[´’]/g,"'"); // Standardise l'apostrophe (Code ASCII 146 - 180) new_name = traiteNumero (new_name); new_name = new_name.replace (/'/g,"' "); // ajout " " après "'" pour les passages en majuscules var part_name = new_name.split(" "); for (var i=0;i<part_name.length;i++) { part_name[i] = part_name[i].capitalize()+" "; part_name[i] = part_name[i].replace (/(-)(Qui |Sur |Sous |Aux? |Par |Du |Des? |La |Les? |En |Et |À )/gi, function (a,x,y) {return (a.toLowerCase()); }); part_name[i] = part_name[i].replace (/^(Qui |Sur |Sous |Aux? |Par |Du |Des? |La |Les? |En |Et |À )/gi, function (a,x,y) {return (a.toLowerCase()); }); part_name[i] = correcteurMots(part_name[i]); } new_name = part_name.join(" "); new_name = new_name.replace (/ *: *\- */g, ": "); new_name = new_name.replace (/:[ ]*:/g, ": "); new_name = new_name.replace (/^ */, ""); // supprime " " en tête new_name = new_name.replace (/ +/g," "); // Supprime les doubles espaces new_name = new_name.replace (/[ |-|,|\/]*$/g, ""); // Traite la fin de chaine new_name = new_name.replace (/' */g,"'"); // supprime " " après "'" new_name = new_name.capitalize(); new_name = new_name.replace (/(\- |\/ |: )([a-z])/g, function (a,x,y) {return (x+y.toUpperCase()); }); // force les majuscules après : ,- et / new_name = new_name.replace (/(\- \-)/gi, "-"); new_name = new_name.replace (/(\- x)/gi, "-"); new_name = correcteurRue (new_name); new_name = new_name.replace (/c'H/g, "c'h"); //exception bretonne "c'h" new_name = new_name.replace (/(['][A-Z])$/, function (a,x) {return (x.toLowerCase()); }); // force les minuscules après ' en fin de texte new_name = new_name.capitalize(); return new_name; } function correcteurMots (name) { var list = WME_CRN_wordGeneric; for (var i = 0, len_i = list.length; i < len_i; i++) { name = corrigeName (name,list[i]); } return name; } function correcteurRue (name) { var list = WME_CRN_roadGeneric; for (var i = 0, len_i = list.length; i < len_i; i++) { name = corrigeName (name,list[i]); } return name; } function corrigeName (name,Correction) { var regexp = new RegExp(Correction.toVerify, Correction.flags); return name.replace (regexp, eval(Correction.corrected)); } function SearchCityID (country_ID, state_ID, cityName) { var emptyct = (cityName===""); var fattr = {countryID: country_ID, stateID: state_ID, isEmpty: emptyct, name : cityName }; var city = Waze.model.cities.getByAttributes(fattr); if (city.length === 0) { myAlert ("Create new city: "+cityName); var f = new WazeActionCreateObject(WazeModelObjectType.CITY, { countryID: country_ID,stateID: state_ID,isEmpty: emptyct,name: cityName}); Waze.model.actionManager.add(f); return f.newObject.getID(); } if (city.length === 1) {return city[0].getID();} if (city.length > 1) { myAlert ("Problems with cityID : "+city.length+" cities with same name. Please save and redo"); return null; } return null; } function SearchPrimaryID (oldStreetID, newCityName, newStreetName) { var oldStreet = Waze.model.streets.objects[oldStreetID]; var oldCity = Waze.model.cities.objects[oldStreet.cityID]; var newCityID = SearchCityID (oldCity.countryID, oldCity.stateID, newCityName); if (newCityID == null) { return null; } if (newStreetName == null) {newStreetName ="";} var emptyst = (newStreetName ==""); var fattr = {cityID: newCityID, isEmpty: emptyst}; if (emptyst == false) { fattr.name = newStreetName;} var st = Waze.model.streets.getByAttributes(fattr); if (st.length === 0) { myAlert ("Create new street: "+newCityName+" "+newStreetName); var a = new WazeActionCreateObject(WazeModelObjectType.STREET, { name: newStreetName,isEmpty: emptyst,cityID: newCityID}); Waze.model.actionManager.add(a); var newPrimaryStreetID = a.newObject.getID(); } if (st.length === 1) {var newPrimaryStreetID = st[0].getID();} if (st.length > 1) { myAlert ("Problems with StreetID : "+st.length+" streets with same name. Please save and redo"); return null; } return newPrimaryStreetID; } function checkLayerState (layerName) { var index = findLayerIndex (layerName); if (index != null) { // return Waze.map.controls[33].map.layers[index].visibility; return Waze.map.controls[0].map.layers[index].visibility; } return false; } function activateLayer (layerName, flag) { if (flag == true || flag == false) { var index = findLayerIndex (layerName); if (index != null) { var layerID = Waze.map.controls[0].map.layers[index].id; // Waze.map.controls[33].map.getLayer(layerID).setVisibility(flag); //affiche le Layer "landmark" "Waze.Layer.FeatureLayer_60" Waze.map.controls[0].map.getLayer(layerID).setVisibility(flag); //affiche le Layer "landmark" "Waze.Layer.FeatureLayer_60" } } } function findLayerIndex (layerName) { var index; switch (layerName.toUpperCase()) { case "AERIALS": index = 0; break; case "CITIES": index = 1; break; case "ROADS": index = 2; break; case "GPS POINTS": index = 3; break; case "AREA MANAGERS": index = 5; break; case "LANDMARKS": index = 6; break; case "BIG JUNCTIONS": index = 7; break; case "SPEED CAMERAS": index = 10;break; case "MAP PROBLEMS": index = 12;break; case "UPDATE REQUESTS": index = 13;break; case "PLACES UPDATE": index = 14;break; case "EDITABLE AREAS": index = 15;break; case "LIVE USERS": index = 25;break; } return index; } function delete_multi_Ids (myArray) { var myNewArray = []; if (myArray.length > 0) { myNewArray[0]= myArray [0]; for (var i = 0, len = myArray.length; i < len; i++) { if (notInArray (myArray [i],myNewArray)) {myNewArray.push(myArray [i]);} } } return myNewArray; } function isInArray (item,array) {return array.indexOf(item) !== -1;} function notInArray (item,array) {return array.indexOf(item) === -1;} function findPending() {return Waze.map.controls[5].pending;} function selectSegments (Select_IDs) { Select_IDs = delete_multi_Ids (Select_IDs) ; // suppression des doublons var foundSegs =[]; for (var i = 0; i<Select_IDs.length;i++) { foundSegs.push(Waze.model.segments.objects[Select_IDs[i]]); // créer la selection } Waze.selectionManager.select(foundSegs); } function manage_WME_CRN(ev) { localStorage.WME_CRN_enable = document.getElementById ('WME_CRN_enable').checked == 1; if(document.getElementById('WME_CRN_enable').checked == 1) { document.getElementById ('WME_CRN_rename').style.display = "block"; } else { document.getElementById ('WME_CRN_rename').style.display = "none"; document.getElementById ('WME_CRN_CheckRoadName').checked = 0; } manage_CheckRoadName(); WME_CRN_goodStreet.length = 0; // vide le tableau des rues correctes return; } function manage_CheckRoadName() { if (document.getElementById ('WME_CRN_CheckRoadName').checked == 1) { document.getElementById('WME_CRN_CheckRoadName').disabled = true; // on désactive la case document.getElementById('WME_CRN_chk').disabled = true; // on désactive le lancement manuel rename_Road(); // on désactive le lancement manuel } else { document.getElementById('WME_CRN_CheckRoadName').disabled = false; // on désactive la case document.getElementById('WME_CRN_chk').disabled = false; } if (WME_CRN_badStreet.length==0 && WME_CRN_goodStreet.length==0) { // gestion du bouton raz document.getElementById('WME_CRN_raz').disabled = true;} else { document.getElementById('WME_CRN_raz').disabled = false;} return; } function afficheObjet (objet) { for (var e in objet) {alert("objet["+e+"] ="+ objet[e]+" !");} } function console_log(msg) { if (console.log) { console.log(msg);} } function encodeHTML (var1) { var var2 = var1; var2 = var2.replace (/[&]/gi,"&"); var2 = var2.replace (/["]/gi,"""); var2 = var2.replace (/[<]/gi,"‹"); var2 = var2.replace (/[>]/gi,"›"); return var2; } function init_WME_CRN() { localStorage.removeItem('WME_CRN_CheckLdmkName'); // Remove old item in LocalStorage localStorage.removeItem('WME_Merge_Unknown_Roads_CheckLdmkName'); localStorage.removeItem('WME_Merge_Unknown_Roads_CheckRoadName'); localStorage.removeItem('WME_Merge_Unknown_Roads_enable'); localStorage.removeItem('WME_CRN_CheckCityName'); localStorage.removeItem('WME_CRN_CheckRoadName'); if (localStorage.WME_CRN_enable == "true") { // restaure old Values (if exist) document.getElementById ('WME_CRN_enable').checked = 1; } document.getElementById ('WME_CRN_CheckRoadName').checked = 0; document.getElementById("WME_CRN_enable").onclick = manage_WME_CRN; document.getElementById("WME_CRN_CheckRoadName").onclick = manage_CheckRoadName; manage_WME_CRN (); myAlert("WME_CRN initialized"); } function myAlert (message) { var myMessage = document.getElementById ('WME_JCB_AlertTxt').innerHTML; var line = myMessage.split("<br>"); if (line.length==1 && line[0]==""){ line[0]= message;} else { line.push (message);} document.getElementById ('WME_JCB_AlertTxt').innerHTML = line.join ("<br>"); document.getElementById ('WME_JCB_AlertBox').style.display = "block"; setTimeout(function() {endAlert();}, 3750 + 500*Math.random()); } function endAlert() { var myMessage = document.getElementById ('WME_JCB_AlertTxt').innerHTML; var line = myMessage.split("<br>"); line.shift(); document.getElementById ('WME_JCB_AlertTxt').innerHTML = line.join ("<br>"); if (line.length ==0){ document.getElementById ('WME_JCB_AlertBox').style.display = "none"; } } function limitForSaveNotReach() { return (Waze.model.actionManager.index < 99);} } CheckRoadName();