Post Reply

WME Color Speeds script coloring for Oregon

Post by AlanOfTheBerg
I have found the WME Color Speeds script to be helpful to see segments that have speeds and what speed they have. (i also tweaked the script a bit to my own liking, and to fix the 55mph problem.)

Below is code to have WME Color Speeds colors match ODOT TransGIS.

Code: Select all

{"speedColors":{"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"},"mph":{"10":"MediumPurple","15":"rgb(0,0,255)","20":"DarkGreen","25":"#6CC","30":"Maroon","35":"Red","40":"rgb(96,0,255)","45":"rgb(96,255,0)","50":"rgb(0,128,255)","55":"#F60","60":"rgb(192,255,0)","65":"DimGray"}},"typeOfRoad":{"1":{"name":"Streets","checked":true,"zoom":4},"2":{"name":"Primary Street","checked":true,"zoom":3},"3":{"name":"Freeways","checked":true,"zoom":0},"4":{"name":"Ramps","checked":true,"zoom":2},"6":{"name":"Major Highway","checked":true,"zoom":1},"7":{"name":"Minor Highway","checked":true,"zoom":2},"8":{"name":"Dirt roads","checked":false,"zoom":4}},"selectedRoadType":[],"visibility":true}
transgis_wmecs.png
(76.45 KiB) Downloaded 732 times
To use this config:
  1. install WME Color Speeds
  2. Reload WME to load the script
  3. Close all WME windows
  4. Open Developer Tools, Resources, Local Storage, http://www.waze.com
  5. Copy the code above and paste over the WME Color Speeds data
  6. Open WME
Oh, but we're not done yet! The colors aren't defined so that WME Color Speeds can use them natively. I made edits to the script to make it more useful. Here is my version of WME Color Speeds today:

Code: Select all

// ==UserScript==
// @name             WME Color Speeds
// @name:fr          WME Color Speeds
// @version          0.30
// @description      Adds colours to road segments to show their speed
// @description:fr   Colorisation des segments selon leurs vitesses.
// @include          https://www.waze.com/editor/*
// @include          https://www.waze.com/*/editor/*
// @include          https://editor-beta.waze.com/*
// @exclude          https://www.waze.com/user/*
// @exclude          https://www.waze.com/*/user/*
// @namespace        https://greasyfork.org/scripts/14044-wme-color-speeds
// @author           French Script Team
// @copyright        Sebiseba, seb-d59 & DummyD2 - 2015
// ==/UserScript==

var WMECSpeeds = {};
var CSpeeds_Version = GM_info.script.version;
var icon_delete="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";
var icon_submit="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";
var icon_edit="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";
//var couleurs=new Array("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","White","Snow","Honeydew","MintCream","Azure","AliceBlue","GhostWhite","WhiteSmoke","Seashell","Beige","OldLace","FloralWhite","Ivory","AntiqueWhite","Linen","LavenderBlush","MistyRose","Gainsboro","LightGrey","Silver","DarkGray","Gray","DimGray","LightSlateGray","SlateGray","DarkSlateGray","Black");
var couleurs=new Array("#000","#300","#600","#900","#C00","#F00","#003","#303","#603","#903","#C03","#F03","#006","#306","#606","#906","#C06","#F06","#009","#309","#609","#909","#C09","#F09","#00C","#30C","#60C","#90C","#C0C","#F0C","#00F","#30F","#60F","#90F","#C0F","#F0F","#030","#330","#630","#930","#C30","#F30","#033","#333","#633","#933","#C33","#F33","#036","#336","#636","#936","#C36","#F36","#039","#339","#639","#939","#C39","#F39","#03C","#33C","#63C","#93C","#C3C","#F3C","#03F","#33F","#63F","#93F","#C3F","#F3F","#060","#360","#660","#960","#C60","#F60","#063","#363","#663","#963","#C63","#F63","#066","#366","#666","#966","#C66","#F66","#069","#369","#669","#969","#C69","#F69","#06C","#36C","#66C","#96C","#C6C","#F6C","#06F","#36F","#66F","#96F","#C6F","#F6F","#090","#390","#690","#990","#C90","#F90","#093","#393","#693","#993","#C93","#F93","#096","#396","#696","#996","#C96","#F96","#099","#399","#699","#999","#C99","#F99","#09C","#39C","#69C","#99C","#C9C","#F9C","#09F","#39F","#69F","#99F","#C9F","#F9F","#0C0","#3C0","#6C0","#9C0","#CC0","#FC0","#0C3","#3C3","#6C3","#9C3","#CC3","#FC3","#0C6","#3C6","#6C6","#9C6","#CC6","#FC6","#0C9","#3C9","#6C9","#9C9","#CC9","#FC9","#0CC","#3CC","#6CC","#9CC","#CCC","#FCC","#0CF","#3CF","#6CF","#9CF","#CCF","#FCF","#0F0","#3F0","#6F0","#9F0","#CF0","#FF0","#0F3","#3F3","#6F3","#9F3","#CF3","#FF3","#0F6","#3F6","#6F6","#9F6","#CF6","#FF6","#0F9","#3F9","#6F9","#9F9","#CF9","#FF9","#0FC","#3FC","#6FC","#9FC","#CFC","#FFC","#0FF","#3FF","#6FF","#9FF","#CFF","#FFF");

// speedColors[unit][speed] = color //-----> Default
WMECSpeeds.speedColors = {
    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"},
    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"}
};
var unit;
var debug=false;
var colorspeeds_mapLayer=[];

var zoom=0;
var RoadToScan = [3,6,7,4,2,1,8];
var RoadUpToStreet = [2,3,6,7];
var highway = [3,6,7];

var typeOfRoad = {
//---Type Road-----------
	 3: {"name":"Freeways","checked":true,"zoom":0},
	 6: {"name":"Major Highway","checked":true,"zoom":1},
	 7: {"name":"Minor Highway","checked":true,"zoom":2},
	 4: {"name":"Ramps","checked":true,"zoom":2},
	 2: {"name":"Primary Street","checked":false,"zoom":3},
	 1: {"name":"Streets","checked":false,"zoom":4},
	 8: {"name":"Dirt roads","checked":false,"zoom":4}};

WMECSpeeds.typeOfRoad = typeOfRoad;

//	 5: "Walking Trails",
//	10: "Pedestrian Bw",
//	14: "Ferry",
//	16: "Stairway",
//	17: "Private Road",
//	18: "Railroad",
//	19: "Runway/Taxiway"
//	20: "Parking Lot Road",
//	21: "Service Road"

WMECSpeeds.selectedRoadType = [];
    
WMECSpeeds.visibility = true;

// *********************
// ** HELPER FUNCTION **
// *********************

function log(msg, obj)
{
    if (obj==null)
        console.log(GM_info.script.name + " v" + CSpeeds_Version + " - " + msg);
    else if (debug) 
        console.debug(GM_info.script.name + " v" + CSpeeds_Version + " - " + msg + " " ,obj);
}

function getId(node) {
    return document.getElementById(node);
}
function getElementsByClassName(classname, node) {
    node || (node = document.getElementsByTagName("body")[0]);
    for (var a = [], re = new RegExp("\\b" + classname + "\\b"), els = node.getElementsByTagName("*"), i = 0, j = els.length;i < j;i++) {
        re.test(els[i].className) && a.push(els[i]);
    }
    return a;
}
function getFunctionWithArgs(func, args) {
    return (
        function () {
            var json_args = JSON.stringify(args);
            return function() {
                var args = JSON.parse(json_args);
                func.apply(this, args);
            }
        }
    )();
}
function IsJsonString(str) {
    try {
        JSON.parse(str);
    } catch (e) {
        return false;
    }
    return true;
}
function RGB2Color(r,g,b) {
    return "rgb(" + Math.round(r) +","+ Math.round(g) +","+ Math.round(b) +")";
}
function Check_Unit() {
    if (CSpeedsModel.isImperial) { unit = "mph"; }
    else { unit = "kmh"; }
    log(unit);
    if (getId('CStable')) {
        getId('CStable').innerHTML="";
        LoadSettings();
        getId('unitvalue').innerHTML="("+unit+")";
    }
}
function saveOption(){
	localStorage.setItem('WMEColorSpeeds', JSON.stringify(WMECSpeeds));
}


// *************
// **  INIT   **
// *************
function CSpeeds_bootstrap() {
    if (typeof unsafeWindow === "undefined") {
        unsafeWindow    = ( function () {
            var dummyElem = document.createElement('p');
            dummyElem.setAttribute('onclick', 'return window;');
            return dummyElem.onclick();
        }) ();
    }

    /* begin running the code! */
    log("starting");
    CSpeeds_init();
}


