WME Road Closures

Shows road closures from Waze Live map in WME

Pada tanggal 21 September 2014. Lihat %(latest_version_link).

// ==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.5
// @grant				none
// @copyright			2014, pvo11
// @namespace			https://greasyfork.org/scripts/5144-wme-road-closures
// ==/UserScript==

roadClosures_version = '0.5';

var epsg900913 = new OpenLayers.Projection("EPSG:900913");
var epsg4326   = new OpenLayers.Projection("EPSG:4326");
var closuresLayer;


function drawLine(line) {
	var linePoints = [];

	var p = new OpenLayers.Geometry.Point(line[0].x, line[0].y).transform(epsg4326, epsg900913);
	linePoints.push(p);
	for(var i = 1; 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;
		p = new OpenLayers.Geometry.Point(lp1.x, lp1.y).transform(epsg4326, epsg900913);
		linePoints.push(p);
	}
	p = new OpenLayers.Geometry.Point(line[line.length-1].x, line[line.length-1].y).transform(epsg4326, epsg900913);
	linePoints.push(p);
	var lineString  = new OpenLayers.Geometry.LineString(linePoints);
	var lineFeature = new OpenLayers.Feature.Vector(lineString, null, { strokeColor: '#000000', strokeDashstyle: 'solid', strokeLinecap: 'round', strokeWidth: 14 } );
	closuresLayer.addFeatures(lineFeature);
	lineString  = new OpenLayers.Geometry.LineString(linePoints);
	lineFeature = new OpenLayers.Feature.Vector(lineString, null, { strokeColor: '#FF0000', strokeDashstyle: 'solid', strokeLinecap: 'round', strokeWidth: 12 } );
	closuresLayer.addFeatures(lineFeature);
	lineString  = new OpenLayers.Geometry.LineString(linePoints);
	lineFeature = new OpenLayers.Feature.Vector(lineString, null, { strokeColor: '#FFFFFF', strokeDashstyle: 'dot', strokeLinecap: 'square', strokeWidth: 12 } );
	closuresLayer.addFeatures(lineFeature);
}


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 {
						var ids = [];
						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") {
									if (typeof(ids[jam.segments[0].ID]) === "undefined") {
										drawLine(jam.line);
										ids[jam.segments[0].ID] = 1;
									}
								}
							} 
						}
					}
			}
		});
	}
}

function writeObject(prefix, o) {
	for (var p in o) {
	}
}

function roadClosures_init()
{
	closuresLayer = new OpenLayers.Layer.Vector("Road Closures", {
			displayInLayerSwitcher: true,
			uniqueName: "__DrawRouteClosures"
		});
	I18n.translations.en.layers.name["__DrawRouteClosures"] = "Road Closures";
	Waze.map.addLayer(closuresLayer);
	closuresLayer.setVisibility(true);
	
	var alertsLayer =  Waze.map.getLayersBy('uniqueName', '__livemap_alerts').first();
	if (typeof(alertsLayer) !== "undefined") {
		var closuresLayerZIdx = closuresLayer.getZIndex();
			var alertsLayerZIdx = alertsLayer.getZIndex();
		if (closuresLayerZIdx > alertsLayerZIdx) {
			closuresLayer.setZIndex(alertsLayerZIdx);
			alertsLayer.setZIndex(closuresLayerZIdx);
		}
	}

	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();