// ==UserScript==
// @name WME Road Closures
// @description Shows road closures from Waze Live map in WME
// @include https://www.waze.com/editor/*
// @include https://www.waze.com/*/editor/*
// @include https://editor-beta.waze.com/*
// @version 0.2
// @grant none
// @copyright 2014, pvo11
// @namespace https://greasyfork.org/scripts/5144-wme-road-closures
// ==/UserScript==
roadClosures_version = '0.2';
var epsg900913 = new OpenLayers.Projection("EPSG:900913");
var epsg4326 = new OpenLayers.Projection("EPSG:4326");
var closuresLayer;
function drawLine(line) {
var lineFeatures = [];
for(var i = 0; i < line.length-1; i++) {
var lp1 = line[i];
var lp2 = line[i + 1];
var dif_lon = Math.abs(lp1.x - lp2.x);
var dif_lat = Math.abs(lp1.y - lp2.y);
if (dif_lon < 0.0000001 && dif_lat < 0.0000001) continue;
var p1 = new OpenLayers.Geometry.Point(lp1.x, lp1.y).transform(epsg4326, epsg900913);
var p2 = new OpenLayers.Geometry.Point(lp2.x, lp2.y).transform(epsg4326, epsg900913);
var points = [];
points.push(p1);
points.push(p2);
var line_part = new OpenLayers.Geometry.LineString(points);
var lineFeature = new OpenLayers.Feature.Vector(line_part, { strokeColor: '#FF0000', labelText: '', strokeWidth: 12 } );
lineFeatures.push(lineFeature);
}
closuresLayer.addFeatures(lineFeatures);
}
function getRoutingURL(){
var server = Waze.location.code;
var routingURL = 'https://www.waze.com';
switch(server){
case 'usa':
routingURL += '/rtserver/web/GeoRSS';
break;
case 'row':
routingURL += '/row-rtserver/web/GeoRSS';
break;
case 'il':
routingURL += '/il-rtserver/web/GeoRSS';
break;
default:
routingURL += '/rtserver/web/GeoRSS';
};
return routingURL;
}
function requestClosures()
{
if (closuresLayer.getVisibility() === true) {
var extent = Waze.map.getExtent();
var pLB = new OpenLayers.Geometry.Point(extent.left, extent.bottom).transform(epsg900913, epsg4326);
var pRT = new OpenLayers.Geometry.Point(extent.right, extent.top).transform(epsg900913, epsg4326);
var data = {
format: "JSON",
types: "traffic",
left: pLB.x,
right: pRT.x,
bottom: pLB.y,
top: pRT.y
}
var url = getRoutingURL();
$.ajax({
dataType: "json",
url: url,
data: data,
success: function(json) {
if (json.error != undefined) {
} else {
if ("undefined" !== typeof(json.jams)) {
var numjams = json.jams.length;
for (var i = 0; i < numjams; i++) {
var jam = json.jams[i];
if (jam.blockType === "ROAD_CLOSED_EVENT") {
drawLine(jam.line);
}
}
}
}
}
});
}
}
function roadClosures_init()
{
var style = new OpenLayers.Style({
strokeDashstyle: 'solid',
strokeColor : "${strokeColor}",
strokeOpacity: 1.0,
strokeWidth: "${strokeWidth}",
fillColor: '#0040FF',
fillOpacity: 1.0,
pointRadius: "${pointRadius}",
label : "${labelText}",
fontFamily: "Tahoma, Courier New",
labelOutlineColor: '#FFFFFF',
labelOutlineWidth: 0,
fontColor: "${fontColor}",
fontOpacity: 1.0,
fontSize: "10px",
display: 'block'
});
closuresLayer = new unsafeWindow.OpenLayers.Layer.Vector("Road Closures", {
displayInLayerSwitcher: true,
uniqueName: "__DrawRouteClosures",
styleMap: new OL.StyleMap(style)
});
I18n.translations.en.layers.name["__DrawRouteClosures"] = "Road Closures";
unsafeWindow.Waze.map.addLayer(closuresLayer);
closuresLayer.setVisibility(true);
Waze.map.events.register("zoomend", null, requestClosures);
Waze.map.events.register("moveend", null, requestClosures);
Waze.map.events.register("changelayer", null, requestClosures);
requestClosures();
}
function roadClosures_bootstrap()
{
var bGreasemonkeyServiceDefined = false;
try
{
bGreasemonkeyServiceDefined = ("object" === typeof Components.interfaces.gmIGreasemonkeyService);
}
catch (err)
{ /* Ignore */ }
if ( "undefined" === typeof unsafeWindow || ! bGreasemonkeyServiceDefined)
{
unsafeWindow = ( function ()
{
var dummyElem = document.createElement('p');
dummyElem.setAttribute ('onclick', 'return window;');
return dummyElem.onclick ();
} ) ();
}
setTimeout(roadClosures_init, 3000);
}
roadClosures_bootstrap();