function CSpeeds_init(){
    // Waze object needed
    CSpeedsWaze = unsafeWindow.Waze;
    if(typeof(CSpeedsWaze) === 'undefined'){
        if (debug) { console.error("WME ColorSpeeds - CSpeedsWaze : NOK"); }
        window.setTimeout(CSpeeds_init, 500);
        return;
    }
    CSpeedsMap = CSpeedsWaze.map;
    if(typeof(CSpeedsMap) == 'undefined'){
        if (debug) { console.error("WME ColorSpeeds - CSpeedsmap : NOK"); }
        window.setTimeout(CSpeeds_init, 500);
        return;
    }
    CSpeedsModel = CSpeedsWaze.model;
    if(typeof(CSpeedsModel) == 'undefined'){
        if (debug) { console.error("WME ColorSpeeds - CSpeedsModel DOM : NOK"); }
        window.setTimeout(CSpeeds_init, 500);
        return;
    }
    //    OpenLayers
    CSpeedOpenLayers = unsafeWindow.OpenLayers; 
    if(typeof(CSpeedOpenLayers) === 'undefined'){
        if (debug) { console.error("WME ColorSpeeds - OpenLayers : NOK"); }
        window.setTimeout(CSpeeds_init, 500);
        return;
    }
    //    Traductions
    CSpeedsI18n = unsafeWindow.I18n.locale;
    if(typeof(CSpeedsI18n) == 'undefined'){
        if (debug) { console.error("WME ColorSpeeds - CSpeedsI18n : NOK"); }
        setTimeout(CSpeeds_init, 500);
        return;
    }
    //    Waze GUI needed
    CSpeedshandle = getId("user-info");
    if(typeof(CSpeedshandle) == 'undefined'){
        if (debug) { console.error("WME ColorSpeeds - CSpeedshandle : NOK"); }
        setTimeout(CSpeeds_init, 500);
        return;
    }
    CSpeedshandleClass = getElementsByClassName("nav-tabs", CSpeedshandle)[0];
    if(typeof(CSpeedshandleClass) === 'undefined'){
        if (debug) { console.error("WME ColorSpeeds - CSpeedshandleClass : NOK"); }
        setTimeout(CSpeeds_init, 500);
        return;
    }
    CSpeedshandleClass2 = getElementsByClassName("tab-content", CSpeedshandle)[0];
    if(typeof(CSpeedshandleClass2) === 'undefined'){
        if (debug) { console.error("WME ColorSpeeds - CSpeedshandleClass2 : NOK"); }
        setTimeout(CSpeeds_init, 500);
        return;
    }

    // Verify localStorage. Init if empty or not correct
    
    
    if (typeof(localStorage.WMEColorSpeeds) !== "undefined" && IsJsonString(localStorage.getItem('WMEColorSpeeds'))) {
        WMECSpeeds = JSON.parse(localStorage.WMEColorSpeeds);
        if (WMECSpeeds.typeOfRoad === undefined) WMECSpeeds.typeOfRoad = typeOfRoad;
    }else {
        if (typeof(localStorage.speedColors) !== "undefined" && IsJsonString(localStorage.getItem('speedColors'))) {
            WMECSpeeds.speedColors={}; WMECSpeeds.speedColors = JSON.parse(localStorage.speedColors);
            localStorage.removeItem("speedColors");
        }
        if (typeof(localStorage.speedColorsVisibility) !== "undefined" && IsJsonString(localStorage.getItem('speedColorsVisibility'))) { 
            WMECSpeeds.visibility = JSON.parse(localStorage.speedColorsVisibility);
            localStorage.removeItem("speedColorsVisibility");
        }
        localStorage.setItem('WMEColorSpeeds', JSON.stringify(WMECSpeeds));
        log("init ok");
    
    }
    
    
    //======================================================

    // Translation
    if (CSpeedsI18n  == "fr") {
        CSlang = new Array("Vitesses","Paramètres","Couleurs","Ajouter nouvelle vitesse","Supprimer","Annuler","Autres","Modifier","Type de route","Zoom");
    }
    else {
        CSlang = new Array("Speeds","Settings","Colors","Add new speed","Delete","Cancel","Others","Edit","Road type","Zoom");
    }
    Check_Unit();

    // WME Layers check
    var layers = CSpeedsMap.getLayersBy("uniqueName","__WME_Color_Speeds");
    if(layers.length == 0) {
        var colorspeeds_style = new CSpeedOpenLayers.Style({
            pointRadius: 2,
            fontWeight: "normal",
            label : "${labelText}",
            fontFamily: "Tahoma, Courier New",
            labelOutlineColor: "#FFFFFF",
            labelOutlineWidth: 2,
            fontColor: '#000000',
            fontSize: "10px"
        });

        colorspeeds_mapLayer = new CSpeedOpenLayers.Layer.Vector("Color Speeds", {
            displayInLayerSwitcher: true,
            uniqueName: "__WME_Color_Speeds",
            styleMap: new CSpeedOpenLayers.StyleMap(colorspeeds_style)
        });

        I18n.translations.en.layers.name["__WME_Color_Speeds"] = "Color Speeds";
        CSpeedsMap.addLayer(colorspeeds_mapLayer);
        colorspeeds_mapLayer.setVisibility(WMECSpeeds.visibility);

    }
    //log('colorspeeds_mapLayer ',colorspeeds_mapLayer);
    
    // Then running
    CSpeeds_css();
    getElementsByClassName('btn-group')[0].onclick=(function(){ Check_Unit(); });
}


// *************
// **  HTML   **
// *************

function CSpeeds_css() {
    var Scss = document.createElement("style");
    Scss.type = "text/css";
    var css =".CScontent {width:250px; margin-left:20px; box-shadow: 0 4px 10px #aaa;}";
    css +=".divEntete {height:24px; font-weight:bold; padding-top:2px; border:2px solid #3d3d3d; background-color:#BEDCE5;}";
    css +=".divContent {clear:both; line-height:21px; height:24px; border:1px solid #3d3d3d; border-top:0;}";
    css +=".divl {float:left; text-align:center;}";
    css +=".divr {float:right; text-align:center;}";
    css +=".speed {color:#59899e; font-weight:bold;}";
    css +=".divcolor {width:80px; height:17px; margin:3px 0 0 5px;}";
    css +=".CStype {color:#59899e; font-weight:bold; text-align:left; margin-left:10px;}";
    css +=".CScheck { margin-left:5px; width:10px; height:10px;}";
    css +=".CSzoom {color:#59899e; font-weight:bold;}";
    css +="#editspeed { display:none;}";
    css +="#newspeed {width:35px; height:22px;}";
    css +="#editzoom { display:none;}";
    css +="#newvalzoom {width:35px; height:22px;}";
    Scss.innerHTML = css;
    document.body.appendChild(Scss);    
    CSpeeds_Mainhtml();
}
function CSpeeds_Mainhtml() {
    //Create content in CSpeeds's tab
    var newtab = document.createElement('li');
    newtab.innerHTML = "<a href='#sidepanel-colorspeeds' data-toggle='tab'><span class='icon-dashboard' title='"+ CSlang[0] +"'></span></a>";
    //newtab.innerHTML = "<a href='#sidepanel-colorspeeds' data-toggle='tab'> "+ CSlang[0] +"</a>";
    CSpeedshandleClass.appendChild(newtab);

    var addon = document.createElement('section');
    //addon.id = "colorspeeds-addon";

    // colorspeeds header
    var content = "<div style='float:left; margin-left:5px;'><b><a href='https://greasyfork.org/scripts/14044-wme-color-speeds' target='_blank'><u>WME Color Speeds</u></a></b> v"+ CSpeeds_Version +"</div>";
    content += "<div style='clear:both; padding-top:10px;'></div><div class='CScontent' >";
    content += "<div class='divEntete'><div class='divl' style='width:60px;'>"+ CSlang[0]+"</div><div class='divr' id='unitvalue' style='width:45px;font-size:11px;line-height:20px;'>("+unit+")</div><div class='divr' style='width:130px;'>"+ CSlang[2] +"</div></div>";

    // new / edit speed
    content += "<div class='divContent' id='editspeed'><div class='divl speed' style='width:60px;'><input type='text' value='' id='newspeed' class='speed' /></div>";
    content += "<div class='divr' style='width:20px;'><a href='#'><img id='cancel' style='width:20px;' title='"+ CSlang[5] +"' src='data:image/png;base64,"+ icon_delete +"' /></a></div>";
    content += "<div class='divr' style='width:20px;'><a href='#'><img id='submit' style='width:20px;' title='"+ CSlang[3] +"' src='data:image/png;base64,"+ icon_submit +"' /></a></div>";
    content += "<div class='divr' style='width:120px; text-align:left;'><select id='CScolor' style='height:22px; width:100px;'>";

    for (var i=0; couleurs[i]; ++i) { content +="<option value='"+ couleurs[i] +"' style='background-color:"+ couleurs[i] +"'>&nbsp;</option>"; }

    content +="</select></div></div>";
    content += "<div class='divContent'><div class='divl speed' style='width:60px;'>"+ CSlang[6] +"</div><div class='divr' style='width:40px;'>&nbsp;</div><div class='divr' style='width:120px;'><div class='divcolor' style='background-color:#f00;'>&nbsp;</div></div></div>";
    content += "<div id='CStable'></div></div><div id='divadd'></div>";
    
    // Type road
    content += "<br><div style='clear:both; padding-top:10px;'></div><div class='CScontent'>";
    content += "<div class='divEntete'><div class='divl' style='width:120px;'>"+ CSlang[8]+"</div><div class='divr' style='width:60px; margin-right:20px;'>"+ CSlang[9] +"</div></div>";
  	// edit zoom
    content += "<div class='divContent' id='editzoom'><div class='divl speed' style='width:110px;'><span id='texttype'></span></div>";
    content += "<div class='divr' style='width:20px;'><a href='#'><img id='cancelZoom' style='width:20px;' title='"+ CSlang[5] +"' src='data:image/png;base64,"+ icon_delete +"' /></a></div>";
    content += "<div class='divr' style='width:20px;'><a href='#'><img id='submitZoom' style='width:20px;' title='"+ CSlang[3] +"' src='data:image/png;base64,"+ icon_submit +"' /></a></div>";
    content += "<div class='divr speed' style='width:60px;'><input type='text' value='' id='newvalzoom' class='speed' /></div>";
    content +="</div>";
    content += "<div id='CSroadType'></div></div>";
    
    addon.innerHTML  = content;
    addon.id = "sidepanel-colorspeeds";
    addon.className = "tab-pane";
    CSpeedshandleClass2.appendChild(addon);  
    getId('divadd').innerHTML="<br/><center><input type='button' id='addbutton' name='add' value='"+ CSlang[3] +"' /></center>";
    getId('addbutton').onclick = (function() {
        getId('editspeed').style.display = "block";
        getId('addbutton').style.display = "none";
    });
    
    
    
    LoadSettings();
    window.setInterval(SCColor,800);
    CSpeedsMap.events.register("zoomend", null, SCColor);
    CSpeedsMap.events.register("moveend", null, SCColor);
    window.addEventListener("beforeunload", saveOption, false);
}

