WME RTC Improvements

Adds several helpful features to RTC handling in the Waze Map Editor

Per 15-06-2016. Zie de nieuwste versie.

Voor het installeren van scripts heb je een extensie nodig, zoals Tampermonkey, Greasemonkey of Violentmonkey.

Voor het installeren van scripts heb je een extensie nodig, zoals {tampermonkey_link:Tampermonkey}.

Voor het installeren van scripts heb je een extensie nodig, zoals Tampermonkey of Violentmonkey.

Voor het installeren van scripts heb je een extensie nodig, zoals Tampermonkey of Userscripts.

Voor het installeren van scripts heb je een extensie nodig, zoals {tampermonkey_link:Tampermonkey}.

Voor het installeren van scripts heb je een gebruikersscriptbeheerder nodig.

(Ik heb al een user script manager, laat me het downloaden!)

Voor het installeren van gebruikersstijlen heb je een extensie nodig, zoals {stylus_link:Stylus}.

Voor het installeren van gebruikersstijlen heb je een extensie nodig, zoals {stylus_link:Stylus}.

Voor het installeren van gebruikersstijlen heb je een extensie nodig, zoals {stylus_link:Stylus}.

Voor het installeren van gebruikersstijlen heb je een gebruikersstijlbeheerder nodig.

Voor het installeren van gebruikersstijlen heb je een gebruikersstijlbeheerder nodig.

Voor het installeren van gebruikersstijlen heb je een gebruikersstijlbeheerder nodig.

(Ik heb al een beheerder - laat me doorgaan met de installatie!)

// ==UserScript==
// @name            WME RTC Improvements
// @description     Adds several helpful features to RTC handling in the Waze Map Editor
// @namespace       vaindil
// @version         1.1.7
// @grant           none
// @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/*
// @exclude         https://www.waze.com/user/*
// @exclude         https://www.waze.com/*/user/*
// @author          vaindil
// ==/UserScript==

var firstrun = true;
var ls = [];
var dmins = 120;
var dstr = '2';

switch (I18n.locale) {
    case 'es':
        ls.locale = 'es';
        ls.name = 'RTC Mejoras';
        ls.prefs = 'Defecto accidente duración (minutos)';
        ls.xdays = 'Expirará en X días';
        ls.crash = 'Accidente';
        ls.invalidstart = 'Fecha de inicio no es válida';
        ls.notint = 'No es untero válido';
        ls.neg = 'No puede ser negativo';
        ls.prefdefault = 'Defecto: ' + dstr + ' hrs';
        ls.preffuture = 'No se puede establecer más de 180 días en el futuro';
        ls.daysing = 'día';
        ls.daypl = 'días';
        ls.hoursing = 'hr';
        ls.hourpl = 'hrs';
        ls.minsing = 'min';
        ls.minpl = 'mins';
        break;
    case 'fr':
        ls.locale = 'fr';
        ls.name = 'RTC Améliorations';
        ls.prefs = 'Défaut crash durée (minutes)';
        ls.xdays = 'Expirer en X jours';
        ls.crash = 'Crash';
        ls.invalidstart = 'Date de début est invalide';
        ls.notint = 'Pas un entier valide';
        ls.neg = 'Vous ne pouvez pas être négatif';
        ls.prefdefault = 'Défaut: ' + dstr + ' heures';
        ls.preffuture = 'Ne peut pas être réglé plus de 180 jours dans le futur';
        ls.daysing = 'journée';
        ls.daypl = 'journées';
        ls.hoursing = 'heure';
        ls.hourpl = 'heures';
        ls.minsing = 'min';
        ls.minpl = 'mins';
        break;
    case 'de':
        ls.locale = 'de';
        ls.name = 'RTC Verbesserungen';
        ls.prefs = 'Standard Absturz Dauer (minuten)';
        ls.xdays = 'in X Tagen verfallen';
        ls.crash = 'Absturz';
        ls.invalidstart = 'Startdatum ist ungültig';
        ls.notint = 'Keine gültige ganze Zahl';
        ls.neg = 'Kann nicht negativ sein';
        ls.prefdefault = 'Default: ' + dstr + ' std';
        ls.preffuture = 'Es können nicht mehr als 180 Tage in der Zukunft festgelegt werden';
        ls.daysing = 'Tag';
        ls.daypl = 'Tagen';
        ls.hoursing = 'std';
        ls.hourpl = 'std';
        ls.minsing = 'min';
        ls.minpl = 'min';
        break;
    case 'it':
        ls.locale = 'it';
        ls.name = 'RTC Miglioramenti';
        ls.prefs = 'Predefinito schianto durata (minuti)';
        ls.xdays = 'Scade in X giorni';
        ls.crash = 'Schianto';
        ls.invalidstart = 'Data di inizio non è valida';
        ls.notint = 'Non un intero valido';
        ls.neg = 'Non può essere negativo';
        ls.prefdefault = 'Predefinito: ' + dstr + ' ore';
        ls.preffuture = 'Non può essere impostato più di 180 giorni per il futuro';
        ls.daysing = 'day';
        ls.daypl = 'days';
        ls.hoursing = 'ora';
        ls.hourpl = 'ore';
        ls.minsing = 'min';
        ls.minpl = 'min';
        break;
    default:
        ls.locale = 'en';
        ls.name = 'RTC Improvements';
        ls.prefs = 'Default crash length (minutes)';
        ls.xdays = 'Expire in X days';
        ls.crash = 'Crash';
        ls.invalidstart = 'Start date is invalid';
        ls.notint = 'Not a valid integer';
        ls.neg = 'Cannot be negative';
        ls.prefdefault = 'Default: ' + dstr + ' hrs';
        ls.preffuture = 'Can\'t be set more than 180 days in the future';
        ls.daysing = 'day';
        ls.daypl = 'days';
        ls.hoursing = 'hr';
        ls.hourpl = 'hrs';
        ls.minsing = 'min';
        ls.minpl = 'mins';
}

