WME Color Speeds

Adds colours to road segments to show their speed

目前為 2015-12-17 提交的版本,檢視 最新版本

  1. // ==UserScript==
  2. // @name WME Color Speeds
  3. // @name:fr WME Color Speeds
  4. // @version 0.29
  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://editor-beta.waze.com/*
  10. // @exclude https://www.waze.com/user/*
  11. // @namespace https://gf.qytechs.cn/scripts/14044-wme-color-speeds
  12. // @author French Script Team
  13. // @copyright Sebiseba, seb-d59 & DummyD2 - 2015
  14. // ==/UserScript==
  15.  
  16. var WMECSpeeds = {};
  17. var CSpeeds_Version = GM_info.script.version;
  18. var icon_delete="iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADqYAAAOpgAABdvkl/FRgAAAixJREFUeNqkk81KW1EUhb9zfxJvNI3GWARDSzMwEYfSX4uDVqgToRQctLO+QO2gHfgMTvsEQtthQTsQCh2IDyBYKa2CCrUGY9qYmtwk956zO8hN0NqZGw4cFovv7L0XR4kIlymLS5YDcKh6u4Jg7gMorPWzRkFHur1+AdApQzjupYeWAPxfpVkLZ6utN8e9bG4JEfyD/VkLd+sCQDB5byCzOjBWyCKC+RIst6qVR2CID2eX03du3ZDSMdRqq43K72mF9e3fDpJACq1Rtk26MJYrb25+VMkk6cnJHKVj8H1QKhV5AVAi0t2BED6I9aXe9+dHr1qOg4hgDWXgpIqu1ahs7xy1Tk+eKpzPKkrgHCBa1pTTk3g3kB8dUZaFGANAZXvnIKifPlPYawoIgeD/MZoNlewtigEThogxSKhBpAhqoz2r4hOaJzTOAwxNLz6cXUnfvTchYjBBgAkCRIS+69cmXC+xImgPQAN+p4MrKGx0JpHNrfXfvjkV7O0R1uvI7n5RdveLutUCgd6RkalYom/NRTKJKAEL4CVNjiAXM1IIv+9A9Q/uz8PSQrM6t9Cszjk/Dkqq1cLShjiqsIvk3hDwFUN709EIL+Bhoydd9r3B8jz2TGe0eewZ3xssN9r6dCfBboxKKQuIA/ZrnOeAu0j4AUhFxuornMcK9CLhW8AAVUB3AAqIAQkbXMDR4J1NyYIGEBoQoB6dLqDzM13aBjsCcqbdIHqZ6K4B+TsAqH70jpODe78AAAAASUVORK5CYII=";
  19. var icon_submit="iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADqYAAAOpgAABdvkl/FRgAAAXtJREFUeNrE00+ojFEYBvDfOd93ZsyMf7Owv2XLQpKFsuDewppSitKwQnbSLYnolp2yRAl1N7KwUMK1sLFVdla6Fkq5E2aGufPZnLmNP7G4C0+9PYu385z3ec9zQlVVVoNolQjuosIQBRJq6GEJIffHPLJbsFdyWWn45wkqlFiPJupoZGEOio6q7LQs/l2giTUrU0U1c0qnRVOS69pakwJbseEnkVFm6LmEc+oodSVXTPk8FphReCG4ke/8ddUXJbMCkq7kmMoDQ1UpWCe6irbgCLo4k9dKMKtwQYHgKzoGHkpYS+GQocJbpf2ilmgHNqosCM6K5hSCwhelE0bmNfEBrwluZecN03ruizZl30+xK1v6rtSR3PEJj7CARYI69mEPtpuxZN5IeyIpfS2nvHfTK9zOJn9DE9O454BnPnqi8tzQYyd1sPlfiRznsI7jDntp0TXn88PWcqWckCKfEXLVctYaK5nbZos33hnoYxl9DCZ4gG/hv//GHwMAMsZhpxGCLcoAAAAASUVORK5CYII=";
  20. var icon_edit="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";
  21. 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)");
  22.  
  23. // speedColors[unit][speed] = color //-----> Default
  24. WMECSpeeds.speedColors = {
  25. 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"},
  26. 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"}
  27. };
  28. var unit;
  29. var debug=false;
  30. var colorspeeds_mapLayer=[];
  31.  
  32. var zoom=0;
  33. var RoadToScan = [3,6,7,4,2,1,8];
  34. var RoadUpToStreet = [2,3,6,7];
  35. var highway = [3,6,7];
  36.  
  37. var typeOfRoad = {
  38. //---Type Road-----------
  39. 3: {"name":"Freeways","checked":true,"zoom":0},
  40. 6: {"name":"Major Highway","checked":true,"zoom":1},
  41. 7: {"name":"Minor Highway","checked":true,"zoom":2},
  42. 4: {"name":"Ramps","checked":true,"zoom":2},
  43. 2: {"name":"Primary Street","checked":false,"zoom":3},
  44. 1: {"name":"Streets","checked":false,"zoom":4},
  45. 8: {"name":"Dirt roads","checked":false,"zoom":4}};
  46.  
  47. WMECSpeeds.typeOfRoad = typeOfRoad;
  48.  
  49. // 5: "Walking Trails",
  50. // 10: "Pedestrian Bw",
  51. // 14: "Ferry",
  52. // 16: "Stairway",
  53. // 17: "Private Road",
  54. // 18: "Railroad",
  55. // 19: "Runway/Taxiway"
  56. // 20: "Parking Lot Road",
  57. // 21: "Service Road"
  58.  
  59. WMECSpeeds.selectedRoadType = [];
  60. WMECSpeeds.visibility = true;
  61.  
  62. // *********************
  63. // ** HELPER FUNCTION **
  64. // *********************
  65.  
  66. function log(msg, obj)
  67. {
  68. if (obj==null)
  69. console.log(GM_info.script.name + " v" + CSpeeds_Version + " - " + msg);
  70. else if (debug)
  71. console.debug(GM_info.script.name + " v" + CSpeeds_Version + " - " + msg + " " ,obj);
  72. }
  73.  
  74. function getId(node) {
  75. return document.getElementById(node);
  76. }
  77. function getElementsByClassName(classname, node) {
  78. node || (node = document.getElementsByTagName("body")[0]);
  79. for (var a = [], re = new RegExp("\\b" + classname + "\\b"), els = node.getElementsByTagName("*"), i = 0, j = els.length;i < j;i++) {
  80. re.test(els[i].className) && a.push(els[i]);
  81. }
  82. return a;
  83. }
  84. function getFunctionWithArgs(func, args) {
  85. return (
  86. function () {
  87. var json_args = JSON.stringify(args);
  88. return function() {
  89. var args = JSON.parse(json_args);
  90. func.apply(this, args);
  91. }
  92. }
  93. )();
  94. }
  95. function IsJsonString(str) {
  96. try {
  97. JSON.parse(str);
  98. } catch (e) {
  99. return false;
  100. }
  101. return true;
  102. }
  103. function RGB2Color(r,g,b) {
  104. return "rgb(" + Math.round(r) +","+ Math.round(g) +","+ Math.round(b) +")";
  105. }
  106. function Check_Unit() {
  107. if (CSpeedsModel.isImperial) { unit = "mph"; }
  108. else { unit = "kmh"; }
  109. log(unit);
  110. if (getId('CStable')) {
  111. getId('CStable').innerHTML="";
  112. LoadSettings();
  113. getId('unitvalue').innerHTML="("+unit+")";
  114. }
  115. }
  116. function saveOption(){
  117. localStorage.setItem('WMEColorSpeeds', JSON.stringify(WMECSpeeds));
  118. }
  119.  
  120.  
  121. // *************
  122. // ** INIT **
  123. // *************
  124. function CSpeeds_bootstrap() {
  125. if (typeof unsafeWindow === "undefined") {
  126. unsafeWindow = ( function () {
  127. var dummyElem = document.createElement('p');
  128. dummyElem.setAttribute('onclick', 'return window;');
  129. return dummyElem.onclick();
  130. }) ();
  131. }
  132.  
  133. /* begin running the code! */
  134. log("starting");
  135. CSpeeds_init();
  136. }
  137.  
  138.  
  139. function CSpeeds_init(){
  140. // Waze object needed
  141. CSpeedsWaze = unsafeWindow.Waze;
  142. if(typeof(CSpeedsWaze) === 'undefined'){
  143. if (debug) { console.error("WME ColorSpeeds - CSpeedsWaze : NOK"); }
  144. window.setTimeout(CSpeeds_init, 500);
  145. return;
  146. }
  147. CSpeedsMap = CSpeedsWaze.map;
  148. if(typeof(CSpeedsMap) == 'undefined'){
  149. if (debug) { console.error("WME ColorSpeeds - CSpeedsmap : NOK"); }
  150. window.setTimeout(CSpeeds_init, 500);
  151. return;
  152. }
  153. CSpeedsModel = CSpeedsWaze.model;
  154. if(typeof(CSpeedsModel) == 'undefined'){
  155. if (debug) { console.error("WME ColorSpeeds - CSpeedsModel DOM : NOK"); }
  156. window.setTimeout(CSpeeds_init, 500);
  157. return;
  158. }
  159. // OpenLayers
  160. CSpeedOpenLayers = unsafeWindow.OpenLayers;
  161. if(typeof(CSpeedOpenLayers) === 'undefined'){
  162. if (debug) { console.error("WME ColorSpeeds - OpenLayers : NOK"); }
  163. window.setTimeout(CSpeeds_init, 500);
  164. return;
  165. }
  166. // Traductions
  167. CSpeedsI18n = unsafeWindow.I18n.locale;
  168. if(typeof(CSpeedsI18n) == 'undefined'){
  169. if (debug) { console.error("WME ColorSpeeds - CSpeedsI18n : NOK"); }
  170. setTimeout(CSpeeds_init, 500);
  171. return;
  172. }
  173. // Waze GUI needed
  174. CSpeedshandle = getId("user-info");
  175. if(typeof(CSpeedshandle) == 'undefined'){
  176. if (debug) { console.error("WME ColorSpeeds - CSpeedshandle : NOK"); }
  177. setTimeout(CSpeeds_init, 500);
  178. return;
  179. }
  180. CSpeedshandleClass = getElementsByClassName("nav-tabs", CSpeedshandle)[0];
  181. if(typeof(CSpeedshandleClass) === 'undefined'){
  182. if (debug) { console.error("WME ColorSpeeds - CSpeedshandleClass : NOK"); }
  183. setTimeout(CSpeeds_init, 500);
  184. return;
  185. }
  186. CSpeedshandleClass2 = getElementsByClassName("tab-content", CSpeedshandle)[0];
  187. if(typeof(CSpeedshandleClass2) === 'undefined'){
  188. if (debug) { console.error("WME ColorSpeeds - CSpeedshandleClass2 : NOK"); }
  189. setTimeout(CSpeeds_init, 500);
  190. return;
  191. }
  192.  
  193. // Verify localStorage. Init if empty or not correct
  194. if (typeof(localStorage.WMEColorSpeeds) !== "undefined" && IsJsonString(localStorage.getItem('WMEColorSpeeds'))) {
  195. WMECSpeeds = JSON.parse(localStorage.WMEColorSpeeds);
  196. if (WMECSpeeds.typeOfRoad === undefined) WMECSpeeds.typeOfRoad = typeOfRoad;
  197. }else {
  198. if (typeof(localStorage.speedColors) !== "undefined" && IsJsonString(localStorage.getItem('speedColors'))) {
  199. WMECSpeeds.speedColors={}; WMECSpeeds.speedColors = JSON.parse(localStorage.speedColors);
  200. localStorage.removeItem("speedColors");
  201. }
  202. if (typeof(localStorage.speedColorsVisibility) !== "undefined" && IsJsonString(localStorage.getItem('speedColorsVisibility'))) {
  203. WMECSpeeds.visibility = JSON.parse(localStorage.speedColorsVisibility);
  204. localStorage.removeItem("speedColorsVisibility");
  205. }
  206. localStorage.setItem('WMEColorSpeeds', JSON.stringify(WMECSpeeds));
  207. log("init ok");
  208. }
  209. //======================================================
  210.  
  211. // Translation
  212. if (CSpeedsI18n == "fr") {
  213. CSlang = new Array("Vitesses","Paramètres","Couleurs","Ajouter nouvelle vitesse","Supprimer","Annuler","Autres","Modifier","Type de route","Zoom");
  214. }
  215. else {
  216. CSlang = new Array("Speeds","Settings","Colors","Add new speed","Delete","Cancel","Others","Edit","Road type","Zoom");
  217. }
  218. Check_Unit();
  219.  
  220. // WME Layers check
  221. var layers = CSpeedsMap.getLayersBy("uniqueName","__WME_Color_Speeds");
  222. if(layers.length == 0) {
  223. var colorspeeds_style = new CSpeedOpenLayers.Style({
  224. pointRadius: 2,
  225. fontWeight: "normal",
  226. label : "${labelText}",
  227. fontFamily: "Tahoma, Courier New",
  228. labelOutlineColor: "#FFFFFF",
  229. labelOutlineWidth: 2,
  230. fontColor: '#000000',
  231. fontSize: "10px"
  232. });
  233.  
  234. colorspeeds_mapLayer = new CSpeedOpenLayers.Layer.Vector("Color Speeds", {
  235. displayInLayerSwitcher: true,
  236. uniqueName: "__WME_Color_Speeds",
  237. styleMap: new CSpeedOpenLayers.StyleMap(colorspeeds_style)
  238. });
  239.  
  240. I18n.translations.en.layers.name["__WME_Color_Speeds"] = "Color Speeds";
  241. CSpeedsMap.addLayer(colorspeeds_mapLayer);
  242. colorspeeds_mapLayer.setVisibility(WMECSpeeds.visibility);
  243.  
  244. }
  245. //log('colorspeeds_mapLayer ',colorspeeds_mapLayer);
  246. // Then running
  247. CSpeeds_css();
  248. getElementsByClassName('btn-group')[0].onclick=(function(){ Check_Unit(); });
  249. }
  250.  
  251.  
  252. // *************
  253. // ** HTML **
  254. // *************
  255.  
  256. function CSpeeds_css() {
  257. var Scss = document.createElement("style");
  258. Scss.type = "text/css";
  259. var css =".CScontent {width:250px; margin-left:20px; box-shadow: 0 4px 10px #aaa;}";
  260. css +=".divEntete {height:24px; font-weight:bold; padding-top:2px; border:2px solid #3d3d3d; background-color:#BEDCE5;}";
  261. css +=".divContent {clear:both; line-height:21px; height:24px; border:1px solid #3d3d3d; border-top:0;}";
  262. css +=".divl {float:left; text-align:center;}";
  263. css +=".divr {float:right; text-align:center;}";
  264. css +=".speed {color:#59899e; font-weight:bold;}";
  265. css +=".divcolor {width:80px; height:17px; margin:3px 0 0 5px;}";
  266. css +=".CStype {color:#59899e; font-weight:bold; text-align:left; margin-left:10px;}";
  267. css +=".CScheck { margin-left:5px; width:10px; height:10px;}";
  268. css +=".CSzoom {color:#59899e; font-weight:bold;}";
  269. css +="#editspeed { display:none;}";
  270. css +="#newspeed {width:35px; height:22px;}";
  271. css +="#editzoom { display:none;}";
  272. css +="#newvalzoom {width:35px; height:22px;}";
  273. Scss.innerHTML = css;
  274. document.body.appendChild(Scss);
  275. CSpeeds_Mainhtml();
  276. }
  277. function CSpeeds_Mainhtml() {
  278. //Create content in CSpeeds's tab
  279. var newtab = document.createElement('li');
  280. newtab.innerHTML = "<a href='#sidepanel-colorspeeds' data-toggle='tab'><span class='icon-dashboard' title='"+ CSlang[0] +"'></span></a>";
  281. //newtab.innerHTML = "<a href='#sidepanel-colorspeeds' data-toggle='tab'> "+ CSlang[0] +"</a>";
  282. CSpeedshandleClass.appendChild(newtab);
  283.  
  284. var addon = document.createElement('section');
  285. //addon.id = "colorspeeds-addon";
  286.  
  287. // colorspeeds header
  288. 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>";
  289. content += "<div style='clear:both; padding-top:10px;'></div><div class='CScontent' >";
  290. 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>";
  291.  
  292. // new / edit speed
  293. content += "<div class='divContent' id='editspeed'><div class='divl speed' style='width:60px;'><input type='text' value='' id='newspeed' class='speed' /></div>";
  294. 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>";
  295. 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>";
  296. content += "<div class='divr' style='width:120px; text-align:left;'><select id='CScolor' style='height:22px; width:100px;'>";
  297.  
  298. for (var i=0; couleurs[i]; ++i) { content +="<option value='rgb"+ couleurs[i] +"' style='background-color:rgb"+ couleurs[i] +"'>&nbsp;</option>"; }
  299.  
  300. content +="</select></div></div>";
  301. 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>";
  302. content += "<div id='CStable'></div></div><div id='divadd'></div>";
  303. // Type road
  304. content += "<br><div style='clear:both; padding-top:10px;'></div><div class='CScontent'>";
  305. 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>";
  306. // edit zoom
  307. content += "<div class='divContent' id='editzoom'><div class='divl speed' style='width:110px;'><span id='texttype'></span></div>";
  308. 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>";
  309. 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>";
  310. content += "<div class='divr speed' style='width:60px;'><input type='text' value='' id='newvalzoom' class='speed' /></div>";
  311. content +="</div>";
  312. content += "<div id='CSroadType'></div></div>";
  313. addon.innerHTML = content;
  314. addon.id = "sidepanel-colorspeeds";
  315. addon.className = "tab-pane";
  316. CSpeedshandleClass2.appendChild(addon);
  317. getId('divadd').innerHTML="<br/><center><input type='button' id='addbutton' name='add' value='"+ CSlang[3] +"' /></center>";
  318. getId('addbutton').onclick = (function() {
  319. getId('editspeed').style.display = "block";
  320. getId('addbutton').style.display = "none";
  321. });
  322. LoadSettings();
  323. window.setInterval(SCColor,800);
  324. CSpeedsMap.events.register("zoomend", null, SCColor);
  325. CSpeedsMap.events.register("moveend", null, SCColor);
  326. window.addEventListener("beforeunload", saveOption, false);
  327. }
  328.  
  329. function LoadSettings(){
  330.  
  331. for (var valSpeed in WMECSpeeds.speedColors[unit]) {
  332. var color = WMECSpeeds.speedColors[unit][valSpeed];
  333. var div = document.createElement('div'); div.className="divContent";
  334. var divspeed = document.createElement('div'); divspeed.className="divl speed"; divspeed.style.width="60px"; divspeed.innerHTML=valSpeed;
  335. div.appendChild(divspeed);
  336.  
  337. var divsuppr = document.createElement('div'); divsuppr.className="divr"; divsuppr.style.width="20px";
  338. var divsuppra = document.createElement('a');
  339. divsuppra.innerHTML="<img style='width:20px;' title='"+ CSlang[4] +"' src='data:image/png;base64,"+ icon_delete +"' />";
  340. divsuppra.href = "#"; divsuppra.className="delSpeed"; divsuppra.id="delSpeed_"+valSpeed;
  341. divsuppr.appendChild(divsuppra);
  342. div.appendChild(divsuppr);
  343.  
  344. var divedit = document.createElement('div'); divedit.className="divr"; divedit.style.width="20px";
  345. var divedita = document.createElement('a');
  346. divedita.innerHTML="<img style='width:16px;' title='"+ CSlang[7] +"' src='data:image/png;base64,"+ icon_edit +"' />";
  347. divedita.href = "#";
  348. divedita.onclick = getFunctionWithArgs(SCEditSpeed, [unit,valSpeed,color]);
  349. divedit.appendChild(divedita);
  350. div.appendChild(divedit);
  351.  
  352. var divcolor = document.createElement('div'); divcolor.className="divr"; divcolor.style.width="120px"; divcolor.innerHTML="<div class='divcolor' style='background-color:"+ color +";'>&nbsp;</div>";
  353. div.appendChild(divcolor);
  354. getId('CStable').appendChild(div);
  355. }
  356. for (var i=0; i < RoadToScan.length; ++i){
  357. var type = RoadToScan[i];
  358. var div = document.createElement('div'); div.className="divContent";
  359. var divcheck = document.createElement('div'); divcheck.className="divl CScheck";
  360. divcheck.innerHTML= '<input type="checkbox" id="cbRoad'+type+'">';
  361. div.appendChild(divcheck);
  362. var divtype = document.createElement('div'); divtype.className="divl CStype"; divtype.style.width="130px"; divtype.innerHTML= WMECSpeeds.typeOfRoad[type].name;
  363. div.appendChild(divtype);
  364. var divedit = document.createElement('div'); divedit.className="divr"; divedit.style.width="20px";
  365. var divedita = document.createElement('a');
  366. divedita.innerHTML="<img style='width:16px;' title='"+ CSlang[7] +"' src='data:image/png;base64,"+ icon_edit +"' />";
  367. divedita.href = "#"; divedita.className="modifyZoom"; divedita.id="zoom_"+type;
  368. divedit.appendChild(divedita);
  369. div.appendChild(divedit);
  370. var divzoom = document.createElement('div'); divzoom.className="divr CSzoom"; divzoom.style.width="60px"; divzoom.innerHTML= WMECSpeeds.typeOfRoad[type].zoom;
  371. div.appendChild(divzoom);
  372. getId('CSroadType').appendChild(div);
  373. getId('cbRoad'+type).checked = WMECSpeeds.typeOfRoad[type].checked;
  374.  
  375.  
  376. }
  377.  
  378. getId('CScolor').onchange=(function(){
  379. getId('CScolor').style.backgroundColor=getId('CScolor').value;
  380. });
  381. getId('cancel').onclick=(function(){
  382. getId('editspeed').style.display = "none";
  383. getId('addbutton').style.display = "block";
  384. getId('CScolor').style.backgroundColor="#fff";
  385. getId('CScolor').value="";
  386. getId('newspeed').value="";
  387. getId('CStable').innerHTML="";
  388. getId('CSroadType').innerHTML="";
  389. LoadSettings();
  390. });
  391. getId('submit').onclick=(function(){
  392. var newSpeed = getId('newspeed').value;
  393. var newColor = getId('CScolor').value;
  394. if (newSpeed && newColor) {
  395. WMECSpeeds.speedColors[unit][newSpeed] = newColor;
  396. }
  397. getId('editspeed').style.display = "none";
  398. getId('addbutton').style.display = "block";
  399. getId('CScolor').style.backgroundColor="#fff";
  400. getId('CScolor').value="";
  401. getId('newspeed').value="";
  402. getId('CStable').innerHTML="";
  403. getId('CSroadType').innerHTML="";
  404. LoadSettings();
  405. });
  406. setupHandler();
  407.  
  408.  
  409. }
  410. function setupHandler() {
  411. var listeDelSpeed = getId("CStable");
  412. var btnDelSpeed = getElementsByClassName("delSpeed", listeDelSpeed);
  413. for (var i=0; i<btnDelSpeed.length; i++)
  414. {
  415. var target=btnDelSpeed[i];
  416. var index = target.id.split('_')[1];
  417. target.onclick = getFunctionWithArgs(SCSpeeds, [unit,index]);
  418. }
  419. var listeEditZoom = getId("CSroadType");
  420. var btnEditZoom = getElementsByClassName("modifyZoom", listeEditZoom);
  421. for (var i=0; i<btnEditZoom.length; i++)
  422. {
  423. var target=btnEditZoom[i];
  424. var index = target.id.split('_')[1];
  425. var val = WMECSpeeds.typeOfRoad[parseInt(index)].zoom;
  426. target.onclick = getFunctionWithArgs(SCEditZoom, [index, val]);
  427. }
  428. }
  429.  
  430. function SCEditSpeed(unit,id,color){
  431. getId('editspeed').style.display = "block";
  432. getId('addbutton').style.display = "none";
  433. getId('newspeed').value=id;
  434. getId('CScolor').value=color;
  435. getId('CScolor').style.backgroundColor =color;
  436. }
  437.  
  438. function SCSpeeds(unit,idx){
  439. var answer = window.confirm(CSlang[4] +" "+idx+" "+unit+" ?");
  440. if (answer){
  441. delete WMECSpeeds.speedColors[unit][idx];
  442. getId('CStable').innerHTML="";
  443. getId('CSroadType').innerHTML="";
  444. LoadSettings();
  445. }
  446. }
  447.  
  448. function SCEditZoom(idx, val){
  449. getId('editzoom').style.display = "block";
  450. getId('newvalzoom').value=val;
  451. getId('texttype').textContent = WMECSpeeds.typeOfRoad[idx].name;
  452. getId('submitZoom').onclick=(function(){
  453. var newValZoom = getId('newvalzoom').value;
  454. if (newValZoom) {
  455. WMECSpeeds.typeOfRoad[idx].zoom = newValZoom;
  456. }
  457. getId('editzoom').style.display = "none";
  458. getId('newvalzoom').value="";
  459. getId('CStable').innerHTML="";
  460. getId('CSroadType').innerHTML="";
  461. LoadSettings();
  462. });
  463. getId('cancelZoom').onclick=(function(){
  464. getId('editzoom').style.display = "none";
  465. getId('newvalzoom').value="";
  466. getId('CStable').innerHTML="";
  467. getId('CSroadType').innerHTML="";
  468. LoadSettings();
  469. });
  470. }
  471.  
  472.  
  473. /*
  474. function removeItem(obj, prop, val) {
  475. var c, found=false;
  476. for(c in obj) {
  477. if(obj[c][prop] == val) { found=true; break; }
  478. }
  479. if(found){ delete obj[c]; }
  480. }
  481. */
  482.  
  483. 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
  484. {
  485. if (!trigo)
  486. d=-d;
  487. function getOrthoVector(p1, p2)
  488. {
  489. return [p1.y-p2.y , p2.x-p1.x];
  490. }
  491. function normalizeVector(v)
  492. {
  493. if (v[0]*v[0]+v[1]*v[1]==0)
  494. return v;
  495. var l=Math.sqrt(v[0]*v[0]+v[1]*v[1]);
  496. return [v[0]/l , v[1]/l];
  497. }
  498. var points = [];
  499. for (var i=0; i<line.length; i++)
  500. {
  501. // compute orthogonal vectors:
  502. var prevVector=[0,0];
  503. var nextVector=[0,0];
  504. if (i>0) // can compute prev
  505. {
  506. var p1=line[i-1];
  507. var p2=line[i];
  508. prevVector=getOrthoVector(p1, p2);
  509. prevVector=normalizeVector(prevVector);
  510. }
  511. if (i<line.length-1) // can compute next
  512. {
  513. var p1=line[i];
  514. var p2=line[i+1];
  515. nextVector=getOrthoVector(p1, p2);
  516. nextVector=normalizeVector(nextVector);
  517. }
  518. // sum vectors and normalize
  519. var v = [(prevVector[0]+nextVector[0]), (prevVector[1]+nextVector[1])];
  520. v=normalizeVector(v);
  521. points.push(new CSpeedOpenLayers.Geometry.Point(line[i].x+v[0]*d, line[i].y+v[1]*d));
  522. }
  523. return points;
  524. }
  525.  
  526. function SCColor(){
  527.  
  528. try { colorspeeds_mapLayer.destroyFeatures();
  529. }catch(err){log('err destroyFeatures: ',err);}
  530.  
  531. var lineFeature = [];
  532. for (var i=0; i < RoadToScan.length; ++i){
  533. var type = RoadToScan[i];
  534. WMECSpeeds.typeOfRoad[type].checked = getId('cbRoad'+type).checked;
  535. }
  536. for (var seg in CSpeedsModel.segments.objects) {
  537. var segment = CSpeedsModel.segments.get(seg);
  538. var attributes = segment.attributes;
  539. var roadType = attributes.roadType;
  540. //var roundabout = attributes.junctionID !== null;
  541. var line = getId(segment.geometry.id);
  542. var fwdspeed = attributes.fwdMaxSpeed;
  543. var revspeed = attributes.revMaxSpeed;
  544. var fwdspeedUnverified = attributes.fwdMaxSpeedUnverified;
  545. var revspeedUnverified = attributes.revMaxSpeedUnverified;
  546. var fwddir = attributes.fwdDirection;
  547. var revdir = attributes.revDirection;
  548. var fwdID = "",revID="";
  549. var isSelected = (segment.selected == true)? true : false;
  550. var isModified = (segment.state == "Update")? true : false;
  551. // check that WME hasn't highlighted this segment
  552. if (isSelected || isModified) continue;
  553.  
  554. if (zoom != CSpeedsMap.zoom) {
  555. zoom = CSpeedsMap.zoom;
  556. //log('zoom = ' + zoom + 'Waze.map.getResolution() = '+Waze.map.getResolution());
  557. }
  558. var shiftValue= 3*Waze.map.getResolution();
  559. if (RoadToScan.indexOf(roadType) == -1) continue;
  560. if (unit == 'mph'){
  561. fwdspeed = (fwdspeed!=null) ? (fwdspeed*0.625) : null;
  562. revspeed = (revspeed!=null) ? (revspeed*0.625) : null;
  563. }
  564. // turn off highlights when roads are no longer visible
  565. if ((zoom < WMECSpeeds.typeOfRoad[roadType].zoom) || !WMECSpeeds.typeOfRoad[roadType].checked) {
  566. continue;
  567. }
  568. WMECSpeeds.visibility = colorspeeds_mapLayer.visibility;
  569. if (fwdspeed && WMECSpeeds.visibility) {
  570. //Color for forward speed
  571. var newWidth="", newColor="", newDashes="", newOpacity="";
  572. if (WMECSpeeds.speedColors[unit].hasOwnProperty(fwdspeed)) {
  573. newColor=WMECSpeeds.speedColors[unit][fwdspeed];
  574. //Dashes
  575. if (fwddir==true && fwdspeed && !fwdspeedUnverified) { newWidth = 6; newOpacity = 0.8; newDashes = "5 10"; } // verified speed
  576. else if (fwddir==true && fwdspeed && fwdspeedUnverified) { newColor = "#ff0000"; newWidth = 4; newOpacity = 0.8; newDashes = "2 10";} // unverified speed
  577. }
  578. else if (fwddir==true && fwdspeed) { newWidth = 4; newColor = "#ff0000"; newOpacity = 0.9; newDashes = "5 5"; } // other
  579. var style = {
  580. strokeColor: newColor,
  581. strokeOpacity: newOpacity,
  582. strokeWidth: newWidth,
  583. strokeDashstyle: newDashes
  584. };
  585. var points = [];
  586. var segID = attributes.id;
  587. points=shiftGeometry(shiftValue, segment.geometry.getVertices(), CSpeedsModel.countries.top.leftHandTraffic);
  588.  
  589. var newline = new CSpeedOpenLayers.Geometry.LineString(points);
  590.  
  591. lineFeature.push(new CSpeedOpenLayers.Feature.Vector(newline, null, style));
  592. //log("segment id: " + attributes.id + ' newColor: '+ newColor + ' segment.CSpeedsFwd.fwdColor: ' + segment.CSpeedsFwd.fwdColor + ' lineFeature: ',lineFeature);
  593. }
  594. if (revspeed && WMECSpeeds.visibility) {
  595. //Color for reverse speed
  596. var newWidth="", newColor="", newDashes="", newOpacity="", newDashOffset="";
  597. if (WMECSpeeds.speedColors[unit].hasOwnProperty(revspeed)) {
  598. newColor=WMECSpeeds.speedColors[unit][revspeed];
  599. //Dashes
  600. if (revdir==true && revspeed && !revspeedUnverified) { newWidth = 6; newOpacity = 0.8; newDashes = "5 10"; } // verified speed
  601. else if (revdir==true && revspeed && revspeedUnverified) { newColor = "#ff0000"; newWidth = 4; newOpacity = 0.8; newDashes = "2 10";} // unverified speed
  602. }
  603. else if (revdir==true && revspeed) { newWidth = 4; newColor = "#ff0000"; newOpacity = 0.9; newDashes = "5 5"; } // other
  604. var style = {
  605. strokeColor: newColor,
  606. strokeOpacity: newOpacity,
  607. strokeWidth: newWidth,
  608. strokeDashstyle: newDashes,
  609. };
  610.  
  611. var points = [];
  612. var segID = attributes.id;
  613. points=shiftGeometry(shiftValue, segment.geometry.getVertices(), !CSpeedsModel.countries.top.leftHandTraffic);
  614.  
  615. var newline = new CSpeedOpenLayers.Geometry.LineString(points);
  616.  
  617. lineFeature.push(new CSpeedOpenLayers.Feature.Vector(newline, null, style));
  618. }
  619.  
  620. }
  621. //log("lineFeature = ",lineFeature);
  622. // Display new array of segments
  623. try{
  624. colorspeeds_mapLayer.addFeatures(lineFeature);
  625. }catch(err){log('err addFeatures: ',err);}
  626. }
  627.  
  628. /* begin running the code! */
  629. CSpeeds_bootstrap ();

QingJ © 2025

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