function LoadSettings(){

    for (var valSpeed in WMECSpeeds.speedColors[unit]) {
        var color = WMECSpeeds.speedColors[unit][valSpeed];
        var div = document.createElement('div'); div.className="divContent";
        var divspeed = document.createElement('div'); divspeed.className="divl speed"; divspeed.style.width="60px"; divspeed.innerHTML=valSpeed;
        div.appendChild(divspeed); 

        var divsuppr = document.createElement('div'); divsuppr.className="divr"; divsuppr.style.width="20px";
        var divsuppra = document.createElement('a');
        divsuppra.innerHTML="<img style='width:20px;' title='"+ CSlang[4] +"' src='data:image/png;base64,"+ icon_delete +"' />";
        divsuppra.href = "#"; divsuppra.className="delSpeed"; divsuppra.id="delSpeed_"+valSpeed;
        divsuppr.appendChild(divsuppra);
        div.appendChild(divsuppr);     

        var divedit = document.createElement('div'); divedit.className="divr"; divedit.style.width="20px";
        var divedita = document.createElement('a');
        divedita.innerHTML="<img style='width:16px;' title='"+ CSlang[7] +"' src='data:image/png;base64,"+ icon_edit +"' />";
        divedita.href = "#";
        divedita.onclick = getFunctionWithArgs(SCEditSpeed, [unit,valSpeed,color]);
        divedit.appendChild(divedita);
        div.appendChild(divedit);  

        var divcolor = document.createElement('div'); divcolor.className="divr"; divcolor.style.width="120px"; divcolor.innerHTML="<div class='divcolor' style='background-color:"+ color +";'>&nbsp;</div>";
        div.appendChild(divcolor); 
        getId('CStable').appendChild(div);
    }
    for (var i=0; i < RoadToScan.length; ++i){
        var type = RoadToScan[i];
        var div = document.createElement('div'); div.className="divContent";
        
        var divcheck = document.createElement('div'); divcheck.className="divl CScheck";
        divcheck.innerHTML= '<input type="checkbox" id="cbRoad'+type+'">';
        div.appendChild(divcheck);
        
        var divtype = document.createElement('div'); divtype.className="divl CStype"; divtype.style.width="130px"; divtype.innerHTML= WMECSpeeds.typeOfRoad[type].name;
        div.appendChild(divtype);
        
        var divedit = document.createElement('div'); divedit.className="divr"; divedit.style.width="20px";
        var divedita = document.createElement('a');
        divedita.innerHTML="<img style='width:16px;' title='"+ CSlang[7] +"' src='data:image/png;base64,"+ icon_edit +"' />";
        divedita.href = "#"; divedita.className="modifyZoom"; divedita.id="zoom_"+type;
        divedit.appendChild(divedita);
        div.appendChild(divedit);  
        
        var divzoom = document.createElement('div'); divzoom.className="divr CSzoom"; divzoom.style.width="60px"; divzoom.innerHTML= WMECSpeeds.typeOfRoad[type].zoom;
        div.appendChild(divzoom);
        getId('CSroadType').appendChild(div);
        getId('cbRoad'+type).checked = WMECSpeeds.typeOfRoad[type].checked;


    }

    getId('CScolor').onchange=(function(){
        getId('CScolor').style.backgroundColor=getId('CScolor').value;
    });
    getId('cancel').onclick=(function(){
        getId('editspeed').style.display = "none";
        getId('addbutton').style.display = "block";
        getId('CScolor').style.backgroundColor="#fff";
        getId('CScolor').value="";
        getId('newspeed').value="";
        getId('CStable').innerHTML="";
        getId('CSroadType').innerHTML="";
        LoadSettings();
    });  
    getId('submit').onclick=(function(){
        var newSpeed = getId('newspeed').value;
        var newColor = getId('CScolor').value;
        if (newSpeed && newColor) {
            WMECSpeeds.speedColors[unit][newSpeed] = newColor;
        }
        getId('editspeed').style.display = "none";
        getId('addbutton').style.display = "block";
        getId('CScolor').style.backgroundColor="#fff";
        getId('CScolor').value="";
        getId('newspeed').value="";
        getId('CStable').innerHTML="";
        getId('CSroadType').innerHTML="";
        LoadSettings();
    });
 
    setupHandler();


}
function setupHandler() {
    
    var listeDelSpeed = getId("CStable");
    var btnDelSpeed = getElementsByClassName("delSpeed", listeDelSpeed);
    for (var i=0; i<btnDelSpeed.length; i++)
    { 
        var target=btnDelSpeed[i];
        var index = target.id.split('_')[1];
        target.onclick = getFunctionWithArgs(SCSpeeds, [unit,index]);
    }
    
    var listeEditZoom = getId("CSroadType");
    var btnEditZoom = getElementsByClassName("modifyZoom", listeEditZoom);
    for (var i=0; i<btnEditZoom.length; i++)
    { 
        var target=btnEditZoom[i];
        var index = target.id.split('_')[1];
        var val = WMECSpeeds.typeOfRoad[parseInt(index)].zoom;
        target.onclick = getFunctionWithArgs(SCEditZoom, [index, val]);
    }
}        

function SCEditSpeed(unit,id,color){
    getId('editspeed').style.display = "block";
    getId('addbutton').style.display = "none";
    getId('newspeed').value=id;
    getId('CScolor').value=color;
    getId('CScolor').style.backgroundColor	=color;
}

function SCSpeeds(unit,idx){
    var answer = window.confirm(CSlang[4] +" "+idx+" "+unit+" ?");
    if (answer){
        delete WMECSpeeds.speedColors[unit][idx];
        getId('CStable').innerHTML="";
        getId('CSroadType').innerHTML="";
        LoadSettings();
    }
}

function SCEditZoom(idx, val){
    getId('editzoom').style.display = "block";
    getId('newvalzoom').value=val;
    getId('texttype').textContent = WMECSpeeds.typeOfRoad[idx].name;
    
    getId('submitZoom').onclick=(function(){
        var newValZoom = getId('newvalzoom').value;
        if (newValZoom) {
            WMECSpeeds.typeOfRoad[idx].zoom = newValZoom;
        }
        getId('editzoom').style.display = "none";
        getId('newvalzoom').value="";
        getId('CStable').innerHTML="";
        getId('CSroadType').innerHTML="";
        LoadSettings();
    });
    getId('cancelZoom').onclick=(function(){
        getId('editzoom').style.display = "none";
        getId('newvalzoom').value="";
        getId('CStable').innerHTML="";
        getId('CSroadType').innerHTML="";
        LoadSettings();
    }); 
}


/*
function removeItem(obj, prop, val) {
    var c, found=false;
    for(c in obj) {
        if(obj[c][prop] == val) { found=true; break; }
    }
    if(found){ delete obj[c]; }
}
*/

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
{
	if (!trigo)
		d=-d;
	
	function getOrthoVector(p1, p2)
	{
		return [p1.y-p2.y , p2.x-p1.x];
	}
	
	function normalizeVector(v)
	{
		if (v[0]*v[0]+v[1]*v[1]==0)
			return v;
		var l=Math.sqrt(v[0]*v[0]+v[1]*v[1]);
		return [v[0]/l , v[1]/l];
	}
	
	var points = [];
	for (var i=0; i<line.length; i++)
	{
		// compute orthogonal vectors:
		var prevVector=[0,0];
		var nextVector=[0,0];
		if (i>0) // can compute prev
		{
			var p1=line[i-1];
			var p2=line[i];
			prevVector=getOrthoVector(p1, p2);
			prevVector=normalizeVector(prevVector);
		}
		if (i<line.length-1) // can compute next
		{
			var p1=line[i];
			var p2=line[i+1];
			nextVector=getOrthoVector(p1, p2);
			nextVector=normalizeVector(nextVector);
		}
		// sum vectors and normalize
		var v = [(prevVector[0]+nextVector[0]), (prevVector[1]+nextVector[1])];
        v=normalizeVector(v);
		points.push(new CSpeedOpenLayers.Geometry.Point(line[i].x+v[0]*d, line[i].y+v[1]*d));
	}
	return points;
}