function welcomeToTheJungle() {
    try {
        var element = $('#sidepanel-prefs');
        if ($(element).length) {
            letsAGo();
        } else {
            setTimeout(welcomeToTheJungle, 1000);
        }
    } catch (err) {
        console.log("RTCENH - " + err);
        setTimeout(welcomeToTheJungle, 1000);
    }
}

welcomeToTheJungle();

function letsAGo() {
    $(document).on('mouseover', 'div.add-closure-button.btn.btn-pastrama.btn-positive', function() {
        $(document).off('mouseover.RTCXdays');
        $(document).on('mouseover.RTCXdays', 'div.edit-closure.new', function() {
            justDewIt();
            $(document).off('mouseover.RTCXdays');
        });
    });

    $(document).on('input.RTCXdaysfield', 'input#expireinXdays', timeAndRelativeDimensionInSpace);
    $(document).on('click.RTCXdayscrash', 'div#RTCXdayscrash', ohNoes);

    $('#sidepanel-prefs').append('<hr />' +
                                 '<h4 style="font-size:13px">' + ls.name + '<br />' + ls.prefs + '</h4>' +
                                 '<input type="number" class="form-control" id="RTCimprovcrashdays" />' +
                                 '<span style="font-weight:bold" id="RTCimprovprefsmsg"></span>' +
                                 '<hr />');
    thisIsWhatYouWanted();
    $(document).on('input.RTCXdaysprefs', 'input#RTCimprovcrashdays', thisIsWhatYouWanted);
}

function justDewIt() {
    $('div.edit-closure.new > form.form > div.checkbox').before(
        '<div class="form-group">' +
            '<label class="control-label">' + ls.xdays + '</label>' +
            '<div class="controls">' +
                '<input type="number" length="3" maxlength="4" class="form-control" id="expireinXdays" />' +
            '</div>' +
        '</div>' +
        '<span id="RTCimprovXdaysmsg" style="color:red;font-weight:bold"></span>'
    );

    $('div.action-buttons').append(
        '<div class="btn btn-danger" id="RTCXdayscrash" style="float:right"><i class="fa fa-exclamation-triangle"></i>  ' + ls.crash + '</div>'
    );


    $('input[name="closure_endDate"]').datepicker('remove');
    $('input[name="closure_endDate"]').datepicker({ format: 'yyyy-mm-dd', todayHighlight: true, autoclose: true, language: ls.locale });
}

