Greasy Fork is available in English.

Wegstatus Polyline Selector

Adds a link in the segment-panel to grab the polyline.

// ==UserScript==
// @name         Wegstatus Polyline Selector
// @namespace    https://wegstatus.nl
// @version      2020.06.08.02
// @description  Adds a link in the segment-panel to grab the polyline.
// @author       Xander "Xanland" Hoogland & Sjors "GigaaG" Luyckx
// @include      /^https:\/\/(www|beta)\.waze\.com\/(?!user\/)(.{2,6}\/)?editor([^\/]?.*)?$/
// @require     https://greasyfork.org/scripts/24851-wazewrap/code/WazeWrap.js

// ==/UserScript==

(function () {
    const copyText = 'Click to copy';
    $('head').append('<style type="text/css">#grab-polyline { background-image: url(https://www.wegstatus.nl/favicon-16x16.png); background-repeat: no-repeat; background-size: 20px 20px; background-position-x: 32%; background-position-y: 40%;}</style>');
    //$('head').append('<style type="text/css">#reverse-segment { background-image: url(https://www.wegstatus.nl/favicon-16x16.png); background-repeat: no-repeat; background-size: 20px 20px; background-position-x: 32%; background-position-y: 40%;}</style>');

    function bootstrap(tries = 1) {
        if (W && W.map &&
            W.model && W.loginManager.user &&
            $ ) {
            init();
        } else if (tries < 1000)
            setTimeout(function () {bootstrap(tries++);}, 200);
    }

    function init(){
        var targetNode = document.querySelector("#edit-panel");
        // Options for the observer (which mutations to observe)
        var config = {
            childList: true,
            subtree: true,
            attributes: true,
            characterData: true
        };
        // Callback function to execute when mutations are observed
        var callback = function(mutationsList, observer) {
            const selectedItemsCount = W.selectionManager.getSelectedFeatures().length
            const streetName = document.getElementsByClassName('full-address')[0].innerText
            if (selectedItemsCount >= 1) {
                if ($("#grab-polyline").length == 0){
                    // Easy hack to show the button in F(ix)U(I)
                    const $fuButtons = $('#edit-panel .more-actions');
                    if ($fuButtons.css('display') == 'inline-flex') {
                        $fuButtons.css('display', 'initial');
                        $('head').append('<style type="text/css">#grab-polyline { background-position-x: 10%; }</style>');
                        $('head').append('<style type="text/css">#reverse-segment { background-position-x 10%; </style>');
                    }
                    $('#segment-edit-general > div.form-group.more-actions').append('<div class="edit-house-numbers-btn-wrapper"><button class="action-button waze-btn waze-btn-white" id="grab-polyline" title="' + copyText + '"><span style="margin-left: 15px">Grab polyline</span></button><textarea id="grab-polyline-textarea" style="display:none"></textarea></div>');
                    $('#segment-edit-general > div.form-group.more-actions').append('<div class="edit-house-numbers-btn-wrapper"><button class="action-button waze-btn waze-btn-white" id="reverse-segment" title="🔄 Reverse segment"><span style="margin-left: 15px">🔄 Reverse segment</span></button><textarea id="reverse-segment-textarea" style="display:none"></textarea></div>');

                    $('#grab-polyline').tooltip({ trigger: 'hover' });
                    $('#reverse-segment').tooltip({ trigger: 'hover' });
                    addClickHanderForGrabPolylineButton();

                }
            } else {
                $('#grab-polyline').parent().remove();
            }

            if (selectedItemsCount > 1){
                $('#reverse-segment').parent().remove();
            }

            //if (streetName.includes("No common street")){
            //    $('#grab-polyline').parent().remove();
            //}
        };

        // Create an observer instance linked to the callback function
        var observer = new MutationObserver(callback);

        // Start observing the target node for configured mutations
        observer.observe(targetNode, config);
    }

    function reverseArr(input) {
        var ret = new Array;
        for(var i = input.length-1; i >= 0; i--) {
            ret.push(input[i]);
        }
        return ret;
    }

    function addClickHanderForGrabPolylineButton() {
        $('#grab-polyline').click(function () {
            var features = W.selectionManager.getSegmentSelection().segments
            var countSegments = features.length
            var polyline = '';
            var fromNode = '';
            var toNode = '';

            for (var i = 0; i < countSegments; i++){
                var component = features[i].geometry.components

                if (i === 0){
                    if (features[i].attributes.fwdDirection == false && features[i].attributes.revDirection == true){
                        component = reverseArr(component);
                        fromNode = features[i].attributes.toNodeID;
                    } else {
                        fromNode = features[i].attributes.fromNodeID;
                    }
                } else {
                    fromNode = features[i].attributes.fromNodeID;
                }

                if (toNode != '' && fromNode != toNode){
                    component = reverseArr(component);
                    toNode = features[i].attributes.fromNodeID;
                } else {
                    toNode = features[i].attributes.toNodeID;
                }

                var points = component.length;
                for (var p = 0 ; p < points ; p++){
                    var coordinates = component[p].clone().transform(W.map.getProjectionObject(), 'EPSG:4326');
                    var x = coordinates.x
                    var y = coordinates.y
                    var latlon = ''+ y +' '+ x +' ';
                    polyline += latlon
                }

            }

            $('#grab-polyline-textarea').val(polyline.trim());
            const copyText = document.querySelector("#grab-polyline-textarea");
            $('#grab-polyline-textarea').show();
            copyText.select();
            document.execCommand("copy");
            $('#grab-polyline-textarea').hide();
            $('#grab-polyline').next(".tooltip").find(".tooltip-inner").text('Polyline copied!');
            setTimeout(function () {
                $('#grab-polyline').next(".tooltip").find(".tooltip-inner").text('Click to copy');
            }, 3000);
        });

        $('#reverse-segment').click(function () {
            W.selectionManager.getSegmentSelection().segments[0].geometry.components.reverse()
            $('#reverse-segment').next(".tooltip").find(".tooltip-inner").text('Segment reversed!');
            setTimeout(function () {
                $('#reverse-segment').next(".tooltip").find(".tooltip-inner").text('Click to reverse.');
            }, 3000);
        });
    }

    bootstrap();
})();