function SCColor(){

    try { colorspeeds_mapLayer.destroyFeatures();
    }catch(err){log('err destroyFeatures: ',err);}

    var lineFeature = [];
    
    for (var i=0; i < RoadToScan.length; ++i){
        var type = RoadToScan[i];
        WMECSpeeds.typeOfRoad[type].checked = getId('cbRoad'+type).checked;
    }
    
    for (var seg in CSpeedsModel.segments.objects) {
        var segment = CSpeedsModel.segments.get(seg);
        var attributes = segment.attributes;
        var roadType = attributes.roadType;
        //var roundabout  = attributes.junctionID !== null;
        var line = getId(segment.geometry.id);
        var fwdspeed = attributes.fwdMaxSpeed;
        var revspeed = attributes.revMaxSpeed;
        var fwdspeedUnverified = attributes.fwdMaxSpeedUnverified;
        var revspeedUnverified = attributes.revMaxSpeedUnverified;
        var fwddir   = attributes.fwdDirection;
        var revdir   = attributes.revDirection;
        var fwdID = "",revID="";
        var isSelected = (segment.selected == true)? true : false;
        var isModified = (segment.state == "Update")? true : false;
        
        
        // check that WME hasn't highlighted this segment
  			if (isSelected || isModified)	continue;

        if (zoom != CSpeedsMap.zoom) {
          zoom = CSpeedsMap.zoom;
          //log('zoom = ' + zoom + 'Waze.map.getResolution() = '+Waze.map.getResolution());
        }
		    var shiftValue= 3*Waze.map.getResolution()+3;
		    
        if (RoadToScan.indexOf(roadType) == -1) continue;
  
        if (unit == 'mph'){
          fwdspeed = (fwdspeed!=null) ? (Math.trunc(fwdspeed*0.625)) : null;
          revspeed = (revspeed!=null) ? (Math.trunc(revspeed*0.625)) : null;
          //fwdspeed = (fwdspeed!=null) ? (fwdspeed*0.6213711922374) : null;
          //revspeed = (revspeed!=null) ? (revspeed*0.6213711922374) : null;
        }
        
        // turn off highlights when roads are no longer visible
        
        if ((zoom < WMECSpeeds.typeOfRoad[roadType].zoom) || !WMECSpeeds.typeOfRoad[roadType].checked) {
            continue;
        }
        WMECSpeeds.visibility = colorspeeds_mapLayer.visibility;
        
        if (fwdspeed && WMECSpeeds.visibility) {
          //Color for forward speed
          var newWidth="", newColor="", newDashes="", newOpacity="";
          if (WMECSpeeds.speedColors[unit].hasOwnProperty(fwdspeed)) {
              newColor=WMECSpeeds.speedColors[unit][fwdspeed];
              //Dashes
              if (fwddir==true && fwdspeed && !fwdspeedUnverified) { newWidth = 4; newOpacity = 0.8; newDashes = "5 10"; } // verified speed
              else if (fwddir==true && fwdspeed && fwdspeedUnverified) { newColor = "#fff"; newWidth = 3; newOpacity = 0.8; newDashes = "2 10";} // unverified speed
          }
          else if (fwddir==true && fwdspeed) { newWidth = 3; newColor = "#000"; newOpacity = 0.8; newDashes = "5 5"; } // other
          
          var style = {
              strokeColor: newColor,
              strokeOpacity: newOpacity,
              strokeWidth: newWidth,
              //strokeDashstyle: newDashes
          };
          
          var points = [];
          var segID = attributes.id;
          points=shiftGeometry(shiftValue, segment.geometry.getVertices(), CSpeedsModel.countries.top.leftHandTraffic);

          var newline = new CSpeedOpenLayers.Geometry.LineString(points);

          lineFeature.push(new CSpeedOpenLayers.Feature.Vector(newline, null, style));
          //log("segment id: " + attributes.id + ' newColor: '+ newColor + ' segment.CSpeedsFwd.fwdColor: ' + segment.CSpeedsFwd.fwdColor + ' lineFeature: ',lineFeature);
        }
        if (revspeed && WMECSpeeds.visibility) { 
            //Color for reverse speed
            var newWidth="", newColor="", newDashes="", newOpacity="", newDashOffset="";
            if (WMECSpeeds.speedColors[unit].hasOwnProperty(revspeed)) {
                newColor=WMECSpeeds.speedColors[unit][revspeed];
                //Dashes
                if (revdir==true && revspeed && !revspeedUnverified) { newWidth = 4; newOpacity = 0.8; newDashes = "5 10"; } // verified speed
                else if (revdir==true && revspeed && revspeedUnverified) { newColor = "#fff"; newWidth = 3; newOpacity = 0.8; newDashes = "2 10";} // unverified speed
            }
            else if (revdir==true && revspeed) { newWidth = 3; newColor = "#000"; newOpacity = 0.8; newDashes = "5 5"; } // other
            
            var style = {
                strokeColor: newColor,
                strokeOpacity: newOpacity,
                strokeWidth: newWidth,
                //strokeDashstyle: newDashes,
            };

            var points = [];
            var segID = attributes.id;
            
            points=shiftGeometry(shiftValue, segment.geometry.getVertices(), !CSpeedsModel.countries.top.leftHandTraffic);		

            var newline = new CSpeedOpenLayers.Geometry.LineString(points);

            lineFeature.push(new CSpeedOpenLayers.Feature.Vector(newline, null, style));
        }

    }
    //log("lineFeature = ",lineFeature);
    // Display new array of segments
    try{
      colorspeeds_mapLayer.addFeatures(lineFeature);
    }catch(err){log('err addFeatures: ',err);}
 
}

/* begin running the code! */
CSpeeds_bootstrap    ();
You can just copy/paste this over in Tampermonkey, save, reload WME.

-Alan
AlanOfTheBerg
EmeritusChamps
EmeritusChamps
Posts: 23627
Has thanked: 568 times
Been thanked: 3480 times

POSTER_ID:701618

1

Send a message
Wiki Resources: Map Editing Manual | alanoftheberg@gmail.com
Oregon-based US Ex-Global Champ Editor | iPhone13Pro - VZ

Post by AlanOfTheBerg
Here's an updated WME Color Speeds with my config changes which allows you to see the current set speed limit on unverified segments as dashed lines, and verified is solid.

Code: Select all

// ==UserScript==
// @name             WME Color Speeds
// @name:fr          WME Color Speeds
// @version          0.32.2
// @description      Adds colours to road segments to show their speed
// @description:fr   Colorisation des segments selon leurs vitesses.
// @include          https://www.waze.com/editor/*
// @include          https://www.waze.com/*/editor/*
// @include          https://editor-beta.waze.com/*
// @exclude          https://www.waze.com/user/*
// @exclude          https://www.waze.com/*/user/*
// @namespace        https://greasyfork.org/scripts/14044-wme-color-speeds
// @updateURL        https://greasyfork.org/scripts/14044-wme-color-speeds/code/WME_Color_Speeds.user.js
// @downloadURL      https://greasyfork.org/scripts/14044-wme-color-speeds/code/WME_Color_Speeds.user.js
// @author           French Script Team
// @copyright        Sebiseba, seb-d59 & DummyD2 - 2015
// ==/UserScript==

var WMECSpeeds = {};
var CSpeeds_Version = GM_info.script.version;
var icon_delete="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";
var icon_submit="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";
var icon_edit="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";
var couleurs=new Array("#000","#111","#222","#333","#444","#555","#666","#777","#888","#999","#AAA","#BBB","#CCC","#DDD","#EEE","#FFF","#300","#600","#900","#C00","#F00","#003","#303","#603","#903","#C03","#F03","#006","#306","#606","#906","#C06","#F06","#009","#309","#609","#909","#C09","#F09","#00C","#30C","#60C","#90C","#C0C","#F0C","#00F","#30F","#60F","#90F","#C0F","#F0F","#030","#330","#630","#930","#C30","#F30","#033","#333","#633","#933","#C33","#F33","#036","#336","#636","#936","#C36","#F36","#039","#339","#639","#939","#C39","#F39","#03C","#33C","#63C","#93C","#C3C","#F3C","#03F","#33F","#63F","#93F","#C3F","#F3F","#060","#360","#660","#960","#C60","#F60","#063","#363","#663","#963","#C63","#F63","#066","#366","#666","#966","#C66","#F66","#069","#369","#669","#969","#C69","#F69","#06C","#36C","#66C","#96C","#C6C","#F6C","#06F","#36F","#66F","#96F","#C6F","#F6F","#090","#390","#690","#990","#C90","#F90","#093","#393","#693","#993","#C93","#F93","#096","#396","#696","#996","#C96","#F96","#099","#399","#699","#999","#C99","#F99","#09C","#39C","#69C","#99C","#C9C","#F9C","#09F","#39F","#69F","#99F","#C9F","#F9F","#0C0","#3C0","#6C0","#9C0","#CC0","#FC0","#0C3","#3C3","#6C3","#9C3","#CC3","#FC3","#0C6","#3C6","#6C6","#9C6","#CC6","#FC6","#0C9","#3C9","#6C9","#9C9","#CC9","#FC9","#0CC","#3CC","#6CC","#9CC","#CCC","#FCC","#0CF","#3CF","#6CF","#9CF","#CCF","#FCF","#0F0","#3F0","#6F0","#9F0","#CF0","#FF0","#0F3","#3F3","#6F3","#9F3","#CF3","#FF3","#0F6","#3F6","#6F6","#9F6","#CF6","#FF6","#0F9","#3F9","#6F9","#9F9","#CF9","#FF9","#0FC","#3FC","#6FC","#9FC","#CFC","#FFC","#0FF","#3FF","#6FF","#9FF","#CFF");

// speedColors[unit][speed] = color //-----> Default
WMECSpeeds.speedColors = {
    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"},
    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"},
};
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:{}};



MultiplePallete=false;

var unit;
var selectedState;
var debug=false;
var colorspeeds_mapLayer=[];

var zoom=0;
var RoadToScan = [3,6,7,4,2,1,8];
var RoadUpToStreet = [2,3,6,7];
var highway = [3,6,7];

