WME Color Speeds

Adds colours to road segments to show their speed

目前為 2018-05-22 提交的版本,檢視 最新版本

  1. // ==UserScript==
  2. // @name WME Color Speeds
  3. // @name:fr WME Color Speeds
  4. // @version 1.2.3
  5. // @description Adds colours to road segments to show their speed
  6. // @description:fr Colorisation des segments selon leurs vitesses.
  7. // @include https://www.waze.com/editor*
  8. // @include https://www.waze.com/*/editor*
  9. // @include https://beta.waze.com/editor*
  10. // @include https://beta.waze.com/*/editor*
  11. // @exclude https://www.waze.com/user*
  12. // @exclude https://www.waze.com/*/user*
  13. // @namespace https://gf.qytechs.cn/scripts/14044-wme-color-speeds
  14. // @author French Script Team
  15. // @copyright Sebiseba, seb-d59 & DummyD2 - 2015
  16. // ==/UserScript==
  17.  
  18. var WMECSpeeds = {};
  19. var CSpeeds_Version = "1.2.3";
  20. var debug=false;
  21. var CSpeeds_OldVersion = CSpeeds_Version;
  22.  
  23. var icon_undo="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";
  24. var icon_delete="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";
  25. var icon_submit="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";
  26. var icon_edit="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";
  27.  
  28. var couleurs=new Array("(255,0,128)","(255,0,160)","(255,0,192)","(255,0,224)","(255,0,255)","(224,0,255)","(192,0,255)","(160,0,255)","(128,0,255)","(96,0,255)","(64,0,255)","(32,0,255)","(0,0,255)","(0,32,255)","(0,64,255)","(0,96,255)","(0,128,255)","(0,160,255)","(0,192,255)","(0,224,255)","(0,255,255)","(0,255,224)","(0,255,192)","(0,255,160)","(0,255,128)","(0,255,96)","(0,255,64)","(0,255,32)","(0,255,0)","(32,255,0)","(64,255,0)","(96,255,0)","(128,255,0)","(160,255,0)","(192,255,0)","(224,255,0)","(255,255,0)","(255,224,0)","(255,192,0)","(255,160,0)","(255,128,0)","(255,96,0)","(255,64,0)","(255,0,0)","Pink","LightPink","HotPink","DeepPink","PaleVioletRed","MediumVioletRed","LightSalmon","Salmon","DarkSalmon","LightCoral","IndianRed","Crimson","FireBrick","DarkRed","Red","OrangeRed","Tomato","Coral","DarkOrange","Orange","Yellow","LightYellow","LemonChiffon","LightGoldenrodYellow","PapayaWhip","Moccasin","PeachPuff","PaleGoldenrod","Khaki","DarkKhaki","Gold","Cornsilk","BlanchedAlmond","Bisque","NavajoWhite","Wheat","BurlyWood","Tan","RosyBrown","SandyBrown","Goldenrod","DarkGoldenrod","Peru","Chocolate","SaddleBrown","Sienna","Brown","Maroon","DarkOliveGreen","Olive","OliveDrab","YellowGreen","LimeGreen","Lime","LawnGreen","Chartreuse","GreenYellow","SpringGreen","MediumSpringGreen","LightGreen","PaleGreen","DarkSeaGreen","MediumAquamarine","MediumSeaGreen","SeaGreen","ForestGreen","Green","DarkGreen","Aqua","Cyan","LightCyan","PaleTurquoise","Aquamarine","Turquoise","MediumTurquoise","DarkTurquoise","LightSeaGreen","CadetBlue","DarkCyan","Teal","LightSteelBlue","PowderBlue","LightBlue","SkyBlue","LightSkyBlue","DeepSkyBlue","DodgerBlue","CornflowerBlue","SteelBlue","RoyalBlue","Blue","MediumBlue","DarkBlue","Navy","MidnightBlue","Lavender","Thistle","Plum","Violet","Orchid","Fuchsia","Magenta","MediumOrchid","MediumPurple","BlueViolet","DarkViolet","DarkOrchid","DarkMagenta","Purple","Indigo","DarkSlateBlue","RebeccaPurple","SlateBlue","MediumSlateBlue","Snow","Honeydew","MintCream","Azure","AliceBlue","GhostWhite","WhiteSmoke","Seashell","Beige","OldLace","FloralWhite","Ivory","AntiqueWhite","Linen","LavenderBlush","MistyRose","LightSlateGray","SlateGray","DarkSlateGray","White","#EEE","Gainsboro","#DDD","LightGrey","#CCC","Silver","#BBB","#AAA","DarkGray","#999","#888","Gray","#777","DimGray","#666","#555","#444","#333","#222","#111","Black");
  29.  
  30. // speedColors[unit][speed] = color //-----> Default
  31. WMECSpeeds.speedColors = {
  32. kmh : {10:"#ff6232",20:"#ff6232",30:"#ff6232",40:"#f9805a",45:"#fc9a3c",50:"#ffad2d",60:"#fffc28",70:"#afff23",80:"#09ff34",90:"#14ff88",100:"#0fffdf",110:"#0ac2ff",130:"#076aff"},
  33. mph : {5:"#ff6232",10:"#ff6232",15:"#ff6232",20:"#f9805a",25:"#fc9a3c",30:"#ffad2d",35:"#fffc28",40:"#afff23",45:"#09ff34",50:"#14ff88",55:"#0fffdf",60:"#0ac2ff",65:"#076aff",70:"#0055dd",75:"#0036db",80:"#0b07ff",85:"#8f07ff"},
  34. Others : "#f00",
  35. };
  36.  
  37. var colorsUS = {Alabama:{}, Alaska:{}, Arizona:{}, Arkansas:{}, California:{}, Colorado:{}, Connecticut:{}, Delaware:{}, District_of_Columbia:{}, Florida:{}, Georgia:{}, Hawaii:{}, Idaho:{}, Illinois:{}, Indiana:{}, Iowa:{}, Kansas:{}, Kentucky:{}, Louisiana:{}, Maine:{}, Maryland:{}, Massachusetts:{}, Michigan:{}, Minnesota:{}, Mississippi:{}, Missouri:{}, Montana:{}, Nebraska:{}, Nevada:{}, New_Hampshire:{}, New_Jersey:{}, New_Mexico:{}, New_York:{}, North_Carolina:{}, North_Dakota:{}, Ohio:{}, Oklahoma:{}, Oregon:{}, Pennsylvania:{}, Rhode_Island:{}, South_Carolina:{}, South_Dakota:{}, Tennessee:{}, Texas:{}, Utah:{}, Vermont:{}, Virginia:{}, Washington:{}, West_Virginia:{}, Wisconsin:{}, Wyoming:{}, United_States_Minor_Outlying_Islands:{}, United_States_Virgin_Islands:{}};
  38.  
  39. var MultiplePalette=false;
  40. var PaletteByCountrie=false;
  41. var unit;
  42. var selectedState;
  43. var selectedCountrie;
  44.  
  45. var colorspeeds_mapLayer=[];
  46. var toggler, groupToggler;
  47. var zoom=0;
  48. var RoadToScan = [3,6,7,4,2,1,8,20,17,999];
  49. //var RoadUpToStreet = [2,3,6,7];
  50. //var highway = [3,6,7];
  51.  
  52. var typeOfRoad = {
  53. //---Type Road-----------
  54. 3: {"name":"Freeways","checked":true,"zoom":0},
  55. 6: {"name":"Major Highway","checked":true,"zoom":1},
  56. 7: {"name":"Minor Highway","checked":true,"zoom":2},
  57. 4: {"name":"Ramps","checked":true,"zoom":2},
  58. 2: {"name":"Primary Street","checked":false,"zoom":3},
  59. 1: {"name":"Streets","checked":false,"zoom":4},
  60. 8: {"name":"Dirt roads","checked":false,"zoom":4},
  61. 20: {"name":"Parking Lot Road","checked":false,"zoom":4},
  62. 17: {"name":"Private Road","checked":false,"zoom":4},
  63. 999: {"name":"Roundabout","checked":false,"zoom":false}
  64. };
  65.  
  66. WMECSpeeds.typeOfRoad = typeOfRoad;
  67.  
  68. // 5: "Walking Trails",
  69. // 10: "Pedestrian Bw",
  70. // 14: "Ferry",
  71. // 16: "Stairway",
  72. // 17: "Private Road",
  73. // 18: "Railroad",
  74. // 19: "Runway/Taxiway"
  75. // 21: "Service Road"
  76.  
  77. //WMECSpeeds.selectedRoadType = [];
  78.  
  79. /*var dashStyles = [
  80. "Solid",
  81. "ShortDash",
  82. "ShortDot",
  83. "ShortDashDot",
  84. "ShortDashDotDot",
  85. "Dot",
  86. "Dash",
  87. "LongDash",
  88. "DashDot",
  89. "LongDashDot",
  90. "LongDashDotDot"
  91. ];
  92. */
  93.  
  94. var CSI18n = "en";
  95.  
  96. var CSlang = {
  97. 1 : {"fr" : "Vitesses", "en" : "Speeds"},
  98. 2 : {"fr" : "Configuration des Couleurs", "en" : "Color Control Panel"},
  99. 3 : {"fr" : "Couleurs", "en" : "Colors"},
  100. 4 : {"fr" : "Ajouter nouvelle vitesse", "en" : "Add new speed"},
  101. 5 : {"fr" : "Supprimer", "en" : "Delete"},
  102. 6 : {"fr" : "Annuler", "en" : "Cancel"},
  103. 7 : {"fr" : "Autres", "en" : "Others"},
  104. 8 : {"fr" : "Modifier", "en" : "Edit"},
  105. 9 : {"fr" : "Type de route", "en" : "Road type"},
  106. 10: {"fr" : "Zoom", "en" : "Zoom"},
  107. 11: {"fr" : "Rouge", "en" : "Red"},
  108. 12: {"fr" : "Vert", "en" : "Green"},
  109. 13: {"fr" : "Bleu", "en" : "Blue"},
  110. 14: {"fr" : "Valider", "en" : "Validate"},
  111. 15: {"fr" : "Decalage", "en" : "Offset"},
  112. 16: {"fr" : "Opacite", "en" : "Opacity"},
  113. 17: {"fr" : "Epaisseur", "en" : "Thickness"},
  114. 18: {"fr" : "Rond-Point", "en" : "Roundabound"},
  115. 19: {"fr" : "Une palette par pays", "en" : "One palette by country"},
  116. 20: {"fr" : "Une palette par état (USA uniquement)", "en" : "One Palette by State (US only)"},
  117. 21: {"fr" : "pour", "en" : "for"}
  118. };
  119. WMECSpeeds.visibility = true;
  120.  
  121. var offsetValue = 3;
  122. var opacityValue = 0.8;
  123. var thicknessValue = 6;
  124.  
  125. // *********************
  126. // ** HELPER FUNCTION **
  127. // *********************
  128.  
  129. function log(msg, obj)
  130. {
  131. if (obj==null)
  132. console.log(GM_info.script.name + " v" + CSpeeds_Version + " - " + msg);
  133. else if (debug)
  134. console.debug(GM_info.script.name + " v" + CSpeeds_Version + " - " + msg + " " ,obj);
  135. }
  136.  
  137. function getId(node) {
  138. return document.getElementById(node);
  139. }
  140. function getElementsByClassName(classname, node) {
  141. node || (node = document.getElementsByTagName("body")[0]);
  142. for (var a = [], re = new RegExp("\\b" + classname + "\\b"), els = node.getElementsByTagName("*"), i = 0, j = els.length;i < j;i++) {
  143. re.test(els[i].className) && a.push(els[i]);
  144. }
  145. return a;
  146. }
  147. function getFunctionWithArgs(func, args) {
  148. return (
  149. function () {
  150. var json_args = JSON.stringify(args);
  151. return function() {
  152. var args = JSON.parse(json_args);
  153. func.apply(this, args);
  154. }
  155. }
  156. )();
  157. }
  158. function IsJsonString(str) {
  159. try {
  160. JSON.parse(str);
  161. } catch (e) {
  162. return false;
  163. }
  164. return true;
  165. }
  166.  
  167. function cloneObj(obj){
  168. var copy = JSON.parse(JSON.stringify(obj));
  169. return copy;
  170. }
  171.  
  172. function Rgb2String(rgb) {
  173. rgb = roundDecimals(rgb);
  174. return "rgb(" + rgb.r +","+ rgb.g +","+ rgb.b +")";
  175. //return "rgb(" + Math.round(rgb.r) +","+ Math.round(rgb.g) +","+ Math.round(rgb.b) +")";
  176. }
  177.  
  178. function color2Rgb(c){
  179. var typ, arr = [], arrlength, i, match, rgb={}, colornames = [], colorrgbs = [], colorHex = [];
  180. c = c.toLowerCase();
  181. if (c.substr(0, 3) == "rgb") {
  182. typ = c.substr(0, 3);
  183. c = c.substr(3);
  184. arrlength = 3;
  185. c = c.replace("(", "");
  186. c = c.replace(")", "");
  187. arr = c.split(",");
  188. if (typ == "rgb") {
  189. if (arr.length != arrlength) {
  190. rgb = {r : 0, g : 0, b : 0 };
  191. //continue;
  192. }
  193. for (i = 0; i < arrlength; i++) {
  194. arr[i] = arr[i].trim();
  195. if (arr[i] == "" || arr[i] == " ") {arr[i] = "0"; }
  196. if (isNaN(arr[i])) {
  197. rgb = {r : 0, g : 0, b : 0, name : null};
  198. break;
  199. }
  200. if (i < 3) {
  201. arr[i] = parseInt(arr[i]);
  202. if (arr[i] > 255) {arr[i] = 255;}
  203. }
  204. }
  205. colorrgbs = getColorArr('rgbs');
  206. for (i = 0; i < colorrgbs.length; i++) {
  207. if (JSON.stringify(arr) == JSON.stringify(colorrgbs[i])) {
  208. colornames = getColorArr('names');
  209. rgb = {r : arr[0], g : arr[1], b : arr[2], name : colornames[i]};
  210. break;
  211. }else rgb = {r : arr[0], g : arr[1], b : arr[2], name : null};
  212. }
  213. }
  214. } else {
  215. match = false;
  216. colornames = getColorArr('names');
  217. for (i = 0; i < colornames.length; i++) {
  218. if (c.toLowerCase() == colornames[i].toLowerCase()) {
  219. colorrgbs = getColorArr('rgbs');
  220. match = true;
  221. rgb = {
  222. r : colorrgbs[i][0],
  223. g : colorrgbs[i][1],
  224. b : colorrgbs[i][2],
  225. name : colornames[i]
  226. };
  227. break;
  228. }
  229. }
  230. if (match == false) {
  231. c = c.replace("#", "");
  232. colorHex = getColorArr('hexs');
  233. for (i = 0; i < colorHex.length; i++) {
  234. if (c == colorHex[i]) {
  235. colornames = getColorArr('names');
  236. rgb["name"] = colornames[i];
  237. break;
  238. }
  239. }
  240. if (c.length == 3) {c = c.substr(0,1) + c.substr(0,1) + c.substr(1,1) + c.substr(1,1) + c.substr(2,1) + c.substr(2,1);}
  241. arr[0] = parseInt(c.substr(0,2), 16);
  242. arr[1] = parseInt(c.substr(2,2), 16);
  243. arr[2] = parseInt(c.substr(4,2), 16);
  244. for (i = 0; i < 3; i++) {
  245. if (isNaN(arr[i])) {
  246. rgb = {r : 0, g : 0, b : 0, name : null};
  247. break;
  248. }
  249. }
  250. rgb["r"] = arr[0];
  251. rgb["g"] = arr[1];
  252. rgb["b"] = arr[2];
  253. }
  254. }
  255. rgb = roundDecimals(rgb);
  256. //log("color2Rgb rgb",rgb);
  257. return rgb;
  258. }
  259. function getColorArr(x) {
  260. if (x == "names") {return ['AliceBlue','AntiqueWhite','Aqua','Aquamarine','Azure','Beige','Bisque','Black','BlanchedAlmond','Blue','BlueViolet','Brown','BurlyWood','CadetBlue','Chartreuse','Chocolate','Coral','CornflowerBlue','Cornsilk','Crimson','Cyan','DarkBlue','DarkCyan','DarkGoldenRod','DarkGray','DarkGrey','DarkGreen','DarkKhaki','DarkMagenta','DarkOliveGreen','DarkOrange','DarkOrchid','DarkRed','DarkSalmon','DarkSeaGreen','DarkSlateBlue','DarkSlateGray','DarkSlateGrey','DarkTurquoise','DarkViolet','DeepPink','DeepSkyBlue','DimGray','DimGrey','DodgerBlue','FireBrick','FloralWhite','ForestGreen','Fuchsia','Gainsboro','GhostWhite','Gold','GoldenRod','Gray','Grey','Green','GreenYellow','HoneyDew','HotPink','IndianRed','Indigo','Ivory','Khaki','Lavender','LavenderBlush','LawnGreen','LemonChiffon','LightBlue','LightCoral','LightCyan','LightGoldenRodYellow','LightGray','LightGrey','LightGreen','LightPink','LightSalmon','LightSeaGreen','LightSkyBlue','LightSlateGray','LightSlateGrey','LightSteelBlue','LightYellow','Lime','LimeGreen','Linen','Magenta','Maroon','MediumAquaMarine','MediumBlue','MediumOrchid','MediumPurple','MediumSeaGreen','MediumSlateBlue','MediumSpringGreen','MediumTurquoise','MediumVioletRed','MidnightBlue','MintCream','MistyRose','Moccasin','NavajoWhite','Navy','OldLace','Olive','OliveDrab','Orange','OrangeRed','Orchid','PaleGoldenRod','PaleGreen','PaleTurquoise','PaleVioletRed','PapayaWhip','PeachPuff','Peru','Pink','Plum','PowderBlue','Purple','RebeccaPurple','Red','RosyBrown','RoyalBlue','SaddleBrown','Salmon','SandyBrown','SeaGreen','SeaShell','Sienna','Silver','SkyBlue','SlateBlue','SlateGray','SlateGrey','Snow','SpringGreen','SteelBlue','Tan','Teal','Thistle','Tomato','Turquoise','Violet','Wheat','White','WhiteSmoke','Yellow','YellowGreen']; }
  261. if (x == "hexs") {return ['f0f8ff','faebd7','00ffff','7fffd4','f0ffff','f5f5dc','ffe4c4','000000','ffebcd','0000ff','8a2be2','a52a2a','deb887','5f9ea0','7fff00','d2691e','ff7f50','6495ed','fff8dc','dc143c','00ffff','00008b','008b8b','b8860b','a9a9a9','a9a9a9','006400','bdb76b','8b008b','556b2f','ff8c00','9932cc','8b0000','e9967a','8fbc8f','483d8b','2f4f4f','2f4f4f','00ced1','9400d3','ff1493','00bfff','696969','696969','1e90ff','b22222','fffaf0','228b22','ff00ff','dcdcdc','f8f8ff','ffd700','daa520','808080','808080','008000','adff2f','f0fff0','ff69b4','cd5c5c','4b0082','fffff0','f0e68c','e6e6fa','fff0f5','7cfc00','fffacd','add8e6','f08080','e0ffff','fafad2','d3d3d3','d3d3d3','90ee90','ffb6c1','ffa07a','20b2aa','87cefa','778899','778899','b0c4de','ffffe0','00ff00','32cd32','faf0e6','ff00ff','800000','66cdaa','0000cd','ba55d3','9370db','3cb371','7b68ee','00fa9a','48d1cc','c71585','191970','f5fffa','ffe4e1','ffe4b5','ffdead','000080','fdf5e6','808000','6b8e23','ffa500','ff4500','da70d6','eee8aa','98fb98','afeeee','db7093','ffefd5','ffdab9','cd853f','ffc0cb','dda0dd','b0e0e6','800080','663399','ff0000','bc8f8f','4169e1','8b4513','fa8072','f4a460','2e8b57','fff5ee','a0522d','c0c0c0','87ceeb','6a5acd','708090','708090','fffafa','00ff7f','4682b4','d2b48c','008080','d8bfd8','ff6347','40e0d0','ee82ee','f5deb3','ffffff','f5f5f5','ffff00','9acd32']; }
  262. if (x == "rgbs") {return [[240,248,255],[250,235,215],[0,255,255],[127,255,212],[240,255,255],[245,245,220],[255,228,196],[0,0,0],[255,235,205],[0,0,255],[138,43,226],[165,42,42],[222,184,135],[95,158,160],[127,255,0],[210,105,30],[255,127,80],[100,149,237],[255,248,220],[220,20,60],[0,255,255],[0,0,139],[0,139,139],[184,134,11],[169,169,169],[169,169,169],[0,100,0],[189,183,107],[139,0,139],[85,107,47],[255,140,0],[153,50,204],[139,0,0],[233,150,122],[143,188,143],[72,61,139],[47,79,79],[47,79,79],[0,206,209],[148,0,211],[255,20,147],[0,191,255],[105,105,105],[105,105,105],[30,144,255],[178,34,34],[255,250,240],[34,139,34],[255,0,255],[220,220,220],[248,248,255],[255,215,0],[218,165,32],[128,128,128],[128,128,128],[0,128,0],[173,255,47],[240,255,240],[255,105,180],[205,92,92],[75,0,130],[255,255,240],[240,230,140],[230,230,250],[255,240,245],[124,252,0],[255,250,205],[173,216,230],[240,128,128],[224,255,255],[250,250,210],[211,211,211],[211,211,211],[144,238,144],[255,182,193],[255,160,122],[32,178,170],[135,206,250],[119,136,153],[119,136,153],[176,196,222],[255,255,224],[0,255,0],[50,205,50],[250,240,230],[255,0,255],[128,0,0],[102,205,170],[0,0,205],[186,85,211],[147,112,219],[60,179,113],[123,104,238],[0,250,154],[72,209,204],[199,21,133],[25,25,112],[245,255,250],[255,228,225],[255,228,181],[255,222,173],[0,0,128],[253,245,230],[128,128,0],[107,142,35],[255,165,0],[255,69,0],[218,112,214],[238,232,170],[152,251,152],[175,238,238],[219,112,147],[255,239,213],[255,218,185],[205,133,63],[255,192,203],[221,160,221],[176,224,230],[128,0,128],[102,51,153],[255,0,0],[188,143,143],[65,105,225],[139,69,19],[250,128,114],[244,164,96],[46,139,87],[255,245,238],[160,82,45],[192,192,192],[135,206,235],[106,90,205],[112,128,144],[112,128,144],[255,250,250],[0,255,127],[70,130,180],[210,180,140],[0,128,128],[216,191,216],[255,99,71],[64,224,208],[238,130,238],[245,222,179],[255,255,255],[245,245,245],[255,255,0],[154,205,50]]; }
  263. }
  264. function roundDecimals(c) {
  265. c.r = Math.round(c.r);
  266. c.g = Math.round(c.g);
  267. c.b = Math.round(c.b);
  268. return c;
  269. }
  270.  
  271. function Check_Unit() {
  272. if (CSpeedsModel.isImperial) { unit = "mph"; }
  273. else { unit = "kmh"; }
  274. log(unit);
  275. if (getId('CStable')) {
  276. getId('CStable').innerHTML="";
  277. getId('CSroadType').innerHTML="";
  278. LoadSettings();
  279. getId('unitvalue').innerHTML="("+unit+")";
  280. }
  281. }
  282.  
  283. function createToggler(){
  284. // Layers switcher
  285. // test with script toggler----------------
  286. var oldTogglers = document.querySelector('.togglers');
  287.  
  288. if (document.querySelector('.layer-switcher-group_scripts') === null)
  289. {
  290. var newScriptsToggler = document.createElement('li');
  291. newScriptsToggler.className = 'group';
  292. newScriptsToggler.innerHTML = '<div class="controls-container main toggler">\
  293. <input class="layer-switcher-group_scripts toggle" id="layer-switcher-group_scripts" type="checkbox">\
  294. <label for="layer-switcher-group_scripts">\
  295. <span class="label-text">Scripts</span>\
  296. </label>\
  297. </div>\
  298. <ul class="children">\
  299. </ul>';
  300. oldTogglers.appendChild(newScriptsToggler);
  301. }
  302.  
  303. var WMECS_toggle = document.createElement('li');
  304. WMECS_toggle.innerHTML = '<div class="controls-container toggler">\
  305. <input class="layer-switcher-item_WME_Color_Speeds toggle" id="layer-switcher-item_WME_Color_Speeds" type="checkbox">\
  306. <label for="layer-switcher-item_WME_Color_Speeds">\
  307. <span class="label-text">Color Speeds</span>\
  308. </label>\
  309. </div>';
  310. var groupScripts = document.querySelector('.layer-switcher-group_scripts').parentNode.parentNode;
  311. var newScriptsChildren = getElementsByClassName("children", groupScripts)[0];
  312. newScriptsChildren.appendChild(WMECS_toggle);
  313. toggler = getId('layer-switcher-item_WME_Color_Speeds');
  314. groupToggler = getId('layer-switcher-group_scripts');
  315. groupToggler.checked = (typeof(localStorage.groupScriptsToggler) !=="undefined" ?
  316. JSON.parse(localStorage.groupScriptsToggler) : true);
  317. toggler.checked = WMECSpeeds.togglerChecked;
  318. toggler.disabled = !groupToggler.checked;
  319. toggler.addEventListener('click', function(e) {
  320. colorspeeds_mapLayer.setVisibility(e.target.checked);
  321. saveOption();
  322. });
  323. groupToggler.addEventListener('click', function(e) {
  324. toggler.disabled = !e.target.checked;
  325. colorspeeds_mapLayer.setVisibility(toggler.checked ? e.target.checked : toggler.checked);
  326. localStorage.setItem('groupScriptsToggler', e.target.checked);
  327. });
  328. }
  329.  
  330.  
  331. function CSTestVersion() {
  332. if (CSpeeds_OldVersion != CSpeeds_Version) {
  333. var CSpeeds_Maj = GM_info.script.name + " v" + CSpeeds_Version + "\n";
  334. if (CSpeedI18n == "fr"){
  335. CSpeeds_Maj +="\nQuoi de neuf:\n";
  336. CSpeeds_Maj +="Compatibilité mode MTE\n";
  337. }else {
  338. CSpeeds_Maj +="\nWhat's new:\n";
  339. CSpeeds_Maj +="Compatibility MTE mode\n";
  340. }
  341. alert(CSpeeds_Maj);
  342. WMECSpeeds.version = CSpeeds_Version;
  343. }
  344. }
  345.  
  346.  
  347. function saveOption(){
  348. WMECSpeeds.togglerChecked = getId('layer-switcher-item_WME_Color_Speeds').checked;
  349. localStorage.setItem('WMEColorSpeeds', JSON.stringify(WMECSpeeds));
  350. }
  351.  
  352.  
  353. // *************
  354. // ** INIT **
  355. // *************
  356. function CSpeeds_bootstrap() {
  357. if (typeof unsafeWindow === "undefined") {
  358. unsafeWindow = ( function () {
  359. var dummyElem = document.createElement('p');
  360. dummyElem.setAttribute('onclick', 'return window;');
  361. return dummyElem.onclick();
  362. }) ();
  363. }
  364.  
  365. /* begin running the code! */
  366. log("starting");
  367. CSpeeds_init();
  368. }
  369.  
  370.  
  371. function CSpeeds_init(){
  372. // Waze object needed
  373. CSpeedsWaze = unsafeWindow.W;
  374. if(typeof(CSpeedsWaze) === 'undefined'){
  375. if (debug) { console.error("WME ColorSpeeds - CSpeedsWaze : NOK"); }
  376. window.setTimeout(CSpeeds_init, 500);
  377. return;
  378. }
  379. CSpeedsMap = CSpeedsWaze.map;
  380. if(typeof(CSpeedsMap) == 'undefined'){
  381. if (debug) { console.error("WME ColorSpeeds - CSpeedsmap : NOK"); }
  382. window.setTimeout(CSpeeds_init, 500);
  383. return;
  384. }
  385. CSpeedsModel = CSpeedsWaze.model;
  386. if(typeof(CSpeedsModel) == 'undefined'){
  387. if (debug) { console.error("WME ColorSpeeds - CSpeedsModel DOM : NOK"); }
  388. window.setTimeout(CSpeeds_init, 500);
  389. return;
  390. }
  391. CSpeedsCountries = CSpeedsModel.countries;
  392. if(typeof(CSpeedsCountries) == 'undefined'){
  393. if (debug) { console.error("WME ColorSpeeds - CSpeedsCountries DOM : NOK"); }
  394. window.setTimeout(CSpeeds_init, 500);
  395. return;
  396. }
  397. if(typeof(CSpeedsCountries.top) == 'undefined'){
  398. if (debug) { console.error("WME ColorSpeeds - CSpeedsCountries.top DOM : NOK"); }
  399. window.setTimeout(CSpeeds_init, 500);
  400. return;
  401. }
  402. if(typeof(CSpeedsCountries.top.name) == 'undefined'){
  403. if (debug) { console.error("WME ColorSpeeds - CSpeedsCountries.top.name DOM : NOK"); }
  404. window.setTimeout(CSpeeds_init, 500);
  405. return;
  406. }
  407. // OpenLayers
  408. CSpeedOpenLayers = unsafeWindow.OL;
  409. if(typeof(CSpeedOpenLayers) === 'undefined'){
  410. if (debug) { console.error("WME ColorSpeeds - OpenLayers : NOK"); }
  411. window.setTimeout(CSpeeds_init, 500);
  412. return;
  413. }
  414. // Traductions
  415. CSpeedI18n = I18n.locale;
  416. if(typeof(CSpeedI18n) == 'undefined'){
  417. if (debug) { console.error("WME ColorSpeeds - CSpeedI18n : NOK"); }
  418. setTimeout(CSpeeds_init, 500);
  419. return;
  420. }
  421. // Verify localStorage. Init if empty or not correct
  422. if (typeof(localStorage.WMEColorSpeeds) !== "undefined" && IsJsonString(localStorage.getItem('WMEColorSpeeds'))) {
  423. WMECSpeeds = JSON.parse(localStorage.WMEColorSpeeds);
  424. if (WMECSpeeds.speedColors.Others === undefined) WMECSpeeds.speedColors.Others = "#f00";
  425. if (WMECSpeeds.speedColors.US === undefined) WMECSpeeds.speedColors.US = cloneObj(colorsUS);
  426. if (WMECSpeeds.speedColors.Countries === undefined) WMECSpeeds.speedColors.Countries = {};
  427. if (WMECSpeeds.MultiplePalette === undefined) WMECSpeeds.MultiplePalette = MultiplePalette;
  428. if (WMECSpeeds.PaletteByCountrie === undefined) WMECSpeeds.PaletteByCountrie = PaletteByCountrie;
  429. if (WMECSpeeds.offsetValue === undefined) WMECSpeeds.offsetValue = offsetValue;
  430. if (WMECSpeeds.opacityValue === undefined) WMECSpeeds.opacityValue = opacityValue;
  431. if (WMECSpeeds.thicknessValue === undefined) WMECSpeeds.thicknessValue = thicknessValue;
  432. for (var key in typeOfRoad) {
  433. if (WMECSpeeds.typeOfRoad.hasOwnProperty(key) === false ){
  434. WMECSpeeds.typeOfRoad[key] = cloneObj(typeOfRoad[key]);
  435. }
  436. }
  437. if (WMECSpeeds.togglerChecked === undefined) WMECSpeeds.togglerChecked = WMECSpeeds.visibility;
  438. if (WMECSpeeds.version === undefined) {CSpeeds_OldVersion = 0;
  439. }else if (WMECSpeeds.version !== undefined) { CSpeeds_OldVersion = WMECSpeeds.version;}
  440. WMECSpeeds.MultiplePalette = (CSpeedsCountries.top.name == "United States")? WMECSpeeds.MultiplePalette : false;
  441.  
  442.  
  443. log("init ok");
  444. log("WMECSpeeds = ",WMECSpeeds);
  445. }else {
  446. localStorage.setItem('WMEColorSpeeds', JSON.stringify(WMECSpeeds));
  447. setTimeout(CSpeeds_init, 500);
  448. return;
  449. }
  450. //======================================================
  451.  
  452. // Translation
  453. if (CSpeedI18n == "fr") { CSI18n = CSpeedI18n;
  454. }else CSI18n = "en";
  455. //======================================================
  456.  
  457. Check_Unit();
  458.  
  459. // WME Layers check
  460. var layers = CSpeedsMap.getLayersBy("uniqueName","WME_Color_Speeds");
  461. if(layers.length == 0) {
  462. I18n.translations[CSpeedI18n].layers.name["WME_Color_Speeds"] = "Color Speeds";
  463. var colorspeeds_style = new CSpeedOpenLayers.Style({
  464. pointRadius: 2,
  465. fontWeight: "normal",
  466. label : "${labelText}",
  467. fontFamily: "Tahoma, Courier New",
  468. labelOutlineColor: "#FFFFFF",
  469. labelOutlineWidth: 2,
  470. fontColor: '#000000',
  471. fontSize: "10px"
  472. });
  473.  
  474. colorspeeds_mapLayer = new CSpeedOpenLayers.Layer.Vector(I18n.t("layers.name.WME_Color_Speeds"), {
  475. displayInLayerSwitcher: true,
  476. uniqueName: "WME_Color_Speeds",
  477. styleMap: new CSpeedOpenLayers.StyleMap(colorspeeds_style)
  478. });
  479.  
  480. CSpeedsMap.addUniqueLayer(colorspeeds_mapLayer);
  481. colorspeeds_mapLayer.setVisibility(WMECSpeeds.visibility);
  482.  
  483. }
  484. createToggler();
  485.  
  486. // MTE mode event
  487. W.app.modeController.model.bind('change:mode', function(){
  488. if (W.app.modeController.getState() !== undefined){
  489. eventUnRegister();
  490. try { colorspeeds_mapLayer.destroyFeatures();
  491. }catch(err){log('err destroyFeatures: ',err);}
  492. }
  493. if (W.app.modeController.getState() === undefined){
  494. eventUnRegister();
  495. createToggler();
  496. CSpeeds_css();
  497. }
  498. });
  499. // reload after changing WME units
  500. W.prefs.on('change:isImperial', function(){
  501. eventUnRegister();
  502. Check_Unit();
  503. createToggler();
  504. CSpeeds_css();
  505. });
  506. //log('colorspeeds_mapLayer ',colorspeeds_mapLayer);
  507. CSTestVersion();
  508. // Then running
  509. CSpeeds_css();
  510. }
  511.  
  512.  
  513.  
  514.  
  515. function CSpeeds_css() {
  516. var CSpeedsCSS = getId("CSpeedsCSS");
  517. if (CSpeedsCSS === null){
  518. CSpeedsCSS = document.createElement("style");
  519. CSpeedsCSS.type = "text/css";
  520. CSpeedsCSS.id="CSpeedsCSS";
  521. }
  522. var css =".CScontent {width:255px; margin-left:10px; box-shadow: 0 4px 10px #aaa;}";
  523. css +=".divStateChoise {width:250px; margin-left:10px; color:#59899e; font-weight:bold; vertical-align: middle;}";
  524. css +=".divHeadline {height:26px; font-weight:bold; padding-top:2px; border:2px solid #3d3d3d; background-color:#BEDCE5;}";
  525. css +=".divContent {clear:both;height:26px; border:2px solid #3d3d3d; border-top:0;}";
  526. css +=".divContentZoom { clear:both; height:26px; border:2px solid #3d3d3d; border-top:0;}";
  527. css +=".divc {float:center; text-align:center;}";
  528. css +=".divl {float:left; text-align:center;}";
  529. css +=".divll {float:left; text-align:left;}";
  530. css +=".divr {float:right; text-align:center;}";
  531. css +=".speed {margin-top:2px; width:65px; height:20px; color:#59899e; font-weight:bold; vertical-align: middle;}";
  532. css +=".divcolor { width:80px; height:17px; margin:4px 0 0 0; vertical-align: middle;}";
  533. css +=".CStype {margin-top:2px; margin-left:10px; height:20px; color:#59899e; font-weight:bold; text-align:left; vertical-align: middle;}";
  534. css +=".CScheckLabel {margin-top:5px; margin-left:10px; height:22px; color:#59899e; font-weight:bold; text-align:left; vertical-align: middle;}";
  535. css +=".CScheck { float:left; width:22px; height:22px;}";
  536. css +=".CSzoom {margin-top:2px; height:20px; color:#59899e; font-weight:bold; vertical-align: middle}";
  537. css +="#newspeed {width:65px; height:26px; font-weight:bold;text-align:center;}";
  538. css +="#editzoom { display:none;}";
  539. css +="#newvalzoom {width:45px; height:24px; font-weight:bold;text-align:center;}";
  540. css +=".CScontentConf {width:280px; margin-left:5px;}";
  541. css +=".divContentConf {clear:both; line-height:24px; height:28px;}";
  542. css +=".valColor {color:#59899e; font-weight:bold;}";
  543. css +="#valRed {width:80px; height:28px; font-weight:bold; color:red;text-align:center;}";
  544. css +="#valGreen {width:80px; height:28px; font-weight:bold; color:green;text-align:center;}";
  545. css +="#valBlue {width:80px; height:28px; font-weight:bold; color:blue;text-align:center;}";
  546. css +="#valOffset {width:80px; height:28px; font-weight:bold;text-align:center;}";
  547. css +="#valOpacity {width:80px; height:28px; font-weight:bold;text-align:center;}";
  548. css +="#valThickness {width:80px; height:28px; font-weight:bold;text-align:center;}";
  549. css +="#ConfColor.dropdown-menu li:hover, #ConfColor+.dropdown-menu li:active, #ConfColor+.dropdown-menu li:focus { cursor: pointer; outline: #3B99FC dotted 1px; }";
  550. css +="#ConfColor.btn { box-shadow: inset 0px -1px 0px rgba(0,0,0,0.2); border-radius: 4px; border: 1px solid rgba(0,0,0,0.25); height:22px; width:90px; }";
  551. css +="#nameColor {width:120px; height:22px;}";
  552. //css +="#ConfDash.dropdown-menu li:hover, #ConfDash+.dropdown-menu li:active, #ConfDash+.dropdown-menu li:focus { cursor: pointer; outline: #3B99FC dotted 1px; }";
  553. //css +="#ConfDash.btn { box-shadow: inset 0px -1px 0px rgba(0,0,0,0.2); border-radius: 4px; border: 1px solid rgba(0,0,0,0.25); height:22px; width:90px; }";
  554. CSpeedsCSS.innerHTML = css;
  555. document.body.appendChild(CSpeedsCSS);
  556. CSpeeds_Mainhtml();
  557. }
  558.  
  559.  
  560. function init_CSpeeds_cfgdialog(){
  561. var CSpeeds_cfgdialog = getId("CSpeeds_cfgdialog");
  562. if (CSpeeds_cfgdialog === null){
  563. CSpeeds_cfgdialog = document.createElement('div');
  564. CSpeeds_cfgdialog.id = 'CSpeeds_cfgdialog';
  565. }
  566. //CSpeeds_cfgdialog.style.fontSize = '90%';
  567. CSpeeds_cfgdialog.style.display = 'none';
  568. CSpeeds_cfgdialog.style.top='10px';
  569. CSpeeds_cfgdialog.style.left='-30px';
  570. CSpeeds_cfgdialog.style.width='290px';
  571. CSpeeds_cfgdialog.style.height='700px';
  572. CSpeeds_cfgdialog.style.marginLeft='20px';
  573. CSpeeds_cfgdialog.style.borderRadius='10px';
  574. CSpeeds_cfgdialog.style.border='2px solid #BEDCE5';
  575. CSpeeds_cfgdialog.style.position= 'relative';
  576. //CSpeeds_cfgdialog.style.padding= '.2em';
  577. CSpeeds_cfgdialog.style.overflow= 'auto';
  578. CSpeeds_cfgdialog.style.background= 'rgba(255, 255, 255, 1)';
  579.  
  580. var content = "<div style='clear:both; padding-top:10px;'></div>";
  581. //content += "<div class='divc' style='width:400px; font-weight:bold;'> WME Color Speeds - "+ CSlang[2][CSI18n]+":</div>";
  582. content += "<div class='divc' style='width:200px; font-weight:bold;'>"+ CSlang[2][CSI18n]+":</div>";
  583. content += "<div style='clear:both; padding-top:10px;'></div>";
  584. //header table
  585. content += "<div class='CScontentConf'>";
  586. // Edit other color
  587. content += "<div class='divContentConf' id='Conf_Others' style='display:none;'>";
  588. content += "<div class='divll' style='width:70px;font-weight:bold;'>"+ CSlang[1][CSI18n]+": </div>";
  589. content += "<div class='divll' style='width:60px;font-weight:bold;'>"+ CSlang[7][CSI18n] +"</div>";
  590. content += "<div class='divl' style='width:45px;'>&nbsp;</div>";
  591. content += "<div style='clear:both; padding-top:10px;'></div>";
  592. content += "<div class='divll' style='width:70px;font-weight:bold;'>"+ CSlang[3][CSI18n] +": </div>";
  593. content += "</div>";
  594. // Edit speed color
  595. content += "<div class='divContentConf' id='Conf_Color' style='display:none;'>";
  596. content += "<div class='divll' style='width:70px;font-weight:bold;'>"+ CSlang[1][CSI18n]+": </div>";
  597. content += "<div class='divll speed' style='width:60px;'><input type='text' value='' id='newspeed'/></div>";
  598. content += "<div class='divl' id='unitvalue' style='width:45px;font-size:11px;font-weight:bold;line-height:20px;'>("+unit+")</div>";
  599. content += "<div style='clear:both; padding-top:10px;'></div>";
  600. content += "<div class='divll' style='width:70px;font-weight:bold;'>"+ CSlang[3][CSI18n] +":</div>";
  601. content += "</div>";
  602. content += "<div class='divl dropdown' style='width:90px; text-align:left;'><button id='ConfColor' class='btn dropdown-toggle' style='background-color:"+WMECSpeeds.speedColors.Others+";' type='button' data-toggle='dropdown'></button><ul class='dropdown-menu' style='height: 400px; overflow: scroll; margin: 0; padding: 0; min-width: 90px;'>";
  603. for (var i=0; couleurs[i]; ++i) {
  604. var test = (couleurs[i].match(/\(/)) ? true : false;
  605. switch(test) {
  606. case true:
  607. content +="<li style='background-color:rgb"+ couleurs[i] +"'>&nbsp;</li>";
  608. break;
  609. case false:
  610. content +="<li style='background-color:"+ couleurs[i] +"'>&nbsp;</li>";
  611. break;
  612. }
  613. }
  614. content +="</ul></div>";
  615. content += "<span class='divl valColor' id=nameColor></span>";
  616. content += "</div>";
  617. content += "<div style='clear:both; padding-top:10px;'></div>";
  618. // Red Value
  619. content += "<div class='CScontentConf'>";
  620. content += "<div class='divContentConf'>";
  621. content += "<div class='divll' style='width:60px;font-weight:bold; color:red;'>"+ CSlang[11][CSI18n]+":</div>";
  622. content += "<div style='clear:both; padding-top:2px;'></div>";
  623. content += "<div class='divl valColor' style='width:80px; height:28px;'><input type='number' max='255' min='0' value='' id='valRed' pattern='[0-9]{3}' /></div>";
  624. content += "<div class='divr'><input id='sliderRed' type='range' max='255' min='0' style='width:180px;height:24px;'></div>";
  625. content += "</div>";
  626.  
  627. // Green Value
  628. content += "<div style='clear:both; padding-top:10px;'></div>";
  629. content += "<div class='divContentConf'>";
  630. content += "<div class='divll' style='width:60px;font-weight:bold; color:green;'>"+ CSlang[12][CSI18n]+":</div>";
  631. content += "<div style='clear:both; padding-top:2px;'></div>";
  632. content += "<div class='divl valColor' style='width:80px; height:28px;'><input type='number' max='255' min='0' value='' id='valGreen' pattern='[0-9]{3}' /></div>";
  633. content += "<div class='divr'><input id='sliderGreen' type='range' max='255' min='0' style='width:180px;height:24px;'></div>";
  634. content += "</div>";
  635. content += "<div style='clear:both; padding-top:10px;'></div>";
  636. // Bleu Value
  637. content += "<div class='divContentConf'>";
  638. content += "<div class='divll' style='width:60px;font-weight:bold; color:blue;'>"+ CSlang[13][CSI18n]+":</div>";
  639. content += "<div style='clear:both; padding-top:2px;'></div>";
  640. content += "<div class='divl valColor' style='width:80px; height:28px;'><input type='number' max='255' min='0' value='' id='valBlue' pattern='[0-9]{3}' /></div>";
  641. content += "<div class='divr'><input id='sliderBlue' type='range' max='255' min='0' style='width:180px;height:24px;'></div>";
  642. content += "</div>";
  643.  
  644. content += "<div style='clear:both; padding-top:10px;'></div>";
  645. content += "<div class='divr' style='width:40px; height:40x'><a href='#'><img id='cancel' style='width:20px;' title='"+ CSlang[6][CSI18n] +"' src='data:image/png;base64,"+ icon_undo +"' /></a></div>";
  646. content += "<div class='divr' style='width:40px; height:40x;'><a href='#'><img id='submit' style='width:20px;' title='"+ CSlang[14][CSI18n] +"' src='data:image/png;base64,"+ icon_submit +"' /></a></div>";
  647. //content += "<div class='divc' style='width:270px; font-weight:bold;'><button id='OkButton'>Ok</button></div>";
  648. content += "</div>";
  649. CSpeeds_cfgdialog.innerHTML = content;
  650. //document.body.appendChild(CSpeeds_cfgdialog);
  651. //CSpeedshandleClass2.appendChild(CSpeeds_cfgdialog);
  652. getId('sidepanel-colorspeeds').appendChild(CSpeeds_cfgdialog);
  653. }
  654.  
  655.  
  656. // *************
  657. // ** HTML **
  658. // *************
  659.  
  660. function CSpeeds_Mainhtml() {
  661. // Waze GUI needed
  662. CSpeedshandle = getId("user-info");
  663. if(typeof(CSpeedshandle) == 'undefined'){
  664. if (debug) { console.error("WME ColorSpeeds - CSpeedshandle : NOK"); }
  665. setTimeout(CSpeeds_Mainhtml, 500);
  666. return;
  667. }
  668. CSpeedshandleClass = getElementsByClassName("nav-tabs", CSpeedshandle)[0];
  669. if(typeof(CSpeedshandleClass) === 'undefined'){
  670. if (debug) { console.error("WME ColorSpeeds - CSpeedshandleClass : NOK"); }
  671. setTimeout(CSpeeds_Mainhtml, 500);
  672. return;
  673. }
  674. CSpeedshandleClass2 = getElementsByClassName("tab-content", CSpeedshandle)[0];
  675. if(typeof(CSpeedshandleClass2) === 'undefined'){
  676. if (debug) { console.error("WME ColorSpeeds - CSpeedshandleClass2 : NOK"); }
  677. setTimeout(CSpeeds_Mainhtml, 500);
  678. return;
  679. }
  680. var addon = getId("sidepanel-colorspeeds");
  681. if (addon === null){
  682. //Create content in CSpeeds's tab
  683. var newtab = document.createElement('li');
  684. newtab.innerHTML = "<a href='#sidepanel-colorspeeds' data-toggle='tab'><span class='fa fa-dashboard' title='"+ CSlang[1][CSI18n] +"'></span></a>";
  685. CSpeedshandleClass.appendChild(newtab);
  686.  
  687. addon = document.createElement('section');
  688. }
  689. // colorspeeds header
  690. var content = "<div style='float:left; margin-left:5px;'><b><a href='https://gf.qytechs.cn/scripts/14044-wme-color-speeds' target='_blank'><u>WME Color Speeds</u></a></b> v"+ CSpeeds_Version +"</div>";
  691. content += "<div id='colorspeedsDiv'>";
  692. // Countries pallete
  693. content += "<div style='clear:both; padding-top:10px;'></div>";
  694. content += "<div class='divStateChoise' id='countrieChoise' style='display:block;'><input type='checkbox' class='CScheck' id='cbPaletteByCountrie'><div class='divl CScheckLabel' style='width:210px;'>"+CSlang[19][CSI18n]+"</div>";
  695. content += "<div style='clear:both; padding-top:10px;'></div>"; //Couleurs pour </div>";
  696. content += "<select id='selectCountrie' style='height:22px; width:250px; active:none;'>";
  697. for (var countrie in WMECSpeeds.speedColors.Countries) { content +="<option value='"+countrie+"'>"+countrie.replace(/_/g, ' ')+"</option>";}
  698. content += "</select></div>";
  699. // Mutiple pallete
  700. content += "<div style='clear:both; padding-top:10px;'></div>";
  701. content += "<div class='divStateChoise' id='stateChoise' style='display:block;'><input type='checkbox' class='CScheck' id='cbMultiplePalette'><div class='divl CScheckLabel' style='width:210px;'>"+CSlang[20][CSI18n]+"</div>";
  702. content += "<div style='clear:both; padding-top:10px;'></div>"; //Couleurs pour </div>";
  703. content += "<select id='selectState' style='height:22px; active:none;'>";
  704. for (var state in WMECSpeeds.speedColors.US) { content +="<option value='"+state+"'>"+state.replace(/_/g, ' ')+"</option>";}
  705. content += "</select></div>";
  706. //header Speed table
  707. content += "<div style='clear:both; padding-top:10px;'></div><div class='CScontent'>";
  708. content += "<div class='divHeadline'><div class='divl' style='width:60px;'>"+ CSlang[1][CSI18n]+"</div><div class='divr' id='unitvalue' style='width:45px;font-size:11px;line-height:20px;'>("+unit+")</div><div class='divr' style='width:130px;'>"+ CSlang[3][CSI18n] +"</div></div>";
  709.  
  710. // Speed table
  711. content += "<div class='divContent'><div class='divl speed' style='width:60px;'>"+ CSlang[7][CSI18n] +"</div>";
  712. content += "<div class='divr' style='width:20px;'>&nbsp;</div>";
  713. content += "<div class='divr' style='width:20px;'><a href='#'><img id='edit_others' style='width:16px;' title='"+ CSlang[8][CSI18n] +"' src='data:image/png;base64,"+ icon_edit +"' /></a></div>";
  714. content += "<div class='divr' style='width:120px;'><div id='color_others' class='divcolor' style='background-color:"+WMECSpeeds.speedColors.Others+";'>&nbsp;</div></div></div>";
  715. content += "<div id='CStable'></div></div><div id='divadd'></div>";
  716. // header Type road
  717. content += "<br><div style='clear:both; padding-top:10px;'></div><div class='CScontent'>";
  718. content += "<div class='divHeadline'><div class='divl' style='width:120px;'>"+ CSlang[9][CSI18n]+"</div><div class='divr' style='width:60px; margin-right:20px;'>"+ CSlang[10][CSI18n] +"</div></div>";
  719. // edit zoom
  720. content += "<div class='divContent' id='editzoom'><div class='divl speed' style='width:110px;'><span id='texttype'></span></div>";
  721. content += "<div class='divr' style='width:20px;'><a href='#'><img id='cancelZoom' style='width:20px;' title='"+ CSlang[6][CSI18n] +"' src='data:image/png;base64,"+ icon_undo +"' /></a></div>";
  722. content += "<div class='divr' style='width:20px;'><a href='#'><img id='submitZoom' style='width:20px;' title='"+ CSlang[14][CSI18n] +"' src='data:image/png;base64,"+ icon_submit +"' /></a></div>";
  723. content += "<div class='divr speed' style='width:60px;'><input type='text' value='' id='newvalzoom'/></div>";
  724. content +="</div>";
  725. content += "<div id='CSroadType'></div></div>";
  726. // offset Value
  727. content += "<br><div style='clear:both; padding-top:10px;'></div>";
  728. content += "<div class='divContentConf'>";
  729. content += "<div class='divll' style='width:65px;font-weight:bold;color:#59899e;'>"+ CSlang[15][CSI18n]+":</div>";
  730. content += "<div style='clear:both; padding-top:2px;'></div>";
  731. content += "<div class='divl valColor' style='width:80px; height:28px;'><input type='number' id='valOffset' min='1' max='10' value='' pattern='[0-9]{2}'/></div>";
  732. content += "<div class='divr'><input id='sliderOffset' type='range' max='10' min='1' step='1' style='width:180px;height:24px;'></div>";
  733. content += "</div>";
  734. // Opacity Value
  735. content += "<div style='clear:both; padding-top:10px;'></div>";
  736. content += "<div class='divContentConf'>";
  737. content += "<div class='divll' style='width:65px;font-weight:bold;color:#59899e;'>"+ CSlang[16][CSI18n]+":</div>";
  738. content += "<div style='clear:both; padding-top:2px;'></div>";
  739. content += "<div class='divl valColor' style='width:80px; height:28px;'><input type='number' id='valOpacity' min='20' max='100' value='' pattern='[0-9]{3}'/></div>";
  740. content += "<div class='divr'><input id='sliderOpacity' type='range' max='100' min='20' step='1' style='width:180px;height:24px;'></div>";
  741. content += "</div>";
  742. // Thickness Value
  743. content += "<div style='clear:both; padding-top:10px;'></div>";
  744. content += "<div class='divContentConf'>";
  745. content += "<div class='divll' style='width:65px;font-weight:bold;color:#59899e;'>"+ CSlang[17][CSI18n]+":</div>";
  746. content += "<div style='clear:both; padding-top:2px;'></div>";
  747. content += "<div class='divl valColor' style='width:80px; height:28px;'><input type='number' id='valThickness' min='2' max='10' value='' pattern='[0-9]{2}'/></div>";
  748. content += "<div class='divr'><input id='sliderThickness' type='range' max='10' min='2' step='1' style='width:180px;height:24px;'></div>";
  749. content += "</div>";
  750.  
  751. /*
  752. // Dash Style
  753. content += "<div class='divContentConf'>";
  754. content += "<div style='clear:both; padding-top:10px;'></div>";
  755. content += "<div class='divll' style='width:140px;font-weight:bold;color:#59899e;'>Dash Style:</div>";
  756. content += "<div class='divl dropdown' style='width:90px; text-align:left;'><button id='ConfDash' class='btn dropdown-toggle' style='background-color:rgb(255,255,255);' type='button' data-toggle='dropdown'></button><ul class='dropdown-menu' style='height: 400px; overflow: scroll; margin: 0; padding: 0; min-width: 90px;'>";
  757. for (var i=0; dashStyles[i]; ++i) {
  758. content +="<li>&nbsp;"+ dashStyles[i] +"&nbsp;</li>";
  759. }
  760. content += "</ul></div>";
  761. */
  762.  
  763.  
  764. content += "</div>";
  765. addon.innerHTML = content;
  766. addon.id = "sidepanel-colorspeeds";
  767. addon.className = "tab-pane";
  768. CSpeedshandleClass2.appendChild(addon);
  769. init_CSpeeds_cfgdialog();
  770. getId('divadd').innerHTML = "<br/><center><input type='button' id='addbutton' name='add' value='"+ CSlang[4][CSI18n] +"' /></center>";
  771. getId('addbutton').onclick = (function() {
  772. getId('Conf_Others').style.display = "none";
  773. getId('Conf_Color').style.display = "block";
  774. getId('colorspeedsDiv').style.display = "none";
  775. getId('newspeed').value="";
  776. getId('ConfColor').style.backgroundColor="#fff";
  777. CSpeeds_cfgdialog.style.display= 'block';
  778. var c = getId('ConfColor').style.backgroundColor;
  779. c = color2Rgb(c);
  780. actualiseColorRGB(c);
  781. });
  782. //log("CSpeedsModel.countries.top.name = "+CSpeedsModel.countries.top.name);
  783. getId('cbPaletteByCountrie').checked=WMECSpeeds.PaletteByCountrie;
  784. getId('selectCountrie').style.display = (WMECSpeeds.PaletteByCountrie)? "block" : "none";
  785. getId('stateChoise').style.display = (CSpeedsCountries.top.name == "United States")? "block" : "none";
  786. if (WMECSpeeds.MultiplePalette==true){
  787. var stateToSelect = CSpeedsModel.states.top.name.replace(/ /g, '_');
  788. for (var index=0; getId('selectState').options[index].value != stateToSelect; index++) {};
  789. getId('selectState').options[index].selected=true;
  790. }
  791. getId('valOffset').value = WMECSpeeds.offsetValue;
  792. getId('sliderOffset').value = WMECSpeeds.offsetValue;
  793. getId('valOpacity').value = Number(WMECSpeeds.opacityValue*100).toFixed(0);
  794. getId('sliderOpacity').value = Number(WMECSpeeds.opacityValue*100).toFixed(0);
  795. getId('valThickness').value = WMECSpeeds.thicknessValue;
  796. getId('sliderThickness').value = WMECSpeeds.thicknessValue;
  797. LoadSettings();
  798. eventRegister();
  799. SCColor();
  800. }
  801.  
  802. function eventRegister(){
  803. CSpeedsWaze.selectionManager.events.register("selectionchanged", null, SCColor);
  804. CSpeedsModel.actionManager.events.register("afterclearactions", null, SCColor);
  805. CSpeedsModel.actionManager.events.register("afterundoaction", null, SCColor);
  806. CSpeedsMap.events.register("zoomend", null, SCColor);
  807. CSpeedsMap.events.register("moveend", null, SCColor);
  808.  
  809. CSpeedsModel.events.register("mergeend", null, SCColor);
  810. window.addEventListener("beforeunload", saveOption, false);
  811. }
  812.  
  813. function eventUnRegister(){
  814. CSpeedsWaze.selectionManager.events.unregister("selectionchanged", null, SCColor);
  815. CSpeedsModel.actionManager.events.unregister("afterclearactions", null, SCColor);
  816. CSpeedsModel.actionManager.events.unregister("afterundoaction", null, SCColor);
  817. CSpeedsMap.events.unregister("zoomend", null, SCColor);
  818. CSpeedsMap.events.unregister("moveend", null, SCColor);
  819. CSpeedsModel.events.unregister("mergeend", null, SCColor);
  820. window.removeEventListener("beforeunload", saveOption, false);
  821. }
  822.  
  823. function LoadSettings(){
  824.  
  825. getId('cbPaletteByCountrie').checked=WMECSpeeds.PaletteByCountrie;
  826. getId('selectCountrie').style.display = (WMECSpeeds.PaletteByCountrie)? "block" : "none";
  827. getId('cbMultiplePalette').checked=WMECSpeeds.MultiplePalette;
  828. getId('selectState').style.display = (WMECSpeeds.MultiplePalette)? "block" : "none";
  829. if (WMECSpeeds.MultiplePalette == false && WMECSpeeds.PaletteByCountrie == false){
  830. for (var valSpeed in WMECSpeeds.speedColors[unit]) {
  831. var color = WMECSpeeds.speedColors[unit][valSpeed];
  832. var div = document.createElement('div'); div.className="divContent";
  833. var divspeed = document.createElement('div'); divspeed.className="divl speed"; divspeed.style.width="60px"; divspeed.innerHTML=valSpeed;
  834. div.appendChild(divspeed);
  835.  
  836. var divsuppr = document.createElement('div'); divsuppr.className="divr"; divsuppr.style.width="20px";
  837. var divsuppra = document.createElement('a');
  838. divsuppra.innerHTML="<img style='width:20px;' title='"+ CSlang[5][CSI18n] +"' src='data:image/png;base64,"+ icon_delete +"' />";
  839. divsuppra.href = "#"; divsuppra.className="delSpeed"; divsuppra.id="delSpeed_"+valSpeed;
  840. divsuppr.appendChild(divsuppra);
  841. div.appendChild(divsuppr);
  842.  
  843. var divedit = document.createElement('div'); divedit.className="divr"; divedit.style.width="20px";
  844. var divedita = document.createElement('a');
  845. divedita.innerHTML="<img style='width:16px;' title='"+ CSlang[8][CSI18n] +"' src='data:image/png;base64,"+ icon_edit +"' />";
  846. divedita.href = "#";
  847. divedita.onclick = getFunctionWithArgs(CSModifCouleur, [unit,valSpeed,color,null]);
  848. divedit.appendChild(divedita);
  849. div.appendChild(divedit);
  850.  
  851. var divcolor = document.createElement('div'); divcolor.className="divr"; divcolor.style.width="120px"; divcolor.innerHTML="<div class='divcolor' style='background-color:"+ color +";'>&nbsp;</div>";
  852. div.appendChild(divcolor);
  853. getId('CStable').appendChild(div);
  854. }
  855. //log("LoadSettings WMECSpeeds.speedColors."+unit+" = ",WMECSpeeds.speedColors[unit]);
  856. }
  857. if (WMECSpeeds.MultiplePalette == true && WMECSpeeds.PaletteByCountrie == false){
  858. selectedState = getId('selectState').options[getId('selectState').selectedIndex].value;
  859. log("selectedState = ", selectedState);
  860. if (WMECSpeeds.speedColors.US[selectedState][unit]===undefined){
  861. WMECSpeeds.speedColors.US[selectedState][unit] = cloneObj(WMECSpeeds.speedColors[unit]);
  862. }
  863. for (var valSpeed in WMECSpeeds.speedColors.US[selectedState][unit]) {
  864. var color = WMECSpeeds.speedColors.US[selectedState][unit][valSpeed];
  865. var div = document.createElement('div'); div.className="divContent";
  866. var divspeed = document.createElement('div'); divspeed.className="divl speed"; divspeed.style.width="60px"; divspeed.innerHTML=valSpeed;
  867. div.appendChild(divspeed);
  868.  
  869. var divsuppr = document.createElement('div'); divsuppr.className="divr"; divsuppr.style.width="20px";
  870. var divsuppra = document.createElement('a');
  871. divsuppra.innerHTML="<img style='width:20px;' title='"+ CSlang[5][CSI18n] +"' src='data:image/png;base64,"+ icon_delete +"' />";
  872. divsuppra.href = "#"; divsuppra.className="delSpeed"; divsuppra.id="delSpeed_"+valSpeed;
  873. divsuppr.appendChild(divsuppra);
  874. div.appendChild(divsuppr);
  875.  
  876. var divedit = document.createElement('div'); divedit.className="divr"; divedit.style.width="20px";
  877. var divedita = document.createElement('a');
  878. divedita.innerHTML="<img style='width:16px;' title='"+ CSlang[8][CSI18n] +"' src='data:image/png;base64,"+ icon_edit +"' />";
  879. divedita.href = "#";
  880. divedita.onclick = getFunctionWithArgs(CSModifCouleur, [unit,valSpeed,color,selectedState]);
  881. divedit.appendChild(divedita);
  882. div.appendChild(divedit);
  883.  
  884. var divcolor = document.createElement('div'); divcolor.className="divr"; divcolor.style.width="120px"; divcolor.innerHTML="<div class='divcolor' style='background-color:"+ color +";'>&nbsp;</div>";
  885. div.appendChild(divcolor);
  886. getId('CStable').appendChild(div);
  887. }
  888. //log("LoadSettings WMECSpeeds.speedColors.US."+selectedState+"."+unit+" = ",WMECSpeeds.speedColors.US[selectedState][unit]);
  889. }
  890. if (WMECSpeeds.PaletteByCountrie == true && WMECSpeeds.MultiplePalette == false){
  891. if (getId('selectCountrie').options[getId('selectCountrie').selectedIndex] !== undefined)
  892. selectedCountrie = getId('selectCountrie').options[getId('selectCountrie').selectedIndex].value;
  893. else selectedCountrie = CSpeedsModel.countries.top.name.replace(/ /g, '_');
  894. log("selectCountrie = ", selectedCountrie);
  895. if (WMECSpeeds.speedColors.Countries[selectedCountrie]===undefined || WMECSpeeds.speedColors.Countries[selectedCountrie][unit]===undefined){
  896. WMECSpeeds.speedColors.Countries[selectedCountrie] = {};
  897. WMECSpeeds.speedColors.Countries[selectedCountrie][unit] = cloneObj(WMECSpeeds.speedColors[unit]);
  898. updateCountrieList();
  899. //log("LoadSettings création WMECSpeeds.speedColors.Countries."+selectedCountrie+"."+unit+" = ",WMECSpeeds.speedColors.Countries[selectedCountrie][unit]);
  900. }
  901. for (var valSpeed in WMECSpeeds.speedColors.Countries[selectedCountrie][unit]) {
  902. var color = WMECSpeeds.speedColors.Countries[selectedCountrie][unit][valSpeed];
  903. var div = document.createElement('div'); div.className="divContent";
  904. var divspeed = document.createElement('div'); divspeed.className="divl speed"; divspeed.style.width="60px"; divspeed.innerHTML=valSpeed;
  905. div.appendChild(divspeed);
  906.  
  907. var divsuppr = document.createElement('div'); divsuppr.className="divr"; divsuppr.style.width="20px";
  908. var divsuppra = document.createElement('a');
  909.  
  910. divsuppra.innerHTML="<img style='width:20px;' title='"+ CSlang[5][CSI18n] +"' src='data:image/png;base64,"+ icon_delete +"' />";
  911. divsuppra.href = "#"; divsuppra.className="delSpeed"; divsuppra.id="delSpeed_"+valSpeed;
  912. divsuppr.appendChild(divsuppra);
  913. div.appendChild(divsuppr);
  914.  
  915. var divedit = document.createElement('div'); divedit.className="divr"; divedit.style.width="20px";
  916. var divedita = document.createElement('a');
  917. divedita.innerHTML="<img style='width:16px;' title='"+ CSlang[8][CSI18n] +"' src='data:image/png;base64,"+ icon_edit +"' />";
  918. divedita.href = "#";
  919. divedita.onclick = getFunctionWithArgs(CSModifCouleur, [unit,valSpeed,color,selectedCountrie]);
  920. divedit.appendChild(divedita);
  921. div.appendChild(divedit);
  922.  
  923. var divcolor = document.createElement('div'); divcolor.className="divr"; divcolor.style.width="120px"; divcolor.innerHTML="<div class='divcolor' style='background-color:"+ color +";'>&nbsp;</div>";
  924. div.appendChild(divcolor);
  925. getId('CStable').appendChild(div);
  926. }
  927. //log("LoadSettings WMECSpeeds.speedColors.Countries."+selectedCountrie+"."+unit+" = ",WMECSpeeds.speedColors.Countries[selectedCountrie][unit]);
  928. }
  929. for (var i=0; i < RoadToScan.length; ++i){
  930. var type = RoadToScan[i];
  931. var div = document.createElement('div'); div.className="divContentZoom";
  932. var divcheck = document.createElement('div'); divcheck.className="divl";
  933. divcheck.innerHTML= '<input type="checkbox" style="margin:1px 1px;" class="CScheck" id="cbRoad'+type+'">';
  934. div.appendChild(divcheck);
  935.  
  936. if (type != 999){
  937. var divtype = document.createElement('div'); divtype.className="divl CStype"; divtype.style.width="130px"; divtype.innerHTML= WMECSpeeds.typeOfRoad[type].name;
  938. div.appendChild(divtype);
  939. var divedit = document.createElement('div'); divedit.className="divr"; divedit.style.width="20px";
  940. var divedita = document.createElement('a');
  941. divedita.innerHTML="<img style='width:16px;' title='"+ CSlang[8][CSI18n] +"' src='data:image/png;base64,"+ icon_edit +"' />";
  942. divedita.href = "#"; divedita.className="modifyZoom"; divedita.id="zoom_"+type;
  943. divedit.appendChild(divedita);
  944. div.appendChild(divedit);
  945. var divzoom = document.createElement('div'); divzoom.className="divr CSzoom"; divzoom.style.width="60px"; divzoom.innerHTML= WMECSpeeds.typeOfRoad[type].zoom;
  946. div.appendChild(divzoom);
  947. }else if (type == 999){
  948. var divtype = document.createElement('div'); divtype.className="divl CStype"; divtype.style.width="130px"; divtype.innerHTML= CSlang[18][CSI18n];
  949. div.appendChild(divtype);
  950. }
  951. getId('CSroadType').appendChild(div);
  952. getId('cbRoad'+type).checked = WMECSpeeds.typeOfRoad[type].checked;
  953. //getId('cbRoad'+type).style.marginLeft = "2px";
  954. //getId('cbRoad'+type).style.marginTop = "2px";
  955. //getId('cbRoad'+type).style.width = "12px";
  956. //getId('cbRoad'+type).style.height = "12px";
  957.  
  958. }
  959. setupHandler();
  960. }
  961.  
  962. function setupHandler(){
  963. var rgb = {r: 0, g:0, b:0, name:null};
  964. var listeDelSpeed = getId("CStable");
  965. var btnDelSpeed = getElementsByClassName("delSpeed", listeDelSpeed);
  966. for (var i=0; i<btnDelSpeed.length; i++)
  967. {
  968. var target=btnDelSpeed[i];
  969. var index = target.id.split('_')[1];
  970. target.onclick = getFunctionWithArgs(SCSpeeds, [unit,index,selectedState,selectedCountrie]);
  971. }
  972. var listeEditZoom = getId("CSroadType");
  973. var btnEditZoom = getElementsByClassName("modifyZoom", listeEditZoom);
  974. for (var i=0; i<btnEditZoom.length; i++)
  975. {
  976. var target=btnEditZoom[i];
  977. var index = target.id.split('_')[1];
  978. var val = WMECSpeeds.typeOfRoad[parseInt(index)].zoom;
  979. target.onclick = getFunctionWithArgs(SCEditZoom, [index, val]);
  980. }
  981. getId('cbPaletteByCountrie').onclick = (function() {
  982. getId('selectCountrie').style.display = (getId('cbPaletteByCountrie').checked)? "block" : "none";
  983. WMECSpeeds.PaletteByCountrie=getId('cbPaletteByCountrie').checked;
  984. WMECSpeeds.MultiplePalette = false;
  985. updateCountrieList();
  986. getId('CStable').innerHTML="";
  987. getId('CSroadType').innerHTML="";
  988. LoadSettings();
  989. SCColor();
  990. });
  991. getId('selectCountrie').onclick = (function(){
  992. updateCountrieList();
  993. getId('CStable').innerHTML="";
  994. getId('CSroadType').innerHTML="";
  995. LoadSettings();
  996. });
  997. getId('cbMultiplePalette').onclick = (function() {
  998. getId('selectState').style.display = (getId('cbMultiplePalette').checked)? "block" : "none";
  999. WMECSpeeds.MultiplePalette=getId('cbMultiplePalette').checked;
  1000. WMECSpeeds.PaletteByCountrie = false;
  1001. if (WMECSpeeds.MultiplePalette==true){
  1002. var stateToSelect = CSpeedsModel.states.top.name.replace(/ /g, '_');
  1003. for (var index=0; getId('selectState').options[index].value != stateToSelect; index++) {};
  1004. getId('selectState').options[index].selected=true;
  1005. }
  1006. getId('CStable').innerHTML="";
  1007. getId('CSroadType').innerHTML="";
  1008. LoadSettings();
  1009. SCColor();
  1010. });
  1011. getId('selectState').onclick = (function(){
  1012. getId('CStable').innerHTML="";
  1013. getId('CSroadType').innerHTML="";
  1014. LoadSettings();
  1015. });
  1016. getId('edit_others').onclick = (function(){
  1017. getId('Conf_Others').style.display="block";
  1018. getId('Conf_Color').style.display = "none";
  1019. getId('colorspeedsDiv').style.display = "none";
  1020. getId('newspeed').value=null;
  1021. getId('ConfColor').style.backgroundColor=WMECSpeeds.speedColors.Others;
  1022. getId('CSpeeds_cfgdialog').style.display= 'block';
  1023. rgb = color2Rgb(WMECSpeeds.speedColors.Others);
  1024. actualiseColorRGB(rgb);
  1025. });
  1026. getId('cancel').onclick=(function(){
  1027. getId('Conf_Others').style.display="none";
  1028. getId('Conf_Color').style.display = "none";
  1029. getId('CSpeeds_cfgdialog').style.display= 'none';
  1030. getId('colorspeedsDiv').style.display = "block";
  1031. getId('newspeed').value="";
  1032. });
  1033. getId('submit').onclick=(function(){
  1034. var newSpeed = getId('newspeed').value;
  1035. var newColor = getId('ConfColor').style.backgroundColor;
  1036. //log("newSpeed = ", newSpeed);log("newColor = ", newColor);
  1037. if (getId('Conf_Color').style.display =="block" && newSpeed && newColor) {
  1038. if (WMECSpeeds.MultiplePalette == true){
  1039. WMECSpeeds.speedColors.US[selectedState][unit][newSpeed] = newColor;
  1040. }else if (WMECSpeeds.PaletteByCountrie == true){
  1041. WMECSpeeds.speedColors.Countries[selectedCountrie][unit][newSpeed] = newColor;
  1042. }else if (WMECSpeeds.MultiplePalette == false && WMECSpeeds.PaletteByCountrie == false){
  1043. WMECSpeeds.speedColors[unit][newSpeed] = newColor;
  1044. }
  1045. }
  1046. if (getId('Conf_Others').style.display == "block" && newColor) {
  1047. WMECSpeeds.speedColors.Others=newColor;
  1048. getId('color_others').style.backgroundColor=WMECSpeeds.speedColors.Others;
  1049. }
  1050. getId('newspeed').value="";
  1051. newSpeed = null;
  1052. newColor = null;
  1053. getId('CStable').innerHTML="";
  1054. getId('CSroadType').innerHTML="";
  1055. getId('Conf_Others').style.display="none";
  1056. getId('Conf_Color').style.display = "none";
  1057. getId('CSpeeds_cfgdialog').style.display= 'none';
  1058. getId('colorspeedsDiv').style.display = "block";
  1059. LoadSettings();
  1060. SCColor();
  1061. });
  1062. $("#ConfColor.dropdown-toggle").dropdown();
  1063. $('#ConfColor+.dropdown-menu li').click(function(){
  1064. getId('ConfColor').style.backgroundColor=this.style.backgroundColor;
  1065. rgb = color2Rgb(this.style.backgroundColor);
  1066. actualiseColorRGB(rgb);
  1067. });
  1068. /*
  1069. $("#ConfDash.dropdown-toggle").dropdown();
  1070. $('#ConfDash+.dropdown-menu li').click(function(){
  1071. getId('ConfDash').text=this.text;
  1072. });
  1073. */
  1074. getId('sliderRed').onmousemove = function(){
  1075. getId('valRed').value=getId('sliderRed').value;
  1076. rgb.r = getId('valRed').value;
  1077. rgb.g = getId('valGreen').value;
  1078. rgb.b = getId('valBlue').value;
  1079. rgb = color2Rgb(Rgb2String(rgb));
  1080. actualiseColorRGB(rgb);
  1081. };
  1082. getId('sliderGreen').onmousemove = function(){
  1083. getId('valGreen').value=getId('sliderGreen').value;
  1084. rgb.r = getId('valRed').value;
  1085. rgb.g = getId('valGreen').value;
  1086. rgb.b = getId('valBlue').value;
  1087. rgb = color2Rgb(Rgb2String(rgb));
  1088. actualiseColorRGB(rgb);
  1089. };
  1090. getId('sliderBlue').onmousemove = function(){
  1091. getId('valBlue').value=getId('sliderBlue').value;
  1092. rgb.r = getId('valRed').value;
  1093. rgb.g = getId('valGreen').value;
  1094. rgb.b = getId('valBlue').value;
  1095. rgb = color2Rgb(Rgb2String(rgb));
  1096. actualiseColorRGB(rgb);
  1097. };
  1098. getId('sliderOffset').onmousemove = function(){
  1099. WMECSpeeds.offsetValue=getId('sliderOffset').value;
  1100. getId('valOffset').value = getId('sliderOffset').value;
  1101. SCColor();
  1102. };
  1103. getId('sliderOpacity').onmousemove = function(){
  1104. WMECSpeeds.opacityValue= Number(getId('sliderOpacity').value/100).toFixed(2);
  1105. getId('valOpacity').value = getId('sliderOpacity').value;
  1106. SCColor();
  1107. };
  1108. getId('sliderThickness').onmousemove = function(){
  1109. WMECSpeeds.thicknessValue= getId('sliderThickness').value;
  1110. getId('valThickness').value = getId('sliderThickness').value;
  1111. SCColor();
  1112. };
  1113. getId('valRed').onchange = function(){
  1114. var R = parseInt(getId('valRed').value);
  1115. if ((R >= 0) && (R <= 255)){
  1116. getId('sliderRed').value = getId('valRed').value;
  1117. rgb.r = getId('valRed').value;
  1118. rgb.g = getId('valGreen').value;
  1119. rgb.b = getId('valBlue').value;
  1120. rgb = color2Rgb(Rgb2String(rgb));
  1121. actualiseColorRGB(rgb);
  1122. }else {
  1123. getId('valRed').value = getId('sliderRed').value;
  1124. }
  1125. };
  1126. getId('valGreen').onchange = function(){
  1127. var G = parseInt(getId('valGreen').value);
  1128. if ((G >= 0) && (G <= 255)){
  1129. getId('sliderGreen').value=getId('valGreen').value;
  1130. rgb.r = getId('valRed').value;
  1131. rgb.g = getId('valGreen').value;
  1132. rgb.b = getId('valBlue').value;
  1133. rgb = color2Rgb(Rgb2String(rgb));
  1134. actualiseColorRGB(rgb);
  1135. }else {
  1136. getId('valGreen').value=getId('sliderGreen').value;
  1137. }
  1138. };
  1139. getId('valBlue').onchange = function(){
  1140. var B = parseInt(getId('valBlue').value);
  1141. if ((B >= 0) && (B <= 255)){
  1142. getId('sliderBlue').value=getId('valBlue').value;
  1143. rgb.r = getId('valRed').value;
  1144. rgb.g = getId('valGreen').value;
  1145. rgb.b = getId('valBlue').value;
  1146. rgb = color2Rgb(Rgb2String(rgb));
  1147. actualiseColorRGB(rgb);
  1148. }else {
  1149. getId('valBlue').value=getId('sliderBlue').value;
  1150. }
  1151. };
  1152. getId('valOffset').onchange = function(){
  1153. var R = parseInt(getId('valOffset').value);
  1154. if ((R >= 1) && (R <= 10)){
  1155. getId('sliderOffset').value = getId('valOffset').value;
  1156. WMECSpeeds.offsetValue=getId('valOffset').value;
  1157. SCColor();
  1158. }else {
  1159. getId('valOffset').value = getId('sliderOffset').value;
  1160. }
  1161. };
  1162. getId('valOpacity').onchange = function(){
  1163. var R = parseInt(getId('valOpacity').value);
  1164. if ((R >= 0) && (R <= 100)){
  1165. getId('sliderOpacity').value = getId('valOpacity').value;
  1166. WMECSpeeds.opacityValue= Number(getId('valOpacity').value/100).toFixed(2);
  1167. SCColor();
  1168. }else {
  1169. getId('valOpacity').value = getId('sliderOpacity').value;
  1170. }
  1171. };
  1172. getId('valThickness').onchange = function(){
  1173. var R = parseInt(getId('valThickness').value);
  1174. if ((R >= 2) && (R <= 10)){
  1175. getId('sliderThickness').value = getId('valThickness').value;
  1176. WMECSpeeds.thicknessValue= getId('valThickness').value;
  1177. SCColor();
  1178. }else {
  1179. getId('valThickness').value = getId('sliderThickness').value;
  1180. }
  1181. };
  1182. }
  1183.  
  1184. function updateCountrieList(){
  1185. var selectCountrie = getId('selectCountrie');
  1186. var current = null;
  1187. if (selectCountrie.selectedIndex >= 0) current = selectCountrie.options[selectCountrie.selectedIndex].value;
  1188. if (current === null) current = CSpeedsModel.countries.top.name.replace(/ /g, '_');
  1189.  
  1190. selectCountrie.options.length = 0;
  1191. for (var countrie in WMECSpeeds.speedColors.Countries) {
  1192. // create option in select menu
  1193. if (countrie === undefined) countrie=CSpeedsModel.countries.top.name.replace(/ /g, '_');
  1194. var countrieOption = document.createElement('option');
  1195. var countrieText = document.createTextNode(countrie.replace(/_/g, ' '));
  1196. if (current !== null && countrie == current)
  1197. countrieOption.setAttribute('selected',true);
  1198. countrieOption.setAttribute('value',countrie);
  1199. countrieOption.appendChild(countrieText);
  1200. selectCountrie.appendChild(countrieOption);
  1201. }
  1202. }
  1203.  
  1204. function CSModifCouleur(unit,id,color,state){
  1205. getId('Conf_Others').style.display = "none";
  1206. getId('Conf_Color').style.display = "block";
  1207. getId('colorspeedsDiv').style.display = "none";
  1208. getId('newspeed').value=id;
  1209. getId('ConfColor').style.backgroundColor=color;
  1210. CSpeeds_cfgdialog.style.display= 'block';
  1211. var c = color2Rgb(color);
  1212. actualiseColorRGB(c);
  1213. }
  1214.  
  1215. function actualiseColorRGB(c){
  1216. log("color: ",c);
  1217. getId('valRed').value = c.r;
  1218. getId('valGreen').value = c.g;
  1219. getId('valBlue').value = c.b;
  1220. getId('sliderRed').value = c.r;
  1221. getId('sliderGreen').value = c.g;
  1222. getId('sliderBlue').value = c.b;
  1223. getId('ConfColor').style.backgroundColor = Rgb2String(c);
  1224. getId('nameColor').innerHTML = c.name;
  1225. }
  1226.  
  1227. function SCSpeeds(unit,idx,state,contrie){
  1228. if (WMECSpeeds.MultiplePalette === true){
  1229. var answer = window.confirm(CSlang[5][CSI18n] +" "+idx+" "+unit+" "+CSlang[21][CSI18n]+" "+state+" ?");
  1230. }else if (WMECSpeeds.PaletteByCountrie === true){
  1231. var answer = window.confirm(CSlang[5][CSI18n] +" "+idx+" "+unit+" "+CSlang[21][CSI18n]+" "+contrie+" ?");
  1232. }else{var answer = window.confirm(CSlang[5][CSI18n] +" "+idx+" "+unit+" ?");}
  1233. if (answer){
  1234. if (WMECSpeeds.MultiplePalette === true){
  1235. delete WMECSpeeds.speedColors.US[state][unit][idx];
  1236. }else if (WMECSpeeds.PaletteByCountrie === true){
  1237. delete WMECSpeeds.speedColors.Countries[contrie][unit][idx];
  1238. }else {delete WMECSpeeds.speedColors[unit][idx];}
  1239. getId('CStable').innerHTML="";
  1240. getId('CSroadType').innerHTML="";
  1241. LoadSettings();
  1242. }
  1243. }
  1244.  
  1245. function SCEditZoom(idx, val){
  1246. getId('editzoom').style.display = "block";
  1247. getId('newvalzoom').value=val;
  1248. getId('texttype').textContent = WMECSpeeds.typeOfRoad[idx].name;
  1249. getId('submitZoom').onclick=(function(){
  1250. var newValZoom = getId('newvalzoom').value;
  1251. if (newValZoom) {
  1252. WMECSpeeds.typeOfRoad[idx].zoom = newValZoom;
  1253. }
  1254. getId('editzoom').style.display = "none";
  1255. getId('newvalzoom').value="";
  1256. getId('CStable').innerHTML="";
  1257. getId('CSroadType').innerHTML="";
  1258. LoadSettings();
  1259. });
  1260. getId('cancelZoom').onclick=(function(){
  1261. getId('editzoom').style.display = "none";
  1262. getId('newvalzoom').value="";
  1263. getId('CStable').innerHTML="";
  1264. getId('CSroadType').innerHTML="";
  1265. LoadSettings();
  1266. });
  1267. }
  1268.  
  1269.  
  1270. function shiftGeometry(d, line, trigo) // d=distance to shift, line=collection of OL points, trigo=boolean: true=left(trigo=CCW) false=right(CW) : fwd is CW, rev is trigo
  1271. {
  1272. if (!trigo)
  1273. d=-d;
  1274. function getOrthoVector(p1, p2)
  1275. {
  1276. return [p1.y-p2.y , p2.x-p1.x];
  1277. }
  1278. function normalizeVector(v)
  1279. {
  1280. if (v[0]*v[0]+v[1]*v[1]==0)
  1281. return v;
  1282. var l=Math.sqrt(v[0]*v[0]+v[1]*v[1]);
  1283. return [v[0]/l , v[1]/l];
  1284. }
  1285. var points = [];
  1286. for (var i=0; i<line.length; i++)
  1287. {
  1288. var vcount=0;
  1289. // compute orthogonal vectors:
  1290. var prevVector=[0,0];
  1291. var nextVector=[0,0];
  1292. if (i>0) // can compute prev
  1293. {
  1294. var p1=line[i-1];
  1295. var p2=line[i];
  1296. prevVector=getOrthoVector(p1, p2);
  1297. prevVector=normalizeVector(prevVector);
  1298. vcount++;
  1299. }
  1300. if (i<line.length-1) // can compute next
  1301. {
  1302. var p1=line[i];
  1303. var p2=line[i+1];
  1304. nextVector=getOrthoVector(p1, p2);
  1305. nextVector=normalizeVector(nextVector);
  1306. vcount++;
  1307. }
  1308. // sum vectors and normalize
  1309. var v = [0, 0];
  1310. if (vcount!=0)
  1311. v = [(prevVector[0]+nextVector[0])/vcount, (prevVector[1]+nextVector[1])/vcount];
  1312. //v=normalizeVector(v);
  1313. points.push(new CSpeedOpenLayers.Geometry.Point(line[i].x+v[0]*d, line[i].y+v[1]*d));
  1314. }
  1315. return points;
  1316. }
  1317.  
  1318. function SCColor(){
  1319. //log('SCColor');
  1320. try { colorspeeds_mapLayer.destroyFeatures();
  1321. }catch(err){log('err destroyFeatures: ',err);}
  1322. if ( CSpeedsCountries !== undefined && CSpeedsCountries.top !== undefined){
  1323. getId('stateChoise').style.display = (CSpeedsCountries.top.name == "United States")? "block" : "none";
  1324. }
  1325. var lineFeature = [];
  1326. for (var i=0; i < RoadToScan.length; ++i){
  1327. var type = RoadToScan[i];
  1328. WMECSpeeds.typeOfRoad[type].checked = getId('cbRoad'+type).checked;
  1329. }
  1330. for (var seg in CSpeedsModel.segments.objects) {
  1331. var segment = CSpeedsModel.segments.get(seg);
  1332. var attributes = segment.attributes;
  1333. var roadType = attributes.roadType;
  1334. var roundabout = (attributes.junctionID === null) ? false : true;
  1335. var line = getId(segment.geometry.id);
  1336. var fwdspeed = attributes.fwdMaxSpeed;
  1337. var revspeed = attributes.revMaxSpeed;
  1338. var fwdspeedUnverified = attributes.fwdMaxSpeedUnverified;
  1339. var revspeedUnverified = attributes.revMaxSpeedUnverified;
  1340. var fwddir = attributes.fwdDirection;
  1341. var revdir = attributes.revDirection;
  1342. //var fwdID = "",revID="";
  1343. var isSelected = (segment.selected == true)? true : false;
  1344. var isModified = (segment.state == "Update")? true : false;
  1345. if (attributes.primaryStreetID === null || attributes.primaryStreetID === undefined) continue;
  1346. if (CSpeedsModel.streets.get(attributes.primaryStreetID) === null || CSpeedsModel.streets.get(attributes.primaryStreetID) === undefined){
  1347. if (debug) log("CSpeedsModel.streets.get("+attributes.primaryStreetID+") =",CSpeedsModel.streets.get(attributes.primaryStreetID));
  1348. continue;
  1349. }
  1350. var cid = CSpeedsModel.streets.get(attributes.primaryStreetID).cityID;
  1351. var stateID =null;
  1352. var countryID =null;
  1353. if (CSpeedsModel.cities.get(cid) === null || CSpeedsModel.cities.get(cid) === undefined){
  1354. if (debug) log("CSpeedsModel.cities.get("+cid+") =",CSpeedsModel.cities.get(cid));
  1355. continue;
  1356. }
  1357.  
  1358. stateID = CSpeedsModel.cities.get(cid).attributes.stateID;
  1359. countryID = CSpeedsModel.cities.get(cid).attributes.countryID;
  1360.  
  1361. var state = CSpeedsModel.states.get(stateID).name.replace(/ /g, '_');
  1362. var countrie = CSpeedsModel.countries.get(countryID).name.replace(/ /g, '_');
  1363. if (WMECSpeeds.PaletteByCountrie==true && WMECSpeeds.speedColors.Countries[countrie]===undefined){
  1364. WMECSpeeds.speedColors.Countries[countrie] = {};
  1365. WMECSpeeds.speedColors.Countries[countrie][unit] = cloneObj(WMECSpeeds.speedColors[unit]);
  1366. updateCountrieList();
  1367. LoadSettings();
  1368. log("SCColor WMECSpeeds.speedColors.Countries."+countrie+"."+unit+" = ",WMECSpeeds.speedColors.Countries[countrie][unit]);
  1369. }
  1370. if (WMECSpeeds.MultiplePalette==true && WMECSpeeds.speedColors.US[state]!==undefined && WMECSpeeds.speedColors.US[state][unit]===undefined){
  1371. WMECSpeeds.speedColors.US[state][unit] = cloneObj(WMECSpeeds.speedColors[unit]);
  1372. //log("SCColor WMECSpeeds.speedColors.US."+state+"."+unit+" = ",WMECSpeeds.speedColors.US[state][unit]);
  1373. }
  1374. // check that WME hasn't highlighted this segment
  1375. if (isSelected || isModified) continue;
  1376.  
  1377. if (zoom != CSpeedsMap.zoom) {
  1378. zoom = CSpeedsMap.zoom;
  1379. //log('zoom = ' + zoom + 'W.map.getResolution() = '+W.map.getResolution());
  1380. }
  1381. var shiftValue= WMECSpeeds.offsetValue*W.map.getResolution();
  1382. if (RoadToScan.indexOf(roadType) == -1 ) continue;
  1383. if ((roundabout != false) && (WMECSpeeds.typeOfRoad['999'].checked==false)) continue;
  1384. if (unit == 'mph'){
  1385. fwdspeed = (fwdspeed!=null) ? (Math.trunc(fwdspeed*0.625)) : null;
  1386. revspeed = (revspeed!=null) ? (Math.trunc(revspeed*0.625)) : null;
  1387. }
  1388. //log("fwdspeed= "+ fwdspeed + " " + unit + " ; revspeed= " + revspeed + " " + unit);
  1389. // turn off highlights when roads are no longer visible
  1390. if ((zoom < WMECSpeeds.typeOfRoad[roadType].zoom) || !WMECSpeeds.typeOfRoad[roadType].checked) {
  1391. continue;
  1392. }
  1393. WMECSpeeds.visibility = colorspeeds_mapLayer.visibility;
  1394. if (fwdspeed && WMECSpeeds.visibility) {
  1395. //Color for forward speed
  1396. var newWidth="", newColor="", newDashes="", newOpacity="";
  1397.  
  1398. if (WMECSpeeds.MultiplePalette === false && WMECSpeeds.PaletteByCountrie === false){
  1399. if (WMECSpeeds.speedColors[unit].hasOwnProperty(fwdspeed)) newColor=WMECSpeeds.speedColors[unit][fwdspeed];
  1400. }else if (WMECSpeeds.PaletteByCountrie === true){
  1401. if (WMECSpeeds.speedColors.Countries[countrie][unit].hasOwnProperty(fwdspeed)) newColor=WMECSpeeds.speedColors.Countries[countrie][unit][fwdspeed];
  1402. }else if (WMECSpeeds.MultiplePalette === true && WMECSpeeds.speedColors.US[state]!==undefined){
  1403. if (WMECSpeeds.speedColors.US[state][unit].hasOwnProperty(fwdspeed)) newColor=WMECSpeeds.speedColors.US[state][unit][fwdspeed];
  1404. }
  1405. /*
  1406. if (newColor!=""){
  1407. //Dashes
  1408. if (fwddir==true && fwdspeed && !fwdspeedUnverified) { newWidth = 6; newOpacity = 0.8; newDashes = "5 10"; } // verified speed
  1409. else if (fwddir==true && fwdspeed && fwdspeedUnverified) { newColor = WMECSpeeds.speedColors.Others; newWidth = 4; newOpacity = 0.8; newDashes = "2 10";} // unverified speed
  1410. }else if (fwddir==true && fwdspeed) { newWidth = 4; newColor = WMECSpeeds.speedColors.Others; newOpacity = 0.9; newDashes = "5 5"; } // other
  1411. */
  1412. if (newColor!=""){
  1413. //Dashes
  1414. if (fwddir==true && fwdspeed && !fwdspeedUnverified) { newWidth = WMECSpeeds.thicknessValue; newOpacity = WMECSpeeds.opacityValue; newDashes = "5 10"; } // verified speed
  1415. else if (fwddir==true && fwdspeed && fwdspeedUnverified) { newColor = WMECSpeeds.speedColors.Others; newWidth = WMECSpeeds.thicknessValue; newOpacity = 0.8; newDashes = "2 10";} // unverified speed
  1416. }else if (fwddir==true && fwdspeed) { newWidth = WMECSpeeds.thicknessValue; newColor = WMECSpeeds.speedColors.Others; newOpacity = WMECSpeeds.opacityValue; newDashes = "5 5"; } // other
  1417. if (newColor!=""){
  1418. var style = {
  1419. strokeColor: newColor,
  1420. strokeOpacity: newOpacity,
  1421. strokeWidth: newWidth,
  1422. strokeDashstyle: newDashes
  1423. };
  1424. var points = [];
  1425. var segID = attributes.id;
  1426. points=shiftGeometry(shiftValue, segment.geometry.getVertices(), CSpeedsModel.countries.top.leftHandTraffic);
  1427.  
  1428. var newline = new CSpeedOpenLayers.Geometry.LineString(points);
  1429.  
  1430. lineFeature.push(new CSpeedOpenLayers.Feature.Vector(newline, null, style));
  1431. //log("segment id: " + attributes.id + ' newColor: '+ newColor + ' segment.CSpeedsFwd.fwdColor: ' + segment.CSpeedsFwd.fwdColor + ' lineFeature: ',lineFeature);
  1432. }
  1433. }
  1434. if (revspeed && WMECSpeeds.visibility) {
  1435. //Color for reverse speed
  1436. var newWidth="", newColor="", newDashes="", newOpacity="", newDashOffset="";
  1437.  
  1438. if (WMECSpeeds.MultiplePalette === false && WMECSpeeds.PaletteByCountrie === false){
  1439. if (WMECSpeeds.speedColors[unit].hasOwnProperty(revspeed)) newColor=WMECSpeeds.speedColors[unit][revspeed];
  1440. }else if (WMECSpeeds.PaletteByCountrie === true){
  1441. if (WMECSpeeds.speedColors.Countries[countrie][unit].hasOwnProperty(revspeed)) newColor=WMECSpeeds.speedColors.Countries[countrie][unit][revspeed];
  1442. }else if (WMECSpeeds.MultiplePalette === true && WMECSpeeds.speedColors.US[state]!==undefined){
  1443. if (WMECSpeeds.speedColors.US[state][unit].hasOwnProperty(revspeed)) newColor=WMECSpeeds.speedColors.US[state][unit][revspeed];
  1444. }
  1445. /*
  1446. if (newColor!=""){
  1447. //Dashes
  1448. if (revdir==true && revspeed && !revspeedUnverified) { newWidth = 6; newOpacity = 0.8; newDashes = "5 10"; } // verified speed
  1449. else if (revdir==true && revspeed && revspeedUnverified) { newColor = WMECSpeeds.speedColors.Others; newWidth = 4; newOpacity = 0.8; newDashes = "2 10";} // unverified speed
  1450. }else if (revdir==true && revspeed) { newWidth = 4; newColor = WMECSpeeds.speedColors.Others; newOpacity = 0.9; newDashes = "5 5"; } // other
  1451. */
  1452. if (newColor!=""){
  1453. //Dashes
  1454. if (revdir==true && revspeed && !revspeedUnverified) { newWidth = WMECSpeeds.thicknessValue; newOpacity = WMECSpeeds.opacityValue; newDashes = "5 10"; } // verified speed
  1455. else if (revdir==true && revspeed && revspeedUnverified) { newColor = WMECSpeeds.speedColors.Others; newWidth = WMECSpeeds.thicknessValue; newOpacity = WMECSpeeds.opacityValue; newDashes = "2 10";} // unverified speed
  1456. }else if (revdir==true && revspeed) { newWidth = WMECSpeeds.thicknessValue; newColor = WMECSpeeds.speedColors.Others; newOpacity = WMECSpeeds.opacityValue; newDashes = "5 5"; } // other
  1457. if (newColor!=""){
  1458. var style = {
  1459. strokeColor: newColor,
  1460. strokeOpacity: newOpacity,
  1461. strokeWidth: newWidth,
  1462. strokeDashstyle: newDashes,
  1463. };
  1464.  
  1465. var points = [];
  1466. var segID = attributes.id;
  1467. points=shiftGeometry(shiftValue, segment.geometry.getVertices(), !CSpeedsModel.countries.top.leftHandTraffic);
  1468.  
  1469. var newline = new CSpeedOpenLayers.Geometry.LineString(points);
  1470.  
  1471. lineFeature.push(new CSpeedOpenLayers.Feature.Vector(newline, null, style));
  1472. }
  1473. }
  1474.  
  1475. }
  1476. //log("lineFeature = ",lineFeature);
  1477. // Display new array of segments
  1478. try{
  1479. colorspeeds_mapLayer.addFeatures(lineFeature);
  1480. }catch(err){log('err addFeatures: ',err);}
  1481. }
  1482.  
  1483. /* begin running the code! */
  1484. CSpeeds_bootstrap();
  1485.  
  1486.  

QingJ © 2025

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