// ==UserScript==
// @name WME Add addresses for places
// @version 0.13
// @description Добавление альтернативных названий (адресов)
// @author ixxvivxxi
// @include https://www.waze.com/editor/*
// @include https://www.waze.com/*/editor/*
// @include https://editor-beta.waze.com/editor/*
// @include https://editor-beta.waze.com/*/editor/*
// @grant none
// @namespace https://greasyfork.org/ru/scripts/12229-wme-add-alt-address-for-housing
// ==/UserScript==
function altAddress_bootstrap()
{
var bGreasemonkeyServiceDefined = false;
try
{
if ("object" === typeof Components.interfaces.gmIGreasemonkeyService)
{
bGreasemonkeyServiceDefined = true;
}
}
catch (err)
{
//Ignore.
}
if ( "undefined" === typeof unsafeWindow || ! bGreasemonkeyServiceDefined)
{
unsafeWindow = ( function ()
{
var dummyElem = document.createElement('p');
dummyElem.setAttribute ('onclick', 'return window;');
return dummyElem.onclick ();
} ) ();
}
/* begin running the code! */
setTimeout(startAltAddress,999);
}
function startAltAddress() {
var POIaddresses = [];
var POIs = [];
Waze.selectionManager.events.register("selectionchanged", null, showTitle);
var wazeActionAddLandmark = require("Waze/Action/AddLandmark");
var wazeActionUpdateObject = require("Waze/Action/UpdateObject");
var wazeActionDeleteObject = require("Waze/Action/DeleteObject");
var wazeActionUpdateFeatureAddress = require("Waze/Action/UpdateFeatureAddress");
var wazefeatureVectorLandmark = require("Waze/Feature/Vector/Landmark");
var wazefeatureEditorLandmark = require("Waze/Presenter/FeatureEditor/Landmark");
var address;
var selectStreetName = "";
function getPOIs() {
for (var idVenue in Waze.model.venues.objects) {
var venue = Waze.model.venues.objects[idVenue];
var venueAddress = venue.getAddress();
var inPois = false;
//console.log(POIaddresses);
var residential = false;
for (var ic = 0; ic < venue.attributes.categories.length; ic++) {
var category = venue.attributes.categories[ic];
if (category == "PARKING_LOT" || category == "PARK" || category == "RIVER_STREAM" || category == "FOREST_GROVE" || category == "NATURAL_FEATURES" || category == "SEA_LAKE_POOL") {
inPois = true;
}
}
for (var ir = 0; ir < POIs.length; ir++) {
if (POIs[ir].attributes.id.toString().indexOf("-") != -1) {continue;}
if (POIs[ir].attributes.id === idVenue) {
POIs[ir] = venue;
inPois = true;
}
}
if (!inPois) {
POIs.push(venue);
}
}
}
function showTitle() {
if(Waze.selectionManager.selectedItems.length === 0 || Waze.selectionManager.selectedItems.length > 1) return;
if(Waze.selectionManager.selectedItems[0].model.type == "segment") {
if (Waze.selectionManager.selectedItems[0].model.attributes.id.toString().indexOf("-") == -1) {
address = Waze.selectionManager.selectedItems[0].model.getAddress();
//console.log(address);
var title = "Update addresses";
if (address.country.id == 37 || address.country.id == 186) {
title = "Обновить адреса";
}
$('.more-actions').append('<button id="addPOIs" class="action-button btn btn-default">' + title + '</button>');
selectStreetName = address.street.name;
}
}
}
$('#sidebar').on('click', '#addPOIs', function(event) {
event.preventDefault();
addPOIs();
});
function createPOI (poiobject) {
var poi = new wazefeatureVectorLandmark();
var geometry = new OpenLayers.Geometry.Point();
geometry.x = poiobject.x + 2;
geometry.y = poiobject.y + 2;
poi.geometry = geometry;
poi.attributes.categories = ["OTHER"];
poi.attributes.aliases.push(poiobject.houseNumber + " " + poiobject.streetName);
poi.attributes.name = poiobject.houseNumber;
if (poiobject.houseNumber.indexOf("/") != -1) {
poi.attributes.aliases.push(poiobject.houseNumber.replace('/', 'к') + " " + poiobject.streetName);
poi.attributes.aliases.push(poiobject.houseNumber.replace('/', ' корпус ') + " " + poiobject.streetName);
}
Waze.model.actionManager.add(new wazeActionAddLandmark(poi));
var poiAddress = poi.getAddress();
console.log(poiAddress.city.name, poiobject.streetName, poiobject.houseNumber);
if (poiAddress.city == null ) {return;}
var residential = false;
var newAddressAtts={streetName: poiobject.streetName, emptyStreet: false, cityName: poiAddress.city.name, emptyCity: false, stateID: poiAddress.state.id, countryID: poiAddress.country.id};
console.log(newAddressAtts);
Waze.model.actionManager.add(new wazeActionUpdateFeatureAddress(poi, newAddressAtts, {streetIDField: 'streetID'} ));
if (!hasChar(poiobject.houseNumber) && poiobject.houseNumber.indexOf("/") == -1) {
console.log('ПТ');
Waze.model.actionManager.add(new wazeActionUpdateObject(poi, {houseNumber: poiobject.houseNumber, residential: true}));
residential = true;
} else {
Waze.model.actionManager.add(new wazeActionUpdateObject(poi, {houseNumber: poiobject.houseNumber}));
console.log('ПОИ');
}
POIs.push(poi);
}
function addPOIs() {
// $('#toolbar #layer-switcher .reload-button').click();
// setTimeout(function() {
$(".more-actions .edit-house-numbers").click();
setTimeout(function() {
$('#map-lightbox .toolbar .cancel').click();
for (var key in Waze.model.houseNumbers.objects) {
//if (key != address.street.id) {continue;}
if (Waze.model.houseNumbers.objects[key].numbers.length > 0) {
for (var i=0; i<Waze.model.houseNumbers.objects[key].numbers.length; i++) {
console.log(Waze.model.houseNumbers.objects[key].getSegment());
if (Waze.model.houseNumbers.objects[key].getSegment() === undefined) {continue;}
if (Waze.model.houseNumbers.objects[key].getSegment().getAddress().street === null) {continue;}
if (Waze.model.houseNumbers.objects[key].getSegment().getAddress().street.name != address.street.name) {continue;}
var number = Waze.model.houseNumbers.objects[key].numbers[i].number;
var hasPOI = false;
var hasRH = false;
//for (var idVenue in Waze.model.venues.objects) {
for (var ir = 0; ir < POIs.length; ir++) {
var venue = POIs[ir];
var venueAddress = venue.getAddress();
if (venueAddress.street !== null && venueAddress.city !== null && venue.attributes.houseNumber !== undefined) {
//console.log(venue);
//console.log(number , address.street.name, hasPOI, hasPOI);
if (address.city.name == venueAddress.city.name && address.street.name == venueAddress.street.name && number == venue.attributes.houseNumber) {
//console.log(number , POIs[ir].houseNumber, '|', address.street.name , POIs[ir].streetName);
hasPOI = true;
if (venue.attributes.residential !== undefined) {
hasRH = venue.attributes.residential;
}
if (number.indexOf("/") !== -1 || hasChar(number)) {
hasRH = true;
}
}
}
if (venue.geometry.bounds.containsLonLat(Waze.model.houseNumbers.objects[key].numbers[i].geometry.toLonLat()) ) {
console.log('Обновление контура', number, address.street.name, hasPOI, hasRH);
if (venue.attributes.streetID != address.street.id) {
hasPOI = true;
var newAddressAtts={streetName: address.street.name, emptyStreet: false, cityName: address.city.name, emptyCity: false, stateID: address.state.id, countryID: address.country.id};
Waze.model.actionManager.add(new wazeActionUpdateFeatureAddress(venue, newAddressAtts, {streetIDField: 'streetID'} ));
var newAtts = {};
var haveChanges = false;
if (venue.attributes.houseNumber != number.toString() && number.indexOf(" ") == -1) {
newAtts.houseNumber = number;
haveChanges = true;
}
if (venue.attributes.name != number.toString() && venue.attributes.name === "") {
newAtts.name = number;
haveChanges = true;
}
var aliases = venue.attributes.aliases;
if (hasChar(number)) {
hasRH = true;
var length = venue.attributes.aliases.length;
var street = number + " " + address.street.name;
var hasAliasAddress = false;
for (var ia = 0; ia < length; ia++) {
if (street == venue.attributes.aliases[ia]) {
hasAliasAddress = true;
}
}
if (!hasAliasAddress) {
aliases.push(street);
haveChanges = true;
}
if ((address.country.id == 37 || address.country.id == 186) && number.indexOf("/") != -1) {
hasAliasAddress = false;
var street = number.replace('/', 'к') + " " + address.street.name;
for (var ia = 0; ia < length; ia++) {
if (street == venue.attributes.aliases[ia]) {
hasAliasAddress = true;
}
}
if (!hasAliasAddress) {
aliases.push(street);
haveChanges = true;
}
hasAliasAddress = false;
var street = number.replace('/', ' корпус ') + " " + address.street.name;
for (var ia = 0; ia < length; ia++) {
if (street == venue.attributes.aliases[ia]) {
hasAliasAddress = true;
}
}
if (!hasAliasAddress) {
aliases.push(street);
haveChanges = true;
}
}
}
if (haveChanges) {
newAtts.aliases = aliases;
Waze.model.actionManager.add(new wazeActionUpdateObject(venue, newAtts));
}
}
}
}
console.log(number, address.street.name, hasPOI, hasRH);
console.log('----------------------');
if (!hasPOI || !hasRH) {
createPOI({
x: Waze.model.houseNumbers.objects[key].numbers[i].geometry.x,
y: Waze.model.houseNumbers.objects[key].numbers[i].geometry.y,
streetName: address.street.name,
houseNumber: number
});
}
}
}
}
}, 3000);
// }, 3000);
}
function addAltNames(arr) {
if ($('.alias-name').length>0) {
$("#landmark-edit-general .aliases-view .delete").click();
}
for (var i = 0; i < arr.length; i++) {
$("#landmark-edit-general .aliases-view .add").click();
var elem;
$('#landmark-edit-general .aliases-view input[type=text]').each(function(index){
if(i == index) {elem = $(this);}
});
elem.val(arr[i]);
elem.change();
}
}
function isChar(number) {
var reg = /([0-9])[А-Яа-я]/;
switch (true) {
case reg.test(number):
return true;
default:
return false;
}
}
function hasChar(number) {
var reg = /[а-яА-Яa-zA-Z/-]/;
switch (true) {
case reg.test(number):
return true;
default:
return false;
}
}
}
altAddress_bootstrap();