var typeOfRoad = {
//---Type Road-----------
	 3: {"name":"Freeways","checked":true,"zoom":0},
	 6: {"name":"Major Highway","checked":true,"zoom":1},
	 7: {"name":"Minor Highway","checked":true,"zoom":2},
	 4: {"name":"Ramps","checked":true,"zoom":2},
	 2: {"name":"Primary Street","checked":false,"zoom":3},
	 1: {"name":"Streets","checked":false,"zoom":4},
	 8: {"name":"Dirt roads","checked":false,"zoom":4}};


WMECSpeeds.typeOfRoad = typeOfRoad;

//	 5: "Walking Trails",
//	10: "Pedestrian Bw",
//	14: "Ferry",
//	16: "Stairway",
//	17: "Private Road",
//	18: "Railroad",
//	19: "Runway/Taxiway"
//	20: "Parking Lot Road",
//	21: "Service Road"

WMECSpeeds.selectedRoadType = [];
    
WMECSpeeds.visibility = true;

// *********************
// ** HELPER FUNCTION **
// *********************

function log(msg, obj)
{
    if (obj==null)
        console.log(GM_info.script.name + " v" + CSpeeds_Version + " - " + msg);
    else if (debug) 
        console.debug(GM_info.script.name + " v" + CSpeeds_Version + " - " + msg + " " ,obj);
}

function getId(node) {
    return document.getElementById(node);
}
function getElementsByClassName(classname, node) {
    node || (node = document.getElementsByTagName("body")[0]);
    for (var a = [], re = new RegExp("\\b" + classname + "\\b"), els = node.getElementsByTagName("*"), i = 0, j = els.length;i < j;i++) {
        re.test(els[i].className) && a.push(els[i]);
    }
    return a;
}
function getFunctionWithArgs(func, args) {
    return (
        function () {
            var json_args = JSON.stringify(args);
            return function() {
                var args = JSON.parse(json_args);
                func.apply(this, args);
            }
        }
    )();
}
function IsJsonString(str) {
    try {
        JSON.parse(str);
    } catch (e) {
        return false;
    }
    return true;
}
function RGB2Color(r,g,b) {
    return "rgb(" + Math.round(r) +","+ Math.round(g) +","+ Math.round(b) +")";
}
function Check_Unit() {
    if (CSpeedsModel.isImperial) { unit = "mph"; }
    else { unit = "kmh"; }
    log(unit);
    if (getId('CStable')) {
        getId('CStable').innerHTML="";
        getId('CSroadType').innerHTML="";
        LoadSettings();
        getId('unitvalue').innerHTML="("+unit+")";
    }
}
function saveOption(){
	localStorage.setItem('WMEColorSpeeds', JSON.stringify(WMECSpeeds));
}


// *************
// **  INIT   **
// *************
function CSpeeds_bootstrap() {
    if (typeof unsafeWindow === "undefined") {
        unsafeWindow    = ( function () {
            var dummyElem = document.createElement('p');
            dummyElem.setAttribute('onclick', 'return window;');
            return dummyElem.onclick();
        }) ();
    }

    /* begin running the code! */
    log("starting");
    CSpeeds_init();
}


function CSpeeds_init(){
    // Waze object needed
    CSpeedsWaze = unsafeWindow.Waze;
    if(typeof(CSpeedsWaze) === 'undefined'){
        if (debug) { console.error("WME ColorSpeeds - CSpeedsWaze : NOK"); }
        window.setTimeout(CSpeeds_init, 500);
        return;
    }
    CSpeedsMap = CSpeedsWaze.map;
    if(typeof(CSpeedsMap) == 'undefined'){
        if (debug) { console.error("WME ColorSpeeds - CSpeedsmap : NOK"); }
        window.setTimeout(CSpeeds_init, 500);
        return;
    }
    CSpeedsModel = CSpeedsWaze.model;
    if(typeof(CSpeedsModel) == 'undefined'){
        if (debug) { console.error("WME ColorSpeeds - CSpeedsModel DOM : NOK"); }
        window.setTimeout(CSpeeds_init, 500);
        return;
    }
    CSpeedsCountries = CSpeedsModel.countries;
    if(typeof(CSpeedsCountries) == 'undefined'){
        if (debug) { console.error("WME ColorSpeeds - CSpeedsCountries DOM : NOK"); }
        window.setTimeout(CSpeeds_init, 500);
        return;
    }
    if(typeof(CSpeedsCountries.top) == 'undefined'){
        if (debug) { console.error("WME ColorSpeeds - CSpeedsCountries.top DOM : NOK"); }
        window.setTimeout(CSpeeds_init, 500);
        return;
    }
    if(typeof(CSpeedsCountries.top.name) == 'undefined'){
        if (debug) { console.error("WME ColorSpeeds - CSpeedsCountries.top.name DOM : NOK"); }
        window.setTimeout(CSpeeds_init, 500);
        return;
    }
    //    OpenLayers
    CSpeedOpenLayers = unsafeWindow.OpenLayers; 
    if(typeof(CSpeedOpenLayers) === 'undefined'){
        if (debug) { console.error("WME ColorSpeeds - OpenLayers : NOK"); }
        window.setTimeout(CSpeeds_init, 500);
        return;
    }
    //    Traductions
    CSpeedsI18n = unsafeWindow.I18n.locale;
    if(typeof(CSpeedsI18n) == 'undefined'){
        if (debug) { console.error("WME ColorSpeeds - CSpeedsI18n : NOK"); }
        setTimeout(CSpeeds_init, 500);
        return;
    }
    //    Waze GUI needed
    CSpeedshandle = getId("user-info");
    if(typeof(CSpeedshandle) == 'undefined'){
        if (debug) { console.error("WME ColorSpeeds - CSpeedshandle : NOK"); }
        setTimeout(CSpeeds_init, 500);
        return;
    }
    CSpeedshandleClass = getElementsByClassName("nav-tabs", CSpeedshandle)[0];
    if(typeof(CSpeedshandleClass) === 'undefined'){
        if (debug) { console.error("WME ColorSpeeds - CSpeedshandleClass : NOK"); }
        setTimeout(CSpeeds_init, 500);
        return;
    }
    CSpeedshandleClass2 = getElementsByClassName("tab-content", CSpeedshandle)[0];
    if(typeof(CSpeedshandleClass2) === 'undefined'){
        if (debug) { console.error("WME ColorSpeeds - CSpeedshandleClass2 : NOK"); }
        setTimeout(CSpeeds_init, 500);
        return;
    }

    // Verify localStorage. Init if empty or not correct
    
    
    if (typeof(localStorage.WMEColorSpeeds) !== "undefined" && IsJsonString(localStorage.getItem('WMEColorSpeeds'))) {
        WMECSpeeds = JSON.parse(localStorage.WMEColorSpeeds);
        if (WMECSpeeds.speedColors.US === undefined) WMECSpeeds.speedColors.US = colorsUS;
        if (WMECSpeeds.MultiplePallete === undefined) WMECSpeeds.MultiplePallete = MultiplePallete;
        WMECSpeeds.MultiplePallete = (CSpeedsCountries.top.name == "United States")? WMECSpeeds.MultiplePallete : false;
    }else {
        localStorage.setItem('WMEColorSpeeds', JSON.stringify(WMECSpeeds));
        log("init ok");
    
    }
    
    
    //======================================================

    // Translation
    if (CSpeedsI18n  == "fr") {
        CSlang = new Array("Vitesses","Paramètres","Couleurs","Ajouter nouvelle vitesse","Supprimer","Annuler","Autres","Modifier","Type de route","Zoom");
    }
    else {
        CSlang = new Array("Speeds","Settings","Colors","Add new speed","Delete","Cancel","Others","Edit","Road type","Zoom");
    }
    Check_Unit();

    // WME Layers check
    var layers = CSpeedsMap.getLayersBy("uniqueName","__WME_Color_Speeds");
    if(layers.length == 0) {
        var colorspeeds_style = new CSpeedOpenLayers.Style({
            pointRadius: 2,
            fontWeight: "normal",
            label : "${labelText}",
            fontFamily: "Tahoma, Courier New",
            labelOutlineColor: "#FFFFFF",
            labelOutlineWidth: 2,
            fontColor: '#000000',
            fontSize: "10px"
        });

        colorspeeds_mapLayer = new CSpeedOpenLayers.Layer.Vector("Color Speeds", {
            displayInLayerSwitcher: true,
            uniqueName: "__WME_Color_Speeds",
            styleMap: new CSpeedOpenLayers.StyleMap(colorspeeds_style)
        });

        I18n.translations.en.layers.name["__WME_Color_Speeds"] = "Color Speeds";
        CSpeedsMap.addLayer(colorspeeds_mapLayer);
        colorspeeds_mapLayer.setVisibility(WMECSpeeds.visibility);

    }
    //log('colorspeeds_mapLayer ',colorspeeds_mapLayer);
    
    // Then running
    CSpeeds_css();
    getElementsByClassName('btn-group')[0].onclick=(function(){ Check_Unit(); });
}


// *************
// **  HTML   **
// *************

