// ==UserScript==
// @name WME Cameras
// @author J0N4S13
// @description Overlay cameras
// @include /^https:\/\/(www|beta)\.waze\.com\/(?!user\/)(.{2,6}\/)?editor.*$/
// @version 2023.01.30
// @grant none
// @namespace https://greasyfork.org/users/218406
// ==/UserScript==
getCamarasIP();
//getCamarasBrisa();
//getCamaraBrisa();
initializeCameras();
var Cameras_Layer;
var camarasIP;
var camarasBrisa;
var camaraBrisa;
function getCamarasIP(){
$.getJSON("https://external.wazept.com/cameras/getCamarasIP.php", function(data) {
camarasIP = data.features;
});
}
function getCamaraBrisa(){
var settings = {
"url": "https://external.wazept.com/cameras/getCamaraBrisa.php",
"method": "GET",
"timeout": 0,
"headers": {
"Cookie": "__cfduid=d9d39e1b66a6c549435973dd2c2f7cae11592957802"
},
};
$.ajax(settings).done(function (response) {
camaraBrisa = response
});
}
function getCamarasBrisa(){
$.getJSON("https://external.wazept.com/cameras/getCamarasBrisa.php", function(data) {
camarasBrisa = data;
});
}
function checkLayerNum()
{
var lmaoLayer = null;
for(var i = 0; i < W.map.layers.length; i++)
{
if(W.map.layers[i].uniqueName == '__cameras') lmaoLayer = i;
}
return lmaoLayer;
}
function getCameras(){
if (!Cameras_Layer.getVisibility()) {
return;
}
Cameras_Layer.destroyFeatures();
$(camarasIP).each(function(){
var lat = this.geometry.y;
var long = this.geometry.x;
addImage("IP", lat, long, this);
});
$(camarasBrisa).each(function(){
var lat = parseFloat(this.Latitude);
var long = parseFloat(this.Longitude);
addImage("BRISA", lat, long, this);
});
}
function addImage(type, lat, long, detail) {
var coords = OL.Layer.SphericalMercator.forwardMercator(long, lat);
var point = new OL.Geometry.Point(coords.lon,coords.lat);
var alertPx = W.map.getPixelFromLonLat(new OL.LonLat(coords.lon,coords.lat));
var icon;
var attributes;
var style;
if(type == "IP"){
icon = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IB2cksfwAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAjdJREFUWIXtlj9oE3EUxz8vXomCIA5tVbAEKUQ4rQi6SbtIZyeHqpWODgo2V3BqjPMlRTs6iZBJZ8HJooODCEoPDFSoCm2poCCCtA33HK70zP1Pk1CEfpdf8n6/33ufd7+733sGeyxjH+C/BNDacEHdfEXgEoDCG2luzMq9pS89BVDbVABckH/sAqcw8pNqm56h5ORE0K4BqG2uAscyk1ZNV22+i+UMdAywk3X76lfbVLEcSVqUCJAa/O5HyOVabdUzIR9JELEAapvricEB5ka8sbQYChzwtSaWE3mEkQCqCFX6UwGyazBuIvoJVE23i8GB+KPo3UV04Sa8e5K6LASgteECu83/xjMYOO3/H5tpeTd0vjgktxtfkwH0wIPE7yaoKw+9sbSYulQ3jQowlQggrjFKGsHlWTh3NRvgeAVelj3fylhwuv13IEOmLfqZXB7CRyAsCEwC0HcY7ryFrT/w6CKcv549sCrUzgZNr1IBJLdRxs17AFu/PWPfoeyZPx6HXyuRU3KweT8dYHppeaeqAbiuf90uv4YjJ+FooXVT/RqsfkhlC34BkQAhzY342T+/5Y0TdXj/FD69SN2epmiAkpML3YY/Pvu/6xNtB4orSJEAIqjarANePU8oNBm1FjcRewRiOYMd9AJBX8fbBtjeKJ1CdNSQ+BDFFTBis4hRd1oyD6JxAtpoz7rdlPog3uPU+eKQbhoVUUYBVFkQaZbFanwDwMruc1f9wPaFMpW6sFcA3dQ+wF9JaLei/FXMqwAAAABJRU5ErkJggg==';
attributes = {
type: type,
url: detail.attributes.url1,
pixel: alertPx
};
style = {
externalGraphic: icon,
graphicWidth: 32,
graphicHeight: 32,
title: 'IP',
cursor: 'help'
};
}
else if(type == "BRISA"){
icon = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACIAAAAqCAYAAADWFImvAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAALWSURBVFhHvZg7aBRRFIYTn1tZLaRIaWGxrYWIjYWCYOwFW0FrC/sU2lirhYVYCqbRxSpFrILGImBhIIoIPmALUSGCKOv9JvuPZ+6c3bmzO7MXPu7sfcz59tyzk90shLZYweGG8WJAfuFtmhe5SDbQ6S51Lj7dXF159vLzpeevh21CDGIRcxT/vxkT3qY2IWZBBLN5ZCKGmKOs7EuE/pi3sG1W+q9+EntBEoGut7CK1a13Q9rujz13vorGRG5u7mQiG1++ufNVjES6gX2JwLK3sIqGRJaTRe5sf8gg8OX17Xy8cZHFg4eOewsJ2v84GD58+ymrB3qC2rFZRYhdKaLgXNMrI3B1400usjX4XtqbQiyyPCkjj99/HQ5+/c4C0rgmA0ggwzVrvP1VJIuIvT9/MwEdjcToyQYiSHl7J1FLhHdOQIlwPEBwpHiGqEmKee9eMbVE9O5pZIbACFCwOh4ro8YYa/i0qa7ieyeLEGRS09EgWNW8LCWLcBRNNDI4U0bssUzbJn20k0W8s6/T2E8dqU6oGbKj+yeLcINps8I+6kL7kVDT/ZNFBEVLvZDm1Mab0HqKWfVmH361RSykmCCkeNynhWC20Fmr1/bBN5OIBSlqgMCqJ47CzukPJOOI2/2NicToAeeN02yhQmsi40AOCYTsuCty4cmLHbtoHsQi2feR07fvX/cWt4krEvreuUf9NW9DW5REAnxv7AVOnrp19968fmy5IspK4AwcOHL0/Ikr124gdvbB2nobcrmI/V1jRAoyMVZu1gJ3RQI2K9kxBTIh4YnBtHL2aPLfvgFPRkIlKeGJQYpcSSSWARY4UlZsajmJFUQgkpFQSWqMWLKcfc2joiQiJgjlUmIGOY31yEzouV/5f2iSiYQ8sWnkCvA0D31BpCAjrFQNuYKglfMYrS+IWEpSIlEuFszFIjTvSozDFYNEOSsmNOcGrIMrBgliGZ3uUucfRGYIamB8WSUAAAAASUVORK5CYII=';
attributes = {
type: type,
idCamera: detail.idCamara,
pixel: alertPx
};
style = {
externalGraphic: icon,
graphicWidth: 32,
graphicHeight: 32,
title: 'Brisa',
cursor: 'help'
};
}
var imageFeature = new OL.Feature.Vector(point, attributes, style);
Cameras_Layer.addFeatures([imageFeature]);
}
function initializeCameras(e)
{
if (e && e.user === null) {
return;
}
if (typeof W === "undefined" || typeof W.loginManager === "undefined" || typeof W.map === 'undefined' || typeof OL === 'undefined' || document.querySelector('.list-unstyled.togglers .group') === null) {
setTimeout(initializeCameras, 100);
return;
}
if (!W.loginManager.user) {
W.loginManager.events.register("login", null, initializeCameras);
W.loginManager.events.register("loginStatus", null, initializeCameras);
if (!W.loginManager.user) {
return;
}
}
function showAlertPopup(f){
divCameras.style.top = '175px';
divCameras.style.left = '375px';
var attributes = f.attributes;
var reportDetail;
if(attributes.type == "IP"){
reportDetail = '<video width="320" height="240" autoplay controls><source src="' + attributes.url + '" type="video/mp4"></video>'
}
else if(attributes.type == "BRISA"){
reportDetail = '<img src="data:image/png;base64, ' + camaraBrisa + '" />'
}
document.getElementById("divCameras").innerHTML = reportDetail;
divCameras.style.visibility = 'visible';
}
function hideAlertPopup(){
divCameras.style.visibility = 'hidden';
divCameras.style.top = '175px';
divCameras.style.left = '375px';
}
function saveLMAOOptions() {
if (localStorage) {
var options = [];
camerasVisibility = document.getElementById("layer-switcher-item_cameras").checked;
options[0] = camerasVisibility;
localStorage.setItem("WMECameras", JSON.stringify(options));
}
}
function registerKeyShortcut(actionName, callback, keyName) {
I18n.translations[I18n.locale].keyboard_shortcuts.groups['default'].members[keyName] = actionName;
W.accelerators.addAction(keyName, {group: 'default'});
W.accelerators.events.register(keyName, null, callback);
W.accelerators._registerShortcuts({[""]: keyName});
}
var camerasVisibility = true;
Cameras_Layer = new OL.Layer.Vector("Cameras",{
rendererOptions: { zIndexing: true },
uniqueName: '__cameras'
} );
if (localStorage.WMECameras) {
var options = JSON.parse(localStorage.getItem("WMECameras"));
camerasVisibility = options[0];
}
window.addEventListener("beforeunload", saveLMAOOptions, false);
var otherGroupSelector = document.getElementById('layer-switcher-group_display');
if (otherGroupSelector !== null) {
var otherGroup = otherGroupSelector.parentNode.parentNode.parentNode.parentNode.getElementsByTagName("UL")[0];
var toggler = document.createElement('li');
var togglerContainer = document.createElement('div');
togglerContainer.className = 'wz-checkbox';
var checkbox = document.createElement('input');
checkbox.type = 'checkbox';
checkbox.id = 'layer-switcher-item_cameras';
checkbox.className = 'toggle';
checkbox.checked = Cameras_Layer.getVisibility();
checkbox.addEventListener('click', function(e) {
Cameras_Layer.setVisibility(e.target.checked);
});
otherGroupSelector.addEventListener('click', function(e) {
Cameras_Layer.setVisibility(e.target.checked & checkbox.checked);
checkbox.disabled = !e.target.checked;
});
togglerContainer.appendChild(checkbox);
var label = document.createElement('label');
label.htmlFor = checkbox.id;
var labelText = document.createElement('span');
labelText.className = 'label-text';
labelText.appendChild(document.createTextNode("Cameras"));
label.appendChild(labelText);
togglerContainer.appendChild(label);
toggler.appendChild(togglerContainer);
otherGroup.appendChild(toggler);
}
W.map.addControl(new OL.Control.DrawFeature(Cameras_Layer, OL.Handler.Path));
W.map.addLayer(Cameras_Layer);
Cameras_Layer.setVisibility(camerasVisibility);
getCameras();
var divPopupCheck = document.getElementById('divCameras');
if (divPopupCheck === null){
var divCameras = document.createElement('div');
divCameras.id = "divCameras";
divCameras.style.position = 'absolute';
divCameras.style.visibility = 'hidden';
divCameras.style.top = '175px';
divCameras.style.left = '375px';
divCameras.style.zIndex = 1000;
divCameras.style.backgroundColor = 'aliceblue';
divCameras.style.borderWidth = '3px';
divCameras.style.borderStyle = 'ridge';
divCameras.style.borderRadius = '10px';
divCameras.style.boxShadow = '5px 5px 10px Silver';
divCameras.style.padding = '4px';
document.body.appendChild(divCameras);
}
W.map.events.register("mousemove", W.map, function(e) {
hideAlertPopup();
var position = this.events.getMousePosition(e);
var lmaoLayer = checkLayerNum();
if(W.map.layers[lmaoLayer].features.length > 0){
var alertFeatures = W.map.layers[lmaoLayer];
for(var j = 0; j < W.map.layers[lmaoLayer].features.length; j++){
var alertX = alertFeatures.features[j].attributes.pixel.x;
var alertY = alertFeatures.features[j].attributes.pixel.y;
if(Cameras_Layer.getVisibility() === true && position.x > alertX - 10 && position.x < alertX + 10 && position.y > alertY - 10 && position.y < alertY + 20){
showAlertPopup(alertFeatures.features[j]);
}
}
}
});
W.map.events.register("zoomend", null, getCameras);
W.map.events.register("moveend", null, getCameras);
}