LOLZ Inline Assistant

inline

// ==UserScript==
// @name         LOLZ Inline Assistant
// @namespace    http://tampermonkey.net/
// @namespace    http://tampermonkey.net/
// @author       @umikud
// @version      1.2
// @description  inline
// @match        https://*.lolz.live/*
// @grant        none
// @license MIT
// ==/UserScript==

(function () {
    'use strict';

    const sectionsDict = {
    "Android": "https://lolz.live/forums/437/",
    "Apex Legends": "https://lolz.live/forums/apex-legends/",
    "Battle.net": "https://lolz.live/forums/688/",
    "Battlefield": "https://lolz.live/forums/battlefield-all/",
    "Battlefield 1": "https://lolz.live/forums/759/",
    "Battlefield 2042": "https://lolz.live/forums/920/",
    "Battlefield V": "https://lolz.live/forums/821/",
    "C#": "https://lolz.live/forums/97/",
    "C/C++": "https://lolz.live/forums/96/",
    "Call of Duty": "https://lolz.live/forums/418/",
    "Counter-Strike 2": "https://lolz.live/forums/cs2/",
    "CrackME / UnpackME": "https://lolz.live/forums/872/",
    "DayZ": "https://lolz.live/forums/998/",
    "Deadlock": "https://lolz.live/forums/deadlock/",
    "Discord": "https://lolz.live/forums/898/",
    "Dota 2": "https://lolz.live/forums/dota2/",
    "EFT: Arena": "https://lolz.live/forums/1000/",
    "Escape from Tarkov": "https://lolz.live/forums/857/",
    "FIFA": "https://lolz.live/forums/946/",
    "Fortnite": "https://lolz.live/forums/790/",
    "Fortnite, Epic Games": "https://lolz.live/forums/800/",
    "GTA": "https://lolz.live/forums/981/",
    "GTA SAMP": "https://lolz.live/forums/139/",
    "GTA V": "https://lolz.live/forums/141/",
    "GTA V MODS": "https://lolz.live/forums/669/",
    "Genshin Impact": "https://lolz.live/forums/genshin-impact/",
    "Go": "https://lolz.live/forums/1016/",
    "HTML шаблоны, лендинги": "https://lolz.live/forums/694/",
    "HTML, CSS, Javascript": "https://lolz.live/forums/820/",
    "Hash": "https://lolz.live/forums/hash/",
    "Honkai Star Rail": "https://lolz.live/forums/honkai-star-rail/",
    "Kali  Linux": "https://lolz.live/forums/713/",
    "League of Legends": "https://lolz.live/forums/130/",
    "Linux": "https://lolz.live/forums/588/",
    "Malware": "https://lolz.live/forums/343/",
    "Minecraft": "https://lolz.live/forums/729/",
    "Node.js": "https://lolz.live/forums/867/",
    "Origin (EA)": "https://lolz.live/forums/origin/",
    "Overwatch 2": "https://lolz.live/forums/967/",
    "P2P обмены": "https://lolz.live/forums/1001/",
    "PHP, MySQL": "https://lolz.live/forums/510/",
    "PSN": "https://lolz.live/forums/psn/",
    "PUBG": "https://lolz.live/forums/767/",
    "Private Keeper, BAS, OB": "https://lolz.live/forums/818/",
    "Python": "https://lolz.live/forums/830/",
    "Rainbow Six Siege": "https://lolz.live/forums/1036/",
    "Roblox": "https://lolz.live/forums/1019/",
    "Roblox Studio": "https://lolz.live/forums/1034/",
    "Rocket League": "https://lolz.live/forums/869/",
    "Rust": "https://lolz.live/forums/rust/",
    "S.T.A.L.K.E.R.": "https://lolz.live/forums/560/",
    "S.T.A.L.K.E.R. 2": "https://lolz.live/forums/1032/",
    "SAMP": "https://lolz.live/forums/690/",
    "SEO, продвижение": "https://lolz.live/forums/95/",
    "SMM": "https://lolz.live/forums/746/",
    "SMM Instagram": "https://lolz.live/forums/748/",
    "SMM ВКонтакте": "https://lolz.live/forums/747/",
    "SQLI, Dork Parsers": "https://lolz.live/forums/sqli/",
    "Social Club": "https://lolz.live/forums/720/",
    "Steam": "https://lolz.live/forums/steam/",
    "Supercell": "https://lolz.live/forums/892/",
    "Team Fortress 2": "https://lolz.live/forums/983/",
    "The Finals": "https://lolz.live/forums/982/",
    "Uplay": "https://lolz.live/forums/uplay/",
    "VR игры": "https://lolz.live/forums/944/",
    "Valorant": "https://lolz.live/forums/914/",
    "War Thunder": "https://lolz.live/forums/1037/",
    "Warface": "https://lolz.live/forums/warface/",
    "Wi-Fi": "https://lolz.live/forums/749/",
    "Windows": "https://lolz.live/forums/109/",
    "World of Tanks": "https://lolz.live/forums/689/",
    "YouTube, Twitch": "https://lolz.live/forums/839/",
    "Zenless Zone Zero": "https://lolz.live/forums/zenless-zone-zero/",
    "iOS": "https://lolz.live/forums/436/",
    "macOS": "https://lolz.live/forums/794/",
    "miHoYo": "https://lolz.live/forums/990/",
    "osu!": "https://lolz.live/forums/870/",
    "Авто, мото": "https://lolz.live/forums/961/",
    "Автореггеры": "https://lolz.live/forums/267/",
    "Авторские курсы": "https://lolz.live/forums/906/",
    "Акки с балансом, бонусами": "https://lolz.live/forums/806/",
    "Аниме": "https://lolz.live/forums/835/",
    "Анонимность": "https://lolz.live/forums/311/",
    "Арбитраж": "https://lolz.live/forums/arbitrage/",
    "Баги Warface": "https://lolz.live/forums/536/",
    "Баги, скрипты Apex Legends": "https://lolz.live/forums/934/",
    "Баги, скрипты для Dota 2": "https://lolz.live/forums/227/",
    "Базы, запросы с почт": "https://lolz.live/forums/431/",
    "Безопасность": "https://lolz.live/forums/745/",
    "Бесплатная графика": "https://lolz.live/forums/833/",
    "Бесплатная накрутка": "https://lolz.live/forums/851/",
    "Бесплатная разработка": "https://lolz.live/forums/1039/",
    "Брут, чекеры": "https://lolz.live/forums/110/",
    "Буст аккаунтов": "https://lolz.live/forums/664/",
    "Валюта Escape from  Tarkov": "https://lolz.live/forums/919/",
    "Ваше творчество": "https://lolz.live/forums/845/",
    "Ваши истории": "https://lolz.live/forums/819/",
    "Ваши работы": "https://lolz.live/forums/372/",
    "Ваши сайты": "https://lolz.live/forums/838/",
    "Веб уязвимости": "https://lolz.live/forums/392/",
    "Веб-разработка": "https://lolz.live/forums/85/",
    "Вещи, техника": "https://lolz.live/forums/912/",
    "Видео Battlefield 1": "https://lolz.live/forums/924/",
    "Видео Battlefield 2042": "https://lolz.live/forums/922/",
    "Видео Battlefield V": "https://lolz.live/forums/923/",
    "Видео DeadLock": "https://lolz.live/forums/1030/",
    "Видео GTA V": "https://lolz.live/forums/175/",
    "Видео League of Legends": "https://lolz.live/forums/219/",
    "Видео Minecraft": "https://lolz.live/forums/204/",
    "Видео Rocket League": "https://lolz.live/forums/973/",
    "Видео SAMP": "https://lolz.live/forums/171/",
    "Видео Valorant": "https://lolz.live/forums/978/",
    "Видео Warface": "https://lolz.live/forums/77/",
    "Видео World of Tanks": "https://lolz.live/forums/215/",
    "Вирусология": "https://lolz.live/forums/752/",
    "Вопрос - Ответ": "https://lolz.live/forums/899/",
    "Воркеры": "https://lolz.live/forums/workers_deleted/",
    "Вторичка": "https://lolz.live/forums/913/",
    "Вторичка дедиков, хостингов": "https://lolz.live/forums/932/",
    "Вторичка софта": "https://lolz.live/forums/671/",
    "Вторичка читов": "https://lolz.live/forums/929/",
    "Вязка каналов": "https://lolz.live/forums/948/",
    "Гайды Apex Legends": "https://lolz.live/forums/878/",
    "Гайды Battlefield 1": "https://lolz.live/forums/887/",
    "Гайды Battlefield 2042": "https://lolz.live/forums/921/",
    "Гайды Battlefield V": "https://lolz.live/forums/886/",
    "Гайды CS2": "https://lolz.live/forums/36/",
    "Гайды Call of Duty": "https://lolz.live/forums/881/",
    "Гайды DayZ": "https://lolz.live/forums/1020/",
    "Гайды DeadLock": "https://lolz.live/forums/1031/",
    "Гайды Escape from Tarkov": "https://lolz.live/forums/885/",
    "Гайды FIFA": "https://lolz.live/forums/970/",
    "Гайды Fortnite": "https://lolz.live/forums/792/",
    "Гайды Genshin Impact": "https://lolz.live/forums/891/",
    "Гайды Honkai Star Rail": "https://lolz.live/forums/994/",
    "Гайды Overwatch 2": "https://lolz.live/forums/968/",
    "Гайды PUBG": "https://lolz.live/forums/768/",
    "Гайды Rocket League": "https://lolz.live/forums/888/",
    "Гайды Rust": "https://lolz.live/forums/883/",
    "Гайды SAMP": "https://lolz.live/forums/170/",
    "Гайды Supercell": "https://lolz.live/forums/893/",
    "Гайды Valorant": "https://lolz.live/forums/917/",
    "Гайды Warface": "https://lolz.live/forums/76/",
    "Гайды World of Tanks": "https://lolz.live/forums/214/",
    "Гайды Zenless Zone Zero": "https://lolz.live/forums/1005/",
    "Гайды osu!": "https://lolz.live/forums/877/",
    "Гайды по VR играм": "https://lolz.live/forums/959/",
    "Гайды по форуму": "https://lolz.live/forums/7/",
    "Гайды, рецепты Minecraft": "https://lolz.live/forums/201/",
    "Гайды, тактики по Dota 2": "https://lolz.live/forums/228/",
    "Гайды, тактики по GTA V": "https://lolz.live/forums/176/",
    "Гайды, тактики по LoL": "https://lolz.live/forums/218/",
    "Гифты, ключи, балансы Steam": "https://lolz.live/forums/728/",
    "Графика": "https://lolz.live/forums/88/",
    "Движки, фреймворки": "https://lolz.live/forums/93/",
    "Девайсы": "https://lolz.live/forums/837/",
    "Дедики, хостинги": "https://lolz.live/forums/763/",
    "Дизайн": "https://lolz.live/forums/design/",
    "Дополнения": "https://lolz.live/forums/976/",
    "Другие игры": "https://lolz.live/forums/816/",
    "Другое": "https://lolz.live/forums/815/",
    "Жалобы": "https://lolz.live/forums/801/",
    "Жизнь форума": "https://lolz.live/forums/4/",
    "Завершенные P2P обмены": "https://lolz.live/forums/1013/",
    "Завершенные розыгрыши": "https://lolz.live/forums/771/",
    "Задания за деньги": "https://lolz.live/forums/834/",
    "Игры": "https://lolz.live/forums/682/",
    "Инвентарь Steam": "https://lolz.live/forums/726/",
    "Инсталлы, крипт": "https://lolz.live/forums/595/",
    "Интервью": "https://lolz.live/forums/interviews/",
    "Исходники": "https://lolz.live/forums/696/",
    "Ищу работу": "https://lolz.live/forums/832/",
    "Ищу софт": "https://lolz.live/forums/718/",
    "Карты и скины osu!": "https://lolz.live/forums/905/",
    "Кино и мультфильмы": "https://lolz.live/forums/873/",
    "Кисти, текстуры, градиенты": "https://lolz.live/forums/698/",
    "Компьютеры": "https://lolz.live/forums/587/",
    "Конкурсы и турниры": "https://lolz.live/forums/107/",
    "Конфиги CS2": "https://lolz.live/forums/38/",
    "Кошельки, верификация": "https://lolz.live/forums/817/",
    "Криптовалюты": "https://lolz.live/forums/780/",
    "Крипторы": "https://lolz.live/forums/347/",
    "Кулинария": "https://lolz.live/forums/cookery/",
    "Логи": "https://lolz.live/forums/810/",
    "Модификации World of Tanks": "https://lolz.live/forums/213/",
    "Моды SAMP": "https://lolz.live/forums/722/",
    "Моды, текстуры для Minecraft": "https://lolz.live/forums/202/",
    "Музыкальные утечки": "https://lolz.live/forums/862/",
    "Накрутка в соц. сетях": "https://lolz.live/forums/593/",
    "Недочеты": "https://lolz.live/forums/bugs/",
    "Нейросети": "https://lolz.live/forums/neural-networks/",
    "Неоплаченные претензии": "https://lolz.live/forums/918/",
    "Новости сайта": "https://lolz.live/forums/265/",
    "Обмен средств": "https://lolz.live/forums/805/",
    "Озвучка": "https://lolz.live/forums/863/",
    "Остальные игры": "https://lolz.live/forums/760/",
    "Ответы ЕГЭ и ОГЭ, ЗНО 2025": "https://lolz.live/forums/otvety-ege-oge-25/",
    "Оценка товара": "https://lolz.live/forums/381/",
    "Палата №8 (Оффтоп)": "https://lolz.live/forums/8/",
    "Парсеры": "https://lolz.live/forums/275/",
    "Плагины и сборки Minecraft": "https://lolz.live/forums/251/",
    "Платные обжалования": "https://lolz.live/forums/paid-appeals/",
    "Подарки в соц. сетях": "https://lolz.live/forums/840/",
    "Поиск исполнителей": "https://lolz.live/forums/975/",
    "Поиск отработчиков": "https://lolz.live/forums/1007/",
    "Полезное ПО": "https://lolz.live/forums/1044/",
    "Пополнение баланса": "https://lolz.live/forums/1014/",
    "Почты": "https://lolz.live/forums/814/",
    "Предложения": "https://lolz.live/forums/suggestions/",
    "Приватные читы": "https://lolz.live/forums/263/",
    "Приватный софт": "https://lolz.live/forums/345/",
    "Приём смс": "https://lolz.live/forums/925/",
    "Проблемы с VR играми": "https://lolz.live/forums/960/",
    "Проблемы с загрузкой аккаунтов": "https://lolz.live/forums/account-upload-issues/",
    "Проблемы с игрой Apex Legends": "https://lolz.live/forums/933/",
    "Проблемы с игрой Call of Duty": "https://lolz.live/forums/958/",
    "Проблемы с игрой DayZ": "https://lolz.live/forums/1029/",
    "Проблемы с игрой Escape from Tarkov": "https://lolz.live/forums/941/",
    "Проблемы с игрой FIFA": "https://lolz.live/forums/971/",
    "Проблемы с игрой Fortnite": "https://lolz.live/forums/987/",
    "Проблемы с игрой GTA V": "https://lolz.live/forums/179/",
    "Проблемы с игрой Genshin Impact": "https://lolz.live/forums/939/",
    "Проблемы с игрой Honkai Star Rail": "https://lolz.live/forums/995/",
    "Проблемы с игрой League of Legends": "https://lolz.live/forums/221/",
    "Проблемы с игрой Minecraft": "https://lolz.live/forums/205/",
    "Проблемы с игрой Rust": "https://lolz.live/forums/942/",
    "Проблемы с игрой SAMP": "https://lolz.live/forums/172/",
    "Проблемы с игрой Valorant": "https://lolz.live/forums/980/",
    "Проблемы с игрой Warface": "https://lolz.live/forums/79/",
    "Проблемы с игрой Zenless Zone Zero": "https://lolz.live/forums/1006/",
    "Проблемы с игрой osu!": "https://lolz.live/forums/945/",
    "Программирование": "https://lolz.live/forums/733/",
    "Прокси чекеры": "https://lolz.live/forums/278/",
    "Прокси-серверы": "https://lolz.live/forums/1003/",
    "Промокоды": "https://lolz.live/forums/897/",
    "Прошивки": "https://lolz.live/forums/1047/",
    "Психология": "https://lolz.live/forums/903/",
    "Работа и услуги": "https://lolz.live/forums/105/",
    "Работа с базами": "https://lolz.live/forums/277/",
    "Работа с видео": "https://lolz.live/forums/91/",
    "Работа с дедиками": "https://lolz.live/forums/374/",
    "Работа с логами": "https://lolz.live/forums/926/",
    "Работа с текстом": "https://lolz.live/forums/391/",
    "Работа с хэшами": "https://lolz.live/forums/586/",
    "Раздачи аккаунтов, ключей": "https://lolz.live/forums/21/",
    "Раздачи баз": "https://lolz.live/forums/444/",
    "Раздачи вещей Steam": "https://lolz.live/forums/849/",
    "Раздачи дедиков": "https://lolz.live/forums/762/",
    "Раздачи логов": "https://lolz.live/forums/848/",
    "Раздачи прокси": "https://lolz.live/forums/566/",
    "Раздел для кураторов": "https://lolz.live/forums/911/",
    "Рассмотренные вопросы": "https://lolz.live/forums/902/",
    "Рассмотренные недочеты": "https://lolz.live/forums/827/",
    "Рассмотренные предложения": "https://lolz.live/forums/809/",
    "Реверсинг / Assembler": "https://lolz.live/forums/584/",
    "Реклама": "https://lolz.live/forums/962/",
    "Ресурсы": "https://lolz.live/forums/608/",
    "Решенные жалобы": "https://lolz.live/forums/803/",
    "Решенные претензии": "https://lolz.live/forums/774/",
    "Розыгрыши": "https://lolz.live/forums/contests/",
    "Серверы Minecraft": "https://lolz.live/forums/203/",
    "Сигны": "https://lolz.live/forums/868/",
    "Скрипты сайтов": "https://lolz.live/forums/650/",
    "Скрипты, боты": "https://lolz.live/forums/685/",
    "Слив фотографий 18+": "https://lolz.live/forums/media-leaks18/",
    "Софт": "https://lolz.live/forums/607/",
    "Софт для графики": "https://lolz.live/forums/92/",
    "Соц. сети": "https://lolz.live/forums/683/",
    "Социальная инженерия": "https://lolz.live/forums/743/",
    "Социальные сети": "https://lolz.live/forums/757/",
    "Спамеры, бомберы": "https://lolz.live/forums/276/",
    "Спорт": "https://lolz.live/forums/904/",
    "Способы заработка": "https://lolz.live/forums/363/",
    "Спроси у ChatGPT": "https://lolz.live/forums/ask-chatgpt/",
    "Сталкер: Зов припяти": "https://lolz.live/forums/561/",
    "Сталкер: Тень Чернобыля": "https://lolz.live/forums/562/",
    "Сталкер: Чистое Небо": "https://lolz.live/forums/563/",
    "Статьи": "https://lolz.live/forums/421/",
    "Телефоны": "https://lolz.live/forums/435/",
    "Тематические вопросы": "https://lolz.live/forums/585/",
    "Тестовый раздел": "https://lolz.live/forums/test-forum/",
    "Торговля": "https://lolz.live/forums/104/",
    "Трафферы": "https://lolz.live/forums/936/",
    "Уроки": "https://lolz.live/forums/823/",
    "Уроки по анимациям": "https://lolz.live/forums/393/",
    "Уроки реверсинга": "https://lolz.live/forums/601/",
    "Учеба": "https://lolz.live/forums/853/",
    "Фишинг": "https://lolz.live/forums/855/",
    "Халява": "https://lolz.live/forums/9/",
    "Хостинг, аренда магазина": "https://lolz.live/forums/596/",
    "Чек игрового инвентаря": "https://lolz.live/forums/909/",
    "Чек криптовалюты": "https://lolz.live/forums/908/",
    "Чек логов, баз": "https://lolz.live/forums/597/",
    "Читы Apex Legends": "https://lolz.live/forums/828/",
    "Читы CS2": "https://lolz.live/forums/785/",
    "Читы Call of Duty": "https://lolz.live/forums/901/",
    "Читы DayZ": "https://lolz.live/forums/1028/",
    "Читы Dota 2": "https://lolz.live/forums/858/",
    "Читы Escape from Tarkov": "https://lolz.live/forums/884/",
    "Читы Fortnite": "https://lolz.live/forums/791/",
    "Читы PUBG": "https://lolz.live/forums/784/",
    "Читы Rust": "https://lolz.live/forums/900/",
    "Читы SAMP": "https://lolz.live/forums/518/",
    "Читы Valorant": "https://lolz.live/forums/916/",
    "Читы Warface": "https://lolz.live/forums/75/",
    "Читы для Android игр": "https://lolz.live/forums/783/",
    "Читы для игр miHoYo": "https://lolz.live/forums/966/",
    "Читы, баги Minecraft": "https://lolz.live/forums/200/",
    "Читы, баги для GTA V": "https://lolz.live/forums/177/",
    "Читы, баги для League of Legends": "https://lolz.live/forums/217/",
    "Шип, рефанд": "https://lolz.live/forums/841/",
    "Шрифты": "https://lolz.live/forums/697/",
    "Юмор": "https://lolz.live/forums/874/",
};

    const cryptoSymbols = {
    btc: 'bitcoin',
    eth: 'ethereum',
    ton: 'the-open-network',
    usdt: 'tether',
    usdc: 'usd-coin',
    bnb: 'binancecoin',
    sol: 'solana',
    xrp: 'ripple',
    doge: 'dogecoin',
    ada: 'cardano',
    avax: 'avalanche-2',
    trx: 'tron',
    shib: 'shiba-inu',
    dot: 'polkadot',
    matic: 'matic-network',
    dai: 'dai',
    ltc: 'litecoin',
    link: 'chainlink',
    op: 'optimism',
    arb: 'arbitrum',
    near: 'near'
    };
    const priceCache = {};
    const CACHE_TTL = 60000;
    let popup = null;
    let editor = null;
    let debounceTimer = null;

    function getCaretPositionRect() {
        const sel = window.getSelection();
        if (!sel.rangeCount) return null;
        const range = sel.getRangeAt(0).cloneRange();
        const rects = range.getClientRects();
        return rects.length ? rects[0] : null;
    }

    function createPopupIfNeeded() {
        if (popup) return;
        popup = document.createElement('div');
        popup.className = 'fr-popup fr-desktop fr-ltr fe-acPopup fr-above fr-active';
        popup.style.zIndex = 9999;
        popup.style.position = 'absolute';
        popup.style.maxWidth = '350px';

        const scrollWrapper = document.createElement('div');
        scrollWrapper.className = 'scroll-wrapper fe-ac fe-ac-user';
        scrollWrapper.style.position = 'relative';

        const scrollContent = document.createElement('div');
        scrollContent.className = 'fe-ac fe-ac-user scroll-content';
        scrollContent.style.maxHeight = '132px';

        scrollWrapper.appendChild(scrollContent);
        popup.appendChild(scrollWrapper);
        document.body.appendChild(popup);
        const style = document.createElement('style');
        style.textContent = `
          .guarantor_block_card_payment {
          padding: 4px 8px;
          font-weight: bold;
          border-radius: 6px;
          font-size: 13px;
          font-family: -apple-system,BlinkMacSystemFont,'Open Sans','Helvetica Neue',sans-serif;
          display: inline-block;
          margin-right: 8px;
        }

         .guarantor_block_card_payment.btc_color  { color: #D1AC40; background-color: #413D31; }
.guarantor_block_card_payment.eth_color  { color: #4093D6; background-color: #313A41; }
.guarantor_block_card_payment.ton_color  { color: #40c0d6; background-color: #36474c; }
.guarantor_block_card_payment.usdt_color { color: #26A17B; background-color: #222; }
.guarantor_block_card_payment.usdc_color { color: #2775CA; background-color: #1E1E1E; }
.guarantor_block_card_payment.bnb_color  { color: #F3BA2F; background-color: #1E1E1E; }
.guarantor_block_card_payment.sol_color  { color: #66F9A1; background-color: #2A2A2A; }
.guarantor_block_card_payment.xrp_color  { color: #00AAE4; background-color: #1C1C1C; }
.guarantor_block_card_payment.doge_color { color: #C2A633; background-color: #3A3A3A; }
.guarantor_block_card_payment.ada_color  { color: #0033AD; background-color: #202020; }
.guarantor_block_card_payment.avax_color { color: #E84142; background-color: #1F1F1F; }
.guarantor_block_card_payment.trx_color  { color: #EF0027; background-color: #191919; }
.guarantor_block_card_payment.shib_color { color: #F55C44; background-color: #2C2C2C; }
.guarantor_block_card_payment.dot_color  { color: #E6007A; background-color: #242424; }
.guarantor_block_card_payment.matic_color{ color: #8247E5; background-color: #282828; }
.guarantor_block_card_payment.dai_color  { color: #F4B731; background-color: #292929; }
.guarantor_block_card_payment.ltc_color  { color: #BEBEBE; background-color: #2E2E2E; }
.guarantor_block_card_payment.link_color { color: #2A5ADA; background-color: #303030; }
.guarantor_block_card_payment.op_color   { color: #FF0420; background-color: #1B1B1B; }
.guarantor_block_card_payment.arb_color  { color: #28A0F0; background-color: #1D1D1D; }
.guarantor_block_card_payment.near_color { color: #000000; background-color: #F8F8F8; }

       `;
        popup.appendChild(style);

    }

    function updatePopup(results, insertCallback, position) {
        createPopupIfNeeded();
        popup.style.left = `${position.left}px`;
        popup.style.top = `${position.top + 20}px`;

        const scrollContent = popup.querySelector('.scroll-content');
        scrollContent.innerHTML = '';

        results.forEach(r => {
            const div = document.createElement('div');
            div.className = 'fe-ac-user-result fe-ac-result';
            div.innerHTML = r.isHtml
    ? r.title
    : `<span class="username"><span class="style2">${r.title}</span></span><span class="item">${r.subtitle}</span>`;

            div.addEventListener('click', (event) => {
                event.preventDefault();
                event.stopPropagation();
                insertCallback(r.insertText);
                hidePopup();
            });
            scrollContent.appendChild(div);
        });
    }

    function hidePopup() {
        if (popup) popup.remove();
        popup = null;
    }

    async function fetchSuggestions(query) {
        const results = [];
        console.log(query)

        const calcMatch = query.match(/^([a-z]{2,5})\s*([\*\+\/\-])\s*(\d+(\.\d+)?%?)$/i);
        if (calcMatch) {
            const [, symbolKey, operator, valueRaw] = calcMatch;
            const coinId = cryptoSymbols[symbolKey];
            if (coinId) {
                const now = Date.now();
                let price;

                const cacheEntry = priceCache[symbolKey];
                if (cacheEntry && now - cacheEntry.timestamp < CACHE_TTL) {
                    price = cacheEntry.price;
                } else {
                    try {
                        const res = await fetch(`https://api.coingecko.com/api/v3/simple/price?ids=${coinId}&vs_currencies=usd`);
                        const data = await res.json();
                        price = data[coinId]?.usd;
                        if (!price) throw new Error();
                        priceCache[symbolKey] = { price, timestamp: now };
                    } catch (e) {
                        console.error('Ошибка получения курс:', e);
                    }
                }

                if (price) {
                    const isPercent = valueRaw.endsWith('%');
                    const value = parseFloat(valueRaw.replace('%', ''));
                    let result;

                    switch (operator) {
                        case '*': result = price * value; break;
                        case '/': result = price / value; break;
                        case '+': result = isPercent ? price * (1 + value / 100) : price + value; break;
                        case '-': result = isPercent ? price * (1 - value / 100) : price - value; break;
                    }

                    const rounded = result.toFixed(2);
                    results.push({
                        title: `<span class="guarantor_block_card_payment ${symbolKey}_color">${symbolKey.toUpperCase()} → ${rounded} USD</span>`,
                        subtitle: '',
                        insertText: `${symbolKey.toUpperCase()}: ${rounded} USD`,
                        isHtml: true
                    });
                }
                return results;
            }
        }


        if (cryptoSymbols[query]) {
            const coinId = cryptoSymbols[query];
            const now = Date.now();
            let price;

            const cacheEntry = priceCache[query];
            if (cacheEntry && now - cacheEntry.timestamp < CACHE_TTL) {
                price = cacheEntry.price;
            } else {
                try {
                    const res = await fetch(`https://api.coingecko.com/api/v3/simple/price?ids=${coinId}&vs_currencies=usd`);
                    const data = await res.json();
                    price = data[coinId]?.usd;
                    if (!price) throw new Error();
                    priceCache[query] = { price, timestamp: now };
                } catch (e) {
                    console.error('Ошибка получения курса:', e);
                }
            }

            if (price) {
                const symbol = query.toUpperCase();
                const html = `<span class="guarantor_block_card_payment ${query}_color">${symbol} ${price} USD</span>`;
                results.push({
                    title: html,
                    subtitle: '',
                    insertText: `${symbol}: ${price} USD`,
                    isHtml: true
                });
            }
        }

        for (const [key, url] of Object.entries(sectionsDict)) {
            if (key.toLowerCase().includes(query.toLowerCase())) {
                const urlParts = url.split("/");
                const last = urlParts.filter(Boolean).pop();
                const nodeId = last.match(/^\d+$/) ? `node${last}` : `node_${last}`;
                const html = `<span class="internalNodeLink ${nodeId}"><a href="${url}" class="internalLink internalNodeLink ${nodeId}">${key}</a></span>`;
                results.push({
                    title: html,
                    subtitle: '',
                    insertText: `${url}`,
                    isHtml: true
                });
            }

        }


        return results;
    }

    function insertTextAtCursor(oldTrigger, newText) {
        const sel = window.getSelection();
        if (!sel.rangeCount) return;
        const node = sel.anchorNode;
        if (!node || !node.textContent) return;

        const text = node.textContent;
        const replaced = text.replace(oldTrigger, newText + ' ');
        node.textContent = replaced;

        const range = document.createRange();
        range.setStart(node, replaced.length);
        range.setEnd(node, replaced.length);
        sel.removeAllRanges();
        sel.addRange(range);
    }

    function handleKeyup(e) {
        if (debounceTimer) clearTimeout(debounceTimer);

        debounceTimer = setTimeout(async () => {
            const sel = window.getSelection();
            if (!sel.rangeCount) return;
            const node = sel.anchorNode;
            if (!node || !node.textContent) return;

            const text = node.textContent;
            const match = text.match(/!([\p{L}\p{N}\s\-\+\*\/%.,]{2,40})$/u);
            if (match) {
                const query = match[1].toLowerCase();
                const caretRect = getCaretPositionRect();
                if (!caretRect) return;
                const suggestions = await fetchSuggestions(query);
                if (suggestions.length) {
                    updatePopup(suggestions, (txt) => insertTextAtCursor('!' + query, txt), caretRect);
                } else {
                    hidePopup();
                }
            } else {
                hidePopup();
            }
        }, 250); 
    }

    function setup() {
        if (editor) return; 
        editor = document.querySelector('.fr-element[contenteditable="true"]');
        if (editor) {
            editor.addEventListener('keyup', handleKeyup);
        }
    }

    const observer = new MutationObserver(() => setup());
    observer.observe(document.body, { childList: true, subtree: true });

    window.addEventListener('load', setup);
})();