function CSpeeds_css() {
    var Scss = document.createElement("style");
    Scss.type = "text/css";
    var css =".CScontent {width:250px; margin-left:20px; box-shadow: 0 4px 10px #aaa;}";
    css +=".divStateChoise {width:250px; margin-left:20px;}";
    css +=".divEntete {height:24px; font-weight:bold; padding-top:2px; border:2px solid #3d3d3d; background-color:#BEDCE5;}";
    css +=".divContent {clear:both; line-height:21px; height:24px; border:1px solid #3d3d3d; border-top:0;}";
    css +=".divl {float:left; text-align:center;}";
    css +=".divr {float:right; text-align:center;}";
    css +=".speed {color:#59899e; font-weight:bold;}";
    css +=".divcolor {width:80px; height:17px; margin:3px 0 0 5px;}";
    css +=".CStype {color:#59899e; font-weight:bold; text-align:left; margin-left:10px;}";
    css +=".CScheck { margin-left:5px; width:12px; height:12px;}";
    css +=".CSzoom {color:#59899e; font-weight:bold;}";
    css +="#editspeed { display:none;}";
    css +="#newspeed {width:35px; height:22px;}";
    css +="#editzoom { display:none;}";
    css +="#newvalzoom {width:35px; height:22px;}";
    css +="#CScolor+.dropdown-menu li:hover, #CScolor+.dropdown-menu li:active, #CScolor+.dropdown-menu li:focus { cursor: pointer; outline: #3B99FC dotted 1px; }";
	  css +="#CScolor.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; }";
    Scss.innerHTML = css;
    document.body.appendChild(Scss);    
    CSpeeds_Mainhtml();
}
function CSpeeds_Mainhtml() {
    //Create content in CSpeeds's tab
    var newtab = document.createElement('li');
    newtab.innerHTML = "<a href='#sidepanel-colorspeeds' data-toggle='tab'><span class='fa fa-dashboard' title='"+ CSlang[0] +"'></span></a>";
    CSpeedshandleClass.appendChild(newtab);

    var addon = document.createElement('section');
    
    // colorspeeds header
    var content = "<div style='float:left; margin-left:5px;'><b><a href='https://greasyfork.org/scripts/14044-wme-color-speeds' target='_blank'><u>WME Color Speeds</u></a></b> v"+ CSpeeds_Version +"</div>";
    
    // Mutiple pallete
    content += "<div style='clear:both; padding-top:10px;'></div>";
    content += "<div class='divStateChoise' id='stateChoise' style='display:block;'><input type='checkbox' class='CScheck' id='cbMultiplePallete'>&nbsp;Multiple Pallete of color."; 
    content += "<div style='clear:both; padding-top:10px;'></div>"; //Couleurs pour </div>";
    content += "<select id='selectState' style='height:22px; active:none;'>"; 
    //content += "<option selected='true' value='null'>All state</option>";
    for (var state in WMECSpeeds.speedColors.US) { content +="<option value='"+state+"'>"+state.replace(/_/g, ' ')+"</option>";}
    content += "</select></div>";
    
    //speed
    content += "<div style='clear:both; padding-top:10px;'></div><div class='CScontent'>";
    content += "<div class='divEntete'><div class='divl' style='width:60px;'>"+ CSlang[0]+"</div><div class='divr' id='unitvalue' style='width:45px;font-size:11px;line-height:20px;'>("+unit+")</div><div class='divr' style='width:130px;'>"+ CSlang[2] +"</div></div>";

    // new / edit speed
    content += "<div class='divContent' id='editspeed'><div class='divl speed' style='width:60px;'><input type='text' value='' id='newspeed' class='speed' /></div>";
    content += "<div class='divr' style='width:20px;'><a href='#'><img id='cancel' style='width:20px;' title='"+ CSlang[5] +"' src='data:image/png;base64,"+ icon_delete +"' /></a></div>";
    content += "<div class='divr' style='width:20px;'><a href='#'><img id='submit' style='width:20px;' title='"+ CSlang[3] +"' src='data:image/png;base64,"+ icon_submit +"' /></a></div>";
    content += "<div class='divr dropdown' style='width:120px; text-align:left;'><button id='CScolor' class='btn dropdown-toggle' type='button' data-toggle='dropdown'></button><ul class='dropdown-menu' style='height: 500px; overflow: scroll; margin: 0; padding: 0; min-width: 90px;'>";

    for (var i=0; couleurs[i]; ++i) { content +="<li style='background-color:"+ couleurs[i] +"'>&nbsp;</li>"; }
    //for (var i=0; couleurs[i]; ++i) { content +="<li style='background-color:"+ couleurs[i] +"'>&nbsp;</li>"; }

    content +="</ul></div></div>";
    content += "<div class='divContent'><div class='divl speed' style='width:60px;'>"+ CSlang[6] +"</div><div class='divr' style='width:40px;'>&nbsp;</div><div class='divr' style='width:120px;'><div class='divcolor' style='background-color:#f00;'>&nbsp;</div></div></div>";
    content += "<div id='CStable'></div></div><div id='divadd'></div>";
    
    // Type road
    content += "<br><div style='clear:both; padding-top:10px;'></div><div class='CScontent'>";
    content += "<div class='divEntete'><div class='divl' style='width:120px;'>"+ CSlang[8]+"</div><div class='divr' style='width:60px; margin-right:20px;'>"+ CSlang[9] +"</div></div>";
  	// edit zoom
    content += "<div class='divContent' id='editzoom'><div class='divl speed' style='width:110px;'><span id='texttype'></span></div>";
    content += "<div class='divr' style='width:20px;'><a href='#'><img id='cancelZoom' style='width:20px;' title='"+ CSlang[5] +"' src='data:image/png;base64,"+ icon_delete +"' /></a></div>";
    content += "<div class='divr' style='width:20px;'><a href='#'><img id='submitZoom' style='width:20px;' title='"+ CSlang[3] +"' src='data:image/png;base64,"+ icon_submit +"' /></a></div>";
    content += "<div class='divr speed' style='width:60px;'><input type='text' value='' id='newvalzoom' class='speed' /></div>";
    content +="</div>";
    content += "<div id='CSroadType'></div></div>";
    
    addon.innerHTML  = content;
    addon.id = "sidepanel-colorspeeds";
    addon.className = "tab-pane";
    CSpeedshandleClass2.appendChild(addon);  
    getId('divadd').innerHTML="<br/><center><input type='button' id='addbutton' name='add' value='"+ CSlang[3] +"' /></center>";
    getId('addbutton').onclick = (function() {
        getId('editspeed').style.display = "block";
        getId('addbutton').style.display = "none";
    });
    
    //log("CSpeedsModel.countries.top.name = "+CSpeedsModel.countries.top.name);
    
    getId('stateChoise').style.display = (CSpeedsCountries.top.name == "United States")? "block" : "none";
    
    LoadSettings();
    //window.setInterval(SCColor,2500);
    CSpeedsWaze.selectionManager.events.register("selectionchanged", null, SCColor);
    //CSpeedsWaze.controller.events.register("saveend", null, SCColor);
    CSpeedsModel.actionManager.events.register("afterclearactions", null, SCColor);
    CSpeedsModel.actionManager.events.register("afterundoaction", null, SCColor);
    CSpeedsMap.events.register("zoomend", null, SCColor);
    CSpeedsMap.events.register("moveend", null, SCColor);
    window.addEventListener("beforeunload", saveOption, false);
    
}

