// ==UserScript==
// @name WAZEPT Segments modded
// @version 2024.04.02.01
// @description Facilitates the standardization of segments for Left hand traffic
// @author J0N4S13 / kid4rm90s
// @include /^https:\/\/(www|beta)\.waze\.com\/(?!user\/)(.{2,6}\/)?editor.*$/
// @exclude https://www.waze.com/user/*editor/*
// @exclude https://www.waze.com/*/user/*editor/*
// @grant none
// @namespace https://greasyfork.org/en/users/1087400-dev-ratna-shakya
// @downloadURL none
// ==/UserScript==
(function() {
var version = GM_info.script.version;
var roads_id = [3,4,6,7,2,1,22,8,20,17,15,18,19];
var pedonal_id = [5,10,16];
var array_config_script = {};
var array_config_country = {};
var array_language_original = {};
var array_language_country = {};
var language = {};
var indexselected = "";
var valueselected = "";
var array_roads = {};
var last_node_A = null;
var last_node_B = null;
var last_coord_esquerda_first = null;
var last_coord_esquerda_last = null;
var last_coord_direita_first = null;
var last_coord_direita_last = null;
var sentido_base = null;
function bootstrap() {
if (typeof W === 'object' && W.userscripts?.state.isReady) {
init();
} else {
document.addEventListener('wme-ready', init, { once: true });
}
}
async function init() {
var result = await getLanguages();
result = await getConfigsScript();
if(array_config_script[W.model.getTopCountry().attributes.abbr] !== undefined)
result = await getConfigsCountry(array_config_script[W.model.getTopCountry().attributes.abbr]);
setTimeout(() => {
W.selectionManager.events.register('selectionchanged', null, selectedFeature);
selectedFeature();
}, 250);
}
function selectedFeature(){
var typeData = null;
setTimeout(() => {
if(typeof W.selectionManager.getSelectedFeatures()[0] != 'undefined')
typeData = W.selectionManager.getSelectedFeatures()[0]._wmeObject.type;
if (typeData == "segment")
{
myTimer();
if(W.loginManager.getUserRank() >= 3)
insertButtons();
}
}, 100)
}
function getConfigsScript() {
return new Promise(resolve => {
fetch('https://docs.google.com/spreadsheets/d/1CVtRxJqQHlHX-uNZXNBL1xDZF3nBa2_u4J6zRhvs2F8/gviz/tq?tqx=out:json&sheet=Config')
.then(res => res.text())
.then(text => {
const json = JSON.parse(text.substr(47).slice(0, -2))
let first = false;
$(json.table.rows).each(function(){
if(first == false)
{
first = true;
return;
}
array_config_script[verifyNull(this["c"][0])] = verifyNull(this["c"][1]);
});
})
var timer = setInterval(check_data, 100);
function check_data() {
if(Object.keys(array_config_script).length > 0 && W.model.getTopCountry() != null)
{
clearInterval(timer);
resolve('true');
}
}
});
}
function getConfigsCountry(link) {
let timeout = 0;
return new Promise(resolve => {
fetch(link)
.then(res => res.text())
.then(text => {
const json = JSON.parse(text.substr(47).slice(0, -2))
$(json.table.rows).each(function(){
if(verifyNull(this["c"][0]) == true)
{
var elem = [verifyNull(this["c"][4]), verifyNull(this["c"][5]), verifyNull(this["c"][6]), verifyNull(this["c"][7]), verifyNull(this["c"][8])];
array_config_country[verifyNull(this["c"][1])] = elem;
array_roads[verifyNull(this["c"][1])] = [verifyNull(this["c"][2]), verifyNull(this["c"][3])];
}
});
})
var timer = setInterval(check_data, 100);
function check_data() {
if(Object.keys(array_config_country).length > 0 || timeout >= 20)
{
clearInterval(timer);
resolve('true');
}
timeout = timeout + 1;
}
});
}
function getLanguages() {
let timeout = 0;
return new Promise(resolve => {
fetch('https://docs.google.com/spreadsheets/d/1cfvkiDDK5mL1CSzAaXWC8oWyqr3us0CQhqIPegq7Q3g/gviz/tq?tqx=out:json')
.then(res => res.text())
.then(text => {
const json = JSON.parse(text.substr(47).slice(0, -2))
let first = false;
$(json.table.rows).each(function(){
if(first == false)
{
first = true;
return;
}
if(verifyNull(this["c"][0]) == "Original String")
{
array_language_original["btnSplit"] = verifyNull(this["c"][1]);
array_language_original["strMeters"] = verifyNull(this["c"][2]);
array_language_original["strDistance"] = verifyNull(this["c"][3]);
array_language_original["strSelMoreSeg"] = verifyNull(this["c"][4]);
}
if(verifyNull(this["c"][0]).toLowerCase() == JSON.parse(localStorage.getItem("editorLocation"))["locale"].toLowerCase())
{
array_language_country["btnSplit"] = verifyNull(this["c"][1]);
array_language_country["strMeters"] = verifyNull(this["c"][2]);
array_language_country["strDistance"] = verifyNull(this["c"][3]);
array_language_country["strSelMoreSeg"] = verifyNull(this["c"][4]);
}
});
})
var timer = setInterval(check_data, 100);
function check_data() {
if(Object.keys(array_language_original).length > 0 || timeout >= 20)
{
if(Object.keys(array_language_country).length == 0)
language = array_language_original;
$.each(array_language_country, function(code, string) {
if(string == "")
language[code] = array_language_original[code];
else
language[code] = array_language_country[code];
});
clearInterval(timer);
resolve('true');
}
timeout = timeout + 1;
}
});
}
function myTimer() {
var n_bloqueio;
var nivel;
var lvl_atual;
var lvl_max;
if (!$("#signsroad").length) {
var signsroad = document.createElement("div");
signsroad.id = 'signsroad';
var btnAB = document.createElement("button");
btnAB.innerHTML = 'A->B';
btnAB.id = 'btnAB';
btnAB.style.cssText = 'height: 20px;font-size:11px';
btnAB.onclick = function() {
let myRoad = W.selectionManager.getSelectedFeatures()[0]._wmeObject.attributes;
if(myRoad.fwdDirection == true) //A to B
{
let center = new OpenLayers.LonLat(W.map.getCenter().lon, W.map.getCenter().lat)
.transform(new OpenLayers.Projection("EPSG:900913"), new OpenLayers.Projection("EPSG:4326"));
var $temp = $("");
$("body").append($temp);
$temp.val(center.lon.toString().slice(0,8) + "," + center.lat.toString().slice(0,8) + "|" + W.selectionManager.getSelectedFeatures()[0]["attributes"]["wazeFeature"]["_wmeObject"]["attributes"]["attributes"]["id"] + "|" + "TRUE" + "|" + getPermalink() + "|" + myRoad.fromNodeID + "|" + myRoad.toNodeID).select();
document.execCommand("copy");
$temp.remove();
}
}
var btnBA = document.createElement("button");
btnBA.innerHTML = 'B->A';
btnBA.id = 'btnBA';
btnBA.style.cssText = 'height: 20px;font-size:11px';
btnBA.onclick = function() {
let myRoad = W.selectionManager.getSelectedFeatures()[0]._wmeObject.attributes;
if(myRoad.revDirection == true) //B to A
{
let center = new OpenLayers.LonLat(W.map.getCenter().lon, W.map.getCenter().lat)
.transform(new OpenLayers.Projection("EPSG:900913"), new OpenLayers.Projection("EPSG:4326"));
var $temp = $("");
$("body").append($temp);
$temp.val(center.lon.toString().slice(0,8) + "," + center.lat.toString().slice(0,8) + "|" + W.selectionManager.getSelectedFeatures()[0]["attributes"]["wazeFeature"]["_wmeObject"]["attributes"]["id"] + "|" + "FALSE" + "|" + getPermalink() + "|" + myRoad.toNodeID + "|" + myRoad.fromNodeID).select();
document.execCommand("copy");
$temp.remove();
}
}
var divSentidos = document.createElement("div");
divSentidos.id = 'divSentidos';
divSentidos.appendChild(btnAB);
divSentidos.appendChild(btnBA);
var divLandmarkScript = document.createElement("div");
divLandmarkScript.id = 'divLandmarkScript';
divLandmarkScript.style.cssText = 'float:left;';
divLandmarkScript.appendChild(signsroad);
divLandmarkScript.appendChild(divSentidos);
$("div #segment-edit-general").prepend(divLandmarkScript);
$("div #segment-edit-general .address-edit").css("display", "inline-block");
$( "#divSentidos" ).hide();
}
}
function defineSpeed (segment, speed) {
let UpdateObject= require("Waze/Action/UpdateObject");
if(segment.attributes.fwdMaxSpeed == null && segment.attributes.fwdMaxSpeed == null)
W.model.actionManager.add(new UpdateObject(segment, {'fwdMaxSpeed': speed, 'revMaxSpeed': speed}));
else if(segment.attributes.fwdMaxSpeed == null)
W.model.actionManager.add(new UpdateObject(segment, {'fwdMaxSpeed': speed}));
else if(segment.attributes.fwdMaxSpeed == null)
W.model.actionManager.add(new UpdateObject(segment, {'revMaxSpeed': speed}));
}
function defineRoadType (segment, type) {
let UpdateObject= require("Waze/Action/UpdateObject");
W.model.actionManager.add(new UpdateObject(segment, {'roadType': type}));
}
function defineLockRankRoad (segment, rank) {
let UpdateObject= require("Waze/Action/UpdateObject");
rank--;
var bloquear;
if(W.loginManager.user.rank >= rank)
bloquear = rank;
else
bloquear = W.loginManager.user.rank;
let lock = segment.attributes.lockRank;
if(lock < bloquear)
W.model.actionManager.add(new UpdateObject(segment, {'lockRank': bloquear}));
}
function convertSegmentType(segment) {
let AddSegment = require("Waze/Action/AddSegment");
let FeatureVectorSegment = require("Waze/Feature/Vector/Segment");
let DeleteSegment = require("Waze/Action/DeleteSegment");
let ModifyAllConnections = require("Waze/Action/ModifyAllConnections");
let UpdateObject = require("Waze/Action/UpdateObject");
let ConnectSegment = require("Waze/Action/ConnectSegment");
var newseg1=new FeatureVectorSegment({geometry:segment.attributes.geometry});
newseg1.copyAttributes(segment);
newseg1.attributes.roadType=parseInt(array_config_country[indexselected][2]);
newseg1.attributes.lockRank=null;
newseg1.setID(null);
W.model.actionManager.add(new DeleteSegment(segment));
let action = new AddSegment(newseg1);
W.model.actionManager.add(action);
let seg = W.model.segments.getObjectById(action.segmentAttributes.id);
if(roads_id.includes(seg.attributes.roadType))
{
W.model.actionManager.add(new UpdateObject(seg,{fwdTurnsLocked:true,revTurnsLocked:true}))
if(seg.getFromNode() != null)
W.model.actionManager.add(new ConnectSegment(seg.getFromNode(),newseg1));
if(seg.getToNode() != null)
W.model.actionManager.add(new ConnectSegment(seg.getToNode(),newseg1));
if(seg.getFromNode() != null)
W.model.actionManager.add(new ModifyAllConnections(seg.getFromNode(),true));
if(seg.getToNode() != null)
W.model.actionManager.add(new ModifyAllConnections(seg.getToNode(),true));
}
return seg;
}
// Split Segments
function insertButtons() {
if (typeof W.loginManager != 'undefined' && !W.loginManager.isLoggedIn()) {
return;
}
if (W.selectionManager.getSelectedFeatures().length === 0)
return;
let exit = false;
$.each(W.selectionManager.getSelectedFeatures(), function(i, segment) {
if(segment._wmeObject.attributes.fwdLaneCount != 0 || segment._wmeObject.attributes.revLaneCount != 0)
exit = true;
if(segment._wmeObject.attributes.fwdDirection == false || segment._wmeObject.attributes.revDirection == false)
exit = true;
if(pedonal_id.includes(segment._wmeObject.attributes.roadType))
exit = true;
});
if(exit)
return;
try {
if (document.getElementById('split-segment') !== null)
return;
} catch (e) {}
var btn1 = $('