WME Color Errors

Adds colours to show errors

目前为 2019-08-18 提交的版本。查看 最新版本

  1. // ==UserScript==
  2. // @name WME Color Errors
  3. // @name:fr WME Color Errors
  4. // @version 0.75
  5. // @icon data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAACXBIWXMAAA7DAAAOwwHHb6hkAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAALuSURBVHja7Jots6swEIb7x6qiUFVVUVEoVBSqKioqU8EfqKpCRaE6FShMo5gjUCiOYebOzTXnvaKlhR44LbS9vcyQmVWdbt5nd7P5GGbr/eFjvT98jtQ+Zuv9oVzvDxiplbMTyVgBPieACWACmADeD/Bn7ABfE8D77PfYAfBUgFCt4DEKZz7H/Js5oMzDSoXPBPh6GCBSHAvSJviGkQW4it4HECmvI9IncygYY2ALcgPGgTccpD9AkQRwf4g4cQPEWYnzsDHkXRlxESTFawFixUDOkxIwIeEvLiKojFFclKPIDOJwhWWX6AWHWF35VPFrAEJeKwXHw9aUsIm8TO6GyE7S80iA3bUuCGRiUZotPKeWRR4+F0DXxBMeIrNHoUaRhhAAKCJei+htI8ocnZUGG7c+j34OQF08FTvk5xLJELJKiEICAEixWfbsRuySOSDHTtA+ED8D5Jo3nF3EA4CBqkR4p98KDd63nc4VTMNv3gga1/lwALeahCoYi6tRA5hzhFmJPFr1Kp92AADWQNHqd3cYQORX7Y1D52gZObQ3YAO7Nu86s5X7Wjb9qD/AOboihkX7SDfLhwGWm7TDu0UsLlnqDbATVR1SKGO7CEAfAqDo0m+NOvsmYjdsDXByq4wsYkkGAxDZkd1cN+YevIgbPb11IV8vuB52lz8CHhWP7QNG1foyC5CULZMWMWQfCCoRFy1+ygQBq+07yjxnJ65vLnMqELWVk82gBbvRRh24MuroOhFELQi0u+6HnYViSRuLT+gUbclAmSEOFVYeOx6nGQPzJbY6Qdb+B6RaNJoBlfFrTqNZ6DfuAIQJ6LTE0FGmGoKRRob8MHv9haY56RxkwaG0QV7am6JtkSHRCvzqokOY+Lc3slR3HJkdCuatoIIAwdmOJUWdtosMg9Dp++7EpiWad+0Bp6z9V68S6/0BgfTBvr1MOKCMwZfBs59Vfs3G/CZUvczZ6XV6ApgAJoAJYAIYM8DoP/YY9ec2fwcAaebQXj6i79wAAAAASUVORK5CYII=
  6. // @description Adds colours to show errors
  7. // @description:fr Colorisation pour afficher les erreurs
  8. // @include https://www.waze.com/editor*
  9. // @include https://www.waze.com/*/editor*
  10. // @include https://beta.waze.com/*
  11. // @exclude https://www.waze.com/user/*
  12. // @exclude https://www.waze.com/*/user/*
  13. // @namespace https://greasyfork.org/fr/scripts/21186-wme-color-errors
  14. // @author Sebiseba
  15. // @copyright Sebiseba 2014-2017
  16. // @grant none
  17. // ==/UserScript==
  18.  
  19. var WMECErrors={}, ColorErrors_mapLayer=[], CErrLeg, CErrSeg, CErrPoi, myLevel, prefPhone, debug="";
  20. var CErrWaze, CErrorsMap, CErrorsModel, CErrorsI18n, CErrorsOpenLayers, CErrorshandle, CErrorshandleClass, CErrorshandleClass2,
  21.  
  22. //french rules
  23. streetNameSeg="^(^Le |^La |^Les |Grande |Allée |[ ]?Avenue[]?|Boulevard |Chemin |Cité |Clos |Côte |Cour[s]? |Descente |Domaine |Hameau |Impasse |Levée |Lotissement |Mail |Montée |Parc |Passage |Place |Placette |Pont |Promenade |Quai |Résidence[s]? |Route |[ ]?Rue[ ]?|Ruelle |Sente |Sentier |Square |Traverse |Venelle |Villa |Voie )",
  24. parkNameSeg="^(Aire |Place |Square )",
  25. excepNameSeg="(Périphérique|Rocade|Duplex|Tunnel|Pont)",
  26. privNameSeg="^(Allée |Avenue |Boulevard |Chemin |Clos |Côte |Cours |Faubourg |Hameau |Impasse |Lotissement |Mail |Passage |Porte |Promenade |Quai |Route |Rue |Ruelle |Sente |Sentier |Voie )",
  27. parkNamePoi="(Parking[s]?|Parc-Relais|Placette|Aire|Arrêt)",
  28. religiousPoi="(Abbatiale|Abbaye|Basilique|Calvaire|Carmel|Cathédrale|Chapelle|Cloître|Collégiale|Conjuratoire|Couvent|Crypte|Dôme|Église|Grande Mosquée|Grotte|Mandir|Maison Diocésaine|Monastère|Mosquée|Notre-Dame|Oratoire|Ordre|Pagode|Presbytère|Prieuré|Sanctuaire|Stupa|Synagogue|Temple)",
  29. busPoi="(Bus[ ][-][ ]|Gare Routière)",
  30. tramPoi="(Tramway[ ][-][ ]|Métro[ ][-][ ])",
  31. possibleTransPoi="(Tram$|Métro$|Arrêt$|Gare$|Station$|Tram |Métro |Arrêt |Gare |Station )",
  32.  
  33. // common all countries
  34. stationsPoi="(CAR_WASH|CHARGING_STATION|FACTORY_INDUSTRIAL|GAS_STATION|JUNCTION_INTERCHANGE|PARKING_LOT|SEAPORT_MARINA_HARBOR|SKI_AREA|SUPERMARKET_GROCERY|TAXI_STATION|TRANSPORTATION|TRASH_AND_RECYCLING_FACILITIES)",
  35. landmarkPoi="(RIVER_STREAM|CANAL|SEA_LAKE_POOL|POOL|SWAMP_MARSH|ISLAND|FOREST_GROVE|BRIDGE)",
  36. excepCatPoi="(RIVER_STREAM|CANAL|SEA_LAKE_POOL|SWAMP_MARSH|ISLAND|FOREST_GROVE|BRIDGE|SWAMP_MARSH|PARK|JUNCTION_INTERCHANGE|CEMETERY|TUNNEL)",
  37. entryPointPoi="(BRIDGE|CANAL|FOREST_GROVE|ISLAND|JUNCTION_INTERCHANGE|POOL|RIVER_STREAM|SEA_LAKE_POOL|SWAMP_MARSH|TUNNEL)",
  38. wazeBot="(admin|avseu|WazeFeed|waze-maint-bot|Waze3rdparty)";
  39.  
  40. // *********************
  41. // ** HELPER FUNCTION **
  42. // *********************
  43.  
  44. function getId(node) {
  45. return document.getElementById(node);
  46. }
  47. function getElementsByClassName(classname, node) {
  48. node || (node=document.getElementsByTagName("body")[0]);
  49. for (var a=[], re=new RegExp("\\b" + classname + "\\b"), els=
  50. node.getElementsByTagName("*"), i=
  51. 0, j=
  52. els.length;i < j;i++) {
  53. re.test(els[i].className) && a.push(els[i]);
  54. }
  55. return a;
  56. }
  57. function IsJsonString(str) {
  58. try {
  59. JSON.parse(str);
  60. } catch (e) {
  61. return false;
  62. }
  63. return true;
  64. }
  65. function getSelectedFeatures(){
  66. if(!W.selectionManager.getSelectedFeatures)
  67. return W.selectionManager.selectedItems;
  68. return W.selectionManager.getSelectedFeatures();
  69. }
  70. // *************
  71. // ** INIT **
  72. // *************
  73. function CErrors_bootstrap() {
  74. if (typeof unsafeWindow === "undefined") {
  75. unsafeWindow =( function () {
  76. var dummyElem=document.createElement('p');
  77. dummyElem.setAttribute('onclick', 'return window;');
  78. return dummyElem.onclick();
  79. }) ();
  80. }
  81. console.log("starting WME Color Errors", GM_info.script.version);
  82. CErrors_init();
  83. fixTel();
  84. }
  85. function CErrors_init(){
  86. // W object needed
  87. CErrWaze=unsafeWindow.W; if(typeof(CErrWaze) === 'undefined'){ if (debug) { console.error("WME ColorErrors - CErrWaze : NOK"); } window.setTimeout(CErrors_init, 500); return; }
  88. CErrorsMap=CErrWaze.map; if(typeof(CErrorsMap) == 'undefined'){ if (debug) { console.error("WME ColorErrors - CErrorsmap : NOK"); } window.setTimeout(CErrors_init, 500); return; }
  89. CErrorsModel=CErrWaze.model; if(typeof(CErrorsModel) == 'undefined'){ if (debug) { console.error("WME ColorErrors - CErrorsmodel : NOK"); } window.setTimeout(CErrors_init, 500); return; }
  90. if(typeof(CErrorsModel.getTopCountry()) === 'undefined' || CErrorsModel.getTopCountry() === null){ if (debug) { console.error("WME ColorErrors - CErrorsmodel Countries top : NOK"); } window.setTimeout(CErrors_init, 500); return; }
  91. CErrorsI18n=unsafeWindow.I18n; if(typeof (CErrorsI18n) == 'undefined') { if (debug) { console.error('WME ColorErrors - CErrorsI18n : NOK'); } setTimeout(CErrors_init, 500); return; }
  92. // OpenLayers
  93. CErrorsOpenLayers=unsafeWindow.OL; if(typeof(CErrorsOpenLayers) === 'undefined'){ if (debug) { console.error("WME ColorErrors - OL : NOK"); } window.setTimeout(CErrors_init, 500); return; }
  94. // Waze GUI needed
  95. CErrorshandle=getId("user-info"); if(typeof(CErrorshandle) == 'undefined'){ window.setTimeout(CErrors_init, 500); return; }
  96. CErrorshandleClass=getElementsByClassName("nav-tabs", CErrorshandle)[0]; if(typeof(CErrorshandleClass) === 'undefined'){ window.setTimeout(CErrors_init, 500); return; }
  97. CErrorshandleClass2=getElementsByClassName("tab-content", CErrorshandle)[0]; if(typeof(CErrorshandleClass2) === 'undefined'){ window.setTimeout(CErrors_init, 500); return; }
  98.  
  99. // Verify localStorage. Init if empty or not correct
  100. if (typeof(localStorage.WMEColorErrors) === "undefined" || localStorage.WMEColorErrors.lenght===null || !IsJsonString(localStorage.WMEColorErrors)) {
  101. WMECErrors.opacity=0.85; // Icons Opacity on map
  102. WMECErrors.myLvl=false; // Show when editable
  103. WMECErrors.seg_Bad=false; // Bad Segments (group)
  104. WMECErrors.seg_Priv=true; // Private with bad name
  105. WMECErrors.seg_Park=true; // Parking with name (but Place / Square)
  106. WMECErrors.seg_Rail=true; // Railroad with bad name
  107. WMECErrors.seg_HW_name=true; //Highways with bad name
  108. WMECErrors.seg_Dir_name=true; // Directions but not Ramp/Freeway
  109. WMECErrors.seg_Toll=true; // Toll (but Ramp/Freeway)
  110. WMECErrors.seg_Ramp_name=true; // Ramp with 3 directions or more
  111. WMECErrors.seg_Ramp_city=true; // Ramp with city name
  112. WMECErrors.seg_RShield=true; // Wrong prefix
  113. WMECErrors.seg_RSAlt=true; //Roadshield must be in alt
  114. WMECErrors.seg_SNameAlt=true; //Road name must be in alt
  115. WMECErrors.seg_DleSpace=true; // Double space in name
  116. WMECErrors.seg_SegBadRS=true; // RoadShield but bad type
  117. WMECErrors.seg_HNFree=true; // House number on Freeway or ramp
  118. WMECErrors.seg_BadSpeed=true; // Bad speed (ex: >80km/h in city)
  119. WMECErrors.seg_BadAltState=true; // Alt State != Main State
  120. // POI
  121. WMECErrors.poi_Bad=false; // Bad POI (group)
  122. WMECErrors.poi_Park_name=true; // Parking with [P]
  123. WMECErrors.poi_Address=true; // Dxxx/Nxxx in or no address
  124. WMECErrors.poi_Entry=true; // Entry Point not defined
  125. WMECErrors.poi_LandM=true; // Landmark with address (street |& city)
  126. WMECErrors.poi_DleSpace=true; // Double space in name
  127. // Low errors
  128. WMECErrors.poi_Resid=true; // Maybe a residential
  129. WMECErrors.poi_Google=true; // No link with Google
  130. WMECErrors.poi_Phone=true; // bad phone number format
  131. WMECErrors.poi_WFeed=true; // Place created by WazeFeed
  132. WMECErrors.poi_WPark=true; // Place created by WazeParking1
  133. WMECErrors.poi_Relig=true; // Religious Center with bad name
  134. WMECErrors.poi_Transp=true; // Bad type or bad name for Buses, Subway or Tramway
  135. WMECErrors.poi_Other=true; // Place "Other"
  136. localStorage.setItem('WMEColorErrors', JSON.stringify(WMECErrors));
  137. }
  138.  
  139. // Phone prefix
  140. switch(CErrorsModel.getTopCountry().id) {
  141. case 3: prefPhone='+213[ ](\\d{2})'; break; // format +213 (dd) xx xx xx @ Algeria
  142. case 73: prefPhone='+33[ ]\\d[ ]\\d{2}'; break; // format +33 d (dd) xx xx xx @ France
  143. case 74: prefPhone='+594[ ]594'; break; // format +594 594 xx xx xx @ French Guiana
  144. case 88: prefPhone='+590[ ]590'; break; // format +590 590 xx xx xx @ Guadeloupe
  145. case 141: prefPhone='+596[ ]596'; break; // format +596 596 xx xx xx @ Martinique
  146. case 148: prefPhone='+377[ ]\\d{2}'; break; // format +377 xx xx xx xx @ Monaco
  147. case 152: prefPhone='+212[ ](\\d{3})'; break; // format +212 xxx xx xx xx @ Morocco
  148. case 184: prefPhone='+262[ ]262'; break; // format +262 262 xx xx xx @ Reunion
  149. default : break;
  150. }
  151.  
  152. // WME Layers check
  153. var layersColor=CErrorsMap.getLayersBy("uniqueName","__WME_Color_Errors"), layersIcons=CErrorsMap.getLayersBy("uniqueName","__WME_Color_Errors_Icons");
  154. var ColorErrors_style=new CErrorsOpenLayers.Style({
  155. pointRadius: 2,
  156. fontWeight: "normal",
  157. label : "${labelText}",
  158. fontFamily: "Tahoma, Courier New",
  159. labelOutlineColor: "#FFFFFF",
  160. labelOutlineWidth: 2,
  161. fontColor: '#000000',
  162. fontSize: "10px"
  163. });
  164. if (layersColor.length === 0) {
  165. ColorErrors_mapLayer=new CErrorsOpenLayers.Layer.Vector("Color Errors", {
  166. displayInLayerSwitcher: false,
  167. uniqueName: "__WME_Color_Errors",
  168. styleMap: new CErrorsOpenLayers.StyleMap(ColorErrors_style)
  169. });
  170. CErrorsI18n.translations[CErrorsI18n.locale].layers.name["__WME_Color_Errors"]="Color Errors";
  171. CErrorsMap.addLayer(ColorErrors_mapLayer);
  172. ColorErrors_mapLayer.setVisibility(true);
  173. }
  174. if (layersIcons.length === 0) {
  175. ColorErrors_mapLayerIcons=new CErrorsOpenLayers.Layer.Vector("Color Errors Icons", {
  176. displayInLayerSwitcher: false,
  177. uniqueName: "__WME_Color_Errors_Icons",
  178. styleMap: new CErrorsOpenLayers.StyleMap(ColorErrors_style)
  179. });
  180. CErrorsI18n.translations[CErrorsI18n.locale].layers.name["__WME_Color_Errors_Icons"]="Color Errors Icons";
  181. CErrorsMap.addLayer(ColorErrors_mapLayerIcons);
  182. ColorErrors_mapLayerIcons.setVisibility(true);
  183. }
  184. myLevel=CErrWaze.loginManager.user.rank;
  185. CErrors_Mainhtml();
  186. }
  187. function CErrAddInfo(){
  188. if (getSelectedFeatures().length !== 0 && !getId('ErrorsList')) {
  189. var CEtest = document.createElement('li');
  190. CEtest.id = "ErrorsList";
  191. if(getElementsByClassName('additional-attributes')[0]) getElementsByClassName('additional-attributes')[0].appendChild(CEtest);
  192. }
  193. }
  194. // *************
  195. // ** HTML **
  196. // *************
  197.  
  198. function CErrors_Mainhtml() {
  199. if (CErrorsI18n.locale == 'fr') {
  200. CErrSeg=new Array('Contrôle des segments',
  201. 'Mauvais segments',
  202. 'Voie privée avec possible mauvais nom',
  203. 'Voie de Parking nommée',
  204. 'Voie ferrée nommée ou nom en alt',
  205. 'Types Routes avec mauvais nom',
  206. 'Bretelle avec plusieurs directions',
  207. 'Direction (sauf bretelle et Autoroute)',
  208. 'Mauvais préfixe (RoadShield)',
  209. 'Double espace dans le nom',
  210. 'Péage (sauf bretelle et Autoroute)',
  211. 'Bretelle/Autoroute avec nom de ville',
  212. 'Le RoadShield doit être en alt',
  213. 'Le nom de route doit être en alt',
  214. 'RoadShield sur mauvais type de voie',
  215. 'N° de rue sur mauvais type de voie',
  216. 'Mauvaise vitesse validée',
  217. 'Département alt différent du principal'
  218. );
  219. CErrPoi=new Array('Contrôle des places',
  220. 'Mauvaises places',
  221. 'Parking mal nommé ou sans nom',
  222. 'Pas d\'adresse ou contenant Dxxx/Nxxx',
  223. 'Point d\'entrée non défini',
  224. 'Site naturel avec adresse',
  225. 'Double espace dans le nom',
  226. 'Peut-être une place résidentielle',
  227. 'Pas de lien avec Google',
  228. 'Lieu édité par WazeFeed',
  229. 'Lieu de type "Autres"',
  230. 'Lieu édité par WazeParking1',
  231. 'Parking : type non défini',
  232. 'Mauvais format du n° de tel',
  233. 'Lieu de culte (nom ou catégorie)',
  234. 'Transport (nom ou catégorie)'
  235. );
  236. CErrLeg=new Array('Légende',
  237. 'A corriger',
  238. 'A vérifier',
  239. 'Pour information',
  240. 'Réglages',
  241. 'Opacité des icônes',
  242. 'Afficher seulements les éditables',
  243. 'Verrouillé par la publicité'
  244. );
  245. }
  246. else {
  247. CErrSeg=new Array('Segments Checking',
  248. 'Bad Segments',
  249. 'Private with possible bad name',
  250. 'Parking with bad name or without',
  251. 'Railroad with name or altname',
  252. 'Highways with bad name',
  253. 'Ramp with several directions',
  254. 'Direction (but Ramp/Freeway)',
  255. 'Wrong prefix (RoadShield)',
  256. 'Double spacing in name',
  257. 'Toll (but Ramp/Freeway)',
  258. 'Ramp/Freeway with city name',
  259. 'RoadShield must be in alt',
  260. 'Road name must be in alt',
  261. 'RoadShield but bad type',
  262. 'HN but bad type',
  263. 'Bad speed verified',
  264. 'Alt State dirrent to Main State'
  265. );
  266. CErrPoi=new Array('Places Checking',
  267. 'Bad Places',
  268. 'Parking with bad name or null',
  269. 'No address or Dxxx/Nxxx within',
  270. 'Entry Point not defined',
  271. 'Natural features with address',
  272. 'Double spacing in name',
  273. 'Maybe a residential place',
  274. 'No link with Google',
  275. 'Place created by WazeFeed',
  276. 'Place type is "Other"',
  277. 'Place created by WazeParking1',
  278. 'Parking : type undefined',
  279. 'Bad phone number format',
  280. 'Religious Center (name or cat)',
  281. 'Transportation (name or cat)'
  282. );
  283. CErrLeg=new Array('Legend',
  284. 'To correct',
  285. 'To check',
  286. 'For information',
  287. 'Settings',
  288. 'Icons opacity',
  289. 'Show when editable',
  290. 'Locked by ad'
  291. );
  292. }
  293. //Create content in CErrors's tab
  294. var CEnewtab=document.createElement('li');
  295. CEnewtab.innerHTML="<a href='#sidepanel-ColorErrors' data-toggle='tab'><span class='fa fa-eye' title='Color Errors'></span></a>";
  296. CErrorshandleClass.appendChild(CEnewtab);
  297.  
  298. var WMECErrors=JSON.parse(localStorage.getItem('WMEColorErrors'));
  299. var CEaddon=document.createElement('section');
  300. CEaddon.id="sidepanel-ColorErrors";
  301. var CEcontent='<div style="float:left; margin-left:5px;padding-bottom:10px;"><b><a href="https://greasyfork.org/fr/scripts/21186-wme-color-errors" target="_blank"><u>WME Color Errors</u></a></b> v'+ GM_info.script.version +'</div>'
  302. + '<h4 style="float:left;clear:both;">'+CErrLeg[4]+'</h4><span style="float:left;clear:both;font-weight:bold;margin-top:10px;">'+CErrLeg[5]+'</span><input id="errOpacity" type="range" max="1" min="0" step="0.05" style="float:left;width:240px;"><div id="opacityValue" style="float:left;font-weight:bold;padding-left:10px;"></div>'
  303. + '<div style="float:left;clear:both;"><input type="checkbox" id="_myLvl"'+(WMECErrors.myLvl ? ' checked' : '')+'/> '+CErrLeg[6]+'</div>'
  304. + '<br><br><h4 style="float:left;margin-top:10px;">'+CErrSeg[0]+'</h4><div style="clear:both;">'
  305. + '<input type="checkbox" id="_seg_Bad"'+(WMECErrors.seg_Bad ? ' checked' : '')+'/> '+CErrSeg[1]+'<br><div id="BadSeg" style="margin-left:5px;"><table>';
  306. CEcontent += fillHtml("seg_Priv", "seg_Bad","#ff7700","\uf256",CErrSeg[2]);
  307. CEcontent += fillHtml("seg_Ramp_name", "seg_Bad","#ff7700","\uf25a",CErrSeg[6]);
  308. CEcontent += fillHtml("seg_BadSpeed", "seg_Bad","#ff7700","\uf1ce",CErrSeg[16]);
  309. CEcontent += fillHtml("seg_BadAltState","seg_Bad","#ff7700","\uf037",CErrSeg[17]);
  310. CEcontent += fillHtml("seg_Park", "seg_Bad","#ff0000","\uf288",CErrSeg[3]);
  311. CEcontent += fillHtml("seg_Rail", "seg_Bad","#ff0000","\uf238",CErrSeg[4]);
  312. CEcontent += fillHtml("seg_Dir_name", "seg_Bad","#ff0000","\uf0a9",CErrSeg[7]);
  313. CEcontent += fillHtml("seg_Toll", "seg_Bad","#ff0000","\uf155",CErrSeg[10]);
  314. CEcontent += fillHtml("seg_Ramp_city", "seg_Bad","#ff0000","\uf015",CErrSeg[11]);
  315. CEcontent += fillHtml("seg_SNameAlt", "seg_Bad","#ff0000","\uf079",CErrSeg[13]);
  316. CEcontent += fillHtml("seg_DleSpace", "seg_Bad","#ff0000","\uf101",CErrSeg[9]);
  317. CEcontent += fillHtml("seg_HW_name", "seg_Bad","#ff0000","\uf018",CErrSeg[5]);
  318. CEcontent += fillHtml("seg_RSAlt", "seg_Bad","#ff0000","\uf074",CErrSeg[12]);
  319. CEcontent += fillHtml("seg_RShield", "seg_Bad","#ff0000","\uf152",CErrSeg[8]);
  320. CEcontent += fillHtml("seg_SegBadRS", "seg_Bad","#ff0000","\uf044",CErrSeg[14]);
  321. CEcontent += fillHtml("seg_HNFree", "seg_Bad","#ff0000","\uf162",CErrSeg[15]);
  322.  
  323. CEcontent += '</table></div></div><br><h4 style="float:left;">'+CErrPoi[0]+'</h4><div style="clear:both;"><tr><td><input type="checkbox" id="_poi_Bad"'+(WMECErrors.poi_Bad ? ' checked' : '')+'/> '+CErrPoi[1]+'<br><div id="BadPoi" style="margin-left:5px;"><table>';
  324. CEcontent += fillHtml("poi_Address", "poi_Bad","#ff0000","\uf2bc",CErrPoi[3]);
  325. CEcontent += fillHtml("poi_LandM", "poi_Bad","#ff0000","\uf1bb",CErrPoi[5]);
  326. CEcontent += fillHtml("poi_DleSpace", "poi_Bad","#ff0000","\uf101",CErrPoi[6]);
  327. CEcontent += fillHtml("poi_Transp", "poi_Bad","#ff0000","\uf207",CErrPoi[15]);
  328. CEcontent += fillHtml("poi_Park_name","poi_Bad","#ff0000","\uf288",CErrPoi[2]);
  329. CEcontent += fillHtml("poi_Park_type","poi_Bad","#ff0000","\uf11d",CErrPoi[12]);
  330. CEcontent += fillHtml("poi_Relig", "poi_Bad","#ff0000","\uf015",CErrPoi[14]);
  331. CEcontent += fillHtml("poi_Entry", "poi_Bad","#ff7700","\uf18e",CErrPoi[4]);
  332. CEcontent += fillHtml("poi_Resid", "poi_Bad","#ff7700","\uf015",CErrPoi[7]);
  333. CEcontent += fillHtml("poi_Google", "poi_Bad","#ff7700","\uf1a0",CErrPoi[8]);
  334. CEcontent += fillHtml("poi_Phone", "poi_Bad","#ff7700","\uf095",CErrPoi[13]);
  335. CEcontent += fillHtml("poi_Other", "poi_Bad","#ff7700","\uf29c",CErrPoi[10]);
  336. CEcontent += fillHtml("poi_WFeed", "poi_Bad","#ffcc00","\uf263",CErrPoi[9]);
  337. CEcontent += fillHtml("poi_WPark", "poi_Bad","#ffcc00","\uf263",CErrPoi[11]);
  338. CEcontent += '</table></div></div><br><h4 style="float:left;">'+CErrLeg[0]+'</h4><div style="clear:both;">';
  339. CEcontent += '<table><tr><td><div style="margin:5px;width:30px;height:2px;background-color:#ff0000;"></div></td><td>'+CErrLeg[1]+'</td></tr>';
  340. CEcontent += '<tr><td><div style="margin:5px;width:30px;height:2px;background-color:#ff7700;"></div></td><td>'+CErrLeg[2]+'</td></tr>';
  341. CEcontent += '<tr><td><div style="margin:5px;width:30px;height:2px;background-color:#ffcc00;"></div></td><td>'+CErrLeg[3]+'</td></tr></table></div>';
  342. CEaddon.innerHTML=CEcontent;
  343. CEaddon.className='tab-pane';
  344. CErrorshandleClass2.appendChild(CEaddon);
  345.  
  346. getId('errOpacity').value=WMECErrors.opacity;
  347. getId('opacityValue').innerHTML = getId('errOpacity').value;
  348.  
  349. getId('errOpacity').onmousemove = function(){
  350. getId('opacityValue').innerHTML = getId('errOpacity').value;
  351. var ls=JSON.parse(localStorage.WMEColorErrors);
  352. ls.opacity=getId('errOpacity').value;
  353. localStorage.setItem('WMEColorErrors', JSON.stringify(ls));
  354. CErrColor();
  355. };
  356. getId('_myLvl').onclick=(function(){
  357. var ls=JSON.parse(localStorage.WMEColorErrors);
  358. (getId('_myLvl').checked === true ? ls.myLvl=true : ls.myLvl=false);
  359. localStorage.setItem('WMEColorErrors', JSON.stringify(ls));
  360. CErrColor();
  361. });
  362. getId('_seg_Bad').onclick=(function(){
  363. var ls=JSON.parse(localStorage.WMEColorErrors);
  364. if (getId('_seg_Bad').checked === true) {
  365. for (var i=0; getElementsByClassName('_seg', BadSeg) [i]; i++) getElementsByClassName('_seg', BadSeg) [i].disabled=false;
  366. ls.seg_Bad=true;
  367. }
  368. else {
  369. for (var i=0; getElementsByClassName('_seg', BadSeg) [i]; i++) getElementsByClassName('_seg', BadSeg) [i].disabled=true;
  370. ls.seg_Bad=false;
  371. }
  372. localStorage.setItem('WMEColorErrors', JSON.stringify(ls));
  373. CErrColor();
  374. });
  375. getId('_poi_Bad').onclick=(function(){
  376. var ls=JSON.parse(localStorage.WMEColorErrors);
  377. if (getId('_poi_Bad').checked === true) {
  378. for (var i=0; getElementsByClassName('_poi', BadPoi) [i]; i++) getElementsByClassName('_poi', BadPoi) [i].disabled=false;
  379. ls.poi_Bad=true;
  380. }
  381. else {
  382. for (var i=0; getElementsByClassName('_poi', BadPoi) [i]; i++) getElementsByClassName('_poi', BadPoi) [i].disabled=true;
  383. ls.poi_Bad=false;
  384. }
  385. localStorage.setItem('WMEColorErrors', JSON.stringify(ls));
  386. CErrColor();
  387. });
  388. getId('_seg_Priv').onclick=(function(){ var ls=JSON.parse(localStorage.WMEColorErrors); (getId('_seg_Priv').checked === true) ? ls.seg_Priv=true : ls.seg_Priv=false; localStorage.setItem('WMEColorErrors', JSON.stringify(ls)); CErrColor(); });
  389. getId('_seg_Park').onclick=(function(){ var ls=JSON.parse(localStorage.WMEColorErrors); (getId('_seg_Park').checked === true) ? ls.seg_Park=true : ls.seg_Park=false; localStorage.setItem('WMEColorErrors', JSON.stringify(ls)); CErrColor(); });
  390. getId('_seg_Rail').onclick=(function(){ var ls=JSON.parse(localStorage.WMEColorErrors); (getId('_seg_Rail').checked === true) ? ls.seg_Rail=true : ls.seg_Rail=false; localStorage.setItem('WMEColorErrors', JSON.stringify(ls)); CErrColor(); });
  391. getId('_seg_HW_name').onclick=(function(){ var ls=JSON.parse(localStorage.WMEColorErrors); (getId('_seg_HW_name').checked === true) ? ls.seg_HW_name=true : ls.seg_HW_name=false; localStorage.setItem('WMEColorErrors', JSON.stringify(ls)); CErrColor(); });
  392. getId('_seg_Dir_name').onclick=(function(){ var ls=JSON.parse(localStorage.WMEColorErrors); (getId('_seg_Dir_name').checked === true) ? ls.seg_Dir_name=true : ls.seg_Dir_name=false; localStorage.setItem('WMEColorErrors', JSON.stringify(ls)); CErrColor(); });
  393. getId('_seg_Toll').onclick=(function(){ var ls=JSON.parse(localStorage.WMEColorErrors); (getId('_seg_Toll').checked === true) ? ls.seg_Toll=true : ls.seg_Toll=false; localStorage.setItem('WMEColorErrors', JSON.stringify(ls)); CErrColor(); });
  394. getId('_seg_Ramp_name').onclick=(function(){ var ls=JSON.parse(localStorage.WMEColorErrors); (getId('_seg_Ramp_name').checked === true) ? ls.seg_Ramp_name=true : ls.seg_Ramp_name=false; localStorage.setItem('WMEColorErrors', JSON.stringify(ls)); CErrColor(); });
  395. getId('_seg_Ramp_city').onclick=(function(){ var ls=JSON.parse(localStorage.WMEColorErrors); (getId('_seg_Ramp_city').checked === true) ? ls.seg_Ramp_city=true : ls.seg_Ramp_city=false; localStorage.setItem('WMEColorErrors', JSON.stringify(ls)); CErrColor(); });
  396. getId('_seg_RShield').onclick=(function(){ var ls=JSON.parse(localStorage.WMEColorErrors); (getId('_seg_RShield').checked === true) ? ls.seg_RShield=true : ls.seg_RShield=false; localStorage.setItem('WMEColorErrors', JSON.stringify(ls)); CErrColor(); });
  397. getId('_seg_RSAlt').onclick=(function(){ var ls=JSON.parse(localStorage.WMEColorErrors); (getId('_seg_RSAlt').checked === true) ? ls.seg_RSAlt=true : ls.seg_RSAlt=false; localStorage.setItem('WMEColorErrors', JSON.stringify(ls)); CErrColor(); });
  398. getId('_seg_SNameAlt').onclick=(function(){ var ls=JSON.parse(localStorage.WMEColorErrors); (getId('_seg_SNameAlt').checked === true) ? ls.seg_SNameAlt=true : ls.seg_SNameAlt=false; localStorage.setItem('WMEColorErrors', JSON.stringify(ls)); CErrColor(); });
  399. getId('_seg_DleSpace').onclick=(function(){ var ls=JSON.parse(localStorage.WMEColorErrors); (getId('_seg_DleSpace').checked === true) ? ls.seg_DleSpace=true : ls.seg_DleSpace=false; localStorage.setItem('WMEColorErrors', JSON.stringify(ls)); CErrColor(); });
  400. getId('_seg_SegBadRS').onclick=(function(){ var ls=JSON.parse(localStorage.WMEColorErrors); (getId('_seg_SegBadRS').checked === true) ? ls.seg_SegBadRS=true : ls.seg_SegBadRS=false; localStorage.setItem('WMEColorErrors', JSON.stringify(ls)); CErrColor(); });
  401. getId('_seg_HNFree').onclick=(function(){ var ls=JSON.parse(localStorage.WMEColorErrors); (getId('_seg_HNFree').checked === true) ? ls.seg_HNFree=true : ls.seg_HNFree=false; localStorage.setItem('WMEColorErrors', JSON.stringify(ls)); CErrColor(); });
  402. getId('_seg_BadSpeed').onclick=(function(){ var ls=JSON.parse(localStorage.WMEColorErrors); (getId('_seg_BadSpeed').checked === true) ? ls.seg_BadSpeed=true : ls.seg_BadSpeed=false; localStorage.setItem('WMEColorErrors', JSON.stringify(ls)); CErrColor(); });
  403. getId('_seg_BadAltState').onclick=(function(){ var ls=JSON.parse(localStorage.WMEColorErrors); (getId('_seg_BadAltState').checked === true) ? ls.seg_BadAltState=true : ls.seg_BadAltState=false; localStorage.setItem('WMEColorErrors', JSON.stringify(ls)); CErrColor(); });
  404.  
  405. getId('_poi_Park_name').onclick=(function(){ var ls=JSON.parse(localStorage.WMEColorErrors); (getId('_poi_Park_name').checked === true) ? ls.poi_Park_name=true : ls.poi_Park_name=false; localStorage.setItem('WMEColorErrors', JSON.stringify(ls)); CErrColor(); });
  406. getId('_poi_Park_type').onclick=(function(){ var ls=JSON.parse(localStorage.WMEColorErrors); (getId('_poi_Park_type').checked === true) ? ls.poi_Park_type=true : ls.poi_Park_type=false; localStorage.setItem('WMEColorErrors', JSON.stringify(ls)); CErrColor(); });
  407. getId('_poi_Address').onclick=(function(){ var ls=JSON.parse(localStorage.WMEColorErrors); (getId('_poi_Address').checked === true) ? ls.poi_Address=true : ls.poi_Address=false; localStorage.setItem('WMEColorErrors', JSON.stringify(ls)); CErrColor(); });
  408. getId('_poi_Entry').onclick=(function(){ var ls=JSON.parse(localStorage.WMEColorErrors); (getId('_poi_Entry').checked === true) ? ls.poi_Entry=true : ls.poi_Entry=false; localStorage.setItem('WMEColorErrors', JSON.stringify(ls)); CErrColor(); });
  409. getId('_poi_LandM').onclick=(function(){ var ls=JSON.parse(localStorage.WMEColorErrors); (getId('_poi_LandM').checked === true) ? ls.poi_LandM=true : ls.poi_LandM=false; localStorage.setItem('WMEColorErrors', JSON.stringify(ls)); CErrColor(); });
  410. getId('_poi_DleSpace').onclick=(function(){ var ls=JSON.parse(localStorage.WMEColorErrors); (getId('_poi_DleSpace').checked === true) ? ls.poi_DleSpace=true : ls.poi_DleSpace=false; localStorage.setItem('WMEColorErrors', JSON.stringify(ls)); CErrColor(); });
  411. getId('_poi_Resid').onclick=(function(){ var ls=JSON.parse(localStorage.WMEColorErrors); (getId('_poi_Resid').checked === true) ? ls.poi_Resid=true : ls.poi_Resid=false; localStorage.setItem('WMEColorErrors', JSON.stringify(ls)); CErrColor(); });
  412. getId('_poi_Google').onclick=(function(){ var ls=JSON.parse(localStorage.WMEColorErrors); (getId('_poi_Google').checked === true) ? ls.poi_Google=true : ls.poi_Google=false; localStorage.setItem('WMEColorErrors', JSON.stringify(ls)); CErrColor(); });
  413. getId('_poi_Phone').onclick=(function(){ var ls=JSON.parse(localStorage.WMEColorErrors); (getId('_poi_Phone').checked === true) ? ls.poi_Phone=true : ls.poi_Phone=false; localStorage.setItem('WMEColorErrors', JSON.stringify(ls)); CErrColor(); });
  414. getId('_poi_WFeed').onclick=(function(){ var ls=JSON.parse(localStorage.WMEColorErrors); (getId('_poi_WFeed').checked === true) ? ls.poi_WFeed=true : ls.poi_WFeed=false; localStorage.setItem('WMEColorErrors', JSON.stringify(ls)); CErrColor(); });
  415. getId('_poi_WPark').onclick=(function(){ var ls=JSON.parse(localStorage.WMEColorErrors); (getId('_poi_WPark').checked === true) ? ls.poi_WPark=true : ls.poi_WPark=false; localStorage.setItem('WMEColorErrors', JSON.stringify(ls)); CErrColor(); });
  416. getId('_poi_Relig').onclick=(function(){ var ls=JSON.parse(localStorage.WMEColorErrors); (getId('_poi_Relig').checked === true) ? ls.poi_Relig=true : ls.poi_Relig=false; localStorage.setItem('WMEColorErrors', JSON.stringify(ls)); CErrColor(); });
  417. getId('_poi_Other').onclick=(function(){ var ls=JSON.parse(localStorage.WMEColorErrors); (getId('_poi_Other').checked === true) ? ls.poi_Other=true : ls.poi_Other=false; localStorage.setItem('WMEColorErrors', JSON.stringify(ls)); CErrColor(); });
  418. getId('_poi_Transp').onclick=(function(){ var ls=JSON.parse(localStorage.WMEColorErrors); (getId('_poi_Transp').checked === true) ? ls.poi_Transp=true : ls.poi_Transp=false; localStorage.setItem('WMEColorErrors', JSON.stringify(ls)); CErrColor(); });
  419.  
  420. CErrWaze.selectionManager.events.register("selectionchanged", null, CErrAddInfo);
  421. CErrWaze.selectionManager.events.register("selectionchanged", null, CErrColor);
  422. CErrorsModel.actionManager.events.register("afterclearactions", null, CErrColor);
  423. CErrorsModel.actionManager.events.register("afterundoaction", null, CErrColor);
  424. CErrorsMap.events.register("zoomend", null, CErrColor);
  425. CErrorsMap.events.register("moveend", null, CErrColor);
  426. window.setTimeout(CErrColor, 500);
  427. }
  428. function fillHtml(id,type,color,icon,text) {
  429. var WMECErrors=JSON.parse(localStorage.getItem('WMEColorErrors'));
  430. return '<tr style="line-height:14px;"><td style="width:20px;"><input type="checkbox" class="'+(type==="seg_Bad" ? '_seg' : '_poi')+'" id="_'+id+'"'+(WMECErrors[id] ? ' checked' : '')+(WMECErrors[type] ? '' : ' disabled')+'/></td><td style="width:20px;"><font style="color:'+color+';font-family:FontAwesome;">'+icon+'</font></td><td><label for="_'+id+'" style="font-weight:normal;">'+text+'</label></td></tr>';
  431. }
  432. function checkClicLayer(){
  433. var lieu=CErrorsI18n.translations[CErrorsI18n.locale].layers.name.landmarks;
  434. getId('layer-switcher-'+CErrorsMap.getLayersByName(lieu)[0].id).onclick=(function(){
  435. window.setTimeout((function() {
  436. CErrColor();
  437. }),10);
  438. });
  439. }
  440. function addIcon(icon,color,geometry,type,pos) {
  441. var style = {
  442. fill: false,
  443. stroke: false,
  444. label: icon,
  445. labelAlign: "cb",
  446. labelXOffset: -4,
  447. labelYOffset: (pos*20),
  448. fontColor: color,
  449. fontSize:"20px",
  450. fontOpacity: getId('errOpacity').value,
  451. fontFamily: "FontAwesome",
  452. labelOutlineWidth: 2,
  453. zIndex: 99999
  454. };
  455. if (type==="segment") {
  456. if(geometry.length==2){
  457. var midX = (((geometry[0].x + geometry[1].x) / 2) + geometry[0].x) / 2;
  458. var midY = (((geometry[0].y + geometry[1].y) / 2) + geometry[0].y) / 2;
  459. var labelPoint = new CErrorsOpenLayers.Geometry.Point(midX,midY);
  460. var imageFeature = new CErrorsOpenLayers.Feature.Vector(labelPoint, null, style);
  461. ColorErrors_mapLayer.addFeatures([imageFeature]);
  462. }
  463. else {
  464. for(i=0;i<geometry.length-1;i++){
  465. if(i%3==1){
  466. var midX = (((geometry[i].x + geometry[i+1].x) / 2) + geometry[i].x) / 2;
  467. var midY = (((geometry[i].y + geometry[i+1].y) / 2) + geometry[i].y) / 2;
  468. var labelPoint = new CErrorsOpenLayers.Geometry.Point(midX,midY);
  469. var imageFeature = new CErrorsOpenLayers.Feature.Vector(labelPoint, null, style);
  470. ColorErrors_mapLayer.addFeatures([imageFeature]);
  471. }
  472. }
  473. }
  474. }
  475. else {
  476. var midX = (((geometry.left + geometry.right) / 2) + geometry.right) / 2;
  477. var midY = (((geometry.bottom + geometry.top) / 2) + geometry.bottom) / 2;
  478. var labelPoint = new CErrorsOpenLayers.Geometry.Point(midX,midY);
  479. var imageFeature = new CErrorsOpenLayers.Feature.Vector(labelPoint, null, style);
  480. ColorErrors_mapLayer.addFeatures([imageFeature]);
  481. }
  482. }
  483. function addLegend(id,icon,color,text){
  484. if(getSelectedFeatures()[0] && getSelectedFeatures()[0].model.attributes.id===id && getId('ErrorsList')) {
  485. getId('ErrorsList').innerHTML +="<span style='color:"+color+";font-family:FontAwesome;'>"+icon+"</span> <span style='color:"+color+";'>"+text+"</span><br>";
  486. }
  487. }
  488. function CErrColor(){
  489. var lineFeature=[], ls=JSON.parse(localStorage.WMEColorErrors);
  490. var lieu=CErrorsI18n.translations[CErrorsI18n.locale].layers.name.landmarks;
  491.  
  492. // Initialize layer
  493. try { ColorErrors_mapLayer.destroyFeatures(); }
  494. catch(err){ log('err destroyFeatures: ',err); }
  495.  
  496. if (getId('ErrorsList')) { getId('ErrorsList').innerHTML=""; }
  497.  
  498. //Segments Checking
  499. if (ls.seg_Bad) {
  500. for (var seg in CErrorsModel.segments.objects) {
  501. // Get values
  502. var segment=CErrorsModel.segments.getObjectById(seg), j=0;
  503. var attributes=segment.attributes;
  504. var geometry=attributes.geometry.components;
  505. var line=getId(segment.geometry.id);
  506. if (segment===null || line === null || segment.state === "Update") continue;
  507. //Name
  508. var sid=attributes.primaryStreetID;
  509. var street=CErrorsModel.streets.getObjectById(sid);
  510. if (street===null) continue;
  511. //Alt Name
  512. var salt=attributes.streetIDs[0];
  513. var streetalt=CErrorsModel.streets.getObjectById(salt);
  514. if (streetalt) { var altname=streetalt.name; } else { var altname=""; }
  515. //City
  516. var streetCity = CErrorsModel.cities.getObjectById(street.cityID);
  517. if (streetCity===null) continue;
  518. streetCity = streetCity.attributes.name;
  519.  
  520. var roadType=attributes.roadType;
  521. if (attributes.primaryStreetID === null || attributes.primaryStreetID === undefined) continue;
  522. if (CErrorsModel.streets.getObjectById(attributes.primaryStreetID) === null || CErrorsModel.streets.getObjectById(attributes.primaryStreetID) === undefined) continue;
  523. var newWidth="", newColor="", newOpacity="0", gline="";
  524.  
  525. if ((ls.myLvl && attributes.rank <= myLevel) || ls.myLvl===false) {
  526. if (ls.seg_Ramp_city) { // Ramp/Freeway with city name
  527. if (streetCity && /^(3|4)$/.test(attributes.roadType)) {
  528. newColor="#ff0000"; newWidth=3; newOpacity=0.95; gline=segment.attributes.geometry.getVertices();
  529. j++;
  530. addIcon("\uf015",newColor,geometry,"segment",j);
  531. addLegend(attributes.id,"\uf015",newColor,CErrSeg[11]);
  532. }
  533. }
  534. if (street.name || altname) {
  535. if (/( - )/.test(street.name)) { var trs=street.name.split(" - "); }
  536. if (ls.seg_Priv) { // Private with bad name
  537. if (attributes.roadType===17 && new RegExp(streetNameSeg).test(street.name)===false) {
  538. newColor="#ff7700"; newWidth=3; newOpacity=0.95; gline=segment.attributes.geometry.getVertices();
  539. j++;
  540. addIcon("\uf256",newColor,geometry,"segment",j);
  541. addLegend(attributes.id,"\uf256",newColor,CErrSeg[2]);
  542. }
  543. }
  544. if (ls.seg_Park && street.name) { // Parking with name (But Place / Square)
  545. if (attributes.roadType===20 && new RegExp(parkNameSeg).test(street.name)===false) {
  546. newColor="#ff0000"; newWidth=3; newOpacity=0.95; gline=segment.attributes.geometry.getVertices();
  547. j++;
  548. addIcon("\uf288",newColor,geometry,"segment",j);
  549. addLegend(attributes.id,"\uf288",newColor,CErrSeg[3]);
  550. }
  551. }
  552. if (ls.seg_Rail && street.name) { // Railroad with bad name
  553. if (attributes.roadType===18 && (altname || street.name)) { //Railroad with name
  554. newColor="#ff0000"; newWidth=3; newOpacity=0.95; gline=segment.attributes.geometry.getVertices();
  555. j++;
  556. addIcon("\uf238",newColor,geometry,"segment",j);
  557. addLegend(attributes.id,"\uf238",newColor,CErrSeg[4]);
  558. }
  559. }
  560. if (ls.seg_Ramp_name && street.name) {
  561. if (/^(3|4)$/.test(attributes.roadType) && /\/.*\//.test(street.name)) { // Ramp with 3 directions or more
  562. newColor="#ff0000"; newWidth=3; newOpacity=0.95; gline=segment.attributes.geometry.getVertices();
  563. j++;
  564. addIcon("\uf25b",newColor,geometry,"segment",j);
  565. addLegend(attributes.id,"\uf25b",newColor,CErrSeg[6]);
  566. }
  567. else if (/^(3|4)$/.test(attributes.roadType) && /\//.test(street.name)) { // Ramp with 2 directions
  568. newColor="#ff7700"; newWidth=3; newOpacity=0.95; gline=segment.attributes.geometry.getVertices();
  569. j++;
  570. addIcon("\uf25a",newColor,geometry,"segment",j);
  571. addLegend(attributes.id,"\uf25a",newColor,CErrSeg[6]);
  572. }
  573. }
  574. if (ls.seg_Dir_name && street.name) { // Directions but not Ramp/Freeway/Major
  575. if (/^[^3|4|6]$/.test(attributes.roadType) && /[:|>]/.test(street.name)) {
  576. newColor="#ff0000"; newWidth=3; newOpacity=0.95; gline=segment.attributes.geometry.getVertices();
  577. j++;
  578. addIcon("\uf0a9",newColor,geometry,"segment",j);
  579. addLegend(attributes.id,"\uf0a9",newColor,CErrSeg[7]);
  580. }
  581. }
  582. if (ls.seg_Toll) { // Toll but not Ramp/Freeway
  583. if (/^[^3|4]$/.test(attributes.roadType) && (attributes.fwdToll || attributes.revToll)) {
  584. newColor="#ff0000"; newWidth=3; newOpacity=0.95; gline=segment.attributes.geometry.getVertices();
  585. j++;
  586. addIcon("\uf155",newColor,geometry,"segment",j);
  587. addLegend(attributes.id,"\uf155",newColor,CErrSeg[10]);
  588. }
  589. }
  590. if (ls.seg_RSAlt && street.name) { // RoadShield must be in alt
  591. if (attributes.roadType!=19 && trs
  592. && /^[A|C|D|N|M|R|T][0-9]+[a-z]?[0-9]?/.test(trs[0].replace(".",""))===true // Roadshield (1st part)
  593. && / - /.test(street.name)===true // Roadshield & street name (separator -)
  594. && /Intérieure|Extérieure/.test(trs[1])===false
  595. && streetCity // City ok
  596. ) {
  597. newColor="#ff0000"; newWidth=3; newOpacity=0.95; gline=segment.attributes.geometry.getVertices();
  598. j++;
  599. addIcon("\uf074",newColor,geometry,"segment",j);
  600. addLegend(attributes.id,"\uf074",newColor,CErrSeg[12]);
  601. }
  602. }
  603. if (ls.seg_HW_name && street.name) { // Highways with bad name
  604. if (/^(3|4|6)$/.test(attributes.roadType) && (/:/.test(street.name)===true && /^[A|C|D|N|M|R|T][0-9]+[a-z]?[0-9]?/.test(street.name)===false) && /^>/.test(street.name)===false && /^[Sortie ]+[0-9]+/.test(street.name)===false && /^(Rocade|Périphérique)/.test(street.name)===false) {
  605. newColor="#ff0000"; newWidth=3; newOpacity=0.95; gline=segment.attributes.geometry.getVertices();
  606. j++;
  607. addIcon("\uf018",newColor,geometry,"segment",j);
  608. addLegend(attributes.id,"\uf018",newColor,CErrSeg[5]);
  609. }
  610. }
  611. if (ls.seg_SegBadRS && street.name) { // RoadShield but bad type
  612. if (/^(1|8|17|20)$/.test(attributes.roadType) && (/^[A|D|N|M|R|T][0-9]+/.test(street.name) || /^[A|D|N|M|R|T]$/.test(street.name))) {
  613. newColor="#ff0000"; newWidth=3; newOpacity=0.95; gline=segment.attributes.geometry.getVertices();
  614. j++;
  615. addIcon("\uf044",newColor,geometry,"segment",j);
  616. addLegend(attributes.id,"\uf044",newColor,CErrSeg[14]);
  617. }
  618. }
  619. if (ls.seg_HNFree) { // House number on Freeway or ramp (and some undrivables)
  620. if (/^(3|4|8|14|18|19)$/.test(attributes.roadType) && attributes.hasHNs===true) {
  621. newColor="#ff0000"; newWidth=3; newOpacity=0.95; gline=segment.attributes.geometry.getVertices();
  622. j++;
  623. addIcon("\uf162",newColor,geometry,"segment",j);
  624. addLegend(attributes.id,"\uf162",newColor,CErrSeg[15]);
  625. }
  626. }
  627. if (ls.seg_BadSpeed) { // Bad speed (ex: >70km/h in city)
  628. if (attributes.fwdMaxSpeed>70 && attributes.fwdMaxSpeedUnverified===false && attributes.revMaxSpeed>70 && attributes.revMaxSpeedUnverified===false && streetCity) {
  629. newColor="#ff7700"; newWidth=3; newOpacity=0.95; gline=segment.attributes.geometry.getVertices();
  630. j++;
  631. addIcon("\uf1ce",newColor,geometry,"segment",j);
  632. addLegend(attributes.id,"\uf1ce",newColor,CErrSeg[16]);
  633. }
  634. }
  635. if (ls.seg_RShield && street.name) { // Wrong prefix (RoadShield)
  636. if ((trs && attributes.roadType!=19 && /^[A|D|N|M|R|T][0-9]+[a-z]?[0-9]?/.test(trs[0].replace(".",""))===false && / - /.test(street.name)===true)
  637. || /^[A|D|N|M|R|T][0-9]+[a-z]?[0-9]? ?-[A-Za-z]/.test(street.name)===true || /^[A|D|N|M|R|T][0-9]+[a-z]?[0-9]?- ?[A-Za-z]/.test(street.name)===true// No space between RS and street name
  638. ) {
  639. newColor="#ff0000"; newWidth=3; newOpacity=0.95; gline=segment.attributes.geometry.getVertices();
  640. j++;
  641. addIcon("\uf152",newColor,geometry,"segment",j);
  642. addLegend(attributes.id,"\uf152",newColor,CErrSeg[8]);
  643. }
  644. }
  645. if (ls.seg_SNameAlt && street.name) { // Street Name must be in alt
  646. if (attributes.roadType!=19 && trs
  647. && /^[A|C|D|N|M|R|T][0-9]+[a-z]?[0-9]?/.test(trs[0].replace(".",""))===true // Roadshield (1st part)
  648. && /^[E][0-9]/.test(trs[1])===false // European Roadshield (2nd part)
  649. && new RegExp(excepNameSeg).test(street.name)===false // Exception
  650. && / - /.test(street.name)===true // Roadshield & street name (separator -)
  651. && /Intérieure|Extérieure/.test(trs[1])===false
  652. && !streetCity // No city
  653. ) {
  654. newColor="#ff0000"; newWidth=3; newOpacity=0.95; gline=segment.attributes.geometry.getVertices();
  655. j++;
  656. addIcon("\uf079",newColor,geometry,"segment",j);
  657. addLegend(attributes.id,"\uf079",newColor,CErrSeg[13]);
  658. }
  659. }
  660. if (ls.seg_DleSpace && street.name) { // Double spacing in name
  661. if (/ /.test(street.name)===true) {
  662. newColor="#ff0000"; newWidth=3; newOpacity=0.95; gline=segment.attributes.geometry.getVertices();
  663. j++;
  664. addIcon("\uf101",newColor,geometry,"segment",j);
  665. addLegend(attributes.id,"\uf101",newColor,CErrSeg[9]);
  666. }
  667. }
  668. if (ls.seg_BadAltState) {
  669. if (streetalt===null) continue;
  670. if (CErrorsModel.cities.getObjectById(street.cityID).attributes.stateID != CErrorsModel.cities.getObjectById(streetalt.cityID).attributes.stateID) { // Alt State != Main State
  671. newColor="#ff7700"; newWidth=3; newOpacity=0.95; gline=segment.attributes.geometry.getVertices();
  672. j++;
  673. addIcon("\uf037",newColor,geometry,"segment",j);
  674. addLegend(attributes.id,"\uf037",newColor,CErrSeg[17]+"<br>Est <b><i>"+CErrorsModel.states.getObjectById(CErrorsModel.cities.getObjectById(streetalt.cityID).attributes.stateID).name+"</i></b><br>Devrait être <b><i>"+CErrorsModel.states.getObjectById(CErrorsModel.cities.getObjectById(street.cityID).attributes.stateID).name)+"</i></b>";
  675. }
  676. }
  677. }
  678. // Highlight if error
  679. if (gline !== "") {
  680. var style={
  681. strokeWidth: newWidth,
  682. strokeColor: newColor,
  683. strokeOpacity: newOpacity
  684. };
  685. var points=[];
  686. for (var i=0; i<gline.length; i++) { points.push(new CErrorsOpenLayers.Geometry.Point(gline[i].x, gline[i].y)); }
  687. var newline=new CErrorsOpenLayers.Geometry.LineString(points);
  688. lineFeature.push(new CErrorsOpenLayers.Feature.Vector(newline, null, style));
  689. }
  690. }
  691. }
  692. }
  693.  
  694. //Places Checking
  695. if (ls.poi_Bad && getId('layer-switcher-group_places').checked) {
  696. for (var poi in CErrorsModel.venues.objects) {
  697. // Get values
  698. var venue=CErrorsModel.venues.getObjectById(poi), j=0;
  699. var pattributes=venue.attributes;
  700. var geometry=pattributes.geometry.bounds;
  701. var poly=pattributes.id;
  702. if (venue===null || poly === null || poi.state=="Update" || poi.selected) continue;
  703. var categories=pattributes.categories;
  704. var pname=pattributes.name;
  705. var venueStreet=CErrorsModel.streets.getObjectById(pattributes.streetID);
  706. if (venueStreet) { var venueCity = CErrorsModel.cities.getObjectById(venueStreet.cityID); }
  707. var newWidth="", newColor="", newOpacity="0", gpoly="";
  708.  
  709. if ((ls.myLvl && pattributes.rank <= myLevel && pattributes.adLocked===false) || ls.myLvl===false) {
  710. if (ls.poi_Resid) { // maybe a residential POI
  711. if ((/^[0-9][ ]?[a-zA-Z]/.test(pname)===true || new RegExp(privNameSeg).test(pname)===true) && pattributes.residential===false && pattributes.categories.indexOf("PARKING_LOT")===-1) {
  712. newColor="#ff7700"; newWidth=15; newOpacity=0.5; gpoly=pattributes.geometry.getVertices();
  713. if (venue.isPoint()) { newWidth=26; }
  714. j++;
  715. addIcon("\uf015",newColor,geometry,"venue",j);
  716. addLegend(poly,"\uf015",newColor,CErrPoi[7]);
  717. }
  718. }
  719. if (ls.poi_Google) { //POI without Google link
  720. if (pattributes.externalProviderIDs.length===0 && pattributes.residential===false && new RegExp(excepCatPoi).test(categories)===false) {
  721. newColor="#ff7700"; newWidth=15; newOpacity=0.5; gpoly=pattributes.geometry.getVertices();
  722. if (venue.isPoint()) { newWidth=26; }
  723. j++;
  724. addIcon("\uf1a0",newColor,geometry,"venue",j);
  725. addLegend(poly,"\uf1a0",newColor,CErrPoi[8]);
  726. }
  727. }
  728. if (ls.poi_Phone && pattributes.phone) { //POI with bad phone number
  729. if (new RegExp('^(\\'+prefPhone + ')([ ](\\d{2})){3}$').test(pattributes.phone)===false // Prefix + 4 digits
  730. && (/^[13]\d[ ](\d{2})$/).test(pattributes.phone)===false // 1x xx or 3x xx
  731. && (/^(0[ ]8\d{2})([ ](\d{3})){2}/).test(pattributes.phone)===false // 0 8xx xxx xxx
  732. && (/^(0[ ]8\d{2})([ ](\d{2})){3}/).test(pattributes.phone)===false // 0 8xx xx xx xx
  733. && (/^(15|17|18|112)$/).test(pattributes.phone)===false // Emergency numbers
  734. ) {
  735. newColor="#ff7700"; newWidth=15; newOpacity=0.5; gpoly=pattributes.geometry.getVertices();
  736. if (venue.isPoint()) { newWidth=26; }
  737. j++;
  738. addIcon("\uf095",newColor,geometry,"venue",j);
  739. addLegend(poly,"\uf095",newColor,CErrPoi[13]);
  740. }
  741. }
  742. if (ls.poi_Other) { // Place type is "Other"
  743. if (categories.indexOf("OTHER") > -1 && (/^Déchèterie/).test(pname)===false) {
  744. newColor="#ff7700"; newWidth=15; newOpacity=0.5; gpoly=pattributes.geometry.getVertices();
  745. if (venue.isPoint()) { newWidth=26; }
  746. j++;
  747. addIcon("\uf29c",newColor,geometry,"venue",j);
  748. addLegend(poly,"\uf29c",newColor,CErrPoi[10]);
  749. }
  750. }
  751. if (ls.poi_Entry) { // POI with default entryExitPoints
  752. if (new RegExp(entryPointPoi).test(categories)===false && pattributes.entryExitPoints.length===0 && venue.isPoint()===false) {
  753. newColor="#ff7700"; newWidth=15; newOpacity=0.5; gpoly=pattributes.geometry.getVertices();
  754. j++;
  755. addIcon("\uf18e",newColor,geometry,"venue",j);
  756. addLegend(poly,"\uf18e",newColor,CErrPoi[4]);
  757. }
  758. }
  759. if (ls.poi_Park_name && categories.indexOf("PARKING_LOT") > -1) { // Parking with bad name
  760. if (new RegExp(streetNameSeg).test(pname)===true) { continue; } //If parking name is a road
  761. if (new RegExp('^'+parkNamePoi+'$').test(pname)===true || // Only Parkings or Aire // ?️|?️️|
  762. new RegExp('^'+parkNamePoi).test(pname)===false // Don't start by ?️ or Parking
  763. // /^(Parking[s]?)( de[s]?| du | le[s]? | la | pour )/.test(pname)===true // Contain bad words
  764. ) {
  765. newColor="#ff0000"; newWidth=15; newOpacity=0.5; gpoly=pattributes.geometry.getVertices();
  766. j++;
  767. addIcon("\uf288",newColor,geometry,"venue",j);
  768. addLegend(poly,"\uf288",newColor,CErrPoi[2]);
  769. }
  770. else if (pname==="") {
  771. newColor="#ff7700"; newWidth=15; newOpacity=0.5; gpoly=pattributes.geometry.getVertices();
  772. j++;
  773. addIcon("\uf288",newColor,geometry,"venue",j);
  774. addLegend(poly,"\uf288",newColor,CErrPoi[2]);
  775. }
  776. if (venue.isPoint()) newWidth=26;
  777. }
  778. if (ls.poi_Park_type && categories.indexOf("PARKING_LOT") > -1) { // Parking with type undefined
  779. if (/PUBLIC|RESTRICTED|PRIVATE/.test(pattributes.categoryAttributes.PARKING_LOT.parkingType)===false) {
  780. newColor="#ff0000"; newWidth=15; newOpacity=0.5; gpoly=pattributes.geometry.getVertices();
  781. j++;
  782. addIcon("\uf11d",newColor,geometry,"venue",j);
  783. addLegend(poly,"\uf11d",newColor,CErrPoi[12]);
  784. }
  785. }
  786. if (ls.poi_Address) { // POI with bad address (Nxxx/Dxxx) or without address
  787. if (venueStreet===null) continue;
  788. if ((/^[A|D|N|M|R][0-9]+/.test(venueStreet.name) && /[ - ]/.test(venueStreet.name)) || (venueStreet.name===null && new RegExp(landmarkPoi).test(categories) === 'false')) {
  789. newColor="#ff0000"; newWidth=15; newOpacity=0.5; gpoly=pattributes.geometry.getVertices();
  790. if (venue.isPoint()) { newWidth=26; }
  791. j++;
  792. addIcon("\uf2bc",newColor,geometry,"venue",j);
  793. addLegend(poly,"\uf2bc",newColor,CErrPoi[3]);
  794. }
  795. }
  796. if (ls.poi_LandM) { // Landmark with road name or city name
  797. if (new RegExp(landmarkPoi).test(categories) && pname==="" && ((venueStreet && venueStreet.name) || (venueCity && venueCity.attributes.name))) {
  798. newColor="#ff0000"; newWidth=15; newOpacity=0.5; gpoly=pattributes.geometry.getVertices();
  799. if (venue.isPoint()) { newWidth=26; }
  800. j++;
  801. addIcon("\uf1bb",newColor,geometry,"venue",j);
  802. addLegend(poly,"\uf1bb",newColor,CErrPoi[5]);
  803. }
  804. }
  805. if (ls.poi_DleSpace) { // Double spacing in name
  806. if (venueStreet && (/ /.test(venueStreet.name)===true || / /.test(pname)===true)) {
  807. newColor="#ff0000"; newWidth=15; newOpacity=0.5; gpoly=pattributes.geometry.getVertices();
  808. j++;
  809. addIcon("\uf101",newColor,geometry,"venue",j);
  810. addLegend(poly,"\uf101",newColor,CErrPoi[6]);
  811. if (venue.isPoint()) { newWidth=26; }
  812. }
  813. }
  814. if (ls.poi_Transp && new RegExp(stationsPoi).test(categories)===false) { //Bus Subway and Tram Station wihtout others stations
  815. if ((
  816. categories.indexOf("BUS_STATION") > -1 && // Good category for bus station
  817. new RegExp('^'+busPoi).test(pname)===false // Bad name
  818. ) || (
  819. categories.indexOf("SUBWAY_STATION") > -1 && // Good category for subway station
  820. new RegExp('^'+tramPoi).test(pname)===false // Bad name
  821. ) || (
  822. categories.indexOf("TRAIN_STATION") > -1 && // Good category for train station
  823. /Gare d[e|u|es|\']/.test(pname)===false // Bad name
  824. ) || (
  825. categories.indexOf("BUS_STATION") == -1 && categories.indexOf("SUBWAY_STATION") == -1 && categories.indexOf("TRAIN_STATION") == -1 &&
  826. new RegExp('^'+possibleTransPoi).test(pname)===true // Maybe a transport station
  827. ) ){
  828. newColor="#ff0000"; newWidth=15; newOpacity=0.5; gpoly=pattributes.geometry.getVertices();
  829. j++;
  830. addIcon("\uf207",newColor,geometry,"venue",j);
  831. addLegend(poly,"\uf207",newColor,CErrPoi[15]);
  832. if (venue.isPoint()) { newWidth=26; }
  833. }
  834. }
  835. if (ls.poi_Relig && categories.indexOf("RELIGIOUS_CENTER") > -1) { // Religious Center with bad name
  836. if (new RegExp('^'+religiousPoi+'$').test(pname)===true || // category without name
  837. new RegExp('^'+religiousPoi).test(pname)===false) { // Bad 1st name
  838. newColor="#ff0000"; newWidth=15; newOpacity=0.5; gpoly=pattributes.geometry.getVertices();
  839. j++;
  840. addIcon("\uf015",newColor,geometry,"venue",j);
  841. addLegend(poly,"\uf015",newColor,CErrPoi[14]);
  842. if (venue.isPoint()) { newWidth=26; }
  843. }
  844. }
  845. if ((ls.poi_Relig && new RegExp('^'+religiousPoi).test(pname)===true && categories.indexOf("RELIGIOUS_CENTER") == -1) || // Religious Center Name but bad category
  846. (new RegExp('^'+religiousPoi+'$').test(pname)===true && categories.indexOf("RELIGIOUS_CENTER") == -1)) { // Bad Religious Center Name with bad category
  847. newColor="#ff0000"; newWidth=15; newOpacity=0.5; gpoly=pattributes.geometry.getVertices();
  848. j++;
  849. addIcon("\uf015",newColor,geometry,"venue",j);
  850. addLegend(poly,"\uf015",newColor,CErrPoi[14]);
  851. if (venue.isPoint()) { newWidth=26; }
  852. }
  853. if (ls.poi_WFeed || ls.poi_WPark) { //Place updated by WazeFeed
  854. if (pattributes.updatedBy && CErrorsModel.users.getObjectById(pattributes.updatedBy)) {
  855. var updName = CErrorsModel.users.getObjectById(pattributes.updatedBy).userName;
  856. if (((ls.poi_WFeed && new RegExp(wazeBot).test(updName)) || (ls.poi_WPark && updName=="WazeParking1")) && pattributes.residential===false) {
  857. newColor="#ffcc00"; newWidth=15; newOpacity=0.5; gpoly=pattributes.geometry.getVertices();
  858. if (venue.isPoint()) { newWidth=26; newOpacity=0.75; }
  859. j++;
  860. addIcon("\uf263",newColor,geometry,"venue",j);
  861. if (updName=="WazeFeed") { addLegend(poly,"\uf263",newColor,CErrPoi[9]); }
  862. else { addLegend(poly,"\uf263",newColor,CErrPoi[11]); }
  863. }
  864. }
  865. }
  866. // Highlight if error
  867.  
  868. }
  869. if (pattributes.adLocked) {
  870. newColor="#ff0000"; newWidth=15; newOpacity=0.75; gpoly=pattributes.geometry.getVertices();
  871. j++;
  872. addIcon("\uf023",newColor,geometry,"venue",j);
  873. addLegend(poly,"\uf023",newColor,CErrLeg[7]);
  874. if (venue.isPoint()) { newWidth=26; }
  875. }
  876. if (gpoly!=="") {
  877. var style={
  878. strokeWidth: newWidth,
  879. strokeColor: newColor,
  880. strokeOpacity: newOpacity,
  881. fillOpacity: 0
  882. };
  883. var points=[];
  884. for (var i=0; i<gpoly.length; i++) { points.push(new CErrorsOpenLayers.Geometry.Point(gpoly[i].x, gpoly[i].y)); }
  885. var newpoly=new CErrorsOpenLayers.Geometry.LinearRing(points);
  886. lineFeature.push(new CErrorsOpenLayers.Feature.Vector(newpoly, null, style));
  887. }
  888. }
  889. }
  890.  
  891. // Display highlighted features
  892. try{ ColorErrors_mapLayer.addFeatures(lineFeature); }
  893. catch(err){ log('err addFeatures: ',err); }
  894. }
  895. // *************************
  896. // ** Telephone fix FR **
  897. // *************************
  898. function fixTel(){
  899. var editpanel = $('#edit-panel');
  900. if (editpanel.length==0) { window.setTimeout(fixTel, 1000); return; }
  901.  
  902. $('#edit-panel').bind('DOMSubtreeModified',function(e){
  903. var editLM = $('#landmark-edit-more-info');
  904. //console.debug("PHONE: editLM" , editLM);
  905. if (editLM.length==1) {
  906. var fixPhoneBtn = $('#wme-telephonefix-fr'); //console.debug("PHONE: fixPhoneBtn" , fixPhoneBtn);
  907. if (fixPhoneBtn.length==0)
  908. {
  909. fixPhoneBtn=document.createElement('button');
  910. fixPhoneBtn.innerHTML='fix';
  911. fixPhoneBtn.id='wme-telephonefix-fr';
  912. $(fixPhoneBtn).css({'float':'right','position':'absolute','right':'0px','bottom':'0px','height':'27px','background-color':'white','border-top-right-radius':'6px','border-bottom-right-radius':'6px','border':'1px solid #cccccc','border-left':'1px dashed #cccccc'});
  913. $('[name=phone]').parent().append(fixPhoneBtn);
  914.  
  915. try {
  916. var venue=Waze.selectionManager.getSelectedFeatures()[0].model;
  917. var phone=venue.attributes.phone;
  918. var newPhone='';
  919. var phoneTo='';
  920. phoneTo = venue.attributes.phone.replace(/^0([0-9])[.| |-]?([0-9][0-9])[.| |-]?([0-9][0-9])[.| |-]?([0-9][0-9])[.| |-]?([0-9][0-9])$/g, "+33 $1 $2 $3 $4 $5");
  921. if (phoneTo!=venue.attributes.phone && phoneTo.startsWith('+33 8')==false)
  922. newPhone=phoneTo;
  923. phoneTo = venue.attributes.phone.replace(/^\+33[ ]*(?:\(?0\)?)?([0-9])[.| |-]?([0-9][0-9])[.| |-]?([0-9][0-9])[.| |-]?([0-9][0-9])[.| |-]?([0-9][0-9])$/g, "+33 $1 $2 $3 $4 $5");
  924. if (phoneTo!=venue.attributes.phone && phoneTo.startsWith('+33 8')==false)
  925. newPhone=phoneTo;
  926. phoneTo = venue.attributes.phone.replace(/^0[.| |-]?8[.| |-]?([0-9])([0-9])[.| |-]?([0-9])([0-9])[.| |-]?([0-9])([0-9])[.| |-]?([0-9])([0-9])$/g, "0 8$1$2 $3$4$5 $6$7$8");
  927. if (phoneTo!=venue.attributes.phone)
  928. newPhone=phoneTo;
  929. phoneTo = venue.attributes.phone.replace(/^\+33[ ]*(?:\(?0\)?)?8[.| |-]?([0-9])([0-9])[.| |-]?([0-9])([0-9])[.| |-]?([0-9])([0-9])[.| |-]?([0-9])([0-9])$/g, "0 8$1$2 $3$4$5 $6$7$8");
  930. if (phoneTo!=venue.attributes.phone)
  931. newPhone=phoneTo;
  932.  
  933. if (newPhone!='')
  934. {
  935. fixPhoneBtn.addEventListener("click", function (v, p) {
  936. return function () {
  937. var newAtts = { phone: p, id: v.attributes.id };
  938. Waze.model.actionManager.add(new (require("Waze/Action/UpdateObject"))(v, newAtts));
  939. $(fixPhoneBtn).css({'display': 'none'});
  940. }
  941. }(venue, newPhone), false);
  942. }
  943. else
  944. $(fixPhoneBtn).css({'display': 'none'});
  945. }
  946. catch (err)
  947. {
  948. $(fixPhoneBtn).css({'display': 'none'});
  949. }
  950. //.debug("PHONE: append fixPhoneBtn" , fixPhoneBtn);
  951. }
  952. }
  953.  
  954. })
  955. }
  956.  
  957. CErrors_bootstrap();