function LoadSettings(){

  getId('cbMultiplePallete').checked=WMECSpeeds.MultiplePallete;
  getId('selectState').style.display = (WMECSpeeds.MultiplePallete)? "block" : "none";
  
  if (WMECSpeeds.MultiplePallete === false){
    for (var valSpeed in WMECSpeeds.speedColors[unit]) {
        var color = WMECSpeeds.speedColors[unit][valSpeed];
        var div = document.createElement('div'); div.className="divContent";
        var divspeed = document.createElement('div'); divspeed.className="divl speed"; divspeed.style.width="60px"; divspeed.innerHTML=valSpeed;
        div.appendChild(divspeed); 

        var divsuppr = document.createElement('div'); divsuppr.className="divr"; divsuppr.style.width="20px";
        var divsuppra = document.createElement('a');
        divsuppra.innerHTML="<img style='width:20px;' title='"+ CSlang[4] +"' src='data:image/png;base64,"+ icon_delete +"' />";
        divsuppra.href = "#"; divsuppra.className="delSpeed"; divsuppra.id="delSpeed_"+valSpeed;
        divsuppr.appendChild(divsuppra);
        div.appendChild(divsuppr);     

        var divedit = document.createElement('div'); divedit.className="divr"; divedit.style.width="20px";
        var divedita = document.createElement('a');
        divedita.innerHTML="<img style='width:16px;' title='"+ CSlang[7] +"' src='data:image/png;base64,"+ icon_edit +"' />";
        divedita.href = "#";
        divedita.onclick = getFunctionWithArgs(SCEditSpeed, [unit,valSpeed,color,null]);
        divedit.appendChild(divedita);
        div.appendChild(divedit);  

        var divcolor = document.createElement('div'); divcolor.className="divr"; divcolor.style.width="120px"; divcolor.innerHTML="<div class='divcolor' style='background-color:"+ color +";'>&nbsp;</div>";
        div.appendChild(divcolor); 
        getId('CStable').appendChild(div);
    }
  }
  if (WMECSpeeds.MultiplePallete === true){
  
    selectedState = getId('selectState').options[getId('selectState').selectedIndex].value;
    log("selectedState = " + selectedState);
    log("WMECSpeeds.speedColors.US[selectedState][unit] = "+ WMECSpeeds.speedColors.US[selectedState][unit]);
    
    if (WMECSpeeds.speedColors.US[selectedState][unit]===undefined){
      WMECSpeeds.speedColors.US[selectedState][unit] = WMECSpeeds.speedColors[unit];
    }
    
    for (var valSpeed in WMECSpeeds.speedColors.US[selectedState][unit]) {
        var color = WMECSpeeds.speedColors.US[selectedState][unit][valSpeed];
        var div = document.createElement('div'); div.className="divContent";
        var divspeed = document.createElement('div'); divspeed.className="divl speed"; divspeed.style.width="60px"; divspeed.innerHTML=valSpeed;
        div.appendChild(divspeed); 

        var divsuppr = document.createElement('div'); divsuppr.className="divr"; divsuppr.style.width="20px";
        var divsuppra = document.createElement('a');
        divsuppra.innerHTML="<img style='width:20px;' title='"+ CSlang[4] +"' src='data:image/png;base64,"+ icon_delete +"' />";
        divsuppra.href = "#"; divsuppra.className="delSpeed"; divsuppra.id="delSpeed_"+valSpeed;
        divsuppr.appendChild(divsuppra);
        div.appendChild(divsuppr);     

        var divedit = document.createElement('div'); divedit.className="divr"; divedit.style.width="20px";
        var divedita = document.createElement('a');
        divedita.innerHTML="<img style='width:16px;' title='"+ CSlang[7] +"' src='data:image/png;base64,"+ icon_edit +"' />";
        divedita.href = "#";
        divedita.onclick = getFunctionWithArgs(SCEditSpeed, [unit,valSpeed,color,selectedState]);
        divedit.appendChild(divedita);
        div.appendChild(divedit);  

        var divcolor = document.createElement('div'); divcolor.className="divr"; divcolor.style.width="120px"; divcolor.innerHTML="<div class='divcolor' style='background-color:"+ color +";'>&nbsp;</div>";
        div.appendChild(divcolor); 
        getId('CStable').appendChild(div);
    }
  }
  for (var i=0; i < RoadToScan.length; ++i){
    var type = RoadToScan[i];
    var div = document.createElement('div'); div.className="divContent";
    
    var divcheck = document.createElement('div'); divcheck.className="divl CScheck";
    divcheck.innerHTML= '<input type="checkbox" id="cbRoad'+type+'">';
    div.appendChild(divcheck);
    
    var divtype = document.createElement('div'); divtype.className="divl CStype"; divtype.style.width="130px"; divtype.innerHTML= WMECSpeeds.typeOfRoad[type].name;
    div.appendChild(divtype);
    
    var divedit = document.createElement('div'); divedit.className="divr"; divedit.style.width="20px";
    var divedita = document.createElement('a');
    divedita.innerHTML="<img style='width:16px;' title='"+ CSlang[7] +"' src='data:image/png;base64,"+ icon_edit +"' />";
    divedita.href = "#"; divedita.className="modifyZoom"; divedita.id="zoom_"+type;
    divedit.appendChild(divedita);
    div.appendChild(divedit);  
    
    var divzoom = document.createElement('div'); divzoom.className="divr CSzoom"; divzoom.style.width="60px"; divzoom.innerHTML= WMECSpeeds.typeOfRoad[type].zoom;
    div.appendChild(divzoom);
    getId('CSroadType').appendChild(div);
    getId('cbRoad'+type).checked = WMECSpeeds.typeOfRoad[type].checked;


  }

  $("#CScolor.dropdown-toggle").dropdown();
  $('#CScolor+.dropdown-menu li').click(function(){
      getId('CScolor').style.backgroundColor=this.style.backgroundColor;
  });
  
  getId('cbMultiplePallete').onclick = (function() {
    getId('selectState').style.display = (getId('cbMultiplePallete').checked)? "block" : "none";
    WMECSpeeds.MultiplePallete=getId('cbMultiplePallete').checked;
    log("WMECSpeeds.MultiplePallete="+WMECSpeeds.MultiplePallete);
    getId('CStable').innerHTML="";
    getId('CSroadType').innerHTML="";
    LoadSettings();
  });
    
  getId('selectState').onclick = (function(){
      getId('CStable').innerHTML="";
      getId('CSroadType').innerHTML="";
      LoadSettings();
  });
  
  getId('cancel').onclick=(function(){
      getId('editspeed').style.display = "none";
      getId('addbutton').style.display = "block";
      getId('CScolor').style.backgroundColor="#fff";
      //getId('CScolor').value="";
      getId('newspeed').value="";
      getId('CStable').innerHTML="";
      getId('CSroadType').innerHTML="";
      LoadSettings();
  });  
  getId('submit').onclick=(function(){
      var newSpeed = getId('newspeed').value;
      var newColor = getId('CScolor').style.backgroundColor;
      if (newSpeed && newColor) {
          if (WMECSpeeds.MultiplePallete === true){
            WMECSpeeds.speedColors.US[selectedState][unit][newSpeed] = newColor;
          }else if (WMECSpeeds.MultiplePallete === false){WMECSpeeds.speedColors[unit][newSpeed] = newColor;}
      }
      getId('editspeed').style.display = "none";
      getId('addbutton').style.display = "block";
      getId('CScolor').style.backgroundColor="#fff";
      getId('newspeed').value="";
      getId('CStable').innerHTML="";
      getId('CSroadType').innerHTML="";
      LoadSettings();
  });
  
  setupHandler();


}
function setupHandler() {
    
    var listeDelSpeed = getId("CStable");
    var btnDelSpeed = getElementsByClassName("delSpeed", listeDelSpeed);
    for (var i=0; i<btnDelSpeed.length; i++)
    { 
        var target=btnDelSpeed[i];
        var index = target.id.split('_')[1];
        target.onclick = getFunctionWithArgs(SCSpeeds, [unit,index,selectedState]);
    }
    
    var listeEditZoom = getId("CSroadType");
    var btnEditZoom = getElementsByClassName("modifyZoom", listeEditZoom);
    for (var i=0; i<btnEditZoom.length; i++)
    { 
        var target=btnEditZoom[i];
        var index = target.id.split('_')[1];
        var val = WMECSpeeds.typeOfRoad[parseInt(index)].zoom;
        target.onclick = getFunctionWithArgs(SCEditZoom, [index, val]);
    }
}        

function SCEditSpeed(unit,id,color,state){
    getId('editspeed').style.display = "block";
    getId('addbutton').style.display = "none";
    getId('newspeed').value=id;
    getId('CScolor').style.backgroundColor	=color;
}

function SCSpeeds(unit,idx,state){
    if (WMECSpeeds.MultiplePallete === true){
      var answer = window.confirm(CSlang[4] +" "+idx+" "+unit+" for "+state+" ?");
    }else{var answer = window.confirm(CSlang[4] +" "+idx+" "+unit+" ?");}
    
    if (answer){
        if (WMECSpeeds.MultiplePallete === true){
            delete WMECSpeeds.speedColors.US[state][unit][idx];
        }else{delete WMECSpeeds.speedColors[unit][idx];}
        
        getId('CStable').innerHTML="";
        getId('CSroadType').innerHTML="";
        LoadSettings();
    }
}

function SCEditZoom(idx, val){
    getId('editzoom').style.display = "block";
    getId('newvalzoom').value=val;
    getId('texttype').textContent = WMECSpeeds.typeOfRoad[idx].name;
    
    getId('submitZoom').onclick=(function(){
        var newValZoom = getId('newvalzoom').value;
        if (newValZoom) {
            WMECSpeeds.typeOfRoad[idx].zoom = newValZoom;
        }
        getId('editzoom').style.display = "none";
        getId('newvalzoom').value="";
        getId('CStable').innerHTML="";
        getId('CSroadType').innerHTML="";
        LoadSettings();
    });
    getId('cancelZoom').onclick=(function(){
        getId('editzoom').style.display = "none";
        getId('newvalzoom').value="";
        getId('CStable').innerHTML="";
        getId('CSroadType').innerHTML="";
        LoadSettings();
    }); 
}


/*
function removeItem(obj, prop, val) {
    var c, found=false;
    for(c in obj) {
        if(obj[c][prop] == val) { found=true; break; }
    }
    if(found){ delete obj[c]; }
}
*/

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
{
	if (!trigo)
		d=-d;
	
	function getOrthoVector(p1, p2)
	{
		return [p1.y-p2.y , p2.x-p1.x];
	}
	
	function normalizeVector(v)
	{
		if (v[0]*v[0]+v[1]*v[1]==0)
			return v;
		var l=Math.sqrt(v[0]*v[0]+v[1]*v[1]);
		return [v[0]/l , v[1]/l];
	}
	
	var points = [];
	for (var i=0; i<line.length; i++)
	{
		// compute orthogonal vectors:
		var prevVector=[0,0];
		var nextVector=[0,0];
		if (i>0) // can compute prev
		{
			var p1=line[i-1];
			var p2=line[i];
			prevVector=getOrthoVector(p1, p2);
			prevVector=normalizeVector(prevVector);
		}
		if (i<line.length-1) // can compute next
		{
			var p1=line[i];
			var p2=line[i+1];
			nextVector=getOrthoVector(p1, p2);
			nextVector=normalizeVector(nextVector);
		}
		// sum vectors and normalize
		var v = [(prevVector[0]+nextVector[0]), (prevVector[1]+nextVector[1])];
        v=normalizeVector(v);
		points.push(new CSpeedOpenLayers.Geometry.Point(line[i].x+v[0]*d, line[i].y+v[1]*d));
	}
	return points;
}