function timeAndRelativeDimensionInSpace() {
    var newdate = new Date();
    if ($('input[name="closure_startDate"]').val() !== '') {
        var p = $('input[name="closure_startDate"]').val().split('-');
        var y = Number(p[0]);
        var m = Number(p[1]);
        var d = Number(p[2]);
        if (!Number.isInteger(y) || isNaN(y) || !Number.isInteger(m) || isNaN(m) || !Number.isInteger(d) || isNaN(d)) {
            $('#RTCimprovXdaysmsg').text(ls.invalidstart);
            return;
        }
        newdate = new Date(y, m - 1, d);
    }
    var v = Number($('#expireinXdays').val());
    if (!Number.isInteger(v) || isNaN(v)) {
        $('#RTCimprovXdaysmsg').text('');
        return;
    }

    if (v === 0) {
        $('#RTCimprovXdaysmsg').text(ls.notint);
        return;
    }

    if (v < 0) {
        $('#RTCimprovXdaysmsg').text(ls.neg);
        return;
    }

    $('#RTCimprovXdaysmsg').text('');
    newdate.setDate(newdate.getDate() + v);
    $('input[name="closure_endDate"]').datepicker('update', newdate);
    if ($('input[name="closure_endTime"]').val() === '')
        $('input[name="closure_endTime"]').timepicker('setTime', '05:00');
}

function ohNoes() {
    $('input[name="closure_reason"]').val(ls.crash);
    var delay = Number(localStorage.getItem('RTCimprovcrashmins'));
    if (!Number.isInteger(delay) || isNaN(delay) || delay === 0 || delay === '0')
        delay = dmins;
    var cur = new Date();
    cur.setMinutes(cur.getMinutes() + delay);
    $('input[name="closure_endDate"]').datepicker('update', cur);
    $('input[name="closure_endTime"]').timepicker('setTime', (('0' + cur.getHours()).slice(-2)) + ':' + (('0' + cur.getMinutes()).slice(-2)));
}

function thisIsWhatYouWanted() {
    var v;
    if (firstrun) {
        v = localStorage.getItem('RTCimprovcrashmins');
        firstrun = false;
    }
    else
        v = $('input#RTCimprovcrashdays').val();

    v = Number(v);
    if (isNaN(Number(v)) || !Number.isInteger(v) || v === 0 || v === '0') {
        localStorage.setItem('RTCimprovcrashmins', dmins);
        $('#RTCimprovprefsmsg').css('color', 'green').text(ls.prefdefault);
        return;
    }
    if (!Number.isInteger(v) || isNaN(v)) {
        localStorage.setItem('RTCimprovcrashmins', dmins);
        $('#RTCimprovprefsmsg').css('color', 'red').text(ls.notint);
        return;
    }
    if (v < 0) {
        localStorage.setItem('RTCimprovcrashmins', dmins);
        $('#RTCimprovprefsmsg').css('color', 'red').text(ls.neg);
        return;
    }
    if (v > 259200) {
        localStorage.setItem('RTCimprovcrashmins', dmins);
        $('#RTCimprovprefsmsg').css('color', 'red').text(ls.preffuture);
        return;
    }
    localStorage.setItem('RTCimprovcrashmins', v);
    $('input#RTCimprovcrashdays').val(v);
    var min = v % 60;
    var hrso = (v - min) / 60;
    var hrsf = hrso % 24;
    var days = (hrso - hrsf) / 24;
    var ms = min !== 1 ? ls.minpl : ls.minsing;
    var hs = hrsf !== 1 ? ls.hourpl : ls.hoursing;
    var ds = days !== 1 ? ls.daypl : ls.daysing;
    $('#RTCimprovprefsmsg').css('color', 'green').text(days + ' ' + ds + ', ' + hrsf + ' ' + hs + ', ' + min + ' ' + ms);
}