WME Assist UA

Check and fix street names for POI and segments. UA fork of original WME Assist

当前为 2024-05-31 提交的版本,查看 最新版本

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         WME Assist UA
// @description  Check and fix street names for POI and segments. UA fork of original WME Assist
// @version      2024.05.31.001
// @namespace    https://greasyfork.org/uk/users/160654-waze-ukraine
// @author       borman84 (Boris Molodenkov), madnut, turbopirate + (add yourself here)
// @grant        GM_xmlhttpRequest
// @connect      google.com
// @connect      script.googleusercontent.com
// @match        https://beta.waze.com/*editor*
// @match        https://www.waze.com/*editor*
// @exclude      https://www.waze.com/*user/*editor/*
// @require      https://rawcdn.githack.com/nextapps-de/winbox/0.2.82/dist/winbox.bundle.min.js#sha256=dfd7e8cc105863d51558637b3671460bee60d3a84af2dd4676ea73fab21258e7
// @icon         data:image/png;base64,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
// ==/UserScript==

/* jshint esversion: 11 */
/* global W */
/* global $ */
/* global require */
/* global OpenLayers */
/* global I18n */

(function () {

    const scriptName = GM_info.script.name;

    function debug(message) {
        if (typeof message === 'string') {
            console.debug(scriptName + " DEBUG: " + message);
        } else {
            console.debug(scriptName + " DEBUG: ", message);
        }
    }

    function info(message) {
        if (typeof message === 'string') {
            console.log(scriptName + " INFO: " + message);
        } else {
            console.log(scriptName + " INFO: ", message);
        }
    }

    function warning(message) {
        if (typeof message === 'string') {
            console.warn(scriptName + " WARN: " + message);
        } else {
            console.warn(scriptName + " WARN: ", message);
        }
    }

    function series(array, start, action, alldone) {
        var helper = function (i) {
            if (i < array.length) {
                action(array[i], function () {
                    helper(i + 1);
                });
            } else {
                if (alldone) {
                    alldone();
                }
            }
        };

        helper(start);
    }

    function run_wme_assist() {
        const supportedRulesVersion = "1.1";
        const requestsTimeout = 20000; // in ms
        const rulesHash = "AKfycbyCR85UB-OexWIcN2pkTV1828bf0M6hUXkfHmu79M50PW3LMjpXkZ4ynRUzf2AOJqQqBA";
        let rulesDB = {};

        function displayHtmlPage(res) {
            if (res.responseText.match(/Authorization needed/) || res.responseText.match(/ServiceLogin/)) {
                alert(scriptName + ":\n" +
                    "Authorization is required for using this script. This is one time action.\n" +
                    "Now you will be redirected to the authorization page, where you'll need to approve request.\n" +
                    "After confirmation, please close the page and reload WME.");
            }
            let w = window.open();
            w.document.open();
            w.document.write(res.responseText);
            w.document.close();
            w.location = res.finalUrl;
        }

        function validateHTTPResponse(res) {
            let result = false,
            displayError = true;
            if (res) {
                switch (res.status) {
                case 200:
                    displayError = false;
                    if (res.responseHeaders.match(/content-type: application\/json/i)) {
                        result = true;
                    } else if (res.responseHeaders.match(/content-type: text\/html/i)) {
                        displayHtmlPage(res);
                    }
                    break;
                default:
                    displayError = false;
                    alert(scriptName + " Error: unsupported status code - " + res.status);
                    info(res.responseHeaders);
                    info(res.responseText);
                    break;
                }
            } else {
                displayError = false;
                alert(scriptName + " error: Response is empty!");
            }

            if (displayError) {
                alert(scriptName + ": Error processing request. Response: " + res.responseText);
            }
            return result;
        }

        function requestRules(callbackFunc) {
            GM_xmlhttpRequest({
                url: 'https://script.google.com/macros/s/' + rulesHash + '/exec?func=getStreetRules&user=' + W.loginManager.user.getUsername(),
                method: 'GET',
                timeout: requestsTimeout,
                onload: function (res) {
                    if (validateHTTPResponse(res)) {
                        let out = JSON.parse(res.responseText);
                        if (out.result == "success") {
                            info("Rules format version: " + out.version);
                            if (out.version == supportedRulesVersion) {
                                rulesDB = out.rules;
                            } else {
                                alert(scriptName + ": Table rules format version is not supported!\nPlease, update Assist script to newer version.");
                            }
                        } else {
                            alert(scriptName + ": Error getting rules!");
                        }
                    }
                    callbackFunc();
                },
                ontimeout: function (res) {
                    alert(scriptName + ": Sorry, request timeout!");
                },
                onerror: function (res) {
                    alert(scriptName + ": Sorry, request error!");
                }
            });
        }

        var Rule = function (comment, func, variant) {
            this.comment = comment;
            this.correct = func;
            this.variant = variant;
        };

        var CustomRule = function (oldname, newname) {
            var title = '/' + oldname + '/ ➤ ' + newname;
            this.oldname = oldname;
            this.newname = newname;
            this.custom = true;
            $.extend(this, new Rule(title, function (text) {
                    return text.replace(new RegExp(oldname), newname);
                }));
        };

        var ExperimentalRule = function (comment, func) {
            this.comment = comment;
            this.correct = func;
            this.experimental = true;
        };

        var Rules = function () {
            var rules_basicCommon = function () {
                return [
                    new Rule('Unbreak space in street name', function (text) {
                        return text.replace(/\s+/g, ' ');
                    }),
                    new Rule('ACUTE ACCENT in street name', function (text) {
                        return text.replace(/\u0301|\u0300/g, '');
                    }),
                    new Rule('Dash in street name', function (text) {
                        return text.replace(/\u2010|\u2011|\u2012|\u2013|\u2014|\u2015|\u2043|\u2212|\u2796/g, '-');
                    }),
                    new Rule('No space after the word', function (text) {
                        return text.replace(/\.(?!\s)(.+)/g, '. $1');
                    }),
                    new Rule('No space after the >', function (text) {
                        return text.replace(/>(?!\s)/g, '> ');
                    }),
                    new Rule('Garbage dot', function (text) {
                        return text.replace(/(^|\s+)\./g, '$1');
                    }),
                ];
            };

            var rules_UA = function () {
                var hasCyrillic = function (s) {
                    return s.search(/[а-яіїєґ]/i) != -1;
                };
                var hasShortStatus = function (s) {
                    return s.search(/( |^)(вул\.|просп\.|мкрн\.|наб\.|пров\.|ст\.|пр\.|б-р|р-н)( |$)/i) != -1;
                };
                var hasLongStatus = function (s) {
                    return s.search(/( |^)(площа|алея|шосе|тракт|узвіз|тупик|міст|в\'їзд|виїзд|виїзд|розворот|трамвай|залізниця|майдан|заїзд|траса|дорог[аи]|шляхопровід|шлях|завулок|квартал|автомагістраль)( |$)/i) != -1;
                };
                var hasSpecialStatus = function (s) {
                    return s.search(/( |^)([РНТМ](-[0-9]+)+|[EОС][0-9]+)|~|>|\/( |$)|^(|до|на|>) /i) != -1;
                };
                var hasInternationalName = function (s) {
                    return s.search(/^E[0-9]+$/i) != -1;
                };
                var hasStatus = function (s) {
                    return (hasShortStatus(s) || hasLongStatus(s) || hasSpecialStatus(s));
                };

                var hasAdjName = function (s) {
                    var adjRegex = new RegExp(
                            '( |^)(Балтійська|Кропивницька|Бориславська|Овочева|Спортивна|Дорогобицька|Зарічна|Привокзальна|Клубна|Запречистська|Заставська|Глибока|Японська' +
                            '|Київська|Городоцька|Зелена|Судова|Замкнена|Стрийська|Козельницька|Снопківська|Волоська|Турецька|Скельна|Грецька|Кубанська|Кримська|Водогінна' +
                            '|Аральська|Студентська|Переяславська|Дунайська|Дністерська|Тернопільська|Зубрівська|Сихівська|Райдужна|Вулецька|Соняшникова|Коломийська' +
                            '|Садибна|Демнянська|Наукова|Жасминова|Білоцерківська|Орлина|Кульпарківська|Вітряна|Молдавська|Виноградна|Холодноярська|Керамічна|Кишинівська' +
                            '|Львівська|Урожайна|Садова|Гіпсова|Окружна|Зв\'язкова|Житомирська|Повстанська|Збиральна|Авіаційна|Кондукторська|Полева|Дублянська|Вокзальна' +
                            '|Галицька|Любінська|Спокійна|Народна|Залізнична|Личаківська|Сполучна|Тернова|Конюшинна|Яворівська|Західна|Суховольська|Світла|Озерна|Ряшівська' +
                            '|Коротка|Сосновська|Весняна|Січова|Вузька|Журавлина|Рудненська|Чернівецька|Стародубська|Хотинська|Одеська|Стрілецька|Замарстинівська|Топольна' +
                            '|Інструментальна|Господарська|Волошкова|Сріблиста|Торф\'яна|Городницька|Сінна|Покутська|Заповітна|Малинова|Вербова|Перекопська|Квітова|Корінна' +
                            '|Східна|Крута|Реміснича|Узбецька|Технічна|Половинна|Хімічна|Жовківська|Лемківська|Сорочинська|Джерельна|Батуринська|Замкова|Клепарівська' +
                            '|Смерекова|Золота|Чорноморська|Вугільна|Сянська|Мулярська|Весела|Мукачівська|Ужгородська|Пильникарська|Базарна|Водна|Вагова|Таманська' +
                            '|Театральна|Вірменська|Університетська|Вічева|Руська|Друкарська|Сербська|Ставропігійська|Стара|Насипна|Рівна|Шевська|Староєврейська|Архівна' +
                            '|Підвальна|Валова|Гуцульська|Банківська|Пекарська|Севастопольська|Тиха|Лісна|Слободна|Харківська|Мала|Круп\'ярська|Таджицька|Кутова|Грибова' +
                            '|Ярова|Букова|Ромоданівська|Зимова|Долішня|Яричівська|Копальна|Казахська|Низова|Міжгірна|Грушева|Ялтинська|Чумацька|Богданівська|Глиняна' +
                            '|Переможна|Поетична|Приязна|Визвольна|Бігова|Наступальна|Пластова|Польова|Ковельська|Врізана|Ігорева|Корейська|Теребовлянська|Черкаська' +
                            '|Белзька|Молочна|Корецька|Крайня|Милятинська|Горіхова|Юнацька|Трависта|Бродівська|Старознесенська|Почаївська|Пинська|Миргородська|Поворотна' +
                            '|Потелицька|Новознесеньська|Волинська|Промислова|Опришківська|Механічна|Донецька|Льняна|Полтв\'яна|Селянська|Космічна|Купальська|Кукурудзяна' +
                            '|Бузька|Тарасівська|Бескидська|Лазнева|Підмурна|Рибна|Тролейбусна|Північна|Лугова|Лісова|Сигнальна|Таллінська|Ливарна|Левандівська|Повітряна' +
                            '|Тісна|Кочегарська|Естонська|Олешківська|Ясна|Щекавицька|Алмазна|Слюсарська|Папоротна|Ботанічна|Заболотівська|Мирна|Скромна|Пропелерна' +
                            '|Загородня|Моторна|Широка|Холмська|Лисеницька|Довга|Пасічна|Хлібна|Китайська|Садівнича|Каштанова|Медова|Околична|Відкрита|Бойківська' +
                            '|Куликівська|Червона|Мила|Сарненська|Природна|Перемиська|Моршинська|Конотопська|Похила|Художня|Вишнева|Молодіжна|Дивізійна|Поштова|Тунельна' +
                            '|Білоруська|Яблунева|Творча|Пільна|Шпитальна|Винниківська|Поліська|Загірна|Нагірна|Мурована|Нова|Архітекторська|Грюнвальдська|Політехнічна' +
                            '|Професорська|Бібліотечна|Болгарська|Випасова|Малоголосківська|Монгольська|Скісна|Резедова|Простинна|Бузинова|Порічкова|Осикова|Нарцисова' +
                            '|Розлога|Ряснянська|Паралельна|Південна|Комарнівська|Перемишльська|Заводська|Соборна|Тупікова|Горішня|Шкільна|Українська|Сонячна|Артищівська' +
                            '|Паркова|Равська|Старомостівська|Головна|Травнева|Клюсовська|Сокальська|Крива|Святоюрська|Завадівська|Центральна|Жовтнева|Колгоспна|Больнична' +
                            '|Радянська|Ювілейна|Степова|Порохова|Робітнича|Очеретяна|Жнивна|Буковинська|Луганська|Абхазька|Лижв\'ярська|Гайдамацька|Грабова|Полунична' +
                            '|Томашівська|Каховська|Гіацинтова|Дальня|Дозвільна|Лютнева|Корсунська|Підгаєцька|Дубнівська|Дрогобицька|Мисливська|Бакінська|Чуваська' +
                            '|Скнилівська|Щирецька|Санітарна|Лікувальна|Баштанна|Мостова|Паровозна|Вагонна|Проста|Суха|Фабрична|Солов\'[яї]на|Хорватська|Вільна|Затишна' +
                            '|Крехівська|Сходова|Спадиста|Туркменська|Олійна|Рослинна|Албанська|Азовська|Карпатська|Листопадна|Віденська|Енергетична|Соколина|Латвійська' +
                            '|Земельна|Трускавецька|Росиста|Рядова|Сусідня|Рахівська|Розбіжна|Рівнинна|Керченська|Піскова|Ніжинська|Кошова|Козацька|Гранітна|Дубова' +
                            '|Полуднева|Лебедина|Навколишня|Січнева|Горівська|Поморянська|Кінцева|Курінна|Новознесенська|Міртова|Шполянська|Грунтова|Ґрунтова|Варшавська)( |$)',
                            'i');
                    return s.search(adjRegex) != -1;
                };

                // ATTENTION: Rule order is important!
                return rules_basicCommon().concat([
                        new Rule('Check with rules from Google Sheet', function (text, city) {
                            let ruleKey = text + '_' + city;
                            if (rulesDB[ruleKey]) {
                                let matchCity = rulesDB[ruleKey].city ? rulesDB[ruleKey].city == city : true;
                                if (matchCity) {
                                    return rulesDB[ruleKey].new_name;
                                }
                            }
                            return text;
                        }, 'GSheets'),

                        new Rule('Fix English characters in name', function (t) {
                            return !hasCyrillic(t) || hasInternationalName(t) ? t : t.replace(/[AaBCcEeHIiKkMOoPpTXxYy]/g, function (c) {
                                return {
                                    'A': 'А',
                                    'a': 'а',
                                    'B': 'В',
                                    'C': 'С',
                                    'c': 'с',
                                    'E': 'Е',
                                    'e': 'е',
                                    'H': 'Н',
                                    'I': 'І',
                                    'i': 'і',
                                    'K': 'К',
                                    'k': 'к',
                                    'M': 'М',
                                    'O': 'О',
                                    'o': 'о',
                                    'P': 'Р',
                                    'p': 'р',
                                    'T': 'Т',
                                    'X': 'Х',
                                    'x': 'х',
                                    'Y': 'У',
                                    'y': 'у'
                                }
                                [c];
                            });
                        }),
                        new Rule('Delete space in initials', function (text) {
                            return text.replace(/(^| +)([А-ЯІЇЄҐ]\.) ([А-ЯІЇЄҐ]\.)/, '$1$2$3');
                        }),
                        new Rule('Incorrect characters in street name', function (t) {
                            // This rule should be before renaming rules or they couldn't see some errors
                            return t
                            .replace(/[@#№$,^!:;*"?<]/g, ' ').replace(/ {2,}/, ' ')
                            .replace(/[`\u02bc]/g, '\''); // replace incorrect apostrophes (`’)
                        }),
                        /*
                        new Rule('Incorrect language', function (t) {
                        // Translate full Russian names to full Ukrainian
                        // and next rules will shorten them if necessary
                        return t
                        .replace(/(^| )в?улица( |$)/i, '$1вулиця$2')
                        .replace(/(^| )спуск( |$)/i, '$1узвіз$2')
                        .replace(/(^| )(т)расса( |$)/i, '$1$2раса$3')
                        .replace(/(^| )(п)ереулок( |$)/i, '$1$2ровулок$3')
                        .replace(/(^| )(п)роезд( |$)/i, '$1$2роїзд$3')
                        .replace(/(^| )(п)лощадь( |$)/i, '$1$2лоща$3')
                        .replace(/(^| )(ш)оссе( |$)/i, '$1$2осе$3')
                        .replace(/(^| )(с)танция( |$)/i, '$1$2танція$3')
                        .replace(/(^| )(а)ллея( |$)/i, '$1$2лея$3')
                        .replace(/(^| )(н)абережная( |$)/i, '$1$2абережна$3')
                        .replace(/(^| )(м)икрорайон( |$)/i, '$1$2ікрорайон$3')
                        .replace(/(^| )(л)иния( |$)/i, '$1$2інія$3')
                        .replace(/(^| )(а)кадемика( |$)/i, '$1$2кадеміка$3')
                        .replace(/(^| )(а)дмирала( |$)/i, '$1$2дмірала$3')
                        .replace(/ и /i, ' та ');
                        }),
                         */
                        new Rule('Mistake in short status', function (t) {
                            return t
                            .replace(/(^| )(буль?в?\.?|б-р\.)( |$)/i, '$1б-р$3')
                            .replace(/(^| )(?:пр-к?т|п(?:р|о)?сп)\.?( |$)/i, '$1просп.$2')
                            .replace(/(^| )пр-з?д\.?( |$)/i, '$1пр.$2')
                            .replace(/(^| )ул\.?( |$)/i, '$1вул.$2')
                            .replace(/(^| )р-н\.( |$)/i, '$1р-н$2')
                            .replace(/(^| )пер\.?( |$)/i, '$1пров.$2')
                            .replace(/(^| )(пров|просп|пр|вул|ст|мкрн|наб|дор)( |$)/i, '$1$2.$3');
                        }),
                        new Rule('Rules for back status', function (t) {
                            // Якщо закінчується на "-ний; -ський", переносимо статус в кінець (сміливе рішення)
                            // !!! Сміливе рішення :)
                            return t
                                .replace(/(^)(пров\.|пр\.|тупик|узвіз)( )(.*ний$)/i, '$4 $2')
                                .replace(/(^)(пров\.|пр\.|тупик|узвіз)( )(.*ський$)/i, '$4 $2')
                        }),
                        new Rule('Long status must be short', function (t) {
                            // Do short status only if there no other shorten statuses in name
                            return hasShortStatus(t) ? t : t
                            .replace(/(^| )район( |$)/i, '$1р-н$2')
                            .replace(/(^| )бульвар( |$)/i, '$1б-р$2')
                            .replace(/(^| )провулок( |$)/i, '$1пров.$2')
                            .replace(/(^| )проспект( |$)/i, '$1просп.$2')
                            .replace(/(^| )вулиця( |$)/i, '$1вул.$2')
                            .replace(/(^| )станція( |$)/i, '$1ст.$2')
                            .replace(/(^| )мікрорайон( |$)/i, '$1мкрн.$2')
                            .replace(/(^| )набережна( |$)/i, '$1наб.$2');
                        }),
                        new Rule('Shorten street name or status must be long', function (t) {
                            return t
                            .replace(/(^| )туп\.?( |$)/i, '$1тупик$2')
                            .replace(/(^| )тр-т\.?( |$)/i, '$1тракт$2')
                            .replace(/(^| )(сп\.?|узв\.?|узвоз)( |$)/i, '$1узвіз$3')
                            .replace(/(^| )пр\.( |$)/i, '$1проїзд$2')
                            .replace(/(^| )пл\.?( |$)/i, '$1площа$2')
                            .replace(/(^| )ал\.?( |$)/i, '$1алея$2')
                            .replace(/(^| )ш\.?( |$)/i, '$1шосе$2')
                            .replace(/(^|а )дор\.?( |$)/i, '$1дорога$2')
                            .replace(/(ї )дор\.?( |$)/i, '$1дороги$2')
                            .replace(/(^| )ген\.?( |$)/i, '$1Генерала$2')
                            .replace(/(^| )див\.?( |$)/i, '$1Дивізії$2')
                            .replace(/(^| )ак\.?( |$)/i, '$1Академіка$2')
                            .replace(/(^| )марш\.?( |$)/i, '$1Маршала$2')
                            .replace(/(^| )адм\.?( |$)/i, '$1Адмірала$2');
                        }),
                        new Rule('Incorrect number ending', function (t) {
                            return t
                            .replace(/-[гштм]а/, '-а')
                            .replace(/-[ыоиі]й/, '-й')
                            .replace(/-тя/, '-я')
                            .replace(/-ая/, '-а');
                        }),
                        new Rule('Incorrect highway name', function (text) {
                            return text.replace(/([РрНнМмPpHM])[-\s]*([0-9]{2})/, function (a, p1, p2) {
                                p1 = p1
                                    .replace('р', 'Р')
                                    .replace('н', 'Н')
                                    .replace('м', 'М')
                                    .replace('P', 'Р')
                                    .replace('p', 'Р')
                                    .replace('H', 'Н')
                                    .replace('M', 'М');

                                return p1 + '-' + p2;
                            });
                        }),
                        new Rule('Incorrect local street name', function (text) {
                            return text.replace(/([ТтT])[-\s]*([0-9]{2})[-\s]*([0-9]{2})/, function (a, p1, p2, p3) {
                                p1 = p1
                                    .replace('т', 'Т')
                                    .replace('T', 'Т');

                                return p1 + '-' + p2 + '-' + p3;
                            });
                        }),
                        new Rule('Incorrect international highway name', function (text) {
                            return text.replace(/^ *[eе][- ]*([0-9]+)/i, 'E$1');
                        }),
                        new Rule('Incorrect local road name', function (text) {
                            return text.replace(/([OoCcОоСс])[-\s]*([0-9]+)[-\s]*([0-9]+)[-\s]*([0-9]+)/, function (a, p1, p2, p3, p4) {
                                p1 = p1
                                    .replace('o', 'О')
                                    .replace('O', 'О')
                                    .replace('c', 'С')
                                    .replace('C', 'С');

                                return p1 + p2 + p3 + p4;
                            });
                        }),

                        new Rule('Fix status', function (t) {
                            return hasStatus(t) ? t : 'вул. ' + t;
                        }, 'Ukraine'),

                        new Rule('Detect status absense or incorrect placement', function (t) {
                            return hasStatus(t) ? (hasAdjName(t) ? t.replace(/(.*)(вул\.)(.*)/, '$1 $3 $2') : t) : (hasAdjName(t) ? t + ' вул.' : '');
                        }, 'Lviv'),

                        new Rule('Move status to begin of name', function (text) {
                            if (!hasSpecialStatus(text)) {
                                return text.replace(/(.*)(вул\.)(.*)/, '$2 $1 $3');
                            }
                            return text;
                        }, 'Ukraine'),
                    ]);
            };

            var getCountryRules = function () {
                var commonRules = [
                    // Following rules must be at the end because
                    // previous rules might insert additional spaces
                    new Rule('Redundant space in street name', function (text) {
                        return text.replace(/[ ]+/g, ' ');
                    }),
                    new Rule('Space at the begin of street name', function (text) {
                        return text.replace(/^[ ]*/, '');
                    }),
                    new Rule('Space at the end of street name', function (text) {
                        return text.replace(/[ ]*$/, '');
                    }),
                ];
                //var countryName = W.model.getTopCountry().getName();
                //info('Get rules for country: ' + countryName);
                var countryRules = rules_UA();

                return countryRules.concat(commonRules);
            };

            var rules = [];
            var customRulesNumber = 0;

            var onAdd = function (rule) {};
            var onEdit = function (index, rule) {};
            var onDelete = function (index) {};

            this.onAdd = function (cb) {
                onAdd = cb;
            };
            this.onEdit = function (cb) {
                onEdit = cb;
            };
            this.onDelete = function (cb) {
                onDelete = cb;
            };

            //this.onCountryChange = function () {
            //    info('Country was changed. Reloading rules...');
            //    rules.splice(customRulesNumber, rules.length - customRulesNumber);
            //    rules = rules.concat(getCountryRules());
            //};

            this.get = function (index) {
                return rules[index];
            };

            this.correct = function (variant, text, city) {
                var newtext = text;
                var experimental = false;
                var custom_enabled = localStorage.getItem('assist_enable_custom_rules') == 'true';

                for (var i = 0; i < rules.length; ++i) {
                    var rule = rules[i];

                    if (rule.custom && !custom_enabled)
                        continue;

                    if (rule.experimental && !this.experimental)
                        continue;

                    if (rule.variant && rule.variant != variant)
                        continue;

                    var previous = newtext;
                    newtext = rule.correct(newtext, city);
                    var changed = (previous != newtext);
                    if (rule.experimental && previous != newtext) {
                        experimental = true;
                    }
                    previous = newtext;
                    // if (rule.custom && changed) {
                    //     // prevent result overwriting by common rules
                    //     break;
                    // }
                }

                return {
                    value: newtext,
                    experimental: experimental
                };
            };

            var save = function (rules) {
                if (localStorage) {
                    localStorage.setItem('assistRulesKey', JSON.stringify(rules.slice(0, customRulesNumber)));
                }
            };

            this.load = function () {
                if (localStorage) {
                    var str = localStorage.getItem('assistRulesKey');
                    if (str) {
                        var arr = JSON.parse(str);
                        for (var i = 0; i < arr.length; ++i) {
                            var rule = arr[i];
                            this.push(rule.oldname, rule.newname);
                        }
                    }
                }

                rules = rules.concat(getCountryRules());
            };

            this.push = function (oldname, newname) {
                var rule = new CustomRule(oldname, newname);
                rules.splice(customRulesNumber++, 0, rule);
                onAdd(rule);

                save(rules);
            };

            this.update = function (index, oldname, newname) {
                var rule = new CustomRule(oldname, newname);
                rules[index] = rule;
                onEdit(index, rule);

                save(rules);
            };

            this.remove = function (index) {
                rules.splice(index, 1);
                --customRulesNumber;
                onDelete(index);

                save(rules);
            };
        };

        var ActionHelper = function () {
            var WazeActionAddAlternateStreet = require("Waze/Action/AddAlternateStreet");
            var WazeActionUpdateFeatureAddress = require("Waze/Action/UpdateFeatureAddress");
            var WazeActionUpdateObject = require("Waze/Action/UpdateObject");

            var ui;

            var type2repo = function (type) {
                var map = {
                    'venue': W.model.venues,
                    'segment': W.model.segments
                };
                return map[type];
            };

            this.setUi = function (u) {
                ui = u;
            };

            this.Select = function (id, type, center, zoom) {
                var attemptNum = 10;

                var select = function () {
                    info('select: ' + id);

                    var obj = type2repo(type).getObjectById(id);

                    W.model.events.unregister('mergeend', null, select);

                    if (obj) {
                        W.selectionManager.setSelectedModels([obj]);
                    } else if (--attemptNum > 0) {
                        W.model.events.register('mergeend', null, select);
                    }

                    debug("Attempt number left: " + attemptNum);

                    W.map.setCenter(center, zoom);
                };

                return select;
            };

            this.fixProblem = function (problem) {
                var deferred = $.Deferred();
                var attemptNum = 10; // after that we decide that object was removed
                var setOld2Alt = localStorage.getItem('assist_move_old_to_alt') == 'true';

                var fix = function () {
                    var uniqueId = problem.object.id + '_' + problem.streetID;
                    var obj = type2repo(problem.object.type).getObjectById(problem.object.id);
                    W.model.events.unregister('mergeend', null, fix);

                    if (obj) {
                        var addr = obj.getAddress().attributes;
                        var attr = {
                            countryID: addr.country.attributes.id,
                            stateID: addr.state.attributes.id,
                            cityName: addr.city.attributes.name,
                            emptyCity: addr.city.attributes.name === null || addr.city.attributes.name === '',
                            streetName: problem.newStreetName,
                            emptyStreet: problem.isEmpty
                        };

                        // check if alternative name
                        if (problem.attrName == 'streetIDs') {
                            // check if still exist
                            if (obj.attributes.streetIDs.indexOf(problem.streetID) > -1) {
                                // remove old street and keep other ones
                                var streets2keep = [];
                                obj.attributes.streetIDs.forEach(function (sid) {
                                    if (problem.streetID !== sid) {
                                        streets2keep.push(sid);
                                    } else {
                                        var altStreet = W.model.streets.getObjectById(sid);
                                        var city = W.model.cities.getObjectById(altStreet.attributes.cityID);
                                        attr.cityName = city.attributes.name;
                                        attr.emptyCity = city.hasName() ? null : true;
                                    }
                                });
                                W.model.actionManager.add(new WazeActionUpdateObject(obj, {
                                        streetIDs: streets2keep
                                    }));

                                // add new street
                                W.model.actionManager.add(new WazeActionAddAlternateStreet(obj, attr, {
                                        streetIDField: problem.attrName
                                    }));
                            } else {
                                ui.updateProblem(uniqueId, '(not found. Deleted?)');
                            }
                        } else {
                            // protect user manual fix
                            if (problem.reason == addr.street.attributes.name) {
                                W.model.actionManager.add(new WazeActionUpdateFeatureAddress(obj, attr, {
                                        streetIDField: problem.attrName
                                    }));
                                // move old name to alt street, if option enabled
                                if (setOld2Alt && obj.type == 'segment') {
                                    var altAttr = {
                                        countryID: addr.country.attributes.id,
                                        stateID: addr.state.attributes.id,
                                        cityName: addr.city.attributes.name,
                                        emptyCity: addr.city.attributes.name === null || addr.city.attributes.name === '',
                                        streetName: problem.reason,
                                        emptyStreet: false //problem.isEmpty
                                    };
                                    W.model.actionManager.add(new WazeActionAddAlternateStreet(obj, altAttr, {
                                            streetIDField: problem.attrName
                                        }));
                                }
                            } else {
                                ui.updateProblem(uniqueId, '(user fix: ' + addr.street.attributes.name + ')');
                            }
                        }
                        deferred.resolve(uniqueId);
                    } else if (--attemptNum <= 0) {
                        ui.updateProblem(uniqueId, '(was not fixed. Deleted?)');
                        deferred.resolve(uniqueId);
                    } else {
                        W.model.events.register('mergeend', null, fix);
                        W.map.setCenter(problem.detectPos, problem.zoom);
                    }

                    debug('Attempt number left: ' + attemptNum);
                };

                fix();

                return deferred.promise();
            };
        };

        var Ui = function () {
            // load main window size and position
            var wndW = localStorage.getItem('assist_window_w');
            var wndH = localStorage.getItem('assist_window_h');
            var wndX = localStorage.getItem('assist_window_x');
            var wndY = localStorage.getItem('assist_window_y');
            // main window default size and position
            var defaultW = 500;
            var defaultH = 500;
            var defaultX = "right";
            var defaultY = "center";
            // define main window limits
            var minH = 100;
            var minW = 200;
            var maxH = 800;
            var maxW = 1024;
            // workaround for bug with window minimize detection
            var saveAllowed = false;

            var addon = document.createElement('div');

            addon.innerHTML = '<wz-overline>' + scriptName + ' v' + GM_info.script.version + '</wz-overline>';

            var section = document.createElement('div');
            section.id = "assist_options";
            section.className = "form-group";
            section.innerHTML = '<wz-label>Options</wz-label>' +
                '<wz-checkbox name="assist_enabled" id="assist_enabled" value="on">Enable/disable</wz-checkbox>' +
                '<wz-checkbox name="assist_skip_alt" id="assist_skip_alt" value="on">Skip checking alternative names</wz-checkbox>' +
                '<wz-checkbox name="assist_move_old_to_alt" id="assist_move_old_to_alt" value="on">Move old name to alternative</wz-checkbox>' +
                '<wz-button name="assist_reset_window" id="assist_reset_window" color="text" size="sm">Reset window size and position</wz-button>';
            addon.appendChild(section);

            var variant = document.createElement('div');
            variant.id = 'variant_options';
            variant.className = "form-group";
            variant.innerHTML = '<wz-label>Naming Rules <a href="https://wazeopedia.waze.com/wiki/Ukraine/Як_називати_вулиці" target="_blank"><span class="fa fa-question-circle"></span></a></wz-label>' +
                '<wz-radio-button name="assist_variant" value="Ukraine" checked="">Ukraine (Classic)</wz-radio-button>' +
                '<wz-radio-button name="assist_variant" value="Lviv">🦁 Lviv (Alternative)</wz-radio-button>';
            if (!$.isEmptyObject(rulesDB)) {
                console.log("WME Assist UA INFO: Downloaded " + Object.keys(rulesDB).length + " rules from Google Sheet");
                variant.innerHTML += '<wz-radio-button name="assist_variant" value="GSheets">Rules from Google Sheet (' + Object.keys(rulesDB).length + ')</wz-radio-button>';
            }
            addon.appendChild(variant);

            section = document.createElement('div');
            section.id = "assist_custom_rules";
            section.className = "form-group";
            $(section)
            .append($('<wz-label>Custom Rules</wz-label>'))
            .append($('<wz-checkbox name="assist_enable_custom_rules" id="assist_enable_custom_rules" value="on">Enable custom rules</wz-checkbox>'))
            .append($('<div>').addClass('btn-toolbar').css({
                    "margin-bottom": "4px"
                })
                .append($('<button>').prop('id', 'assist_add_custom_rule').addClass('btn btn-default btn-primary').text('Add'))
                .append($('<button>').prop('id', 'assist_edit_custom_rule').addClass('btn btn-default').text('Edit'))
                .append($('<button>').prop('id', 'assist_del_custom_rule').addClass('btn btn-default btn-warning').text('Del')))
            .append($('<ul>').addClass('issue-tracker').css({
                    "height": "250px",
                    "overflow": "auto",
                    "padding": "4px",
                    "border": "1px solid lightgray"
                }));
            addon.appendChild(section);

            section = document.createElement('div');
            section.id = "assist_exceptions";
            section.className = "form-group";
            $(section)
            .append($('<wz-label title="Right click on error in list to add">').text('Exceptions'))
            .append($('<ul>').addClass('issue-tracker').css({
                    "height": "250px",
                    "overflow": "auto",
                    "padding": "4px",
                    "border": "1px solid lightgray"
                }));
            addon.appendChild(section);

            const { tabLabel, tabPane } = W.userscripts.registerSidebarTab("sidepanel-assist");

            tabLabel.innerText = scriptName;
            tabLabel.title = scriptName;

            tabPane.innerHTML = addon.innerHTML;

            //tabPane.addEventListener("element-connected", () => {
            //    alert("connected");
            //}, { once: false });

            //tabPane.addEventListener("element-disconnected", () => {
            //    alert("disconnected");
            //}, { once: false });

            var selectedCustomRule = -1;

            this.selectedCustomRule = function () {
                return selectedCustomRule;
            };

            this.addCustomRule = function (title) {
                var thisrule = $('<li>').addClass('list-item-card').click(function () {
                    selectedCustomRule = $('#assist_custom_rules li.list-item-card').index(thisrule);
                    info('index: ' + selectedCustomRule);
                    $('#assist_custom_rules li.list-item-card').css({
                        'background-color': ''
                    });
                    $('#assist_custom_rules li.list-item-card').removeClass('active');
                    $(this).css({
                        'background-color': 'lightblue'
                    });
                    $(this).addClass('active');
                }).hover(function () {
                    $(this).css({
                        cursor: 'pointer',
                        'background-color': 'lightblue'
                    });
                }, function () {
                    $(this).css({
                        cursor: 'auto'
                    });
                    if (!$(this).hasClass('active')) {
                        $(this).css({
                            'background-color': ''
                        });
                    }
                })
                    .append($('<p>').addClass('additional-info clearfix').text(title))
                    .appendTo($('#assist_custom_rules ul.issue-tracker'));
            };

            this.updateCustomRule = function (index, title) {
                $('#assist_custom_rules li.list-item-card').eq(index).find('p.additional-info').text(title);
            };

            this.removeCustomRule = function (index) {
                $('#assist_custom_rules li.list-item-card').eq(index).remove();
                selectedCustomRule = -1;
            };

            this.addException = function (name, del) {
                var thisrule = $('<li>').addClass('list-item-card').click(function () {
                    var index = $('#assist_exceptions li.list-item-card').index(thisrule);
                    del(index);
                }).hover(function () {
                    $(this).css({
                        cursor: 'pointer',
                        'background-color': 'lightblue'
                    });
                }, function () {
                    $(this).css({
                        cursor: 'auto'
                    });
                    if (!$(this).hasClass('active')) {
                        $(this).css({
                            'background-color': ''
                        });
                    }
                })
                    .append($('<p>').addClass('additional-info clearfix').text(name))
                    .appendTo($('#assist_exceptions ul.issue-tracker'));
            };

            this.removeException = function (index) {
                $('#assist_exceptions li.list-item-card').eq(index).remove();
            };

            this.showMainWindow = function () {
                localStorage.setItem('assist_enabled', true);
                mainWindow[0].winbox.show();
                info('enabled');
            };

            this.hideMainWindow = function () {
                localStorage.setItem('assist_enabled', false);
                $('#assist_clearall_btn').click();
                mainWindow[0].winbox.hide();
                info('disabled');
            };

            var wazeMap = $('#WazeMap');

            // ==== Main Window
            $('<div>').prop('id', 'assist_main_window_content')
            .append($('<div>').css({
                    padding: 10
                })
                .append($('<div class="btn-toolbar">')
                    .append($('<button id="assist_fixall_btn" class="btn waze-btn waze-btn-small waze-btn-red">Fix all</button>'))
                    .append($('<button id="assist_fixselected_btn" class="btn waze-btn waze-btn-small waze-btn-red">Fix selected</button>'))
                    .append($('<button id="assist_scanarea_btn" class="btn waze-btn waze-btn-small waze-btn-blue">Scan area</button>'))
                    .append($('<button id="assist_clearfixed_btn" class="btn waze-btn waze-btn-small waze-btn-green">Clear fixed</button>'))
                    .append($('<button id="assist_clearall_btn" class="btn waze-btn waze-btn-small waze-btn-grey" title="Clear all results"><i class="fa fa-close"></i></button>')))
                .append($('<h2><input id="assist_select_all_chk" type="checkbox" />Unresolved issues</h2>').css({
                        'font-size': '100%',
                        'font-weight': 'bold',
                    }))
                .append($('<ol id="assist_unresolved_list"></ol>').css({
                        border: '1px solid lightgrey',
                        'padding-top': 2,
                        'padding-bottom': 2,
                    })))
            .append($('<div>').css({
                    padding: 10,
                })
                .append($('<h2>Fixed issues</h2>').css({
                        'font-size': '100%',
                        'font-weight': 'bold',
                    }))
                .append($('<ol id="assist_fixed_list"></ol>').css({
                        border: '1px solid lightgrey',
                        'padding-top': 2,
                        'padding-bottom': 2,
                    })))
            .appendTo(wazeMap);

            new WinBox(scriptName, {
                id: "assist_main_window",
                class: [ "no-full" ],
                hidden: true,
                x: wndX ? wndX : defaultX,
                y: wndY ? wndY : defaultY,
                width: wndW ? wndW : defaultW,
                height: wndH ? wndH : defaultH,
                minheight: minH,
                minwidth: minW,
                maxheight: maxH,
                maxwidth: maxW,
                background: 'lightblue',
                border: 4,
                mount: document.getElementById("assist_main_window_content"),
                onminimize: function(){
                    this.focus();
                },
                onresize: function(w, h) {
                    if (!this.hidden && !this.min && !this.max &&
                        w > minW && h > minH && w < maxW && h < maxH) {
                        saveAllowed = true;
                        localStorage.setItem('assist_window_w', w);
                        localStorage.setItem('assist_window_h', h);
                    } else {
                        saveAllowed = false;
                    }
                },
                onmove: function(x, y) {
                    if (!this.hidden && !this.min && !this.max &&
                        saveAllowed) {
                        localStorage.setItem('assist_window_x', x);
                        localStorage.setItem('assist_window_y', y);
                    }
                },
                onclose: function(force) {
                    $('#assist_enabled').click();
                    return true;
                }
            });
            var mainWindow = $('#assist_main_window');

            mainWindow.find('.wb-title').css({
                'font-weight': 'bold',
                color: 'black'
            });
            mainWindow.find('.wb-title').append($('<span> - </span>'));
            mainWindow.find('.wb-title')
            .append($('<span>', {
                    id: 'assist-error-num',
                    title: 'Number of unresolved issues',
                    text: 0,
                }).css({
                    color: 'red'
                }));
            mainWindow.find('.wb-title').append($('<span> / </span>'));
            mainWindow.find('.wb-title')
            .append($('<span>', {
                    id: 'assist-fixed-num',
                    title: 'Number of fixed issues',
                    text: 0,
                }).css({
                    color: 'green'
                }));
            /*
            mainWindow.find('.wb-title').append($('<span> - </span>'));
            mainWindow.find('.wb-title')
            .append($('<span>', {
                    id: 'assist-scan-progress',
                    title: 'Scan progress',
                    text: 0,
                }).css({
                    color: 'blue'
                }));
            */
            $("#assist_reset_window").click(function () {
                mainWindow[0].winbox.resize(defaultW, defaultH).move(defaultX, defaultY);
            });

            // ==== Custom Rule Dialog
            $('<div>').prop('id', 'assist_custom_rule_dialog_content')
            .append($('<div>').css({
                    padding: 10
                })
                .append($('<p>All form fields are required</p>'))
                    .append($('<fieldset>')
                        .append($('<label>').prop('for', 'oldname').text('RegExp'))
                        .append($('<input>', {
                            type: 'text',
                            name: 'oldname',
                            id: 'oldname',
                        }))
                    .append($('<label>').prop('for', 'newname').text('Replace text'))
                    .append($('<input>', {
                            type: 'text',
                            name: 'newname',
                            id: 'newname',
                        }))))
            .append($('<div>').css({
                    padding: 10
                })
                .append($('<div class="btn-toolbar">')
                    .append($('<button id="assist_custom_submit_btn" class="btn waze-btn waze-btn-small waze-btn-green">Submit</button>'))
                    .append($('<button id="assist_custom_cancel_btn" class="btn waze-btn waze-btn-small waze-btn-red">Cancel</button>'))
                ))
            .appendTo(wazeMap);

            $('#assist_custom_rule_dialog_content label').css({
                display: 'block'
            });
            $('#assist_custom_rule_dialog_content input').css({
                display: 'block',
                width: '100%'
            });

            new WinBox("Add Custom Rule", {
                id: "assist_custom_rule_dialog",
                class: [ "no-full", "no-min", "no-max", "no-resize" ],
                hidden: true,
                x: "center",
                y: "center",
                width: "300px",
                height: "250px",
                background: 'lightblue',
                border: 4,
                mount: document.getElementById("assist_custom_rule_dialog_content"),
                onclose: function(force){
                    this.hide();
                    return true;
                }
            });
            var customRuleDialog = $('#assist_custom_rule_dialog');

            $("#assist_custom_submit_btn").click(function () {
                customRuleDialog_Ok();
                customRuleDialog[0].winbox.hide();
            });
            $("#assist_custom_cancel_btn").click(function () {
                customRuleDialog[0].winbox.hide();
            });

            var self = this;

            this.addProblem = function (id, text, selectFunc, editFunc, exception, experimental) {
                var problem = $('<li>')
                    .prop('id', 'issue-' + id)
                    .append($('<input>', {
                            value: id,
                            type: "checkbox"
                        }))
                    .append($('<a>', {
                            href: "javascript:void(0)",
                            text: text,
                            click: function (event) {
                                selectFunc(event);
                            },
                            contextmenu: function (event) {
                                exception(event);
                                event.preventDefault();
                                event.stopPropagation();
                            },
                        }))
                    .append('&nbsp;')
                    .append($('<span>', {
                            title: "Add custom rule for this problem",
                            class: "fa fa-edit",
                            style: "cursor: pointer;",
                            click: function (event) {
                                editFunc(event);
                            }
                        }))
                    .appendTo($('#assist_unresolved_list'));

                if (experimental) {
                    problem.children().css({
                        color: 'red'
                    }).prop('title', 'Experimental rule');
                }
            };

            this.getCheckedItemsList = function () {
                var itemsList = [];
                $('#assist_unresolved_list').find('input').each(function () {
                    if (this.checked) {
                        itemsList.push(this.value);
                    }
                });
                return itemsList;
            };

            this.updateProblem = function (id, text) {
                var a = $('li#issue-' + escapeId(id) + ' > a');
                a.text(a.text() + ' ' + text);
            };

            this.setUnresolvedErrorNum = function (text) {
                $('#assist-error-num').text(text);
            };

            this.setFixedErrorNum = function (text) {
                $('#assist-fixed-num').text(text);
            };

            this.setScanProgress = function (text) {
                //$('#assist-scan-progress').text(text);
            };

            var escapeId = function (id) {
                return String(id).replace(/\./g, "\\.");
            };

            this.moveToFixedList = function (id) {
                $("#issue-" + escapeId(id)).appendTo($('#assist_fixed_list')).find("span").remove();
                $("#issue-" + escapeId(id)).find("input").remove();
            };

            this.removeError = function (id) {
                $("#issue-" + escapeId(id)).remove();
            };

            var fixAllBtn = $('#assist_fixall_btn');
            var fixSelectedBtn = $('#assist_fixselected_btn');
            var scanAreaBtn = $('#assist_scanarea_btn');
            var clearFixedBtn = $('#assist_clearfixed_btn');
            var clearAllBtn = $('#assist_clearall_btn');

            var selectAllChk = $('#assist_select_all_chk');

            var unresolvedList = $('#assist_unresolved_list');
            var fixedList = $('#assist_fixed_list');

            var enableCheckbox = $('#assist_enabled');
            var skipAltCheckbox = $('#assist_skip_alt');
            var moveOld2AltCheckbox = $('#assist_move_old_to_alt');
            var enableCustomRulesCheckbox = $('#assist_enable_custom_rules');

            var addCustomRuleBtn = $('#assist_add_custom_rule');
            var editCustomRuleBtn = $('#assist_edit_custom_rule');
            var delCustomRuleBtn = $('#assist_del_custom_rule');

            this.fixAllBtn = function () {
                return fixAllBtn;
            };
            this.fixSelectedBtn = function () {
                return fixSelectedBtn;
            };
            this.scanAreaBtn = function () {
                return scanAreaBtn;
            };
            this.clearFixedBtn = function () {
                return clearFixedBtn;
            };
            this.clearAllBtn = function () {
                return clearAllBtn;
            };

            this.selectAllChk = function () {
                return selectAllChk;
            };

            this.unresolvedList = function () {
                return unresolvedList;
            };
            this.fixedList = function () {
                return fixedList;
            };

            this.enableCheckbox = function () {
                return enableCheckbox;
            };
            this.skipAltCheckbox = function () {
                return skipAltCheckbox;
            };
            this.moveOld2AltCheckbox = function () {
                return moveOld2AltCheckbox;
            };
            this.enableCustomRulesCheckbox = function () {
                return enableCustomRulesCheckbox;
            };
            this.variantRadio = function (value) {
                if (!value) {
                    return $('[name=assist_variant]');
                }

                return $('[name=assist_variant][value=' + value + ']');
            };

            this.addCustomRuleBtn = function () {
                return addCustomRuleBtn;
            };
            this.editCustomRuleBtn = function () {
                return editCustomRuleBtn;
            };
            this.delCustomRuleBtn = function () {
                return delCustomRuleBtn;
            };
            this.customRuleDialog = function (title, params) {
                var deferred = $.Deferred();

                if (params) {
                    customRuleDialog.find('#oldname').val(params.oldname);
                    customRuleDialog.find('#newname').val(params.newname);
                }

                customRuleDialog_Ok = function () {
                    deferred.resolve({
                        oldname: customRuleDialog.find('#oldname').val(),
                        newname: customRuleDialog.find('#newname').val(),
                    });
                };

                customRuleDialog[0].winbox.setTitle(title);
                customRuleDialog[0].winbox.show();

                return deferred.promise();
            };
            //this.variant = function () {
            //    return $('[name=assist_variant][checked]')[0].value;
            //};
        };

        var Scanner = function () {
            var ROAD_TYPE = {
                STREET: 1,
                PRIMARY_STREET: 2,
                FREEWAY: 3,
                RAMP: 4,
                WALKING_TRAIL: 5,
                MAJOR_HIGHWAY: 6,
                MINOR_HIGHWAY: 7,
                OFF_ROAD: 8,
                WALKWAY: 9,
                PEDESTRIAN_BOARDWALK: 10,
                FERRY: 15,
                STAIRWAY: 16,
                PRIVATE_ROAD: 17,
                RAILROAD: 18,
                RUNWAY_TAXIWAY: 19,
                PARKING_LOT_ROAD: 20,
                ALLEY: 22
            };

            var zoomToRoadType = function (e) {
                if (e < 14) {
                    return [];
                }
                switch (e) {
                case 14:
                    return [ROAD_TYPE.PRIMARY_STREET, ROAD_TYPE.FREEWAY, ROAD_TYPE.RAMP, ROAD_TYPE.MAJOR_HIGHWAY, ROAD_TYPE.MINOR_HIGHWAY, ROAD_TYPE.FERRY];
                case 15:
                    return [ROAD_TYPE.PRIMARY_STREET, ROAD_TYPE.FREEWAY, ROAD_TYPE.RAMP, ROAD_TYPE.MAJOR_HIGHWAY, ROAD_TYPE.MINOR_HIGHWAY, ROAD_TYPE.OFF_ROAD, ROAD_TYPE.WALKWAY, ROAD_TYPE.PEDESTRIAN_BOARDWALK, ROAD_TYPE.FERRY, ROAD_TYPE.STAIRWAY, ROAD_TYPE.PRIVATE_ROAD, ROAD_TYPE.RAILROAD, ROAD_TYPE.RUNWAY_TAXIWAY, ROAD_TYPE.PARKING_LOT_ROAD, ROAD_TYPE.ALLEY];
                default:
                    return Object.values(ROAD_TYPE);
                }
            };
            var zoomToVenueLevel = function (e) {
                switch (e) {
                case 12:
                    return 1;
                case 13:
                    return 2;
                case 14:
                case 15:
                case 16:
                    return 3;
                case 17:
                case 18:
                case 19:
                case 20:
                case 21:
                case 22:
                    return 4;
                default:
                    return null;
                }
            };

            var getData = function (e, cb) {
                //debug(e);
                $.get(W.Config.paths.features, e).done(cb);
            };

            var splitExtent = function (extent, zoom) {
                var result = [];

                var ratio = 1; //map.getResolution() / map.getResolutionForZoom(zoom); //FIXME: temporary commented, because getResolutionForZoom() is gone
                var dx = extent.getWidth() / ratio;
                var dy = extent.getHeight() / ratio;

                var x,
                y;
                for (x = extent.left; x < extent.right; x += dx) {
                    for (y = extent.bottom; y < extent.top; y += dy) {
                        var bounds = new OpenLayers.Bounds();
                        bounds.extend(new OpenLayers.LonLat(x, y));
                        bounds.extend(new OpenLayers.LonLat(x + dx, y + dy));

                        result.push(bounds);
                    }
                }

                return result;
            };

            this.scan = function (bounds, zoom, analyze, progress) {
                if (localStorage.getItem('assist_enabled') != 'true') {
                    return;
                }
                var boundsArray = splitExtent(bounds, zoom);
                var completed = 0;

                if (boundsArray.length > 20 && !confirm('Script will scan ' + boundsArray.length + ' pieces. Are you OK?')) {
                    return;
                }

                progress = progress || function () {};

                series(boundsArray, 0, function (bounds, next) {
                    var piece = bounds.transform(W.map.getProjectionObject(), 'EPSG:4326');

                    var e = {
                        bbox: piece.toBBOX(),
                        language: I18n.locale,
                        venueFilter: '3',
                        venueLevel: zoomToVenueLevel(zoom),
                    };
                    var z = {
                        roadTypes: zoomToRoadType(zoom).toString()
                    };
                    OpenLayers.Util.extend(e, z);

                    getData(e, function (data) {
                        analyze(piece, zoom, data);
                        progress(++completed * 100 / boundsArray.length);
                        next();
                    });
                });
            };
        };

        var Analyzer = function () {
            var Exceptions = function () {
                var exceptions = [];

                var onAdd = function (name) {};
                var onDelete = function (index) {};

                var save = function (exceptions) {
                    if (localStorage) {
                        localStorage.setItem('assistExceptionsKey', JSON.stringify(exceptions));
                    }
                };

                this.load = function () {
                    if (localStorage) {
                        var str = localStorage.getItem('assistExceptionsKey');
                        if (str) {
                            var arr = JSON.parse(str);
                            for (var i = 0; i < arr.length; ++i) {
                                var exception = arr[i];
                                this.add(exception);
                            }
                        }
                    }
                };

                this.contains = function (name) {
                    if (exceptions.indexOf(name) == -1)
                        return false;
                    return true;
                };

                this.add = function (name) {
                    exceptions.push(name);
                    save(exceptions);
                    onAdd(name);
                };

                this.remove = function (index) {
                    exceptions.splice(index, 1);
                    save(exceptions);
                    onDelete(index);
                };

                this.onAdd = function (cb) {
                    onAdd = cb;
                };
                this.onDelete = function (cb) {
                    onDelete = cb;
                };
            };

            var analyzedIds = [];
            var problems = [];
            var unresolvedIdx = 0;
            var skippedErrors = 0;
            var variant;
            var exceptions = new Exceptions();
            var rules;
            var action;

            var getUnresolvedErrorNum = function () {
                return problems.length - unresolvedIdx - skippedErrors;
            };

            var getFixedErrorNum = function () {
                return unresolvedIdx;
            };

            this.unresolvedErrorNum = getUnresolvedErrorNum;
            this.fixedErrorNum = getFixedErrorNum;

            this.setRules = function (r) {
                rules = r;
            };

            this.setActionHelper = function (a) {
                action = a;
            };

            this.loadExceptions = function () {
                exceptions.load();
            };

            this.onExceptionAdd = function (cb) {
                exceptions.onAdd(cb);
            };

            this.onExceptionDelete = function (cb) {
                exceptions.onDelete(cb);
            };

            this.addException = function (reason, cb) {
                exceptions.add(reason);

                var i;
                for (i = 0; i < problems.length; ++i) {
                    var problem = problems[i];
                    if (problem.reason == reason) {
                        problem.skip = true;
                        ++skippedErrors;

                        cb(problem.object.id);
                    }
                }
            };

            this.removeException = function (i) {
                exceptions.remove(i);
            };

            this.setVariant = function (v) {
                variant = v;
            };

            this.reset = function () {
                analyzedIds = [];
                problems = [];
                unresolvedIdx = 0;
                skippedErrors = 0;
            };

            this.fixAll = function (oneFixed, allFixed) {
                series(problems, unresolvedIdx, function (p, next) {
                    if (p.skip) {
                        next();
                        return;
                    }

                    action.fixProblem(p).done(function (id) {
                        ++unresolvedIdx;
                        oneFixed(id);

                        setTimeout(next, 0);
                    });
                }, allFixed);
            };

            this.fixSelected = function (listToFix, oneFixed, allFixed) {
                series(problems, unresolvedIdx, function (p, next) {
                    if (listToFix.indexOf(p.object.id + '_' + p.streetID) == -1) {
                        next();
                        return;
                    }
                    if (p.skip) {
                        next();
                        return;
                    }

                    action.fixProblem(p).done(function (id) {
                        ++unresolvedIdx;
                        oneFixed(id);

                        setTimeout(next, 0);
                    });
                }, allFixed);
            };

            var checkStreet = function (bounds, zoom, streetID, obj, attrName, onProblemDetected) {
                var userlevel = W.loginManager.getUserRank() + 1;
                var street = W.model.streets.getObjectById(streetID);

                if (!street)
                    return;

                var detected = false;
                var skip = false;
                var title = '';
                var reason;
                var newStreetName;

                if (!street.attributes.isEmpty) {
                    let streetName = street.attributes.name;
                    if (!exceptions.contains(streetName)) {
                        try {
                            var city = W.model.cities.getObjectById(street.attributes.cityID);
                            var result = rules.correct(variant, streetName, city.attributes.name);
                            newStreetName = result.value;
                            detected = (newStreetName != streetName);
                            if (obj.type == 'venue') {
                                title = 'POI: ';
                            }
                            // alternative names
                            if (attrName == 'streetIDs') {
                                title = 'ALT: ';
                            }
                            // if user has lower rank, just show the segment, but no fix allowed
                            if (obj.lockRank && obj.lockRank >= userlevel) {
                                title = '(L' + (obj.lockRank + 1) + ') ' + title;
                                skip = true;
                            }
                            // show segments with closures, but lock them from fixing
                            if (obj.hasClosures) {
                                title = '(🚧) ' + title;
                                skip = true;
                            }
                            title = title + streetName.replace(/\u00A0/g, '■').replace(/^\s|\s$/, '■');
                            // for "detect only rules" we have no replacement to show
                            if (!newStreetName) {
                                skip = true;
                            } else {
                                title = title + ' ➤ ' + newStreetName;
                            }
                            if (skip) {
                                title = '🔒 ' + title;
                            }
                            reason = streetName;
                        } catch (err) {
                            warning('Street name "' + streetName + '" causes error in rules');
                            return;
                        }
                    }
                }

                if (detected) {
                    var gj = new OpenLayers.Format.GeoJSON();
                    var geometry = gj.parseGeometry(obj.geometry);
                    var objCenter = geometry.getBounds().getCenterLonLat().transform(W.Config.map.projection.remote, W.map.getProjectionObject());
                    var boundsCenter = bounds.clone().getCenterLonLat().transform(W.Config.map.projection.remote, W.map.getProjectionObject());
                    obj.center = objCenter;

                    problems.push({
                        object: obj,
                        reason: reason,
                        attrName: attrName,
                        detectPos: boundsCenter,
                        zoom: zoom,
                        newStreetName: newStreetName,
                        isEmpty: street.attributes.isEmpty,
                        cityId: street.attributes.cityID,
                        streetID: streetID,
                        experimental: false,
                        skip: skip,
                    });

                    onProblemDetected(obj.id + '_' + streetID, obj, title, reason);
                }
            };

            this.analyze = function (bounds, zoom, data, onProblemDetected) {
                var startTime = new Date().getTime();
                var analyzeAlt = true;

                info('start analyze');

                var subjects = {
                    'segment': {
                        attr: 'primaryStreetID',
                        name: 'segments'
                    },
                    'venue': {
                        attr: 'streetID',
                        name: 'venues'
                    }
                };

                if (localStorage) {
                    if (localStorage.getItem('assist_skip_alt') == 'true') {
                        analyzeAlt = false;
                    }
                }

                for (var k in subjects) {
                    var subject = subjects[k];
                    var subjectData = data[subject.name];

                    if (!subjectData)
                        continue;

                    var objects = subjectData.objects;

                    for (var i = 0; i < objects.length; ++i) {
                        var obj = objects[i];
                        var id = obj.id;

                        obj.type = k;

                        if (analyzedIds.indexOf(id) >= 0)
                            continue;

                        if (typeof obj.approved != 'undefined' && !obj.approved)
                            continue;

                        checkStreet(bounds, zoom, obj[subject.attr], obj, subject.attr, onProblemDetected);

                        // support for alternative names
                        if (subject.name == 'segments' && analyzeAlt) {
                            for (var j = 0, n = obj.streetIDs.length; j < n; j++) {
                                checkStreet(bounds, zoom, obj.streetIDs[j], obj, 'streetIDs', onProblemDetected);
                            }
                        }
                        analyzedIds.push(id);
                    }
                }

                info('end analyze: ' + (new Date().getTime() - startTime) + 'ms');
            };
        };

        var Application = function () {
            var scanner = new Scanner();
            var analyzer = new Analyzer();

            var FULL_ZOOM_LEVEL = 17;

            var scanForZoom = function (zoom) {
                scanner.scan(W.map.olMap.calculateBounds(), zoom, function (bounds, zoom, data) {
                    //debug(data);
                    //var w = window.open();
                    //w.document.open();
                    //w.document.write(JSON.stringify(data));
                    //w.document.close();

                    analyzer.analyze(bounds, zoom, data, function (id, obj, title, reason) {
                        ui.addProblem(id, title,
                            action.Select(obj.id, obj.type, obj.center, zoom),
                            function () {
                            ui.customRuleDialog('Add custom rule', {
                                oldname: '(.*)' + reason + '(.*)',
                                newname: reason
                            }).done(function (response) {
                                rules.push(response.oldname, response.newname);
                                ui.scanAreaBtn().click();
                            });
                        },
                            function () {
                            analyzer.addException(reason, function (id) {
                                ui.removeError(id);
                                ui.setUnresolvedErrorNum(analyzer.unresolvedErrorNum());
                            });
                        }, false);

                        ui.setUnresolvedErrorNum(analyzer.unresolvedErrorNum());
                    });
                }, function (progress) {
                    ui.setScanProgress(Math.round(progress) + '%');
                });
            };

            var fullscan = function () {
                scanForZoom(FULL_ZOOM_LEVEL);
            };

            var scan = function () {
                scanForZoom(W.map.getZoom());
            };

            var action = new ActionHelper();
            var rules = new Rules();
            var ui = new Ui();

            analyzer.setRules(rules);
            analyzer.setActionHelper(action);

            action.setUi(ui);

            analyzer.onExceptionAdd(function (name) {
                ui.addException(name, function (index) {
                    if (confirm('Delete exception for ' + name + '?')) {
                        analyzer.removeException(index);
                    }
                });
            });

            analyzer.onExceptionDelete(function (index) {
                ui.removeException(index);
            });

            //        rules.experimental = true;

            rules.onAdd(function (rule) {
                ui.addCustomRule(rule.comment);
            });

            rules.onEdit(function (index, rule) {
                ui.updateCustomRule(index, rule.comment);
            });

            rules.onDelete(function (index) {
                ui.removeCustomRule(index);
            });

            //W.model.events.register('mergeend', null, function () {
            //    var name = W.model.getTopCountry().getName();
            //    if (name != currentCountry) {
            //        rules.onCountryChange(name);
            //        currentCountry = name;
            //    }
            //});

            analyzer.loadExceptions();
            rules.load();

            this.start = function () {
                ui.enableCheckbox().change(function () {
                    if (this.checked) {
                        ui.showMainWindow();

                        var savedVariant = localStorage.getItem('assist_variant');
                        if (savedVariant !== null) {
                            ui.variantRadio(savedVariant).prop('checked', true);
                            analyzer.setVariant(savedVariant);
                        }

                        scan();
                        W.model.events.register('mergeend', null, scan);
                    } else {
                        W.model.events.unregister('mergeend', null, scan);
                        ui.hideMainWindow();
                    }
                });

                ui.skipAltCheckbox().change(function () {
                    localStorage.setItem('assist_skip_alt', this.checked);
                    ui.scanAreaBtn().click();
                });

                ui.moveOld2AltCheckbox().change(function () {
                    localStorage.setItem('assist_move_old_to_alt', this.checked);
                    if (this.checked) {
                        // force enable skip alt option
                        localStorage.setItem('assist_skip_alt', true);
                        ui.skipAltCheckbox().prop('checked', true);
                        ui.skipAltCheckbox().prop('disabled', true);
                    } else {
                        // unblock skip alt option
                        ui.skipAltCheckbox().prop('disabled', false);
                    }
                });

                ui.enableCustomRulesCheckbox().change(function () {
                    localStorage.setItem('assist_enable_custom_rules', this.checked);
                    ui.scanAreaBtn().click();
                });

                ui.variantRadio().change(function (e) {
                    if (e.currentTarget.checked) {
                        localStorage.setItem('assist_variant', this.value);

                        analyzer.setVariant(this.value);
                        ui.scanAreaBtn().click();
                    }
                });

                if (localStorage.getItem('assist_enabled') == 'true') {
                    ui.enableCheckbox().click();
                }
                if (localStorage.getItem('assist_skip_alt') == 'true') {
                    ui.skipAltCheckbox().click();
                }
                if (localStorage.getItem('assist_move_old_to_alt') == 'true') {
                    ui.moveOld2AltCheckbox().click();
                }
                if (localStorage.getItem('assist_enable_custom_rules') == 'true') {
                    ui.enableCustomRulesCheckbox().click();
                }

                ui.fixAllBtn().click(function () {
                    ui.fixAllBtn().hide();
                    ui.fixSelectedBtn().hide();
                    ui.scanAreaBtn().hide();
                    ui.clearFixedBtn().hide();
                    ui.clearAllBtn().hide();

                    W.model.events.unregister('mergeend', null, scan);

                    setTimeout(function () {
                        analyzer.fixAll(function (id) {
                            ui.setUnresolvedErrorNum(analyzer.unresolvedErrorNum());
                            ui.setFixedErrorNum(analyzer.fixedErrorNum());
                            ui.moveToFixedList(id);
                        }, function () {
                            ui.fixAllBtn().show();
                            ui.fixSelectedBtn().show();
                            ui.scanAreaBtn().show();
                            ui.clearFixedBtn().show();
                            ui.clearAllBtn().show();

                            W.model.events.register('mergeend', null, scan);
                        });
                    }, 0);
                });

                ui.fixSelectedBtn().click(function () {
                    ui.fixAllBtn().hide();
                    ui.fixSelectedBtn().hide();
                    ui.scanAreaBtn().hide();
                    ui.clearFixedBtn().hide();
                    ui.clearAllBtn().hide();

                    W.model.events.unregister('mergeend', null, scan);

                    var listToFix = ui.getCheckedItemsList();

                    setTimeout(function () {
                        analyzer.fixSelected(listToFix, function (id) {
                            ui.setUnresolvedErrorNum(analyzer.unresolvedErrorNum());
                            ui.setFixedErrorNum(analyzer.fixedErrorNum());
                            ui.moveToFixedList(id);
                        }, function () {
                            ui.fixAllBtn().show();
                            ui.fixSelectedBtn().show();
                            ui.scanAreaBtn().show();
                            ui.clearFixedBtn().show();
                            ui.clearAllBtn().show();

                            W.model.events.register('mergeend', null, scan);
                        });
                    }, 0);
                });

                ui.clearFixedBtn().click(function () {
                    ui.fixedList().empty();
                });

                ui.clearAllBtn().click(function () {
                    ui.fixedList().empty();
                    ui.unresolvedList().empty();

                    analyzer.reset();

                    ui.setUnresolvedErrorNum(0);
                    ui.setFixedErrorNum(0);
                });

                ui.selectAllChk().change(function () {
                    var allChecked = this.checked;
                    ui.unresolvedList().find('input').each(function () {
                        this.checked = allChecked;
                    });
                });

                ui.scanAreaBtn().click(function () {
                    ui.fixedList().empty();
                    ui.unresolvedList().empty();

                    analyzer.reset();

                    ui.setUnresolvedErrorNum(0);
                    ui.setFixedErrorNum(0);

                    fullscan();
                });

                ui.addCustomRuleBtn().click(function () {
                    ui.customRuleDialog('Add', {
                        oldname: '',
                        newname: ''
                    }).done(function (response) {
                        rules.push(response.oldname, response.newname);
                    });
                });

                ui.editCustomRuleBtn().click(function () {
                    var id = ui.selectedCustomRule();
                    if (id >= 0) {
                        ui.customRuleDialog('Edit', {
                            oldname: rules.get(id).oldname,
                            newname: rules.get(id).newname
                        }).done(function (response) {
                            rules.update(id, response.oldname, response.newname);
                        });
                    } else {
                        alert('Custom rule is not selected');
                    }
                });

                ui.delCustomRuleBtn().click(function () {
                    var id = ui.selectedCustomRule();
                    if (id >= 0) {
                        rules.remove(id);
                    } else {
                        alert('Custom rule is not selected');
                    }
                });

                window.assist = this;
            };
        };

        function readyFunc() {
            requestRules(function () {
                info("Ready to work!");
                var app = new Application();
                app.start();
            });
        }

        if (W?.userscripts?.state.isReady) {
            readyFunc();
        } else {
            document.addEventListener("wme-ready", readyFunc, {
                once: true,
            });
        }

    }

    run_wme_assist();

})();