function SCColor(){
    
    
    if (CSpeedsCountries !== undefined && CSpeedsCountries.top !== undefined){
      //log("CSpeedsCountries.top.name = "+CSpeedsCountries.top.name);
      //getId('stateChoise').style.display = (CSpeedsCountries.top.name == "France")? "block" : "none";
      getId('stateChoise').style.display = (CSpeedsCountries.top.name == "United States")? "block" : "none";
    }
    
    try { colorspeeds_mapLayer.destroyFeatures();
    }catch(err){log('err destroyFeatures: ',err);}

    var lineFeature = [];
    
    for (var i=0; i < RoadToScan.length; ++i){
        var type = RoadToScan[i];
        WMECSpeeds.typeOfRoad[type].checked = getId('cbRoad'+type).checked;
    }
    
    for (var seg in CSpeedsModel.segments.objects) {
        var segment = CSpeedsModel.segments.get(seg);
        var attributes = segment.attributes;
        var roadType = attributes.roadType;
        //var roundabout  = attributes.junctionID !== null;
        var line = getId(segment.geometry.id);
        var fwdspeed = attributes.fwdMaxSpeed;
        var revspeed = attributes.revMaxSpeed;
        var fwdspeedUnverified = attributes.fwdMaxSpeedUnverified;
        var revspeedUnverified = attributes.revMaxSpeedUnverified;
        var fwddir   = attributes.fwdDirection;
        var revdir   = attributes.revDirection;
        //var fwdID = "",revID="";
        var isSelected = (segment.selected == true)? true : false;
        var isModified = (segment.state == "Update")? true : false;
    
        if (attributes.primaryStreetID === null ) continue;
        
        var cid = Waze.model.streets.get(attributes.primaryStreetID).cityID;
		    var stateID = Waze.model.cities.get(cid).stateID;
        var state = Waze.model.states.get(stateID).name.replace(/ /g, '_');
        
        if (WMECSpeeds.MultiplePallete==true && WMECSpeeds.speedColors.US[state][unit]===undefined){
          WMECSpeeds.speedColors.US[state][unit] = WMECSpeeds.speedColors[unit];
        }
        
    
        // check that WME hasn't highlighted this segment
  			if (isSelected || isModified)	continue;

        if (zoom != CSpeedsMap.zoom) {
          zoom = CSpeedsMap.zoom;
          //log('zoom = ' + zoom + 'Waze.map.getResolution() = '+Waze.map.getResolution());
        }
		    var shiftValue= 3*Waze.map.getResolution()+2;
		    
        if (RoadToScan.indexOf(roadType) == -1) continue;
  
        if (unit == 'mph'){
          fwdspeed = (fwdspeed!=null) ? (Math.trunc(fwdspeed*0.625)) : null;
          revspeed = (revspeed!=null) ? (Math.trunc(revspeed*0.625)) : null;
        }
        //log("fwdspeed= "+ fwdspeed + " " + unit + " ;  revspeed= " + revspeed + " " + unit);
        
        // turn off highlights when roads are no longer visible
        
        if ((zoom < WMECSpeeds.typeOfRoad[roadType].zoom) || !WMECSpeeds.typeOfRoad[roadType].checked) {
            continue;
        }
        WMECSpeeds.visibility = colorspeeds_mapLayer.visibility;
        
        if (fwdspeed && WMECSpeeds.visibility) {
          //Color for forward speed
          var newWidth="", newColor="", newDashes="", newOpacity="";

          if (WMECSpeeds.MultiplePallete === false){
            if (WMECSpeeds.speedColors[unit].hasOwnProperty(fwdspeed)) newColor=WMECSpeeds.speedColors[unit][fwdspeed];
          }else if (WMECSpeeds.MultiplePallete === true){
            if (WMECSpeeds.speedColors.US[state][unit].hasOwnProperty(fwdspeed)) newColor=WMECSpeeds.speedColors.US[state][unit][fwdspeed];
          }
          
          if (newColor!=""){
            //Dashes
            if (fwddir==true && fwdspeed && !fwdspeedUnverified) { newWidth = 4; newOpacity = 0.7; } // verified speed
            else if (fwddir==true && fwdspeed && fwdspeedUnverified) { newWidth = 4; newOpacity = 0.8; newDashes = "5 10";} // unverified speed
          }else if (fwddir==true && fwdspeed) { newWidth = 4; newColor = "#000000"; newOpacity = 0.7; newDashes = "2 10"; } // other
          
          
          var style = {
              strokeColor: newColor,
              strokeOpacity: newOpacity,
              strokeWidth: newWidth,
              strokeDashstyle: newDashes
          };
          
          var points = [];
          var segID = attributes.id;
          points=shiftGeometry(shiftValue, segment.geometry.getVertices(), CSpeedsModel.countries.top.leftHandTraffic);

          var newline = new CSpeedOpenLayers.Geometry.LineString(points);

          lineFeature.push(new CSpeedOpenLayers.Feature.Vector(newline, null, style));
          //log("segment id: " + attributes.id + ' newColor: '+ newColor + ' segment.CSpeedsFwd.fwdColor: ' + segment.CSpeedsFwd.fwdColor + ' lineFeature: ',lineFeature);
        }
        if (revspeed && WMECSpeeds.visibility) { 
            //Color for reverse speed
            var newWidth="", newColor="", newDashes="", newOpacity="", newDashOffset="";

            if (WMECSpeeds.MultiplePallete === false){
              if (WMECSpeeds.speedColors[unit].hasOwnProperty(revspeed)) newColor=WMECSpeeds.speedColors[unit][revspeed];
            }else if (WMECSpeeds.MultiplePallete === true){
              if (WMECSpeeds.speedColors.US[state][unit].hasOwnProperty(revspeed)) newColor=WMECSpeeds.speedColors.US[state][unit][revspeed];
            }
            if (newColor!=""){
                //Dashes
                if (revdir==true && revspeed && !revspeedUnverified) { newWidth = 4; newOpacity = 0.7; } // verified speed
                else if (revdir==true && revspeed && revspeedUnverified) { newWidth = 4; newOpacity = 0.8; newDashes = "5 10";} // unverified speed
            }else if (revdir==true && revspeed) { newWidth = 4; newColor = "#000000"; newOpacity = 0.7; newDashes = "2 10"; } // other
            
            var style = {
                strokeColor: newColor,
                strokeOpacity: newOpacity,
                strokeWidth: newWidth,
                strokeDashstyle: newDashes,
            };

            var points = [];
            var segID = attributes.id;
            
            points=shiftGeometry(shiftValue, segment.geometry.getVertices(), !CSpeedsModel.countries.top.leftHandTraffic);		

            var newline = new CSpeedOpenLayers.Geometry.LineString(points);

            lineFeature.push(new CSpeedOpenLayers.Feature.Vector(newline, null, style));
        }

    }
    //log("lineFeature = ",lineFeature);
    // Display new array of segments
    try{
      colorspeeds_mapLayer.addFeatures(lineFeature);
    }catch(err){log('err addFeatures: ',err);}
 
}

/* begin running the code! */
CSpeeds_bootstrap    ();
AlanOfTheBerg
EmeritusChamps
EmeritusChamps
Posts: 23627
Has thanked: 568 times
Been thanked: 3480 times
Send a message
Wiki Resources: Map Editing Manual | alanoftheberg@gmail.com
Oregon-based US Ex-Global Champ Editor | iPhone13Pro - VZ

Post by AlanOfTheBerg
Here is the updated Oregon colors config script. This assumes that you have installed WME Color Speeds 0.32.2 as posted above.

Code: Select all

{"speedColors":{"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"},"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"},"US":{"Alabama":{"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"}},"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":{"mph":{"10":"rgb(204, 153, 255)","15":"rgb(255, 153, 0)","20":"rgb(0, 204, 0)","25":"rgb(102, 204, 255)","30":"Maroon","35":"Red","40":"rgb(102, 51, 153)","45":"rgb(153, 153, 0)","50":"rgb(0, 51, 255)","55":"rgb(204, 51, 0)","60":"rgb(204, 255, 0)","65":"rgb(255, 0, 204)","70":"rgb(119, 119, 119)"}},"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":{}}},"typeOfRoad":{"1":{"name":"Streets","checked":false,"zoom":4},"2":{"name":"Primary Street","checked":true,"zoom":"2"},"3":{"name":"Freeways","checked":true,"zoom":0},"4":{"name":"Ramps","checked":true,"zoom":2},"6":{"name":"Major Highway","checked":true,"zoom":"1"},"7":{"name":"Minor Highway","checked":true,"zoom":"1"},"8":{"name":"Dirt roads","checked":false,"zoom":4}},"selectedRoadType":[],"visibility":true,"MultiplePallete":true}
  1. Copy the code above
  2. Ensure WMEColorSpeeds is enabled in Tampermonkey/Greasemonkey.
  3. Open WME, verify that WMEColorSpeeds loaded and looks good with "multiple color palettes" enabled
  4. Go to the Tampermonkey menu and click on WMEColorSpeeds to disable it
  5. Reload WME
  6. Open Developer Tools, Resources, Local Storage, http://www.waze.com
  7. Find "WMEColorSpeeds"
  8. Double-click the Value data on the WMEColorSpeeds line (see image below with this selected)
  9. Paste and hit enter
  10. Go to Tampermonkey/Greasemonkey and enable WME Color Speeds
  11. Reload WME
AlanOfTheBerg
EmeritusChamps
EmeritusChamps
Posts: 23627
Has thanked: 568 times
Been thanked: 3480 times
Send a message
Attachments
Wiki Resources: Map Editing Manual | alanoftheberg@gmail.com
Oregon-based US Ex-Global Champ Editor | iPhone13Pro - VZ