WME Add addresses for places

Добавление альтернативных названий (адресов)

目前为 2016-04-25 提交的版本,查看 最新版本

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