Greasy Fork is available in English.

TWLeoTools

Useful tools for The West!

// ==UserScript==
// @name TWLeoTools
// @namespace TomRobert
// @author Leotas (updated by Tom Robert)
// @description Useful tools for The West!
// @include https://*.the-west.*/game.php*
// @include https://*.the-west.*/index.php?page=logout
// @include https://www.the-west.*
// @include https://beta.the-west.net*
// @include http*://tw-db.info/*?strana=invent&x=*
// @exclude https://classic.the-west.net*
// @version 1.45.5
// @grant none
// ==/UserScript==
// translation:Tom Robert(German&English),Darius II/Wojcieszy(Polish),pepe100(Spanish),ruud99(Dutch),Creature/krcsirke(Hungarian),Timemod Herkumo(Greek),Elly Siranno/Raymond Reddington(Portuguese),Billy-AR(Italian)
(function (fn) {
  var script = document.createElement('script');
  script.setAttribute('type', 'application/javascript');
  script.textContent = '(' + fn.toString() + ')();';
  document.body.appendChild(script);
  document.body.removeChild(script);
})(function () {
  if (location.href.includes('index.php?page=logout')) {
    location.href = '/';
  } else {
    LTstart = {
      version: '1.45.5',
      langs: {
        en: {
          language: 'English',
          ApiGui1: 'This script contains many features to simplify your everyday life in The West.<br><br>More Informations: ',
          ApiGui2: 'Open script page',
          FeatLogout: 'Add a logout button on the right side',
          FeatStatusbar: 'Remove the taskbar',
          FeatShowAP: 'Show your actual skill points in job windows',
          FeatChangeCity: 'Switch title and player name in the town hall',
          FeatDuellMap: 'Add Duelmap tab in duel window',
          FeatMarkDaily: 'Highlight daily login bonus on day 5 to not miss it',
          FeatMarketTown: 'Show town name in market window',
          FeatMarketMessage: 'Get a message when there are items or money to pick up on actual market',
          FeatAchievHide: 'Hide completed achievements in achievements window',
          FeatRecipeMarket: 'Improve the purchase of recipes on market',
          FeatMoveJobs: 'Move the queued jobs a bit to the left',
          FeatBlinkEvents: 'Stop the blinking of the event, County Fair buttons on the left side',
          FeatFortTracker: 'Turn off fort battle reminder',
          FeatFriendsPop: 'Hide "Friend online" pop-ups',
          FeatInstantQuest: 'Complete the quest instantly if all requirements are done',
          FeatQuestWiki: 'Add a link in the quest window to show the quest on the wiki page',
          FeatCityTravel: 'Show the travel time to the towns in the blackboard',
          FeatBetterSheriff: 'Add a new tab in the sheriff window to see all possible bounties',
          FeatChatProfessions: 'Show the crafting profession of the players in the chat list',
          FeatQuestBookSearch: 'Search for solved quests in the quest book',
          FeatMarketRights: 'Show if market offers are public or only for alliance/town members',
          FeatEquipManagerPlus: 'Improve the equipment manager in the inventory',
          FeatShortPopups: 'Make the item pop-ups shorter',
          FeatHideNotis: 'Add a button to hide the job notifications on the left side',
          FeatJobProducts: 'Show in the job pop-up how many products you already have in your inventory',
          FeatMapDistance: ' Show the number of miles next to the travel time',
          FeatTraderSell: 'Sell multiple items at once to the trader',
          FeatTouchControl: 'Enable touch control on your mobile browser',
          settings1: 'Open settings',
          settings2: 'Open settings and information window',
          ghosttown1: 'Go to ghost town ',
          ghosttown2: 'Open ghost town',
          ghosttown3: 'Open ghost town and center it on map',
          indiantown1: 'Go to Indian village ',
          indiantown2: 'Open Indian village',
          indiantown3: 'Open Indian village and center it on map',
          openmarket: 'Open market',
          forum: 'Open town forum',
          newsets: 'New sets are added to the script',
          chooseItems: 'Choose the items',
          remindHover: 'You get a notification when an item can be used again. Here you can choose these items.',
          remindReady: 'Ready to collect',
          skipHover: 'Skip the confirmation and result messages when you open some bags. Here you can choose these bags',
          skipDone: 'You get',
          info: 'Info',
          contact: 'Contact',
          chooseLang: 'Choose language',
          features: 'Features',
          name: 'Name',
          author: 'Author',
          version: 'Version',
          gameversion: 'Gameversions',
          website: 'Website',
          weblink: 'Weblink',
          save: 'Save',
          saveMessage: 'Settings saved. Some changes need a refresh of the game window.',
          setbonus2: 'Informations about the set bonuses',
          frame2: 'Helpful web pages',
          choose: 'Click on the hat to get started',
          items: 'items',
          parts: 'parts',
          showItems: 'Show the set items in your Bag',
          noItems: 'No items in your inventory found. Click again with CTRL to show it on TW-Calc.',
          ownSets: 'Only own sets',
          switchWeapon: 'Switch between firearm and melee weapon',
          selectBonus: 'Select bonuses',
          resetB: 'Reset',
          body: 'Clothing',
          right_arm: 'Weapons',
          animal: 'Horse & Yield',
          rest: 'Other',
          buff: 'Buffs',
          refresh: 'Refresh',
          noFriends: 'No Friends',
          reward: 'Reward',
          allprofessions: 'All Professions',
          market1: 'Items on market',
          market2: 'There are items/money on this market. What do you want to pick up?',
          all: 'All',
          onlyBids: 'Only bids',
          nothing: 'Nothing',
          worldwide: 'Worldwide',
          alliance: 'Alliance',
          town: 'Town',
          level: 'Level',
          duelLevel: 'Duelling level',
          exp: 'Exp',
          distance: 'Distance',
          startduel: 'Start Duel',
          centerMap: 'Center map',
          popup: 'The opponent\'s skill bonus',
          damage: 'Damage',
          duelmap: 'Duelmap',
          duelradius: 'Duel radius',
          minutes: 'minutes',
          hour: '1 hour',
          hours: 'hours',
          searchOpp: 'Search for opponents',
          amount: 'Dead',
          not_dead_amount: 'Alive',
          duellevel: 'Lvl',
          status: 'Status',
          sortBy: 'Sort by',
          tooLow: 'Too low duelling level of opponent',
          tooHigh: 'Too high duelling level of opponent',
          ownTown: 'Member of your town',
          attackable: 'Show only attackable players',
          logout: 'Logout',
          accNfin: 'Accept & complete quest',
          onWiki: 'Show the quest on the wiki',
          longerName: 'Name must be longer than 2 characters',
          loading: 'Loading...',
          rename: 'Rename',
          newName: 'Choose a new set name',
          used: 'Used',
          renameWarning: 'When you rename a set, you will wear it and undress it again.<br>You may loose health points during the process!',
          sellItems: 'Sell items to the trader?',
          removeWorkNotis: 'Hide all job notifications',
          compInv: 'Click on "cancel" to just show only auctionable items\n or\nEnter other inventory URL to compare',
          loginAll1: 'Login all worlds',
          loginAll2: 'Load all your active worlds with one click',
          custom1: 'Custom',
          custom2: 'Your custom login list',
          edit: 'Edit',
          saveMessage2: 'Saved successfully',
        },
        de: {
          language: 'German (Deutsch)',
          ApiGui1: 'Das Script beinhaltet verschiedene Funktionen um den Alltag bei The West zu vereinfachen.<br><br>Weitere Informationen: ',
          ApiGui2: 'Skriptfenster öffnen',
          FeatLogout: 'Erstellt einen Logout-Button rechts in der Menüleiste',
          FeatStatusbar: 'Entfernt die Fensterleiste mit den verschiedenen Tabs im unteren Teil',
          FeatShowAP: 'Zeige die Arbeitspunkte im Job-Fenster',
          FeatChangeCity: 'Tausche Titel und Spielername in der Stadthalle',
          FeatDuellMap: 'Füge im Duellfenster einen Tab hinzu, der eine Duellkarte zeigt',
          FeatMarkDaily: 'Markiere Täglicher Loginbonus am Tag 5 besonders, um ihn nicht zu übersehen',
          FeatMarketTown: 'Zeige im Marktfenster, zu welcher Stadt es gehört',
          FeatMarketMessage: 'Wenn du an einem Markt stehst, wo etwas abgeholt werden kann, erscheint eine Meldung',
          FeatAchievHide: 'Verstecke alle abgeschlossenen Erfolge im Erfolgsfenster für eine bessere Übersicht',
          FeatRecipeMarket: 'Verbessert den Kauf von Rezepten im Markt',
          FeatMoveJobs: 'Verschiebe eingestellte Arbeiten ein wenig nach links',
          FeatBlinkEvents: 'Das Blinken der Event-, Wanderzirkus-Buttons usw. am linken Rand entfernen',
          FeatFortTracker: 'Fortkampftracker abschalten',
          FeatFriendsPop: '"Freund online" Pop-ups deaktivieren',
          FeatInstantQuest: 'Schliesse die Quest sofort ab, wenn die Voraussetzungen bereits erfüllt sind',
          FeatQuestWiki: 'Füge im Questfenster einen Link hinzu, der die Quest im Wiki zeigt',
          FeatCityTravel: 'Zeige die Reisezeit zu den Städten im Blackboard-Fenster',
          FeatBetterSheriff: 'Erweitere den Sheriff um einen Tab, welcher alle Kopfgelder auflistet',
          FeatChatProfessions: 'Zeige den Handwerksberuf der Spieler in der Chatliste',
          FeatQuestBookSearch: 'Suche im Questbuch nach abgeschlossenen Quests',
          FeatMarketRights: 'Zeige ob Marktangebote öffenltich oder nur für Allianz-/Stadtmitglieder sind',
          FeatEquipManagerPlus: 'Erweitere den Ausrüstungsmanager im Inventar',
          FeatShortPopups: 'Mache die Item-Popups kompakter',
          FeatHideNotis: 'Blende Arbeits-Benachrichtigungen am linken Rand mit einem Klick aus',
          FeatJobProducts: 'Zeige bei den Arbeiten, wie viele Produkte du bereits besitzt',
          FeatMapDistance: 'Zeige die Entfernung in Meilen neben der Reisezeit',
          FeatTraderSell: 'Ermöglicht dem Fahrenden Händler mehrere Gegenstände auf einmal zu verkaufen',
          FeatTouchControl: 'Aktiviere Touchsteuerung im mobilen Browser',
          settings1: 'Einstellungen öffnen',
          settings2: 'Öffnet das Informations- und Einstellungsfenster',
          ghosttown1: 'Gehe zur Geisterstadt ',
          ghosttown2: 'Öffne Geisterstadt',
          ghosttown3: 'Öffnet das Fenster der Geisterstadt und zentriert es auf der Map',
          indiantown1: 'Gehe zum Indianerdorf ',
          indiantown2: 'Öffne Indianerdorf',
          indiantown3: 'Öffnet das Fenster des Indianerdorfes und zentriert es auf der Map',
          openmarket: 'Öffne Marktfenster',
          forum: 'Öffne Stadtforum',
          newsets: 'Dem Script wurden neue Sets hinzugefügt',
          chooseItems: 'Wähle die Gegenstände aus',
          remindHover: 'Wenn die Gegenstände bereit zum Einsammeln sind, bekommst du einen Hinweis. Hier kannst du diese Items auswählen.',
          remindReady: 'Bereit zum Einsammeln',
          skipHover: 'Überspringe die Bestätigungs- und Resultatsmeldung beim Öffnen bestimmter Taschen. Hier kannst du diese Taschen auswählen.',
          skipDone: 'Du bekommst',
          info: 'Info',
          contact: 'Kontakt',
          chooseLang: 'Sprache auswählen',
          features: 'Features',
          name: 'Name',
          author: 'Autor',
          version: 'Version',
          gameversion: 'Gameversionen',
          website: 'Webseite',
          weblink: 'Link',
          save: 'Speichern',
          saveMessage: 'Einstellungen gespeichert. Manche Änderungen werden erst nach Neuladen des Spiels sichtbar.',
          setbonus2: 'Lass dir die Boni aller Sets anzeigen',
          frame2: 'Hilfreiche Webseiten',
          choose: 'Klicke auf den Hut und wähle aus',
          items: 'Gegenstände',
          parts: 'Teile',
          showItems: 'Zeige die Setgegenstände in deinem Inventar',
          noItems: 'Keine Gegenstände im Inventar gefunden. Klicke erneut mit CTRL um sie auf TW-Calc anzuzeigen.',
          ownSets: 'Nur eigene Sets',
          switchWeapon: 'Wähle Schuss- oder Schlagwaffe',
          selectBonus: 'Boni auswählen',
          resetB: 'Zurücksetzen',
          body: 'Kleidung',
          right_arm: 'Waffen',
          animal: 'Pferd & Produkt',
          rest: 'Andere',
          buff: 'Buffs',
          refresh: 'Aktualisieren',
          noFriends: 'Keine Freunde',
          reward: 'Belohnung',
          allprofessions: 'Alle Berufe',
          market1: 'Gegenstände auf dem Markt',
          market2: 'Es sind noch Gegenstände/Geld auf diesem Markt. Was soll abgeholt werden?',
          all: 'Alles',
          onlyBids: 'Nur Gebote',
          nothing: 'Nichts',
          worldwide: 'Weltweit',
          alliance: 'Allianz',
          town: 'Stadt',
          level: 'Stufe',
          duelLevel: 'Duellstufe',
          exp: 'EP',
          distance: 'Distanz',
          startduel: 'Starte Duell',
          centerMap: 'Zentriere Map',
          popup: 'Fertigkeitenbonus des Gegners',
          damage: 'Schaden',
          duelmap: 'Duellkarte',
          duelradius: 'Duellradius',
          minutes: 'Minuten',
          hour: '1 Stunde',
          hours: 'Stunden',
          searchOpp: 'Duellgegner suchen',
          amount: 'Tot',
          not_dead_amount: 'Lebendig',
          duellevel: 'Lvl',
          status: 'Status',
          sortBy: 'Sortiere nach',
          tooLow: 'Zu tiefe Duellstufe des Gegners',
          tooHigh: 'Zu hohe Duellstufe des Gegners',
          ownTown: 'Mitbürger deiner Stadt',
          attackable: 'Zeige nur duellierbare Spieler',
          logout: 'Logout',
          accNfin: 'Quest annehmen & abschließen',
          onWiki: 'Zeige die Quest im Wiki',
          longerName: 'Name muss länger als 2 Zeichen sein',
          loading: 'Lädt...',
          rename: 'Umbenennen',
          newName: 'Neuer Set-Name',
          used: 'Benutzt',
          renameWarning: 'Du ziehst das Set beim Umbenennen an und wieder aus.<br>Möglicherweise verlierst du deswegen Lebenspunkte!',
          sellItems: 'Items dem Händler verkaufen?',
          removeWorkNotis: 'Entferne die Arbeits-Benachrichtigungen',
          compInv: 'Klicke auf "Abbrechen, um nur auktionierbare Items anzuzeigen\n oder\nFüge andere Inventar-URL ein, um zu vergleichen',
          loginAll1: 'Alle einloggen',
          loginAll2: 'Lade all deine aktiven Welten mit einem Klick',
          custom1: 'Eigene',
          custom2: 'Deine eigene Login-Liste',
          edit: 'Bearbeiten',
          saveMessage2: 'Speichern erfolgreich',
        },
        pl: {
          language: 'Polish (polski)',
          ApiGui1: 'Skrypt ten zawiera wiele funkcji, aby uprościć codzienne życie na Zachodzie.<br><br>Więcej informacji: ',
          ApiGui2: 'Otwórz w nowej karcie',
          FeatLogout: 'Dodanie przycisku po prawej stronie, wyloguj się.',
          FeatStatusbar: 'Usuwa pasek z oknami w dolnej części gry.',
          FeatShowAP: 'Pokazuje Punkty Pracy (PP) w oknie danej pracy.',
          FeatChangeCity: 'Zamienia tytuł gracza na początku, w karcie graczy w ratuszu.',
          FeatDuellMap: 'Dodaje dodatkową zakładkę pojedynków, w pojedynkach.',
          FeatMarkDaily: 'Oznacza dodatkową ramką 5 dzień logowania.',
          FeatMarketTown: 'Dodaje nazwę miasta w karcie targu.',
          FeatMarketMessage: 'Jeżeli znajdujesz się w mieście gdzie coś jest do odebrania. Pojawia się komunikat.',
          FeatAchievHide: 'Ukrywa zaliczone osiągnięcia.',
          FeatRecipeMarket: 'Dodaje dodatkowe przyciski z receptami w karcie targ.',
          FeatMoveJobs: 'Przenieś zadania w kolejce trochę na lewo',
          FeatBlinkEvents: 'Zatrzymaj pulsowanie przycisków (zdarzenie, pomoce, ostrzeżenia itp) po lewej stronie',
          FeatFortTracker: 'Wyłącz przypomnienie o bitwie',
          FeatFriendsPop: 'Ukryj "Przyjaciel on-line" pop-ups',
          FeatInstantQuest: 'Wykonaj zadanie natychmiast, gdyby wszystkie wymagania zostały wykonane',
          FeatQuestWiki: 'Add a link in the quest window to show the quest on the wiki page',
          FeatCityTravel: 'Show the travel time to the towns in the blackboard',
          FeatBetterSheriff: 'Add a new tab in the sheriff window to see all possible bounties',
          FeatChatProfessions: 'Show the crafting profession of the players in the chat list',
          FeatQuestBookSearch: 'Search for solved quests in the quest book',
          FeatMarketRights: 'Show if market offers are public or only for alliance/town members',
          FeatEquipManagerPlus: 'Improve the equipment manager in the inventory',
          FeatShortPopups: 'Make the item pop-ups shorter',
          FeatHideNotis: 'Add a button to hide the job notifications on the left side',
          FeatJobProducts: 'Show in the job pop-up how many products you already have in your inventory',
          FeatMapDistance: ' Show the number of miles next to the travel time',
          FeatTraderSell: 'Sell multiple items at once to the trader',
          FeatTouchControl: 'Enable touch control for map and scrollbar on your mobile',
          settings1: 'Otwórz ustawienia',
          settings2: 'Otwiera okno ustawień oraz informacji o skrypcie.',
          ghosttown1: 'Idź do Miasta Widmo, dojście ',
          ghosttown2: 'Otwórz zadania w Mieście Widmo',
          ghosttown3: 'Otwiera okno z zadaniami w Mieście Widmo',
          indiantown1: 'Idź do Wioski Indiańskiej, dojście ',
          indiantown2: 'Otwórz zadania w Wiosce Indiańskiej',
          indiantown3: 'Otwiera okno z zadaniami w Wiosce Indiańskiej.',
          openmarket: 'Otwórz targ',
          forum: 'Otwórz forum',
          newsets: 'Nowe zestawy są dodawane do skryptu',
          chooseItems: 'Choose the items',
          remindHover: 'You get a notification when an item can be used again. Here you can choose these items.',
          remindReady: 'Ready to collect',
          skipHover: 'Skip the confirmation and result messages when you open some bags. Here you can choose these bags',
          skipDone: 'You get',
          info: 'Informacja',
          contact: 'Kontakt',
          chooseLang: 'Wybierz język',
          features: 'Ustawienia',
          name: 'Nazwa',
          author: 'Autor',
          version: 'Wersja',
          gameversion: 'Wersja gry',
          website: 'Strona',
          weblink: 'Dyskusja',
          save: 'Zapisz',
          saveMessage: 'Ustawienia zapisane. Niektóre zmiany potrzebują odświeżenia okna gry.',
          setbonus2: 'Informacje o ustawionych premie',
          frame2: 'Pomocna stron internetowych',
          choose: 'Kliknij na kapelusz i wybierz',
          items: 'przedmioty',
          parts: 'parts',
          showItems: 'Show the set items in your Bag',
          noItems: 'No items in your inventory found. Click again with CTRL to show it on TW-Calc.',
          ownSets: 'Only own sets',
          switchWeapon: 'Switch between firearm and melee weapon',
          selectBonus: 'Select bonuses',
          resetB: 'Reset',
          body: 'Clothing',
          right_arm: 'Weapons',
          animal: 'Horse & Yield',
          rest: 'Other',
          buff: 'Buffs',
          refresh: 'Odświeżać',
          noFriends: 'Brak przyjaciół',
          reward: 'Nagroda',
          allprofessions: 'Wszystko',
          market1: 'Przedmioty na targu',
          market2: 'Na tym targu znajdują się przedmioty/kasa, odebrać?',
          all: 'Wszystko',
          onlyBids: 'Tylko oferty',
          nothing: 'Nic',
          worldwide: 'Worldwide',
          alliance: 'Alliance',
          town: 'Miasto',
          level: 'Poziom',
          duelLevel: 'Poziom pojedynków',
          exp: 'Exp',
          distance: 'Odległość',
          startduel: 'Akcja',
          centerMap: 'Wyśrodkowanie',
          popup: 'Bonusy umiejętności przeciwnika',
          damage: 'Obrażenia',
          duelmap: 'Mapa pojedynków',
          duelradius: 'Zasięg',
          minutes: 'Minut',
          hour: '1 Godzina',
          hours: 'Godzin',
          searchOpp: 'Szukaj przeciwników',
          amount: 'Dead',
          not_dead_amount: 'Alive',
          duellevel: 'Lvl',
          status: 'Status',
          sortBy: 'Sort by',
          tooLow: 'Too low duelling level of opponent',
          tooHigh: 'Too high duelling level of opponent',
          ownTown: 'Member of your town',
          attackable: 'Show only attackable players',
          logout: 'Logout',
          accNfin: 'Przyjmij & zakończ zadanie',
          onWiki: 'Show the quest on the wiki',
          longerName: 'Name must be longer than 2 characters',
          loading: 'Loading...',
          rename: 'Rename',
          newName: 'Choose a new set name',
          used: 'Used',
          renameWarning: 'When you rename a set, you will wear it and undress it again.<br>You may loose health points during the process!',
          sellItems: 'Sell items to the trader?',
          removeWorkNotis: 'Hide all job notifications',
          compInv: 'Click on "cancel" to just show only auctionable items\n or\nEnter other inventory URL to compare',
          loginAll1: 'Login all worlds',
          loginAll2: 'Załaduj wszystkie aktywne światów za pomocą jednego kliknięcia',
          custom1: 'Custom',
          custom2: 'Your custom login list',
          edit: 'Edit',
          saveMessage2: 'Saved successfully',
        },
        es: {
          language: 'Spanish (español)',
          ApiGui1: 'El script incluye varias funciones que simplifican la vida cotidiana en The West.<br><br>Más información: ',
          ApiGui2: 'Abrir ventana del script',
          FeatLogout: 'Crea un botón de cierre de sesión a la derecha en la barra de menús',
          FeatStatusbar: 'Oculta la barra inferior de las ventanas',
          FeatShowAP: 'Ver los puntos de trabajo en la ventana de trabajo',
          FeatChangeCity: 'Cambiar título y nombre del jugador en el ayuntamiento',
          FeatDuellMap: 'Completar la ventana de duelos con una pestaña que muestra el mapa de duelos',
          FeatMarkDaily: 'Marcar el Bonus-Conexión-5 Días especialmente para que no te lo pierdas',
          FeatMarketTown: 'Mostrar en la ventana de mercado, la ciudad al que pertenece',
          FeatMarketMessage: 'Si llegas a un mercado donde tienes algo que puede ser recogido, aparece un mensaj',
          FeatAchievHide: 'Ocultar logros completados en la ventana de logros para una mejor visión',
          FeatRecipeMarket: 'Mejorar la compra de recetas en el mercado',
          FeatMoveJobs: 'Mover los trabajos en cola un poco a la izquierda',
          FeatBlinkEvents: 'Detener el parpadeo de los botones de Evento y Feria de Condado en el lado izquierdo',
          FeatFortTracker: 'Apagar el recordatorio de Batalla de fuerte',
          FeatFriendsPop: 'Esconder ventana emergente de "Amigo conectado"',
          FeatInstantQuest: 'Completar la misión al instante si se cumplen todos los requisitos',
          FeatQuestWiki: 'Agregar un enlace en la ventana de búsqueda para mostrar la búsqueda en la Wiki',
          FeatCityTravel: 'Mostrar el tiempo de viaje a las ciudades en la pizarra',
          FeatBetterSheriff: 'Añadir una nueva pestaña en la ventana del sheriff para ver todas las recompensas posibles',
          FeatChatProfessions: 'Mostrar el oficio de los jugadores en la lista del chat',
          FeatQuestBookSearch: 'Buscar misiones terminadas en libro de misiones',
          FeatMarketRights: 'Mostrar si las ofertas de mercado son públicas o solo para los miembros de la Alianza/Ciudad',
          FeatEquipManagerPlus: 'Mejorar el administrador de equipos en el inventario',
          FeatShortPopups: 'Hacer los pop-ups de articulos más cortos',
          FeatHideNotis: 'Agregar un botón para ocultar las notificaciones de trabajo en el lado izquierdo',
          FeatJobProducts: 'Mostrar en la ventana emergente de trabajo cuántos productos tienes en tu inventario',
          FeatMapDistance: 'Mostrar la cantidad de millas al lado del tiempo de viaje',
          FeatTraderSell: 'Vender varios artículos a la vez al comerciante',
          FeatTouchControl: 'Habilitar el control táctil para el mapa y la barra de desplazamiento en su dispositivo móvil',
          settings1: 'Abrir preferencias',
          settings2: 'Abrir la ventana de información y ajustes',
          ghosttown1: 'Ir a la Ciudad Fantasma ',
          ghosttown2: 'Abrir Ciudad Fantasma',
          ghosttown3: 'Abrir la ventana de la Ciudad Fantasma y centrarla en el mapa',
          indiantown1: 'Ir al Pueblo Indio Waupee ',
          indiantown2: 'Abrir Pueblo Indio Waupee',
          indiantown3: 'Abrir la ventana del Pueblo Indio Waupee y centrarla en el mapa',
          openmarket: 'Abrir Mercado',
          forum: 'Abrir el foro de la ciudad',
          newsets: 'Nuevos conjuntos añadidos al script',
          chooseItems: 'Elegir los artículos',
          remindHover: 'Recibir una notificación cuando un artículo puede volverse a usar. Aquí puedes elegir estos artículos.',
          remindReady: 'Listo para recoger',
          skipHover: 'Omitir los mensajes de confirmación y resultado cuando abres algunas bolsas. Aquí puedes elegir estas bolsas',
          skipDone: 'Obtienes',
          info: 'Información',
          contact: 'Contacto',
          chooseLang: 'Elige idioma',
          features: 'Funciones',
          name: 'Nombre',
          author: 'Autor',
          version: 'Versión',
          gameversion: 'Versión Juego',
          website: 'Web',
          weblink: 'Weblink',
          save: 'Guardar',
          saveMessage: 'Ajustes guardados. Algunos cambios necesitan una actualización de la ventana de juego.',
          setbonus2: 'Información acerca de los bonus de conjunto',
          frame2: 'Páginas web votos',
          choose: 'Haga clic en el sombrero y elegir',
          items: 'artículos',
          parts: 'partes',
          showItems: 'Mostrar los artículos del conjunto en tu bolsa',
          noItems: '¡No se han encontrado artículos de este conjunto!',
          ownSets: 'Solo conjuntos propios',
          switchWeapon: 'Cambiar entre arma de fuego y arma contundente',
          selectBonus: 'Seleccionas bonus',
          resetB: 'Reiniciar',
          body: 'Ropa',
          right_arm: 'Armas',
          animal: 'Montura y Producto',
          rest: 'Otros',
          refresh: 'Actualizar',
          noFriends: 'Sin Amigos',
          reward: 'Recompensa',
          allprofessions: 'Todos Oficios',
          market1: 'Productos en el Mercado',
          market2: 'Todavía hay productos/dinero en el Mercado. ¿Desea recogerlos?',
          all: 'Todos',
          onlyBids: 'Solo Ofertas',
          nothing: 'Ninguno',
          worldwide: 'Mundo',
          alliance: 'Alianza',
          town: 'Ciudad',
          level: 'Nivel',
          duelLevel: 'Nivel Duelo',
          exp: 'Exp',
          distance: 'Distancia',
          startduel: 'Iniciar Duelo',
          centerMap: 'Centrar Mapa',
          popup: 'El bonus de habilidad del oponente',
          damage: 'Daño',
          duelmap: 'Mapa Duelos',
          duelradius: 'Radio duelos',
          minutes: 'Minutos',
          hour: '1 Hora',
          hours: 'Horas',
          searchOpp: 'Buscar Duelo',
          amount: 'Muerto',
          not_dead_amount: 'Vivo',
          duellevel: 'Niv',
          status: 'Estado',
          sortBy: 'Ordenar por',
          tooLow: 'Nivel de duelo del oponente demasiado bajo',
          tooHigh: 'Nivel de duelo del oponente demasiado alto',
          ownTown: 'Miembro de tu ciudad',
          attackable: 'Mostrar solo jugadores atacables',
          logout: 'Cerrar sesión',
          accNfin: 'Aceptar & concluir búsqueda',
          onWiki: 'Mostrar la búsqueda en la Wiki',
          longerName: 'El nombre debe tener más de 2 caracteres',
          loading: 'Cargando...',
          rename: 'Renombrar',
          newName: 'Elige un nuevo nombre de conjunto',
          used: 'Usado',
          renameWarning: 'Cuando renombre un conjunto, se lo pondrá y se lo quitará de nuevo.<br>¡Puede perder puntos de vida durante el proceso!',
          sellItems: '¿Vender artículos al comerciante?',
          removeWorkNotis: 'Ocultar todas las notificaciones de trabajo',
          compInv: 'Haga clic en "cancelar" para mostrar solo los artículos subastables \n o \n Ingrese otra URL de inventario para comparar',
          loginAll1: 'Conectarse a todos los mundos',
          loginAll2: 'Cargar todos los mundos activos con un solo click',
          custom1: 'Personalizar',
          custom2: 'Tu lista de conexión personalizada',
          edit: 'Editar',
          saveMessage2: 'Grabado con éxito',
        },
        nl: {
          language: 'Dutch (Nederlands)',
          ApiGui1: 'Dit script bevat veel mogelijkheden om het dagelijks leven in The West te vergemakkelijken.<br><br>Voor meer informatie: ',
          ApiGui2: 'Open script pagina',
          FeatLogout: 'Voeg een afmeldknop toe aan de rechterzijde van het scherm',
          FeatStatusbar: 'Verwijder het dagelijkse taken icoon',
          FeatShowAP: 'Toon je vaardigheidspunten in werkzaamheidsscherm windows',
          FeatChangeCity: 'Verwissel de titel en de spelersnaam in het  stadhuis',
          FeatDuellMap: 'Voeg een duelkaart toe aan de duel tab',
          FeatMarkDaily: 'Markeer de dagelijkse inlogbonus op de 5e dag zodat je hem niet mist',
          FeatMarketTown: 'Toon stadsnaam in marktscherm',
          FeatMarketMessage: 'Krijg een bericht wanneer er voorwerpen of geld beschikbaar zijn om op te halen',
          FeatAchievHide: 'Verberg voltooide prestaties in prestatiescherm',
          FeatRecipeMarket: 'Verbeter overzicht voor recepten kopen.',
          FeatMoveJobs: 'Verschuif de werkzaamheden in de wachtrij een stukje naar links',
          FeatBlinkEvents: 'Stop het knipperen van event of circus knop aan linkerkant',
          FeatFortTracker: 'Schakel de fortgevecht herinnering uit',
          FeatFriendsPop: 'Verberg “uw vriend logt in” pop-ups',
          FeatInstantQuest: 'Voltooi de quest direct als aan alle vereisten is gedaan',
          FeatQuestWiki: 'Add a link in the quest window to show the quest on the wiki page',
          FeatCityTravel: 'Show the travel time to the towns in the blackboard',
          FeatBetterSheriff: 'Add a new tab in the sheriff window to see all possible bounties',
          FeatChatProfessions: 'Show the crafting profession of the players in the chat list',
          FeatQuestBookSearch: 'Search for solved quests in the quest book',
          FeatMarketRights: 'Show if market offers are public or only for alliance/town members',
          FeatEquipManagerPlus: 'Improve the equipment manager in the inventory',
          FeatShortPopups: 'Make the item pop-ups shorter',
          FeatHideNotis: 'Add a button to hide the job notifications on the left side',
          FeatJobProducts: 'Show in the job pop-up how many products you already have in your inventory',
          FeatMapDistance: ' Show the number of miles next to the travel time',
          FeatTraderSell: 'Sell multiple items at once to the trader',
          FeatTouchControl: 'Enable touch control for map and scrollbar on your mobile',
          settings1: 'Instellingen openen',
          settings2: 'Instellingen en informatiescherm openen',
          ghosttown1: 'Ga naar de Spookstad ',
          ghosttown2: 'Open Spookstad',
          ghosttown3: 'Open Spookstad en centreer het op de kaart',
          indiantown1: 'Ga naar Waupees indianendorp ',
          indiantown2: 'Open Waupees indianendorp',
          indiantown3: 'Open Waupees indianendorp en centreer het op de kaart',
          openmarket: 'Open markt',
          forum: 'Open stadsforum',
          newsets: 'Nieuwe sets worden toegevoegd aan het script',
          chooseItems: 'Choose the items',
          remindHover: 'You get a notification when an item can be used again. Here you can choose these items.',
          remindReady: 'Ready to collect',
          skipHover: 'Skip the confirmation and result messages when you open some bags. Here you can choose these bags',
          skipDone: 'You get',
          info: 'Informatie',
          contact: 'Contact',
          chooseLang: 'Kies een taal',
          features: 'Features',
          name: 'Naam',
          author: 'Auteur',
          version: 'Versie',
          gameversion: 'Spelversies',
          website: 'Website',
          weblink: 'Link',
          save: 'Opslaan',
          saveMessage: 'Instellingen toegevoegd. Sommige veranderingen hebben behoefte aan een refresh van het spel venster.',
          setbonus2: 'Informatie over de set bonusen',
          frame2: 'Nuttige websites',
          choose: 'Klik op de hoed en kies',
          items: 'Voorwerpen',
          parts: 'parts',
          showItems: 'Show the set items in your Bag',
          noItems: 'No items in your inventory found. Click again with CTRL to show it on TW-Calc.',
          ownSets: 'Only own sets',
          switchWeapon: 'Switch between firearm and melee weapon',
          selectBonus: 'Select bonuses',
          resetB: 'Reset',
          body: 'Clothing',
          right_arm: 'Weapons',
          animal: 'Horse & Yield',
          rest: 'Other',
          buff: 'Buffs',
          refresh: 'Verversen',
          noFriends: 'Geen vrienden',
          reward: 'Beloning',
          allprofessions: 'Alle Beroepen',
          market1: 'Voorwerpen op de markt',
          market2: 'Er zijn voorpen/geld op de markt. Wat wil je eraf halen?',
          all: 'Alles',
          onlyBids: 'Alleen biedingen',
          nothing: 'Niets',
          worldwide: 'Worldwide',
          alliance: 'Alliance',
          town: 'Stad',
          level: 'Level',
          duelLevel: 'Duel level',
          exp: 'Ervaring',
          distance: 'Afstand',
          startduel: 'Duelleren',
          centerMap: 'Centreer kaart',
          popup: 'Vaardigheden-Bonus van de tegenstander',
          damage: 'Schade',
          duelmap: 'Duelkaart',
          duelradius: 'Duel radius',
          minutes: 'minuten',
          hour: '1 uur',
          hours: 'uren',
          searchOpp: 'Zoek naar tegenstanders',
          amount: 'Dead',
          not_dead_amount: 'Alive',
          duellevel: 'Lvl',
          status: 'Status',
          sortBy: 'Sort by',
          tooLow: 'Too low duelling level of opponent',
          tooHigh: 'Too high duelling level of opponent',
          ownTown: 'Member of your town',
          attackable: 'Show only attackable players',
          logout: 'Afmelden',
          accNfin: 'Opdracht aannemen & afsluiten',
          onWiki: 'Show the quest on the wiki',
          longerName: 'Name must be longer than 2 characters',
          loading: 'Loading...',
          rename: 'Rename',
          newName: 'Choose a new set name',
          used: 'Used',
          renameWarning: 'When you rename a set, you will wear it and undress it again.<br>You may loose health points during the process!',
          sellItems: 'Sell items to the trader?',
          removeWorkNotis: 'Hide all job notifications',
          compInv: 'Click on "cancel" to just show only auctionable items\n or\nEnter other inventory URL to compare',
          loginAll1: 'Login all worlds',
          loginAll2: 'Laad al uw actieve werelden met één klik',
          custom1: 'Custom',
          custom2: 'Your custom login list',
          edit: 'Edit',
          saveMessage2: 'Saved successfully',
        },
        hu: {
          language: 'Hungarian (Magyar)',
          ApiGui1: 'Ez a szkript több olyan funkciót tartalmaz ami megkönnyíti a mindennapjaidat a vadnyugaton.<br><br>Több információ: ',
          ApiGui2: 'Szkript oldalának megnyitása',
          FeatLogout: 'Kilépés gomb a jobb oldalra',
          FeatStatusbar: 'Tálca eltüntetése',
          FeatShowAP: 'Valódi képességpontok a munkaablakokban',
          FeatChangeCity: 'Cím és játékosnév felcserélése a városházánál',
          FeatDuellMap: 'Párbajtérkép a párbaj ablakban',
          FeatMarkDaily: 'Az 5. napi belépés bónusz bekeretezése, hogy nehogy kihagyd',
          FeatMarketTown: 'Városnév megjelenítése a piac ablakban',
          FeatMarketMessage: 'Felugró ablak amikor tárgyak vagy pénz felvétele lehetséges az aktuális piacnál',
          FeatAchievHide: 'Befejezett események elrejtése az esemény ablakban',
          FeatRecipeMarket: 'Receptvásárlás megkönnyítése, rendezése a piacon',
          FeatMoveJobs: 'Mozgassa el a munka várólistát kissé balra hogy elférjenek az ikonok',
          FeatBlinkEvents: 'Események, eladás és piaci vásár gomb villogás kikapcsolása',
          FeatFortTracker: 'Kapcsolja ki az erődharc emlékeztetőt',
          FeatFriendsPop: 'Rejtse el a "barátod bejelentkezett" felugró ablakokat',
          FeatInstantQuest: 'Befejezni a küldetést, azonnal, ha minden feltétel kész',
          FeatQuestWiki: 'Link hozzáadása a kalandablakban, amin elérhető a kaland wikioldala',
          FeatCityTravel: 'Távolság a várostól mutatása a hirdetőtáblán',
          FeatBetterSheriff: 'Új lap hozzáadása a Seriff ablakban, láthatóvá téve az összes körözöttet',
          FeatChatProfessions: 'Mesterségek mutatása a játékosoknál a chat partnerlistánál',
          FeatQuestBookSearch: 'Keresés a befejezett kalandoknál a kalandkönyvben',
          FeatMarketRights: 'Piaci ajánlatoknál mutatása, hogy bárki számára elérhető vagy csak szövetség/város tagok számára',
          FeatEquipManagerPlus: 'Felszerelés kezelő ablak fejlesztése',
          FeatShortPopups: 'Tárgy felugró menüjének rövidítése',
          FeatHideNotis: 'Bal oldalon lévő munkaértesítéseket eltüntető gomb hozzáadása',
          FeatJobProducts: 'Munkáknál felugró menüben mutassa, mennyi terméked van már a felszerelésedben, ami az adott munkánál található',
          FeatMapDistance: ' Show the number of miles next to the travel time',
          FeatTraderSell: 'Sell multiple items at once to the trader',
          FeatTouchControl: 'Enable touch control for map and scrollbar on your mobile',
          settings1: 'Beállítások megnyitása',
          settings2: 'Beállítások és információk',
          ghosttown1: 'Menj el a Szellemvárosba ',
          ghosttown2: 'Szellemváros megnyitása',
          ghosttown3: 'Szellemváros megnyitása és ráközelítés térképen',
          indiantown1: 'Menj Waupee Indián falujába ',
          indiantown2: 'Indián falu megnyitása',
          indiantown3: 'Indián falu megnyitása és ráközelítés térképen',
          openmarket: 'Piac megnyitása',
          forum: 'Városfórum megnyitása',
          newsets: 'Új szett(ek) lettek hozzáadva a szkripthez',
          chooseItems: 'Válasz tárgyat',
          remindHover: 'Értesítést kapsz, amint egy tárgy ismét használható. Itt tudod kiválasztani melyik tárgyakról szeretnél értesítést kapni.',
          remindReady: 'Begyűjtésre készen áll',
          skipHover: 'Táskák nyitásánál megerősítő és jutalom üzenet figyelem kívül hagyása. Itt tudod kiválasztani melyik táska nyitásról ne kapj üzenetet.',
          skipDone: 'Ezt kapod',
          info: 'Információk',
          contact: 'Elérhetőségek',
          chooseLang: 'Válasszon nyelvet',
          features: 'Funkciók',
          name: 'Név',
          author: 'Szerző',
          version: 'Verzió',
          gameversion: 'Játékverzió',
          website: 'Weboldal',
          weblink: 'Webcím',
          save: 'Mentés',
          saveMessage: 'Beállítások elmentve. Néhány változás életbe lépéséhez frissítse a játék ablakát.',
          setbonus2: 'Információk a szettbónuszokról',
          frame2: 'Hasznos weboldalak',
          choose: 'Kattints a kalapra a kezdéshez, választáshoz',
          items: 'tárgyak',
          parts: 'darabok',
          showItems: 'Mutassa a szett tárgyakat a felszerelésedben',
          noItems: 'Nem található tárgy(ak) a felszerelésedben',
          ownSets: 'Csak a megszerzett szettek',
          switchWeapon: 'Váltás lőfegyver és ütőfegyver közt',
          selectBonus: 'Válasz bónuszt',
          resetB: 'Visszaállítás',
          body: 'Ruházat',
          right_arm: 'Párbajfegyver',
          animal: 'Állat',
          rest: 'Egyéb',
          buff: 'Buffs',
          refresh: 'Újratöltés',
          noFriends: 'Nincsenek barátok',
          reward: 'Díjak',
          allprofessions: 'Minden szakma',
          market1: 'Áruk a piacon',
          market2: 'Vannak Áruk/Pénz ezen a piacon. Mit szeretnél átvenni? ',
          all: 'Mindent',
          onlyBids: 'Árukat',
          nothing: 'Semmit',
          worldwide: 'Világ',
          alliance: 'Szövetség',
          town: 'Város',
          level: 'Szint',
          duelLevel: 'Párbajszint',
          exp: 'Tp',
          distance: 'Távolság',
          startduel: 'Párbaj kezdése',
          centerMap: 'Térkép közepére',
          popup: 'Az ellenfél bónusza',
          damage: 'Sebzés',
          duelmap: 'Párbajtérkép',
          duelradius: 'Párbaj sugár',
          minutes: 'perc',
          hour: '1 óra',
          hours: 'óra',
          searchOpp: 'Ellenfél keresése',
          amount: 'Halva',
          not_dead_amount: 'Élve',
          duellevel: 'Szint',
          status: 'Státusz',
          sortBy: 'Rendezés',
          tooLow: 'Túl alacsony a párbajszintje az ellenfélnek',
          tooHigh: 'Túl magas a párbajszintje az ellenfélnek',
          ownTown: 'Városod tagja',
          attackable: 'Csak a kihívható ellenfeleket mutassa',
          logout: 'Kijelentkezés',
          accNfin: 'Kaland elfogadása & lezárása',
          onWiki: 'Kaland mutatása a wikin',
          longerName: 'Névnek két karakternél hosszabbnak kell lennie',
          loading: 'Töltés...',
          rename: 'Átnevezés',
          newName: 'Válasz új nevet a szettnek',
          used: 'Használt',
          renameWarning: 'When you rename a set, you will wear it and undress it again.<br>You may loose health points during the process!',
          sellItems: 'Sell items to the trader?',
          removeWorkNotis: 'Összes munkaértesítés elrejtése',
          compInv: 'Kattints a "mégse" gombra hogy csak az árverezhető tárgyakat mutassa\n vagy\nHozzáadd egy másik táska URL címét összehasonlításként',
          loginAll1: 'Összes világba bejelentkezés',
          loginAll2: 'Betölti az összes aktív világok egyetlen kattintással',
          custom1: 'Egyedi',
          custom2: 'Egyedi bejelentkezési listád',
          edit: 'Szerkesztés',
          saveMessage2: 'Sikeres mentés',
        },
        el: {
          language: 'Greek (ελληνικά)',
          ApiGui1: 'Αυτό το script περιέχει πολλά χαρακτηριστικά για να απλοποιήσετε την ζωή σας στο The West.<br><br>Περισσότερες πληροφορίες: ',
          ApiGui2: 'Ρυθμίσεις του script',
          FeatLogout: 'Προσθέστε ένα κουμπί αποσύνδεσης στη δεξιά πλευρά',
          FeatStatusbar: 'Αφαιρέστε τη γραμμή εργασιών',
          FeatShowAP: 'Εμφάνιση των συνολικών πόντων εργασίας στα παράθυρα εργασίας',
          FeatChangeCity: 'Βάλτε τον τίτλο πριν από το όνομα του παίκτη στην καρτέλα του Δημαρχείου',
          FeatDuellMap: 'Προσθήκη καρτέλας Duelmap στην καρτέλα μονομαχιών',
          FeatMarkDaily: 'Επισημάνετε το καθημερινό μπόνους σύνδεσης την 5η ημέρα για να μην το χάσετε',
          FeatMarketTown: 'Εμφάνιση ονόματος πόλης στο παράθυρο της αγοράς',
          FeatMarketMessage: 'Εμφάνιση μηνύματος όταν υπάρχουν αντικείμενα ή χρήματα στην αγορά της πόλης που μόλις ταξιδέψατε',
          FeatAchievHide: 'Απόκρυψη ολοκληρωμένων επιτευγμάτων στο παράθυρο επιτευγμάτων',
          FeatRecipeMarket: 'Βελτιώστε την αγορά συνταγών στην αγορά',
          FeatMoveJobs: 'Μετακινήστε την καρτέλα των τρέχουσων εργασιών λίγο προς τα αριστερά',
          FeatBlinkEvents: 'Σταματήστε την αναλαμπή των Εκδηλώσεων και του Λούνα Παρκ στην αριστερή πλευρά',
          FeatFortTracker: 'Απενεργοποιήστε την υπενθύμιση μάχης οχυρού',
          FeatFriendsPop: 'Απόκρυψη αναδυόμενων παραθύρων "Συνδεδεμένοι φίλοι"',
          FeatInstantQuest: 'Ολοκληρώστε μια αποστολή αμέσως αν πληρούνται όλες οι απαιτήσεις',
          FeatQuestWiki: 'Προσθήκη ενός κουμπιού στις αποστολές για την εμφάνισή τους στην σελίδα "Βοήθειας"',
          FeatCityTravel: 'Εμφάνιση του χρόνου ταξιδιού στις πόλεις του μαυροπίνακα',
          FeatBetterSheriff: 'Προσθήκη μιας νέας καρτέλας στο παράθυρο του "Σερίφη" για να δείτε όλες τις πιθανές επικυρήξεις',
          FeatChatProfessions: 'Προσθήκη του εικονιδίου επαγγέλματος των παικτών στη λίστα συνομιλίας (τσατ)',
          FeatQuestBookSearch: 'Αναζήτηση για επιλυμένες αποστολές στο βιβλίο αποστολών',
          FeatMarketRights: 'Προσθήκη εικονιδίου για το εάν οι προσφορές της αγοράς είναι δημόσιες ή μόνο για μέλη της συμμαχίας / πόλης',
          FeatEquipManagerPlus: 'Βελτιώστε τον υπεύθυνο εξοπλισμού στα αποθέματα',
          FeatShortPopups: 'Εμφάνιση μικρότερης περιγραφής αντικειμένων στα αποθέματα',
          FeatHideNotis: 'Προσθήκη ενός κουμπιού για την απόκρυψη των ειδοποιήσεων εργασίας στην αριστερή πλευρά',
          FeatJobProducts: 'Εμφανίστε στο αναδυόμενο παράθυρο εργασίας πόσα προϊόντα έχετε ήδη στα αποθέματά σας',
          FeatMapDistance: 'Εμφάνιση της απόστασης του ταξιδιού σας σε Μίλια',
          FeatTraderSell: 'Πώληση πολλαπλών αντικειμένων στον Έμπορο',
          FeatTouchControl: 'Enable touch control for map and scrollbar on your mobile',
          settings1: 'Ρυθμίσεις',
          settings2: 'Ανοίξτε τις ρυθμίσεις και το παράθυρο πληροφοριών',
          ghosttown1: 'Προς την Πόλη Φάντασμα ➔ ',
          ghosttown2: 'Άνοιγμα της Πόλης Φάντασμα',
          ghosttown3: 'Άνοιγμα και κεντράρισμα του χάρτη στην Πόλη Φάντασμα',
          indiantown1: 'Προς το Ινδιάνικο χωριό ➔ ',
          indiantown2: 'Άνοιγμα του Ινδιάνικου χωριού',
          indiantown3: 'Άνοιγμα και κεντράρισμα του χάρτη στο Ινδιάνικο χωριό',
          openmarket: 'Άνοιγμα της Αγοράς',
          forum: 'Άνοιγμα του Φόρουμ Πόλης',
          newsets: 'Νέα Σετ προσθέθηκαν στο script',
          chooseItems: 'Επιλέξτε τα αντικείμενα',
          remindHover: 'Λαμβάνετε μια ειδοποίηση όταν ένα αντικείμενο μπορεί να χρησιμοποιηθεί ξανά. Εδώ μπορείτε να επιλέξετε αυτά τα αντικείμενα.',
          remindReady: 'Έτοιμο για συλλογή',
          skipHover: 'Απενεργοποιήστε τα μηνύματα επιβεβαίωσης και τα αποτελέσματα όταν ανοίγετε κάποιες τσάντες. Εδώ μπορείτε να επιλέξετε αυτές τις τσάντες',
          skipDone: 'Παίρνετε',
          info: 'Πληροφορίες',
          contact: 'Επικοινωνία',
          chooseLang: 'Επιλογή γλώσσας',
          features: 'Χαρακτηριστικά',
          name: ' Όνομα παίκτη',
          author: 'Συντάκτης',
          version: 'Έκδοση',
          gameversion: 'Έκδοση παιχνιδιού',
          website: 'Ιστοσελίδα',
          weblink: 'Σύνδεσμος',
          save: 'Αποθήκευση',
          saveMessage: 'Οι ρυθμίσεις αποθηκεύτηκαν. Ορισμένες αλλαγές χρειάζονται μια ανανέωση του παραθύρου του παιχνιδιού.',
          setbonus2: 'Πληροφορίες σχετικά με τα μπόνους των Σετ',
          frame2: 'Χρήσιμες ιστοσελίδες',
          choose: 'Κάντε κλικ στο καπέλο για να ξεκινήσετε',
          items: 'Αντικείμενα',
          parts: 'Τεμάχια',
          showItems: 'Εμφάνιση των αντικειμένων που υπάρχουν στα αποθέματά σας',
          noItems: 'Δεν βρέθηκαν αντικείμενα στα αποθέματά σας!',
          ownSets: 'Δικά σου Σετ',
          switchWeapon: 'Εναλλαγή μεταξύ πυροβόλου όπλου και ξίφους όπλου',
          selectBonus: 'Επιλέξτε Μπόνους',
          resetB: 'Επαναφορά',
          body: 'Ένδυση',
          right_arm: 'Όπλο μονομαχίας',
          animal: 'Άλογο & σέλα',
          rest: 'Άλλο',
          buff: 'Buffs',
          refresh: 'Ανανέωση',
          noFriends: 'Δεν υπάρχουν φίλοι',
          reward: 'Ανταμοιβή',
          allprofessions: 'Όλα τα επαγγέλματα',
          market1: 'Αντικείμενα στην Αγορά',
          market2: 'Υπάρχουν αντικείμενα / χρήματα σε αυτήν την αγορά. Τι θέλετε να σηκώσετε;',
          all: 'Όλα',
          onlyBids: 'Μόνο προσφορές',
          nothing: 'Τίποτα',
          worldwide: 'Οποιονδήποτε',
          alliance: 'Συμμαχία',
          town: 'Πόλη',
          level: 'Επίπεδο',
          duelLevel: ' Επίπεδο μονομαχίας ',
          exp: ' Εμπειρία ',
          distance: ' Απόσταση ',
          startduel: ' Μονομαχήστε ',
          centerMap: 'Κεντράρισμα στον χάρτη',
          popup: 'Το μπόνους δεξιοτήτων των αντιπάλων',
          damage: 'Ζημιά',
          duelmap: 'Χάρτης μονομαχιών',
          duelradius: 'Ακτίνα μονομαχιών',
          minutes: 'λεπτά',
          hour: '1 ώρα',
          hours: 'ώρες',
          searchOpp: 'Αναζήτηση για αντιπάλους',
          amount: 'Νεκρός/ή',
          not_dead_amount: 'Ζωντανός/ή',
          duellevel: 'Επίπεδο',
          status: 'Κατάσταση',
          sortBy: 'Ταξινόμηση κατά',
          tooLow: 'Χαμηλό επίπεδο μονομαχίας του αντιπάλου',
          tooHigh: 'Υψηλό επίπεδο μονομαχίας του αντιπάλου',
          ownTown: 'Μέλος της πόλης σου',
          attackable: 'Εμφάνιση μόνο παίκτες που μπορείτε να μονομαχήσετε',
          logout: 'Αποσύνδεση',
          accNfin: 'Αποδοχή & Ολοκλήρωση αποστολής',
          onWiki: 'Εμφάνισε την αποστολή στο Wiki',
          longerName: 'Το όνομα πρέπει να είναι μεγαλύτερο από 2 χαρακτήρες',
          loading: 'Φόρτωση...',
          rename: 'Μετονομασία',
          newName: 'Επιλέξτε ένα νέο όνομα Σετ',
          used: 'Χρησιμοποιείται',
          renameWarning: 'Όταν μετονομάζετε ένα Σετ, θα το φορέσετε και θα το ξαναβγάλετε.<br>Μπορεί να χάσετε κάποιους πόντους υγείας κατά τη διάρκεια της διαδικασίας!',
          sellItems: 'Πώληση αντικειμένων στον Έμπορο;',
          removeWorkNotis: 'Απόκρυψη όλων των ειδοποιήσεων εργασιών',
          compInv: 'Κάντε κλικ στην επιλογή "ακύρωση" για να προβάλλετε μόνο αντικείμενα που μπορούν να πουληθούν με πλειστηριασμό\n ή\nΠροσθέστε άλλη διεύθυνση URL αποθέματος για σύγκριση',
          loginAll1: 'Είσοδος σε όλους',
          loginAll2: 'Φορτώστε όλους τους ενεργούς κόσμους σας με ένα κλικ',
          custom1: 'Προσαρμοσμένο',
          custom2: 'Η προσαρμοσμένη λίστα σας σύνδεσης',
          edit: 'Επεξεργασία',
          saveMessage2: 'Αποθηκεύτηκε με επιτυχία',
        },
        pt: {
          language: 'Portuguese (português)',
          ApiGui1: 'Esse script foi feito para facilitar sua vida no Velho Oeste: ',
          ApiGui2: 'Abrir página do Script',
          FeatLogout: 'Adicionar botão de sair no fim dos scripts',
          FeatStatusbar: 'Remover a barra de tarefas',
          FeatShowAP: 'Mostrar seus pontos de habilidade na janela de trabalho.',
          FeatChangeCity: 'Mude o título e nome do jogador na cidade.',
          FeatDuellMap: 'Adicionar mapa de duelos na janela duelos.',
          FeatMarkDaily: 'Destacar bônus de login diário.',
          FeatMarketTown: 'Mostrar nome da cidade no mercado.',
          FeatMarketMessage: 'Receber notificação de itens comprados ou vendidos no mercado atual.',
          FeatAchievHide: 'Ocultar conquistas realizadas na janela de conquistas.',
          FeatRecipeMarket: 'Melhorar a compra de receitas no mercado.',
          FeatMoveJobs: 'Mover os trabalhos enfileirados a esquerda.',
          FeatBlinkEvents: 'Não piscar botões de evento ao lado esquerdo.',
          FeatFortTracker: 'Ocultar botão da batalha de forte.',
          FeatFriendsPop: 'Ocultar janela de amigos online.',
          FeatInstantQuest: 'Completar aventura instantâneamente quando tiver os requisitos.',
          FeatQuestWiki: 'Adicionar link para abrir a aventura no wiki.',
          FeatCityTravel: 'MOstrar o tempo de distância nas cidades do quadro.',
          FeatBetterSheriff: 'Adicionar aba no Xerife para ver todas as recompensas possíveis.',
          FeatChatProfessions: 'MOstrar a profissão dos jogadores na lista do chat.',
          FeatQuestBookSearch: 'Pesquisar por aventuras resolvidas no livro de aventuras',
          FeatMarketRights: 'Diferenciar itens no mercado entre cidade, aliança, e público.',
          FeatEquipManagerPlus: 'Mostre o gerenciamento de equipamento no inventário.',
          FeatShortPopups: 'Tornar janelas pop-up mais curtas.',
          FeatHideNotis: 'Adicionar botão para ocultar as notificações do trabalho ao lado esquerdo.',
          FeatJobProducts: 'Mostrar na janela de trabalho quantos produtos você já tem no inventário.',
          FeatMapDistance: ' Mostrar o número de milhas ao lado do tempo de viagem.',
          FeatTraderSell: 'Vender vários itens de uma só vez ao comerciante.',
          FeatTouchControl: 'Enable touch control for map and scrollbar on your mobile',
          settings1: 'Configurações',
          settings2: 'Configurações e Janela de Informações',
          ghosttown1: 'Ir para Cidade Fantasma ',
          ghosttown2: 'Abrir Cidade Fantasma',
          ghosttown3: 'Abrir Cidade Fantasma e Centralizar no Mapa',
          indiantown1: 'Ir para Vila Indígena ',
          indiantown2: 'Abrir Vila Ingígena',
          indiantown3: 'Abrir Vila Indígena e Centralizar no Mapa',
          openmarket: 'Mercado',
          forum: 'Fórum da Cidade',
          newsets: 'Novos Sets Adicionados ao Script',
          chooseItems: 'Escolha os Itens',
          remindHover: 'Receber notificação quando um item puder ser usado novamente.',
          remindReady: 'Pronto para recolher.',
          skipHover: 'Pular janelas de confirmação ao abrir algumas caixas e itens.',
          skipDone: 'Você ganhou:',
          info: 'Informação',
          contact: 'Contato:',
          chooseLang: 'Escolher Idioma',
          features: 'Características',
          name: 'Nome',
          author: 'Autor',
          version: 'Versão',
          gameversion: 'Versão do Game',
          website: 'Website',
          weblink: 'Weblink',
          save: 'Salvar',
          saveMessage: 'Configurações salvas. Algumas mudanças só apareceram quando atualizar a janela.',
          setbonus2: 'Informações sobre o bônus do set',
          frame2: 'Páginas da Web Úteis',
          choose: 'Clique no Chapéu para começar.',
          items: 'Itens',
          parts: 'Partes',
          showItems: 'Mostrar os itens definidos no seu saco.',
          noItems: 'Nenhum item no seu inventário foi encontrado. Clique novamente com a tecla CTRL para mostrar no TW-Calc.',
          ownSets: 'Apenas possui conjuntos.',
          switchWeapon: 'Alternar entre arma de fogo e arma de vigor.',
          selectBonus: 'Selecionar bônus',
          resetB: 'Resetar',
          body: 'Roupas',
          right_arm: 'Armas',
          animal: 'Cavalo & Sela',
          rest: 'Outros',
          buff: 'Buffs',
          refresh: 'Atualizar',
          noFriends: 'Sem Amigos',
          reward: 'Recompensa',
          allprofessions: 'Todas as Profissões',
          market1: 'Itens no Mercado',
          market2: 'Há itens e dinheiro no mercado, o que você quer recolher?',
          all: 'Os dois',
          onlyBids: 'Apenas Lance',
          nothing: 'Nada',
          worldwide: 'No mundo todo',
          alliance: 'Aliança',
          town: 'Cidade',
          level: 'Nível',
          duelLevel: 'Nivel de Duelo',
          exp: 'Experiência',
          distance: 'Distância',
          startduel: 'Desafiar num Duelo',
          centerMap: 'Centralizar Mapa',
          popup: 'Bônus de Habilidade do Oponente',
          damage: 'Danificar',
          duelmap: 'Mapa de Duelo',
          duelradius: 'Raio de Duelo',
          minutes: 'Minutos',
          hour: '1 hora',
          hours: 'horas',
          searchOpp: 'Pesquisar Oponentes',
          amount: 'Morto',
          not_dead_amount: 'Vivo',
          duellevel: 'Nível',
          status: 'Status',
          sortBy: 'Ordenar por:',
          tooLow: 'Nível de duelo muito baixo.',
          tooHigh: 'Nível de duelo muito alto',
          ownTown: 'Membro da sua Cidade',
          attackable: 'Mostrar apenas jogadores atacáveis',
          logout: 'Sair',
          accNfin: 'Aceitar e completar quest.',
          onWiki: 'Abrir quest na janela wi-ki',
          longerName: 'O nome deve ter mais de 2 caracteres.',
          loading: 'Carregando...',
          rename: 'Renomear',
          newName: 'Escolha um novo nome de conjunto',
          used: 'Usado',
          renameWarning: 'Quando você renomeia um conjunto, você vai usá-lo e despir-lo novamente.<br>Você pode perder pontos de saúde durante o processo!',
          sellItems: 'Vender itens para o comerciante?',
          removeWorkNotis: 'Ocultar todas as notificações de Jobs',
          compInv: 'Clique em "cancelar" para mostrar apenas itens leiloáveis\n ou\nIntroduza outro URL de inventário para comparar',
          loginAll1: 'Login em todos os mundos',
          loginAll2: 'Carregue todos os seus mundos ativos em um clique',
          custom1: 'Personalizado',
          custom2: 'Sua lista de login persnalizada',
          edit: 'Editar',
          saveMessage2: 'Salvo com sucesso!',
        },
        it: {
          language: 'Italian (italiano)',
          ApiGui1: 'Questo script raccoglie molte funzionalità utili a semplificarti la vita in The West.<br><br>Ulteriori informazioni: ',
          ApiGui2: 'Apri la pagina dello script',
          FeatLogout: 'Aggiungi sul lato destro dello schermo un pulsante disconnetti',
          FeatStatusbar: 'Nascondi la barra degli incarichi',
          FeatShowAP: 'Mostra i tuoi attuali punti abilità nelle finestre dei lavori',
          FeatChangeCity: 'Nel municipio, inverti il titolo e il nome del giocatore',
          FeatDuellMap: 'Aggiungi la scheda Mappa duelli nella finestra Duelli',
          FeatMarkDaily: 'Evidenzia il bonus login del 5° giorno per non dimenticarlo',
          FeatMarketTown: 'Mostra il nome della città nella finestra del mercato',
          FeatMarketMessage: 'Ricevi una notifica quando ci sono oggetti o soldi da ritirare al mercato della città dove ti trovi in quel momento',
          FeatAchievHide: 'Nascondi i Successi completati nella rispettiva finestra di gioco',
          FeatRecipeMarket: 'Migliora l\'organizzazione delle ricette al mercato',
          FeatMoveJobs: 'Sposta la coda dei lavori leggermente più a sinistra',
          FeatBlinkEvents: 'Termina il lampeggiamento delle icone degli eventi e della fiera nella barra delle notifiche',
          FeatFortTracker: 'Disattiva l\'icona di notifica della battaglia al forte',
          FeatFriendsPop: 'Nascondi i pop-up "Amico online"',
          FeatInstantQuest: 'Se tutti i requisiti sono soddisfatti, permetti di concludere le missioni istantaneamente',
          FeatQuestWiki: 'Aggiungi un link alla wiki italiana (ove disponibile) nelle finestre delle missioni',
          FeatCityTravel: 'Mostra la distanza verso le città nella lavagna',
          FeatBetterSheriff: 'Aggiungi una nuova scheda nella finestra dello sceriffo per vedere tutte le possibili taglie',
          FeatChatProfessions: 'Mostra la professione a fianco del nome dei giocatori nella lista della chat',
          FeatQuestBookSearch: 'Aggiungi una casella di ricerca nella scheda "Completate" del libro missioni',
          FeatMarketRights: 'Mostra se le offerte del mercato sono pubbliche oppure per alleati\concittadini',
          FeatEquipManagerPlus: 'Migliora la finestra "Gestione equipaggiamento" nell\'inventario',
          FeatShortPopups: 'Rendi i tooltip degli oggetti più corti',
          FeatHideNotis: 'Aggiungi un pulsante per nascondere le notifiche dei lavori nella relativa barra',
          FeatJobProducts: 'Nel tooltip dei prodotti mostra quanti se ne possiede in inventario',
          FeatMapDistance: 'Mostra la distanza in miglia accanto al tempo di viaggio',
          FeatTraderSell: 'Consenti di vendere oggetti in quantità multipla ai negozi\mercante ambulante',
          FeatTouchControl: 'Abilità il controllo touch nel browser mobile',
          settings1: 'Apri le impostazioni',
          settings2: 'Apri le impostazioni e la finestra di informazioni',
          ghosttown1: 'Vai alla Città fantasma',
          ghosttown2: 'Apri la Città Fantasma',
          ghosttown3: 'Apri la Città Fantasma e centra la mappa',
          indiantown1: 'Vai al Villaggio Indiano',
          indiantown2: 'Apri il Villaggio Indiano',
          indiantown3: 'Apri il Villaggio Indiano e centra la mappa',
          openmarket: 'Apri il mercato',
          forum: 'Apri il forum città',
          newsets: 'Nuovi set sono stati aggiunti allo script',
          chooseItems: 'Scegli gli oggetti',
          remindHover: 'Ricevi una notifica quando un oggetto può essere di nuovo utilizzato. Scegli qui gli oggetti di interesse.',
          remindReady: 'Pronto per essere collezionato',
          skipHover: 'Salta i messaggi di conferma e risultato quando apri alcuni oggetti. Scegli qui gli oggetti di interesse',
          skipDone: 'Ottieni',
          info: 'Informazioni',
          contact: 'Contatti',
          chooseLang: 'Scegli lingua',
          features: 'Caratteristiche',
          name: 'Nome',
          author: 'Autore',
          version: 'Versione',
          gameversion: 'Versione di gioco',
          website: 'Sito internet',
          weblink: 'Link al sito',
          save: 'Salva',
          saveMessage: 'Impostazioni salvate. Aggiorna la pagina per renderle effettive.',
          setbonus2: 'Informazioni sui bonus set',
          frame2: 'Pagine internet di aiuto',
          choose: 'Clicca sul cappello per iniziare',
          items: 'oggetti',
          parts: 'parti',
          showItems: 'Mostra i set oggetti nel tuo inventario',
          noItems: 'Nessun oggetto trovato nel tuo inventario. Cliccaci nuovamente tenendo premuto CTRL per mostrarlo su TW-Calc.',
          ownSets: 'Solo propri set',
          switchWeapon: 'Inverti armi da fuoco e da contusione',
          selectBonus: 'Scegli i bonus',
          resetB: 'Reset',
          body: 'Abiti',
          right_arm: 'Armi',
          animal: 'Cavallo e oggetto',
          rest: 'Altro',
          buff: 'Buffs',
          refresh: 'Aggiorna',
          noFriends: 'Nessun amico',
          reward: 'Ricompensa',
          allprofessions: 'Tutte le professioni',
          market1: 'Oggetti al mercato',
          market2: 'Ci sono oggetti/soldi da ritirare in questo mercato. Vuoi farlo?',
          all: 'Tutto',
          onlyBids: 'Solo aste',
          nothing: 'Niente',
          worldwide: 'Mondiale',
          alliance: 'Alleanza',
          town: 'Città',
          level: 'Livello',
          duelLevel: 'Livello duello',
          exp: 'Esperienza',
          distance: 'Distanza',
          startduel: 'Inizia duello',
          centerMap: 'Centra mappa',
          popup: 'Abilità bonus dell\'avversario',
          damage: 'Danno',
          duelmap: 'Mappa duelli',
          duelradius: 'Raggio duelli',
          minutes: 'minuti',
          hour: '1 ora',
          hours: 'ore',
          searchOpp: 'Cerca avversari',
          amount: 'Morto',
          not_dead_amount: 'Vivo',
          duellevel: 'Liv',
          status: 'Stato',
          sortBy: 'Ordina per',
          tooLow: 'Livello duello avversario troppo basso',
          tooHigh: 'Livello duello avversario troppo alto',
          ownTown: 'Membro della tua città',
          attackable: 'Mostra solo i giocatori duellabili',
          logout: 'Disconneti',
          accNfin: 'Accetta e completa missione',
          onWiki: 'Mostra la missione nella Wiki',
          longerName: 'Il nome deve essere più lungo di 2 caratteri',
          loading: 'Caricamento...',
          rename: 'Rinomina',
          newName: 'Scegli un nuovo nome set',
          used: 'Usato',
          renameWarning: 'Quando rinomini un set lo indosserai e svestirai di nuovo.<br>In questo processo potresti perdere dei punti vita!',
          sellItems: 'Vuoi vendere questi oggetti?',
          removeWorkNotis: 'Nascondi tutte le notifiche dei lavori',
          compInv: 'Clicca su "cancella" per mostrare solo gli oggetti vendibili all\'asta\n oppure\nInserisci altro URL di inventari per confrontare',
          loginAll1: 'Fai login in tutti i mondi',
          loginAll2: 'Carica tutti i mondi in cui sei attivo con un clic',
          custom1: 'Personalizza',
          custom2: 'La tua lista login personalizzata',
          edit: 'Modifica',
          saveMessage2: 'Salvato con successo',
        },
      },
      Images: function (img, file) {
        return 'https://tomrobert.safe-ws.de/' + img + (file ? '.jpg' : '.png');
      },
    };
    if (location.href.includes('game.php')) {
      LT = {
        name: 'TWLeoTools',
        author: 'Leotas (updated by Tom Robert)',
        minGame: '2.04',
        maxGame: Game.version.toString(),
        website: 'https://greasyfork.org/scripts/7238',
        SPEC: [
          'speed', 'luck', 'dollar', 'experience', 'regen', 'drop',
        ],
        list: null,
        currSetBonus: 0,
        currBonusSearch: '',
        lvlToggle: 0,
        setAbc: false,
        onlyOwnSets: false,
        chooseBonus: {
          subWeapon: 'hand'
        },
        Data: {},
        loaded: [],
        Features: {
          Logout: false,
          Statusbar: false,
          ShowAP: false,
          ChangeCity: false,
          DuellMap: true,
          MarkDaily: true,
          MarketMessage: true,
          MarketTown: true,
          AchievHide: true,
          RecipeMarket: true,
          MoveJobs: true,
          BlinkEvents: false,
          FortTracker: false,
          FriendsPop: false,
          InstantQuest: true,
          QuestWiki: true,
          CityTravel: true,
          BetterSheriff: true,
          ChatProfessions: true,
          QuestBookSearch: true,
          MarketRights: true,
          EquipManagerPlus: true,
          ShortPopups: true,
          HideNotis: true,
          JobProducts: true,
          MapDistance: true,
          TraderSell: true,
          TouchControl: true,
        },
        cooldown: {
          2482: 1,
          2484: 1,
          2485: 1,
          2557: 1,
          2558: 1,
          2665: 1,
          2666: 1,
          2698: 1,
          50691: 1,
          51482: 1,
          51483: 1,
        },
        cooldownTimer: {},
        cooldownSetTime: function (y, res, sec) {
          LT.cooldownTimer[y] = setTimeout(function () {
              var imgs = $('<span></span>');
              for (var z = 0; z < res.length; z++) {
                var itemDiv = new tw2widget.JobItem(res[z].obj).getMainDiv();
                imgs.append(itemDiv);
              }
              var cooldownMsg = new west.gui.Dialog(LTlang.remindReady, imgs, 'ok').addButton('ok', function () {
                  Wear.open();
                  Inventory.showSearchResult(res);
                  cooldownMsg.hide();
                  LT.cooldownTimer[y] = 0;
                }).addButton('cancel').show();
            }, sec);
        },
        skipOpen: {
          1975: 1,
          2561: 0.5,
          2562: 0.5,
          2675: 0.5,
        },
        addStyle: function (css) {
          var style = document.createElement('style');
          style.type = 'text/css';
          style.innerHTML = css;
          document.body.appendChild(style);
        },
        updateLang: function () {
          var lg = LTstart.langs;
          LT.lang = lg[localStorage.getItem('scriptsLang')] ? localStorage.getItem('scriptsLang') : lg[Game.locale.substr(0, 2)] ? Game.locale.substr(0, 2) : 'en';
          LTlang = lg[LT.lang];
        },
      };
      LT.updateLang();
      LT.Skript = {
        init: function () {
          TheWestApi.register('LeoTools', LT.name, LT.minGame, LT.maxGame, LT.author, LT.website).setGui('<br>' + LTlang.ApiGui1 + '<a href="javascript:LT.GUI.open(\'openKontakt\');LT.GUI.makeList();" title="' + LTlang.ApiGui2 + '">' + LTlang.ApiGui2 + '</a><br><br><i>' + LT.name + ' v' + LTstart.version + '</i>');
          var menuContainer = $('<div id="LT-menu" class="menulink" onclick="LT.GUI.openSelectbox();" title="' + LT.name + '" />').css('background-image', 'url(' + LTstart.Images('LT_settings') + ')').css('background-position', '0px 0px').mouseenter(function () {
              $(this).css('background-position', '-25px 0px');
            }).mouseleave(function () {
              $(this).css('background-position', '0px 0px');
            });
          $('#ui_menubar').append($('<div class="ui_menucontainer" />').append(menuContainer).append('<div class="menucontainer_bottom" />'));
          LT.Skript.updateFeat();
          LT.SkipOpen();
        },
        updateFeat: function () {
          var saved = localStorage.getItem('TWLT');
          LT.Data = saved && saved.indexOf('{') === 0 && JSON.parse(saved) || {};
          for (var k in LT.Features) {
            if (LT.Skript.getFeature(k) && !LT.loaded.includes(k)) {
              try {
                LT.loaded.push(k);
                LT[k].init();
              } catch (e) {}
            }
          }
          LT.CollectReminder();
        },
        getFeature: function (name) {
          return (LT.Data[name] !== undefined) ? LT.Data[name] : LT.Features[name];
        },
      };
      Map.getLastQueuePosition = function () {
        var posx = Character.position.x;
        var posy = Character.position.y;
        if (TaskQueue.queue.length >= 1) {
          var data = TaskQueue.queue[TaskQueue.queue.length - 1].wayData;
          if (data.x) {
            posx = data.x;
            posy = data.y;
          }
        }
        return {
          x: posx,
          y: posy
        };
      };
      var EvName = Object.keys(Game.sesData)[0],
      set1 = west.storage.ItemSetManager._setList;
      if (EvName)
        var sendGift = Game.sesData[EvName].friendsbar;
      LT.GUI = {
        openSelectbox: function () {
          LT.GUI.makeList();
          var selectbox = new west.gui.Selectbox();
          $(selectbox.getMainDiv()).append('<div class="LTselbox"/>');
          selectbox.setHeader(LT.name);
          selectbox.setWidth(300);
          selectbox.addItem(0, LTlang.settings1, LTlang.settings2);
          selectbox.addItem(1, 'SetBonus', LTlang.setbonus2);
          selectbox.addItem(2, 'BonusSearch', LTlang.setbonus2);
          selectbox.addItem(3, 'WebCenter', LTlang.frame2);
          selectbox.addItem(4, LTlang.ghosttown1 + Map.calcWayTime(Map.getLastQueuePosition(), {
              x: 1728,
              y: 2081
            }).formatDuration(), LTlang.ghosttown1);
          selectbox.addItem(5, LTlang.ghosttown2, LTlang.ghosttown3);
          selectbox.addItem(6, LTlang.indiantown1 + Map.calcWayTime(Map.getLastQueuePosition(), {
              x: 28002,
              y: 16658
            }).formatDuration(), LTlang.indiantown1);
          selectbox.addItem(7, LTlang.indiantown2, LTlang.indiantown3);
          selectbox.addItem(8, LTlang.openmarket, LTlang.openmarket);
          selectbox.addItem(9, LTlang.forum, LTlang.forum);
          if (EvName) {
            selectbox.addItem(10, '<div style="text-overflow:ellipsis; white-space:nowrap; overflow:hidden;"><b>' + sendGift.label + '</b></div>', sendGift.label);
          }
          selectbox.addListener(function (e) {
            switch (e) {
            case 0:
              LT.GUI.open('openFeatures');
              break;
            case 1:
              LT.GUI.open('openSetsWindow', 0, 'SetBonus');
              break;
            case 2:
              LT.GUI.open('openSetsWindow', 0, 'BonusSearch');
              break;
            case 3:
              LT.GUI.open('openFrame');
              break;
            case 4:
              QuestEmployerWindow.startWalk({
                key: 'ghosttown',
                x: '1728',
                y: '2081'
              });
              break;
            case 5:
              Map.center(1728, 2081);
              QuestEmployerWindow.showEmployer('ghosttown', '1728', '2081');
              break;
            case 6:
              QuestEmployerWindow.startWalk({
                key: 'indianvillage',
                x: '28002',
                y: '16658'
              });
              break;
            case 7:
              Map.center(28002, 16658);
              QuestEmployerWindow.showEmployer('indianvillage', '28002', '16658');
              break;
            case 8:
              MarketWindow.open(Character.homeTown.town_id);
              break;
            case 9:
              ForumWindow.open();
              break;
            case 10:
              LT.GUI.open('openSender');
              break;
            }
          });
          var pos = $('div#LT-menu').offset();
          pos = {
            clientX: pos.left,
            clientY: pos.top
          };
          selectbox.show(pos);
        },
        window: {},
        checkbox: {},
        open: function (tab, data, id) {
          LT.GUI.window = wman.open('LT', 'TheWest - LeoTools', 'noreload').setMiniTitle(LT.name).setMaxSize(1268, 838).addTab(LTlang.info + ' & ' + LTlang.contact, 'LTContact', LT.GUI.openKontakt).addTab(LTlang.features, 'LTFeatures', LT.GUI.openFeatures).addTab('SetBonus', 'SetBonus', LT.GUI.openSetsWindow).addTab('BonusSearch', 'BonusSearch', LT.GUI.openSetsWindow).addTab('WebCenter', 'LTFrame', LT.GUI.openFrame);
          if (EvName)
            LT.GUI.window.addTab('Event', 'LTSender', LT.GUI.openSender);
          LT.GUI[tab](data, id);
          $('.tw2gui_window_inset', LT.GUI.window.getMainDiv()).css('background-image', 'url(' + LTstart.Images('LT_backGr', 1) + ')');
        },
        getDefault: function (tab) {
          LT.GUI.window.setResizeable(false).setSize(748, 471).clearContentPane().removeClass('nocloseall').setTitle('TheWest - LeoTools');
          LT.GUI.window.dontCloseAll = false;
          $(LT.GUI.window.getContentPane()).css('margin-top', '0px');
          var wnd = LT.GUI.window.getMainDiv();
          $('.textart_title', wnd).css('display', '');
          LT.GUI.window.activateTab(tab);
        },
        openKontakt: function () {
          LT.GUI.getDefault('LTContact');
          var fmfb = function (l) {
            return 'https://forum.the-west.' + l + '/index.php?conversations/add&to=Tom Robert';
          },
          content = $('<br><h1>' + LTlang.info + '</h1><ul style="list-style-type:none;line-height:18px;margin-left:5px;"><li><b>' + LTlang.name + ': </b>' + LT.name + '</li><li><b>' + LTlang.author + ': </b>' + LT.author + '</li><li><b>' + LTlang.version + ': </b>' + LTstart.version + '</li><li><b>' + LTlang.gameversion + ': </b>' + LT.minGame + ' - ' + LT.maxGame + '</li><li><b>' + LTlang.website + ': </b>' + '<a href="' + LT.website + '" target="_blank">' + LTlang.weblink + '</a></li></ul>' +
              '<br><h1>' + LTlang.contact + '</h1><ul style="margin-left:15px;line-height:18px;"><li>Send a message to <a target=\'_blanck\' href="http://om.the-west.de/west/de/player/?ref=west_invite_linkrl&player_id=647936&world_id=13&hash=7dda">Tom Robert on German world Arizona</a></li>' +
              '<li>Contact me on <a target=\'_blanck\' href="https://greasyfork.org/forum/messages/add/Tom Robert">Greasy Fork</a></li>' +
              '<li>Message me on one of these The West Forum:<br>/ <a target=\'_blanck\' href="' + fmfb('de') + '">deutsches Forum</a> / ' +
              '<a target=\'_blanck\' href="' + fmfb('net') + '">English forum</a> / <a target=\'_blanck\' href="' + fmfb('pl') + '">forum polski</a> / ' +
              '<a target=\'_blanck\' href="' + fmfb('es') + '">foro español</a> /<br>/ <a target=\'_blanck\' href="' + fmfb('ru') + '">Русский форум</a> / ' +
              '<a target=\'_blanck\' href="' + fmfb('fr') + '">forum français</a> / <a target=\'_blanck\' href="' + fmfb('it') + '">forum italiano</a> / ' +
              '<a target=\'_blanck\' href="https://forum.beta.the-west.net/index.php?conversations/add&to=Tom Robert">beta forum</a> /<br>I will get an e-mail when you sent me the message <img src="images/chat/emoticons/smile.png"></li></ul>');
          LT.GUI.window.appendToContentPane(content);
        },
        openFeatures: function () {
          LT.GUI.getDefault('LTFeatures');
          var featScroll = new west.gui.Scrollpane().appendContent('<h2>' + LTlang.chooseLang + '</h2>'),
          langBox = new west.gui.Combobox().appendTo(featScroll.getContentPane());
          for (var j in LTstart.langs)
            langBox.addItem(j, LTstart.langs[j].language);
          langBox.select(LT.lang);
          LT.cdTemp = LT.Data.cooldown ? $.extend({}, LT.Data.cooldown) : $.extend({}, LT.cooldown);
          $('<span title="' + LTlang.remindHover + '" style="background-image: url(images/items/yield/low_heart_container.png); cursor: pointer; position: absolute; height: 73px; width: 73px; right: 0px; top: 0px;"/>').appendTo(featScroll.getContentPane()).click(function () {
            var cont = $('<span>');
            for (var x in LT.cooldown) {
              var productDiv = new tw2widget.JobItem(ItemManager.getByBaseId(x)).getMainDiv();
              $(productDiv).css('opacity', LT.cdTemp[x] || LT.cooldown[x]).attr('onclick', 'LT.cdTemp[' + x + ']=$(this).css("opacity")==1?0.5:1;$(this).css("opacity",LT.cdTemp[' + x + ']);');
              cont.append(productDiv);
            }
            new west.gui.Dialog(LTlang.chooseItems, cont).addButton('ok').show();
          });
          LT.skipTemp = LT.Data.skipOpen ? $.extend({}, LT.Data.skipOpen) : $.extend({}, LT.skipOpen);
          var openSkipList = function () {
            var cont2 = $('<span></span>');
            for (var x in LT.skipTemp) {
              var productDiv2 = new tw2widget.JobItem(ItemManager.getByBaseId(x)).getMainDiv(),
              productDel = new west.gui.Icon('abort ' + x).getMainDiv().click(function (e) {
                  e.stopPropagation();
                  e.target.parentElement.remove();
                  delete LT.skipTemp[e.target.classList[2]];
                });
              $(productDel).css({
                'display': 'inline-block',
                'position': 'absolute',
                'right': '0px'
              });
              $(productDiv2).css('opacity', LT.skipTemp[x]).attr('onclick', 'LT.skipTemp[' + x + ']=$(this).css("opacity")==1?0.5:1;$(this).css("opacity",LT.skipTemp[' + x + ']);').append(productDel);
              cont2.append(productDiv2);
            }
            var itemPrew = $('<div id="LT_add_chest_prew" style="height:73px;width:73px;border:1px solid;border-radius:10px;float:left"/><br>');
            var textFP = new west.gui.Textfield('add_skipOpen_chest').maxlength(6).setPlaceholder('item_base_id').addKeyUpListener(function (e) {
                $('#LT_add_chest_prew').empty();
                iconP.disable();
                var val = e.target.value;
                if (!isNaN(val) && val < forbid.maxID) {
                  var item = ItemManager.getByBaseId(val);
                  if (item) {
                    $('#LT_add_chest_prew').append(new tw2widget.JobItem(item).getMainDiv());
                    if (item.usebonus && item.usebonus.length == 1 && item.action.split(',')[2] == "'yield');" && !LT.skipTemp[val])
                      iconP.enable();
                  }
                }
              }),
            iconP = new west.gui.Iconbutton(new west.gui.Icon('plus'), function () {
                LT.skipTemp[textFP.getValue()] = 1;
                skipList.hide();
                openSkipList();
              }).disable(),
            iconA = new west.gui.Icon('abort').getMainDiv().click(function () {
                textFP.setValue('');
                $('#LT_add_chest_prew').empty();
                iconP.disable();
              });
            cont2.append(itemPrew, textFP.getMainDiv(), iconP.getMainDiv(), iconA);
            var skipList = new west.gui.Dialog(LTlang.chooseItems, cont2).setBlockGame(false).setDraggable(true).addButton('ok').show();
          };
          $('<span title="' + LTlang.skipHover + '" style="background-image: url(images/items/yield/productchest_1.png); cursor: pointer; position: absolute; height: 73px; width: 73px; right: 0px; top: 73px;"/>').appendTo(featScroll.getContentPane()).click(openSkipList);
          featScroll.appendContent('<br><br><h2>' + LTlang.features + '</h2>');
          for (var k in LT.Features) {
            LT.GUI.checkbox[k] = new west.gui.Checkbox().setLabel(LTlang['Feat' + k]).setSelected(LT.Skript.getFeature(k)).appendTo(featScroll.getContentPane());
            featScroll.appendContent('<br><div style="height:5px;" />');
          }
          featScroll.appendContent('<br>');
          $(featScroll.getMainDiv()).css({
            'height': '330px',
            'margin-top': '10px'
          });
          var button = new west.gui.Button(LTlang.save, function () {
              localStorage.setItem('scriptsLang', langBox.getValue());
              LT.updateLang();
              for (var k in LT.GUI.checkbox)
                LT.Data[k] = LT.GUI.checkbox[k].isSelected();
              LT.Data.cooldown = LT.cdTemp;
              LT.Data.skipOpen = LT.skipTemp;
              localStorage.setItem('TWLT', JSON.stringify(LT.Data));
              LT.Skript.updateFeat();
              new UserMessage(LTlang.saveMessage, 'success').show();
            });
          $(LT.GUI.window.getContentPane()).append(featScroll.getMainDiv()).append(button.getMainDiv());
        },
        makeList: function () {
          if (!LT.list)
            $.getScript('https://tomrobert.safe-ws.de/forbidN.js').done(function () {
              LT.list = west.storage.ItemSetManager._setArray.slice(0);
              LT.setListAll = {};
              LT.setListOwn = {};
              LT.itemListAll = {};
              LT.itemListOwn = {};
              var slot = {
                2: ['animal', 'yield'],
                3: ['right_arm', 'left_arm'],
                6: ['body', 'pants', 'neck', 'head', 'foot', 'belt']
              };
              var i = LT.list.length;
              while (i--) {
                var si = LT.list[i];
                if (!forbid.sets.includes(si.key) && si.items[0] && !ItemManager.getByBaseId(si.items[0]).short.includes('friendset_') && !si.key.includes('friendship_set_'))
                  LT.setListAll[si.key] = si;
                else
                  LT.list.splice(i, 1);
              }
              LT.setLength = Object.keys(LT.setListAll).length;
              for (var j in LT.setListAll) {
                var sa = LT.setListAll[j];
                //sa.items.sort((a, b) => a - b);
                var sil = sa.items.length;
                sa.slots = slot[sil] && slot[sil].includes(ItemManager.getByBaseId(sa.items[1]).type) ? slot[sil][0] : 'rest';
                var items = sa.getAvailableItems();
                if (items.length) {
                  var bon = {},
                  oneType = [];
                  for (var o = 0; o < items.length; o++) {
                    var igt = ItemManager.get(items[o]);
                    items[o] = igt.item_base_id;
                    if (sa.bonus[o + 1] && !oneType.includes(igt.type))
                      bon[o + 1] = sa.bonus[o + 1];
                    oneType.push(igt.type);
                  }
                  LT.setListOwn[j] = {
                    items: items.reverse(),
                    bonus: bon,
                    name: sa.name,
                    slots: sa.slots,
                  };
                }
              }
              var replUml = function (str) {
                return str.toUpperCase().replace(/"/g, '').replace(/Á/g, 'A').replace(/É/g, 'E').replace(/Ő/g, 'O').replace(/Ú|Ü|Ű/g, 'U').replace(/Ś/g, 'S');
              };
              LT.list.sort(function (a, b) {
                var a1 = replUml(a.name),
                b1 = replUml(b.name);
                return (a1 == b1) ? 0 : (a1 > b1) ? 1 : -1;
              });
              var buffDesc = function (umt) {
                return umt.match(/[^%-:]+/)[0].trim();
              },
              useboni = {},
              ammobelt = 2741,
              ghostmusic = 2732,
              lantern = 2734,
              moneyboost = 2468,
              ratatou = 51127,
              cocktail = 51579,
              getBuff = function (itm, num) {
                return buffDesc(ItemManager.getByBaseId(itm).usebonus[num]);
              };
              useboni[getBuff(ammobelt, 2)] = 'offense';
              useboni[getBuff(ammobelt, 1)] = 'defense';
              useboni[getBuff(ghostmusic, 0)] = 'experience';
              useboni[getBuff(moneyboost, 0)] = 'dollar';
              useboni[getBuff(ratatou, 0)] = 'luck';
              useboni[getBuff(ratatou, 1)] = 'drop';
              useboni[getBuff(ghostmusic, 1)] = 'joball';
              useboni[getBuff(lantern, 0)] = 'speed';
              useboni[getBuff(cocktail, 0)] = 'regen';
              for (var kn in CharacterSkills.keyNames)
                useboni[CharacterSkills.keyNames[kn]] = kn;
              var addItems = function (obj, state) {
                var ob = obj.bonus,
                boni = {
                  1: ob.item.slice()
                },
                slot = 'item';
                if (obj.usebonus) {
                  slot = 'buff';
                  for (var oub of obj.usebonus) {
                    if (!oub)
                      continue;
                    var desc = buffDesc(oub);
                    if (useboni[desc])
                      boni[1].push({
                        name: useboni[desc],
                        value: oub.match(/\d+/)[0],
                      });
                  }
                } else
                  for (var cat in ob) {
                    if (cat == 'item')
                      continue;
                    for (var type in ob[cat]) {
                      var ct = ob[cat][type];
                      if (ct > 0) {
                        boni[1].push({
                          name: type,
                          value: ct,
                          isSector: cat == 'fortbattlesector',
                          leveled: obj.item_level > 0
                        });
                      }
                    }
                  }
                LT['itemList' + state][obj.item_base_id] = {
                  bonus: boni,
                  name: obj.name,
                  slots: slot,
                  pos: obj.type,
                  item_level: obj.item_level,
                };
              };
              var allItems = ItemManager.getAll();
              for (var k in allItems)
                if (k > 9 && k < forbid.maxID && !forbid.IDs.includes(k) && !(allItems[k].set && !LT.setListAll[allItems[k].set]))
                  addItems(allItems[k], 'All');
              for (var l in Bag.items_by_id)
                if (!forbid.IDs.includes(k))
                  addItems(Bag.items_by_id[l].obj, 'Own');
              for (var m in Wear.wear)
                addItems(Wear.wear[m].obj, 'Own');
              var collect = set1.collector_set.bonus[9], //pray
              pilg = set1.set_pilgrim_male.bonus[2], //build
              lee = set1.set_oktoberfest_2016_1.bonus[6], //offenstrue
              hero = set1.independance_event_set7.bonus[2], //drop
              delChar = function (list) {
                return list.desc.replace(/[0-9]|\+|\.|\%/g, '').substring(1);
              };
              LT.searchObj = {
                offense: [delChar(collect[5]), 'fort/battle/button_attack'],
                offensetrue: [delChar(lee[4]), 'fort/battle/help01'],
                defense: [delChar(hero[13]), 'fort/battle/button_defend'],
                defensetrue: [delChar(collect[6]), 'fort/battle/help02'],
                resistance: [delChar(hero[15]), 'fort/battle/resistance'],
                //damage: ['weapon damage', 'items/left_arm/golden_rifle'],
                damagetrue: [delChar(collect[7]), 'items/left_arm/golden_rifle'],
                experience: [delChar(hero[10]), 'items/yield/xp_boost', '<br>'],
                dollar: [delChar(hero[11]), 'items/yield/dollar_boost'],
                luck: [delChar(collect[2]), 'items/yield/luck_boost'],
                drop: [delChar(hero[9]), 'items/yield/product_boost'],
                joball: [delChar(collect[0]), 'window/job/jobstar_small_gold'],
                speed: [delChar(collect[1]), 'jobs/walk'],
                regen: [delChar(collect[3]), 'jobs/sleep'],
                pray: [delChar(collect[4]), 'jobs/pray'],
                job1000: [delChar(pilg[0]), 'jobs/build'],
              };
              for (var ca = 0; ca < CharacterSkills.allSkillKeys.length; ca++) {
                if (ca % 5 === 0) {
                  var attr = CharacterSkills.allAttrKeys[ca / 5];
                  LT.searchObj[attr] = [CharacterSkills.keyNames[attr], 'window/skills/circle_' + attr, ca % 10 === 0 ? '<br>' : ''];
                }
                var skill = CharacterSkills.allSkillKeys[ca];
                LT.searchObj[skill] = [CharacterSkills.keyNames[skill], 'window/skills/skillicon_' + skill];
              }
              if (!localStorage.getItem('TWLTdate') || Date.parse(forbid.date) > Date.parse(localStorage.getItem('TWLTdate'))) {
                var setNames = '',
                nSets = forbid.unlock;
                for (var h of nSets)
                  setNames += LT.GUI.getSetOrItem(h, set1[h]) + '<br>';
                new west.gui.Dialog(LT.name, '<span><b>' + forbid.date.toDateString() + '</b><br>' + LTlang.newsets + ':<br><br>' + setNames + '</span>', west.gui.Dialog.SYS_OK).setBlockGame(false).setDraggable(true).addButton('ok').show();
                localStorage.setItem('TWLTdate', forbid.date);
              }
            });
        },
        itemsInInv: function (id) {
          var upgrade = isNaN(id) ? LT.currList[id].items : [id],
          items = [];
          for (var g of upgrade) {
            for (var h = 0; h <= 5; h++) {
              items.push(g * 1000 + h);
            }
          }
          var invItems = Bag.getItemsByItemIds(items);
          if (invItems.length > 0) {
            Wear.open();
            Inventory.showCustomItems(invItems);
          } else
            new UserMessage(LTlang.noItems, 'hint').show();
        },
        getSetOrItem: function (id, obj, nolink) {
          if (!obj)
            return id;
          var isItem = !isNaN(id),
          nNew = window.forbid && (isItem && id >= forbid.unlockID || !isItem && forbid.unlock.includes(id)) ? '<img src="' + LTstart.Images('new') + '">' : '',
          nLvl = obj.item_level ? '<img src="images/items/item_level.png"><span style="font-size: 11px;color:#ffffff;text-shadow:black -1px 0 1px,black 0 1px 1px,black 1px 0 1px,black 0 -1px 1px;">' + obj.item_level + '</span>' : '',
          options = {
            show_alreadyown: true
          };
          if (LT.lvlToggle)
            options.character = {
              level: LT.lvlToggle
            };
          var nPopup = 'data-setkey="' + id + '"',
          click = 'onclick="LT.GUI.itemsInInv(\'' + id + '\')"',
          img = '';
          if (isItem) {
            var itemId = id + '00' + obj.item_level,
            item = ItemManager.get(itemId);
            nPopup = 'data-itemid="' + itemId + '" title="' + (new ItemPopup(item, options).getXHTML().escapeHTML()) + '"';
            img = '<img src="' + item.image + '" width="25">';
          } else if (LT.GUI.window.currentActiveTabId == 'SetBonus')
            nPopup += 'title="' + LTlang.showItems + '" style="color:#FFE7B1;"';
          else
            click = 'onclick="LT.GUI.open(\'openSetsWindow\',\'' + id + '\',\'SetBonus\')"';
          if (nolink)
            click = '';
          return '<b><span class="linklike" ' + nPopup + click + '>' + nNew + img + nLvl + obj.name + '</span></b>';
        },
        newState: '',
        html: {},
        openSetsWindow: function (st, tab) {
          LT.GUI.getDefault(tab);
          LT.GUI.window.setTitle(tab);
          var newSet = false;
          if (typeof st === 'string') {
            newSet = true;
            LT['curr' + tab] = st;
          }
          var scrollpane = new west.gui.Scrollpane('LTSetsWindow');
          $(scrollpane.getMainDiv()).css({
            'margin-left': '120px',
            'margin-top': '10px',
            'width': '578px'
          });
          var lvlUp = function (level, value) {
            var ret = !level ? 0 : value < 1 ? Math.round(Math.max(1, value * 1000 * level)) / 10000 : Math.round(Math.max(1, value * 0.1 * level));
            return value + ret;
          },
          charLvl = Character.level,
          getBonImg = function (n, w) {
            var son = LT.searchObj[n] || JobList.getJobById(n.slice(3));
            return '<img src="images/' + (son[1] || 'jobs/' + son.shortname) + '.png" width="' + w + '" title="' + (son[0] || son.name) + '">';
          },
          types = {},
          perL = set1.instance_set_1.bonus[2][0].desc.match(/\(.*?\)/)[0],
          compare = function (sets, id) {
            for (var i in sets) {
              var si = sets[i];
              for (var k in si.bonus)
                for (var ID of si.bonus[k]) {
                  var ib = ID.bonus || ID;
                  var NAM = (ib.name || ib.type) + (ib.job || ib.isSector || '');
                  if (id[NAM]) {
                    if (!types[i]) {
                      types[i] = {
                        desc: (LT.SPEC.includes(NAM) ? '% ' : ' ') + (ID.key && !LT.lvlToggle ? perL : ''),
                        value: {},
                        values: {},
                        compVal: {
                          sum: 0
                        },
                        slots: si.slots,
                        name: si.name,
                        item_level: si.item_level,
                        items: si.items,
                      };
                    }
                    if (!types[i].value[NAM])
                      types[i].value[NAM] = 0;
                    types[i].value[NAM] += ib.value;
                    var NUM = types[i].value[NAM] * (LT.SPEC.includes(NAM) && types[i].slots != 'buff' ? 100 : 1);
                    var VAL = LT.lvlToggle && ID.key ? Math.ceil(NUM * LT.lvlToggle) : NUM;
                    var lvl = ib.leveled ? 0 : si.item_level;
                    var LVL = lvlUp(lvl, VAL) * id[NAM];
                    if (!types[i].values[k])
                      types[i].values[k] = $.extend({
                          sum: 0
                        }, types[i].values[k - 1]);
                    types[i].values[k][NAM] = Math.round(LVL * 1000) / 1000;
                    types[i].compVal[NAM] = !LT.lvlToggle && ID.key ? lvlUp(lvl, Math.ceil(NUM * Character.level)) * id[NAM] : LVL;
                    types[i].parts = k;
                  }
                }
              if (types[i]) {
                for (var cv in types[i].compVal) {
                  types[i].compVal.sum += types[i].compVal[cv];
                  for (var nv in types[i].values)
                    types[i].values[nv].sum += types[i].values[nv][cv] || 0;
                }
                if (si.items) {
                  for (var is of si.items)
                    if (ItemManager.getByBaseId(is).sub_type != id.subWeapon)
                      types[i].compVal.sum += types[is] ? types[is].compVal.sum : 0;
                }
              }
            }
          },
          reloadLvl = 0,
          showbonus = {
            'SetBonus': function (id) {
              LT.currSetBonus = id;
              scrollpane.contentPane.empty();
              var types = {},
              sets = LT.currList[id];
              if (!sets)
                return;
              LT.GUI.window.setTitle(LT.GUI.getSetOrItem(id, sets));
              var spCont = '<span style="width:60%;position:absolute;">';
              for (var k in sets.bonus) {
                spCont += '<b>' + k + ' ' + LTlang.items + ':</b><br>';
                for (var ID of sets.bonus[k]) {
                  var ib = ID.bonus || ID;
                  var NAM = (ib.name || ib.type) + (ib.job || ib.isSector || '');
                  if (!types[NAM]) {
                    var DESC = ID.desc && (LT.lvlToggle && ID.key && ID.desc.replace(/[0-9]|\+|\.|\([^)]+\)$/g, '') || ID.desc.replace(/[0-9]|\+|\./g, '')) || CharacterSkills.keyNames[NAM];
                    types[NAM] = {
                      key: (ID.key || 0),
                      desc: DESC,
                      value: 0
                    };
                  }
                  types[NAM].value += ib.value;
                }
                for (var m in types) {
                  var n = types[m];
                  var NUM = n.value * (LT.SPEC.includes(m) ? 100 : 1);
                  var VAL = LT.lvlToggle && n.key ? Math.ceil(NUM * LT.lvlToggle) : Math.round(NUM * 100) / 100;
                  spCont += getBonImg(m, 23) + ' + ' + VAL + ' ' + n.desc + '<br>';
                }
              }
              spCont += '</span><span style="width:40%;left:60%;position:absolute;">';
              for (var o of LT.currList[id].items)
                spCont += LT.GUI.getSetOrItem(o, LT['itemList' + LT.currState][o]) + '<br>';
              scrollpane.appendContent(spCont);
              setTimeout(function () {
                var cont = $('div.LTSetsWindow div.tw2gui_scrollpane_clipper_contentpane > span');
                cont.parent().height(cont.height() + 10);
              }, 100);
            },
            'BonusSearch': function (idString) {
              var id = JSON.parse(idString);
              if (Object.keys(id).length > 2 && !LT.lvlToggle) {
                if (!LT.currBonusSearch) {
                  LT.currBonusSearch = idString;
                  reloadLvl = 1;
                }
                return lvlBox.select(charLvl);
              }
              scrollpane.contentPane.empty();
              types = {};
              var title = '';
              for (var oi in LT.searchObj)
                if (id[oi])
                  title += getBonImg(oi, 35) + ' ';
              LT.GUI.window.setTitle(title);
              var ns = '' + LT.lvlToggle + LT.onlyOwnSets;
              if (idString != LT.currBonusSearch || ns != LT.GUI.newState || reloadLvl) {
                LT.currBonusSearch = idString;
                LT.GUI.newState = ns;
                reloadLvl = 0;
                compare(LT['itemList' + LT.currState], id);
                compare(LT.currList, id);
                var types2 = Object.keys(types).sort(function (a, b) {
                    return types[b].compVal.sum / types[b].parts - types[a].compVal.sum / types[a].parts;
                  }),
                ic = 0;
                LT.GUI.html = {
                  body: '',
                  right_arm: '',
                  animal: '',
                  rest: '',
                  item: '',
                  buff: '',
                };
                for (var type of types2) {
                  var n = types[type],
                  nsi = n.slots == 'item';
                  if (nsi && ic++ > 200)
                    continue;
                  var setval = 0;
                  LT.GUI.html[n.slots] += '<br>' + LT.GUI.getSetOrItem(type, n) + '<br>';
                  for (var o in n.values) {
                    if (o == 'sum')
                      continue;
                    var pre = (nsi ? '' : o + ' ' + LTlang.parts + ':');
                    LT.GUI.html[n.slots] += pre + ' +' + n.values[o].sum + n.desc + '<br>';
                    setval = n.values[o].sum;
                  }
                  if (n.items) {
                    var ibs = 0;
                    for (var ib of n.items)
                      if (ItemManager.getByBaseId(ib).sub_type != id.subWeapon)
                        ibs += types[ib] ? types[ib].values[1].sum : 0;
                    LT.GUI.html[n.slots] += '& ' + LTlang.items + ': +' + (ibs + setval) + '<br>';
                  }
                }
              }
              scrollpane.appendContent('<span class="LTBonusS body" style="width:16%;position:absolute;"><h4>' + LTlang.body + '</h4></span><span class="LTBonusS right_arm" style="width:16%;left:17%;position:absolute;"><h4>' + LTlang.right_arm + '</h4></span><span class="LTBonusS animal" style="width:16%;left:34%;position:absolute;"><h4>' + LTlang.animal + '</h4></span><span class="LTBonusS rest" style="width:16%;left:51%;position:absolute;"><h4>' + LTlang.rest + '</h4></span><span class="LTBonusS item" style="width:16%;left:68%;position:absolute;"><h4>' + LTlang.items + '</h4></span><span class="LTBonusS buff" style="width:16%;right:0;position:absolute;"><h4>' + LTlang.buff + '</h4></span>');
              for (var hs in LT.GUI.html)
                $('.LTBonusS.' + hs).append(LT.GUI.html[hs]);
              setTimeout(function () {
                var maxHeight = 0;
                for (var h of $('div.LTSetsWindow span.LTBonusS'))
                  if (h.clientHeight > maxHeight)
                    maxHeight = h.clientHeight;
                $('div.LTSetsWindow div.tw2gui_scrollpane_clipper_contentpane').height(maxHeight + 10);
              }, 200);
            },
          },
          loadResult = function () {
            if (LT.setLength <= forbid.max || LT.onlyOwnSets || newSet) {
              if (LT['curr' + tab])
                showbonus[tab](LT['curr' + tab]);
              newSet = false;
            }
          },
          selbox,
          loadSelbox = function () {
            LT.currState = LT.onlyOwnSets ? 'Own' : 'All';
            LT.currList = LT['setList' + LT.currState];
            selbox = new west.gui.Selectbox().setWidth(250);
            LT.GUI.window.setTitle(tab);
            scrollpane.contentPane.empty();
            if (LT.setLength <= forbid.max || LT.onlyOwnSets) {
              if (tab == 'SetBonus') {
                selbox.addListener(showbonus.SetBonus);
                var sbaI = function (j) {
                  var sj = LT.currList[j];
                  selbox.addItem(j, '<img src=' + (forbid.unlock.includes(j) ? LTstart.Images('new') : ItemManager.getByBaseId(sj.items[0]).image) + ' height="20" width="20">' + '<div style="padding-right: 20px; text-overflow:ellipsis; white-space:nowrap; overflow:hidden;">' + sj.name + '</div>', sj.name);
                };
                if (LT.setAbc) {
                  for (var h of LT.list)
                    if (LT.currList[h.key])
                      sbaI(h.key);
                } else
                  for (var i in LT.currList)
                    sbaI(i);
              }
              scrollpane.appendContent('<h1>' + LTlang.choose + '!</h1>');
            } else
              scrollpane.appendContent('<p style="color: #a31919;">ERROR: There are new sets added to the game.<br>Please <a href="javascript:LT.GUI.open(\'openKontakt\');" title="Open contact tab">contact me</a> so I can add the sets to the script.</p>');
          },
          img = {
            SetBonus: 'dayofthedead_2014_hat3',
            BonusSearch: 'st_patrick_head',
            shot: 'goldensable',
            hand: 'golden_gun',
          },
          buttonLogic = function (ev, d, b) {
            var butObj = b || ev.data.obj,
            id = butObj.id,
            val = 1;
            if ($(ev.currentTarget).hasClass('butPlus') || d > 0) {
              if (butObj.current_value + 1 > butObj.max_value)
                return false;
            } else {
              if (butObj.current_value - 1 < butObj.min_value)
                return false;
              val = -1;
            }
            butObj.current_value += val;
            if (CharacterSkills.skills[id]) {
              var attr = CharacterSkills.skills[id].attr_key;
              if (!LT.chooseBonus[attr])
                LT.chooseBonus[attr] = 0;
              LT.chooseBonus[attr] += val;
              $('.chooseBonus #' + attr + ' span.displayValue').text(LT.chooseBonus[attr]);
              if (LT.chooseBonus[attr] === 0)
                delete LT.chooseBonus[attr];
            }
            if (butObj.current_value === 0)
              delete LT.chooseBonus[id];
            else
              LT.chooseBonus[id] = butObj.current_value;
            $('.chooseBonus #' + id + ' span.displayValue').text(butObj.current_value);
            return true;
          },
          cont,
          getCB = function (id) {
            if (LT.searchObj[id][2])
              cont.append(LT.searchObj[id][2]);
            var div = $('<div class="chooseBonus" style="display:inline-block;">' + getBonImg(id, 45)).appendTo(cont);
            new west.gui.Plusminusfield(id, LT.chooseBonus[id] || 0, -100, 100, 0, buttonLogic, buttonLogic, buttonLogic).setWidth(45).appendTo(div);
          },
          chooseWindow = function () {
            cont = $('<span>').append('<div style="width:92px;display:inline-block;vertical-align:top;background-color:#A47F5B;border-radius:5px;">' +
                '<img id="switchWeapon" style="cursor:pointer;" src="https://wiki.the-west.de/images/1/1a/Switch_weapons_icon.png" title="' + LTlang.switchWeapon + '" width="45">' +
                '<img id="subWeapon" src="images/items/right_arm/' + img[LT.chooseBonus.subWeapon] + '.png" width="45"></div>');
            for (var so in LT.searchObj) {
              getCB(so);
            }
            new west.gui.Dialog(LTlang.selectBonus, cont).setBlockGame(false).setDraggable(true).addButton('ok', function () {
              if (Object.keys(LT.chooseBonus).length > 1)
                showbonus.BonusSearch(JSON.stringify(LT.chooseBonus));
              else {
                LT.currBonusSearch = '';
                loadSelbox();
              }
            }).addButton(LTlang.resetB, function () {
              LT.chooseBonus = {
                subWeapon: 'hand'
              };
              chooseWindow();
            }).addButton('cancel').show();
            $('#switchWeapon').click(function () {
              LT.chooseBonus.subWeapon = LT.chooseBonus.subWeapon == 'shot' ? 'hand' : 'shot';
              $("#subWeapon").attr('src', 'images/items/right_arm/' + img[LT.chooseBonus.subWeapon] + '.png');
            });
            $('div.chooseBonus .tw2gui_plusminus').width('auto');
            $('div.chooseBonus').css('margin-left', '2px');
          };
          setbutton = $('<span title="' + LTlang.choose + '" style="background-image:url(images/items/head/' + img[tab] + '.png); cursor:pointer;  position:absolute; height:73px; width:73px; margin:4px;" />');
          setbutton.click(function () {
            if (tab == 'SetBonus') {
              var pos = $(setbutton).offset();
              selbox.setPosition(pos.left + 35, pos.top + 50);
              selbox.show();
            } else if (tab == 'BonusSearch' && (LT.setLength <= forbid.max || LT.onlyOwnSets))
              chooseWindow();
          });
          var content = $('<div>');
          content.css({
            'margin-top': '90px',
            'width': '110px',
            'position': 'absolute',
          });
          $(LT.GUI.window.getContentPane()).append(setbutton, content, scrollpane.getMainDiv());
          var maxLvl = 150,
          setsSort = tab == 'SetBonus' ? new west.gui.Checkbox('ABC', null, function (state) {
              LT.setAbc = state;
              loadSelbox();
            }).setSelected(LT.setAbc, true).getMainDiv() : '',
          lvlBox = new west.gui.Combobox().setWidth(77).addItem(0, '0').addItem(charLvl, '' + charLvl),
          onlyOwn = new west.gui.Checkbox(LTlang.ownSets, null, function (state) {
              LT.onlyOwnSets = state;
              loadSelbox();
              loadResult();
            }).setSelected(LT.onlyOwnSets);
          if (charLvl != maxLvl)
            lvlBox.addItem(maxLvl, '' + maxLvl);
          lvlBox.select(LT.lvlToggle).addListener(function (lvl) {
            LT.lvlToggle = lvl;
            loadResult();
          });
          content.append(setsSort, '<br><br><b>' + LTlang.level + ':</b>', lvlBox.getMainDiv(), onlyOwn.getMainDiv());
          $('div.tw2gui_window.LT.active_tab_id_BonusSearch').width(1060);
          $('div.tw2gui_window.LT.active_tab_id_BonusSearch div.tw2gui_scrollpane.LTSetsWindow').width(900);
        },
        openFrame: function (iframe, size) {
          LT.GUI.window.setResizeable(true).addClass('nocloseall').clearContentPane().activateTab('LTFrame');
          LT.GUI.window.dontCloseAll = true;
          if (Array.isArray(size))
            LT.GUI.window.setSize(size[0], size[1]);
          var wnd = LT.GUI.window.getMainDiv();
          $('.tw2gui_window_inset', wnd).css('background-image', 'url(' + LTstart.Images('LT_backGr', 1) + ')');
          $('.textart_title', wnd).css('display', 'none');
          var contPan = $(LT.GUI.window.getContentPane());
          contPan.css('margin-top', '-30px');
          new west.gui.Button('QuakeNet Webchat').appendTo(contPan).click(function () {
            var iframe = 'https://webchat.quakenet.org';
            LT.GUI.openFrame(iframe);
          });
          new west.gui.Button('Wiki The-West').appendTo(contPan).click(function () {
            var iframe = Game.helpURL.replace('http:', 'https:');
            LT.GUI.openFrame(iframe);
          });
          new west.gui.Button('TW-DB.info').appendTo(contPan).click(function () {
            var iframe = 'https://tw-db.info';
            LT.GUI.openFrame(iframe);
          });
          if (typeof iframe === 'string')
            contPan.append($('<iframe src="' + iframe + '" style="width:100%; height:94%; border:0; margin-bottom:1px; ">'));
        },
        openSender: function () {
          LT.GUI.getDefault('LTSender');
          var EvImg = EvName == 'Octoberfest' ? 'window/events/octoberfest/pretzels_icon' : 'interface/friendsbar/events/' + EvName;
          LT.GUI.window.setTitle(sendGift.label + '    <img src="images/' + EvImg + '.png">');
          if (!isDefined(WestUi.FriendsBar.friendsBarUi)) {
            WestUi.FriendsBar.toggle();
          }
          setTimeout((function () {
              var e = [],
              t = Chat.Friendslist.getFriends(),
              r = WestUi.FriendsBar.friendsBarUi.friendsBar.eventActivations,
              i,
              s,
              u,
              a;
              for (s = 0; s < t.length; s++) {
                i = typeof r[t[s].playerId] !== 'undefined' && r[t[s].playerId][EvName] !== 'undefined' ? r[t[s].playerId][EvName] : 0;
                e.push({
                  n: t[s].pname,
                  i: t[s].playerId,
                  t: i
                });
              }
              e.sort(Sort.create('asc', function (e) {
                  return e.t;
                }));
              i = $('<table align="center" border="1" cellpadding="2px" border="1">');
              for (s = 0; s < e.length; s++) {
                u = e[s].t + parseInt(sendGift.cooldown, 10) - new ServerDate().getTime() / 1000;
                if (u > 0) {
                  a = $('<td>(' + u.formatDurationBuffWay() + ')</td>');
                } else {
                  a = $('<td><a href="#">' + sendGift.label + '</a></td>').click(e[s].i, function (e) {
                      $(this).parent().remove();
                      Ajax.remoteCall('friendsbar', 'event', {
                        player_id: e.handleObj.data,
                        event: EvName
                      }, function (t) {
                        if (t.error)
                          return MessageError(t.msg).show();
                        MessageSuccess(t.msg).show();
                        var n = e.handleObj.data;
                        r[n] = r[n] || {};
                        r[n][EvName] = t.activationTime;
                      });
                    });
                }
                i.append($('<tr>)').append($('<td>' + e[s].n + '</td>'), a));
              }
              var scrollpane = new west.gui.Scrollpane();
              $(scrollpane.getMainDiv()).css({
                'margin-top': '10px',
                'width': '340px',
                'position': 'absolute',
              });
              scrollpane.appendContent(i);
              if (t.length === 0)
                scrollpane.appendContent('<h2 style="text-align: center; color: #a31919; margin-top: 50px;">' + LTlang.noFriends + '</h2>');
              var scrollP = new west.gui.Scrollpane();
              $(scrollP.getMainDiv()).css({
                'margin-top': '10px',
                'margin-left': '345px',
                'width': '353px', //698-345
              });
              if (EvName == 'Hearts' || EvName == 'DayOfDead') {
                var name = '',
                weMmd = west.events.Manager.model._data.events;
                if (EvName == 'Hearts')
                  name = weMmd.valentine.model._data.name;
                else
                  name = weMmd.DayOfDead.model._l10n.ui.mouseover + ' ' + new Date().getFullYear();
                scrollP.appendContent('<h3>' + name + '</h3>');
                //west.events.Manager.getRunningEvents()
                var rew = Game.sesData[EvName].rewards;
                for (var r in rew) {
                  var div = $('<div />');
                  div.append('<img src="images/' + EvImg + '.png">  <b>' + r + '</b><br>' + rew[r].desc + '<br>');
                  var id = rew[r].id;
                  if (isNaN(id)) {
                    div.append('<i>' + LTlang.reward + ': ' + id + '</i><br><br>');
                  } else {
                    var invItem = new tw2widget.JobItem(ItemManager.get(id));
                    div.append(invItem.getMainDiv()).append('<br><br><br><br><br>');
                  }
                  scrollP.appendContent(div);
                }
              }
              $(LT.GUI.window.getContentPane()).append(scrollpane.getMainDiv()).append(scrollP.getMainDiv());
            }), 500);
        },
      };
      LT.RecipeMarket = {
        init: function () {
          var inject = function (category, data) {
            $('.LTFind').remove();
            var gLS4P = Game.InfoHandler.getLocalString4ProfessionId;
            var buttons_recipe = $('<div class="LTFind"><a href=\'javascript:LT.RecipeMarket.filterRecipe(0);\'><img title="' + LTlang.allprofessions + '" alt="allprofessions" src="' + LTstart.Images('LT_recipes') + '" /></a><a href=\'javascript:LT.RecipeMarket.filterRecipe(1);\'><img title="' + gLS4P(1) + '" alt="fieldcook" style="width: 30px;" src="images/items/recipe/recipe_cook.png" /></a><a href=\'javascript:LT.RecipeMarket.filterRecipe(2);\'><img title="' + gLS4P(2) + '" alt="tonicpeddler" style="width: 30px;" src="images/items/recipe/recipe_quack.png" /></a><a href=\'javascript:LT.RecipeMarket.filterRecipe(3);\'><img title="' + gLS4P(3) + '" alt="blacksmith" style="width: 30px;" src="images/items/recipe/recipe_smith.png" /></a><a href=\'javascript:LT.RecipeMarket.filterRecipe(4);\'><img title="' + gLS4P(4) + '" alt="mastersaddler" style="width: 30px;" src="images/items/recipe/recipe_sattle.png" /></a></div>');
            if (category == 'recipe') {
              $('.searchbox').before(buttons_recipe);
              $('.searchbox').css('margin-bottom', '0');
              var items = [];
              for (var i = 0; i < data.length; i++)
                items[i] = ItemManager.get(data[i]);
              items.sort(function (a, b) {
                return a.min_level - b.min_level;
              });
              LT.RecipeMarket.Recipe = items;
              for (var h = 0; h < items.length; h++)
                data[h] = items[h].item_id;
              return data;
            }
            $('.searchbox').css('margin-bottom', '18px');
            return data;
          };
          MarketWindow.Buy.twlt_updateCategory = MarketWindow.Buy.updateCategory;
          MarketWindow.Buy.updateCategory = function (category, data) {
            data = inject(category, data);
            MarketWindow.Buy.twlt_updateCategory.call(this, category, data);
          };
          MarketWindow.getClearName = function (obj) {
            if (obj.type == 'recipe') {
              var name = ItemManager.get(obj.craftitem).name;
              return isDefined(name) ? name : obj.name;
            }
            return obj.name;
          };
        },
        filterRecipe: function (profession_id) {
          var data = $('#mpb_recipe_content p');
          data.show();
          if (profession_id === 0)
            return;
          for (var i = 0; i < LT.RecipeMarket.Recipe.length; i++)
            if (profession_id != LT.RecipeMarket.Recipe[i].profession_id)
              $(data[i]).hide();
        }
      };
      LT.AchievHide = {
        init: function () {
          var hideUnErfolge = function () {
            $('.playerachievement-' + Character.playerId + ' .achievement').hide();
            $('.playerachievement-' + Character.playerId + ' .achievement .achievement_unachieved').parent().show();
          };
          AchievementExplorer.prototype.twlt_updateContent = AchievementExplorer.prototype.updateContent;
          AchievementExplorer.prototype.updateContent = function (data) {
            var tmp = AchievementExplorer.prototype.twlt_updateContent.call(this, data);
            if (data.folder.id != 'overall' && data.folder.id != 'heroics')
              hideUnErfolge();
            return tmp;
          };
        }
      };
      LT.MarketMessage = {
        Towns: {},
        init: function () {
          Ajax.get('map', 'get_minimap', {}, function (json) {
            if (json.error)
              return new UserMessage(json.msg).show();
            LT.MarketMessage.Towns = json.towns;
            EventHandler.listen('position_change', function () {
              LT.MarketMessage.check();
            });
            var setVal2 = setInterval(function () {
                if (Character.position.x) {
                  clearInterval(setVal2);
                  LT.MarketMessage.check();
                }
              }, 1000);
          });
        },
        check: function () {
          var town_id,
          offers,
          bids,
          fetch = function (action) {
            Ajax.remoteCall('building_market', action, {}, function (resp) {
              if (resp.error)
                return new UserMessage(resp.msg).show();
              Character.setDeposit(resp.deposit);
              Character.setMoney(resp.cash);
              return new MessageSuccess(resp.msg).show();
            });
          };
          var fetchAll = function (what) {
            if (what == 1)
              fetch('fetch_town_offers');
            fetch('fetch_town_bids');
            EventHandler.signal('inventory_changed');
          };
          var showDialog = function () {
            new west.gui.Dialog(LTlang.market1, LTlang.market2, west.gui.Dialog.SYS_QUESTION).addButton(LTlang.all, function () {
              fetchAll(1);
            }).addButton(LTlang.onlyBids, function () {
              fetchAll(0);
            }).addButton(LTlang.nothing).show();
          };
          var checkItems = function () {
            for (var g = 0; g < bids.length; g++) {
              var bgs = bids[g];
              if (bgs.market_town_id == town_id && (bgs.auction_ends_in < 0 || bgs.current_bid == bgs.max_price)) {
                showDialog();
                return;
              }
            }
            for (var f = 0; f < offers.length; f++) {
              var ofs = offers[f];
              if (ofs.market_town_id == town_id && (ofs.auction_ends_in < 0 || ofs.current_bid == ofs.max_price)) {
                showDialog();
                return;
              }
            }
          };
          var get_offers = function () {
            Ajax.remoteCall('building_market', 'fetch_offers', {
              page: 0
            }, function (json) {
              offers = json.msg.search_result;
              checkItems();
            });
          };
          var get_bids = function () {
            Ajax.remoteCall('building_market', 'fetch_bids', {}, function (json) {
              bids = json.msg.search_result;
              get_offers();
            });
          };
          var towns = LT.MarketMessage.Towns;
          for (var k in towns)
            if (towns[k].x == Character.position.x && towns[k].y == Character.position.y) {
              town_id = towns[k].town_id;
              var wait = Character.health < 6 ? Character.playerId.toString().substr(-4) : 1;
              setTimeout(function () {
                get_bids();
              }, wait);
            }
        }
      };
      LT.MarketTown = {
        init: function () {
          if (!LT.Skript.getFeature('MarketMessage'))
            Ajax.get('map', 'get_minimap', {}, function (json) {
              if (json.error)
                return new UserMessage(json.msg).show();
              LT.MarketMessage.Towns = json.towns;
            });
          MarketWindow.twlt_showTab = MarketWindow.showTab;
          MarketWindow.showTab = function () {
            MarketWindow.twlt_showTab.apply(this, arguments);
            if (MarketWindow.townId > -1)
              MarketWindow.window.setTitle(MarketWindow.window.titler.text + " - " + LT.MarketMessage.Towns[MarketWindow.townId].name);
          };
        }
      };
      LT.MarkDaily = {
        init: function () {
          var addBorder = function () {
            var rows = $('.reward-row');
            var row = $(rows[4]);
            if (row.hasClass('today'))
              row.css('border', '20px solid red');
          };
          west.player.LoginBonus.prototype.twlt_show = west.player.LoginBonus.prototype.show;
          west.player.LoginBonus.prototype.show = function () {
            var tmp = west.player.LoginBonus.prototype.twlt_show.call(this);
            if (tmp !== undefined)
              return tmp;
            addBorder();
          };
        }
      };
      LT.DuellMap = {
        init: function () {
          var generateNpcPopup = function (data) {
            var weapon = ItemManager.get(data.weaponId),
            damage = weapon.getDamage(data),
            npcData = data.bonus;
            return '<table class="dln_npcskill_popup"><tr><td colspan="5" class="text_bold">' + LTlang.popup + '<br>&nbsp;</td></tr><tr><td><img src="/images/window/duels/npcskill_shot.jpg" /></td><td><img src="/images/window/duels/npcskill_punch.jpg" /></td><td><img src="/images/window/duels/npcskill_aim.jpg" /></td><td><img src="/images/window/duels/npcskill_appearance.jpg" /></td><td></td></tr><tr><td class="text_bold">' + (npcData.shot || 0) + '</td><td class="text_bold">' + (npcData.punch || 0) + '</td>' + '<td class="text_bold">' + (npcData.aim || 0) + '</td><td class="text_bold">' + (npcData.appearance || 0) + '</td><td></td></tr>' + '<tr><td><img src="/images/window/duels/npcskill_tactic.jpg" /></td><td><img src="/images/window/duels/npcskill_reflex.jpg" /></td><td><img src="/images/window/duels/npcskill_dodge.jpg" /></td><td><img src="/images/window/duels/npcskill_tough.jpg" /></td><td><img src="/images/window/duels/npcskill_health.jpg" /></td></tr><tr><td class="text_bold">' + (npcData.tactic || 0) + '</td><td class="text_bold">' + (npcData.reflex || 0) + '</td><td class="text_bold">' + (npcData.dodge || 0) + '</td><td class="text_bold">' + (npcData.tough || 0) + '</td><td class="text_bold">' + (npcData.health || 0) + '</td></tr><tr><td colspan="2" class="text_bold"><img src="' + weapon.image + '" /></td><td colspan="3" class="text_bold"><br>' + weapon.name + '<br>(' + LTlang.damage + ': ' + damage.min + ' - ' + damage.max + ')</td></tr></table>';
          };
          Ajax.remoteCallMode('character', 'get_info', {}, function (resp) {
            Character.setDuelLevel(resp.duelLevel);
          });
          var progB = new west.gui.Progressbar(0, 100);
          progB.setTextOnly(true);
          $(progB.getMainDiv()).css('width', '772px');
          var fillPage = function () {
            $('#LTDuellMapTable').empty();
            $('#LTDuellMapPlayers').empty();
            $('#LTDuellMapTable').append('<tr><th>' + LTlang.name + '</th><th>' + LTlang.town + '</th><th>' + LTlang.level + '</th><th>' + LTlang.duelLevel + '</th><th>' + LTlang.exp + '</th><th>' + LTlang.distance + '</th><th>' + LTlang.startduel + '</th><th>' + LTlang.centerMap + '</th></tr>');
            for (var k in LT.DuellMap.Player) {
              var data = LT.DuellMap.Player[k];
              var content = $('<tr></tr>');
              content.append('<td><a href="javascript:void(PlayerProfileWindow.open(' + data.player_id + '));" title="' + (Character.charClass == 'duelist' ? generateNpcPopup(data).escapeHTML() : '') + '">' + data.player_name + '</a></td>',
                '<td><a href="javascript:void(TownWindow.open(' + data.town_x + ',' + data.town_y + '));">' + data.town_name + '</a></td>',
                '<td>' + data.level + '</td>',
                '<td>' + data.duellevel + '</td>',
                '<td>' + Math.round((7 * data.duellevel - 5 * Character.duelLevel + 5) * Character.duelMotivation * 3) + '</td>',
                '<td>' + window.Map.calcWayTime(Map.getLastQueuePosition(), {
                  x: data.character_x,
                  y: data.character_y
                }).formatDuration() + '</td>',
                '<td><a href="#" onclick="SaloonWindow.startDuel(' + data.player_id + ', ' + data.alliance_id + ', false, DuelsWindow);">' + LTlang.startduel + '</a></td>',
                '<td><a href="#" onclick="Map.center(' + data.character_x + ', ' + data.character_y + ');">' + LTlang.centerMap + '</a></td>');
              $('#LTDuellMapTable').append(content);
              content = $('<div style="position:absolute;border:1px solid black;background:#FF0000;width:4px;height:4px;left:' + (data.character_x / 46592 * 770 - 2) + 'px;top:' + (data.character_y / 20480 * 338 - 2) + 'px;" />');
              eval('content.click(function () { SaloonWindow.startDuel(' + data.player_id + ', ' + data.alliance_id + ', false, DuelsWindow); });');
              content.addMousePopup('<b>' + data.player_name + '</b> ' + window.Map.calcWayTime(Map.getLastQueuePosition(), {
                  x: data.character_x,
                  y: data.character_y
                }).formatDuration());
              $('#LTDuellMapPlayers').append(content);
            }
            $('<div style="position:absolute;border:1px solid black;background:#00CCFF;width:4px;height:4px;left:' + (Character.position.x / 46592 * 770 - 2) + 'px;top:' + (Character.position.y / 20480 * 338 - 2) + 'px;" />').addMousePopup('Deine Position').appendTo('#LTDuellMapPlayers');
          };
          var getPlayer = function (i, distance) {
            if (i == -1) {
              progB.setValue(0);
              LT.DuellMap.Player = {};
              i++;
            }
            Ajax.remoteCall('duel', 'search_op', {
              next: true,
              order_by: 'ASC',
              sort: 'range',
              page: i,
              distance: distance * 60
            }, function (json) {
              var l = json.oplist.pclist.length;
              for (var j = 0; j < l; j++) {
                var plyr = json.oplist.pclist[j].player_name;
                if (!LT.DuellMap.Player[plyr]) {
                  LT.DuellMap.Player[plyr] = json.oplist.pclist[j];
                  progB.increase(1);
                }
              }
              if (json.oplist.next && i < 40) {
                getPlayer(++i, distance);
                return;
              }
              LT.DuellMap.progBVal = progB.getValue();
              fillPage();
            });
          };
          var showTab = function (win, id) {
            DuelsWindow.window.setSize(840, 655).addClass('premium-buy');
            DuelsWindow.window.activateTab(id).$('div.tw2gui_window_content_pane > *').each(function (i, e) {
              if ($(e).hasClass('duels-' + id)) {
                $(e).children().fadeIn();
                $(e).show();
              } else {
                $(e).children().fadeOut();
                $(e).hide();
              }
            });
            DuelsWindow.window.setTitle(LTlang.duelmap);
            if (Object.keys(LT.DuellMap.Player).length === 0) {
              LT.DuellMap.progBVal = 0;
              getPlayer(-1, 15);
            } else
              progB.setValue(LT.DuellMap.progBVal);
          };
          var initDuellmap = function () {
            DuelsWindow.window.addTab(LTlang.duelmap, 'LTDuellmap', showTab);
            LT.DuellMap.Player = {};
            var area = $('<div class="duels-LTDuellmap" style="display:none;"></div>').appendTo(DuelsWindow.window.getContentPane()),
            content = $('<div style="height:350px;top:10px;position:relative"></div>'),
            left = 0,
            top = 0;
            for (var i = 1; i <= 15; i++) {
              var img = $('<img style="position:absolute;border:1px solid #000;width:110px;height:169px;left:' + left + 'px;top:' + top + 'px;" src="images/map/minimap/county_' + i + '.jpg" />');
              left += 110;
              if (i === 7) {
                left = 0;
                top = 169;
              }
              if (i === 4 || i === 11) {
                img.css('height', '114px');
              }
              if (i === 11) {
                img.css('top', top + 55 + 'px');
              }
              if (i === 15) {
                img.css({
                  height: '110px',
                  left: '330px',
                  top: '114px'
                });
              }
              content.append(img);
            }
            content.append('<div id="LTDuellMapPlayers"></div>');
            content.appendTo(area);
            area.append(progB.getMainDiv());
            var scrollpane = new west.gui.Scrollpane().appendTo(area);
            $(scrollpane.getMainDiv()).css('height', '185px');
            scrollpane.appendContent(LTlang.duelradius + '    ');
            var combobox = new west.gui.Combobox().setWidth(120).addItem('15', '15 ' + LTlang.minutes).addItem('30', '30 ' + LTlang.minutes).addItem('60', LTlang.hour).addItem('120', '2 ' + LTlang.hours).addItem('240', '4 ' + LTlang.hours).addItem('360', '6 ' + LTlang.hours).select('15').appendTo(scrollpane.getContentPane());
            new west.gui.Button(LTlang.searchOpp).appendTo(scrollpane.getContentPane()).click(function () {
              getPlayer(-1, combobox.getValue());
            });
            scrollpane.appendContent('<table border="1" id="LTDuellMapTable"></table>');
          };
          DuelsWindow.twlt_open = DuelsWindow.open;
          DuelsWindow.open = function () {
            var tmp = DuelsWindow.twlt_open.call(this);
            if (tmp !== undefined)
              return tmp;
            initDuellmap();
          };
          DuelsWindow.twlt_showTab = DuelsWindow.showTab;
          DuelsWindow.showTab = function (id) {
            var tmp = DuelsWindow.twlt_showTab.call(this, id);
            if (tmp !== undefined)
              return tmp;
            DuelsWindow.window.removeClass('premium-buy').setSize(748, 472);
          };
        }
      };
      LT.ChangeCity = {
        init: function () {
          var swap = function (that) {
            var rows = $('.' + that.window.id + ' .row .cell.cell_2.name,.' + that.window.id + ' .row .cell.cell_2.name_foreign');
            rows.empty();
            for (var i = 0; i <= that.data.length; i++) {
              var player = that.data[i];
              $(rows[i]).append('<span>&nbsp;' + (player.title !== undefined ? player.title : '') + '</span><a href="#" onClick="PlayerProfileWindow.open(' + player.player_id + ')">' + player.name + '</a>');
            }
          };
          CityhallWindow.Residents.twlt_fillContent = CityhallWindow.Residents.fillContent;
          CityhallWindow.Residents.fillContent = function () {
            var tmp = CityhallWindow.Residents.twlt_fillContent.call(this);
            if (tmp !== undefined)
              return tmp;
            swap(this);
          };
        }
      };
      LT.ShowAP = {
        init: function () {
          var addAP = function (that) {
            var job = that.job;
            var getJobFeaturedCls = function () {
              if (LinearQuestHandler.hasTutorialQuest())
                return '';
              if (job.is_gold)
                return 'gold';
              if (job.is_silver)
                return 'silver';
              return '';
            };
            var aps = that.currSkillpoints - that.job.workpoints;
            var jobicon = '<div class="job" title="' + job.get('description').escapeHTML().cutIt(150) + '"><div class="featured ' + getJobFeaturedCls() + '"></div>' + '<img src="images/jobs/' + job.get('shortname') + '.png" class="job_icon" /></div>';
            that.window.setTitle(jobicon + '&nbsp;&nbsp;' + job.get('name').escapeHTML() + ' (' + aps + ' AP)');
          };
          JobWindow.twlt_initView = JobWindow.initView;
          JobWindow.initView = function () {
            var tmp = JobWindow.twlt_initView.call(this);
            if (tmp !== undefined)
              return tmp;
            addAP(this);
          };
        }
      };
      LT.Statusbar = {
        init: function () {
          $('div#ui_windowbar').hide();
          $('div#ui_windowbar_state').hide();
        }
      };
      LT.Logout = {
        init: function () {
          var menu = $('<div class="menulink" onclick="LT.Logout.logout();" title="' + LTlang.logout + '" />').css('background-image', 'url(' + LTstart.Images('logout') + ')').css('background-position', '0px 0px').mouseenter(function () {
              $(this).css('background-position', '-25px 0px');
            }).mouseleave(function () {
              $(this).css('background-position', '0px 0px');
            });
          $('#LT-menu').after(menu);
        },
        logout: function () {
          location.href = 'game.php?window=logout&action=logout&h=' + Player.h;
        },
      };
      LT.MoveJobs = {
        init: function () {
          var st = $('.menulink.lscript')[0].title;
          $('div#ui_bottomright').css('right', '35px');
          $('div.ui_menucontainer').css('margin-bottom', '7px');
          $('div#ui_scripts').remove();
          EscapeWindow.twlt_open = EscapeWindow.twlt_open || EscapeWindow.open;
          EscapeWindow.open = function () {
            EscapeWindow.twlt_open.apply(this, arguments);
            wman.getById('escape').setSize(240, 326);
            $('div.tw2gui_win2.escape div.content div.tw2gui_button')[3].after(new west.gui.Button(st, function () {
                TheWestApi.open();
                wman.getById('escape').destroy();
              }).setMinWidth(175).getMainDiv());
          };
        }
      };
      LT.BlinkEvents = {
        init: function () {
          var setVal7 = setInterval(function () {
              if ($('.border.highlight').length) {
                clearInterval(setVal7);
                $('.border.highlight').remove();
                LT.addStyle('.border.highlight {display:none;}');
              }
            }, 3000);
        }
      };
      LT.FortTracker = {
        init: function () {
          LT.addStyle('.fort_battle_notification {display:none!important;}');
        }
      };
      LT.FriendsPop = {
        init: function () {
          west.notification.ToastOnlineNotification.prototype.show = function () {};
        }
      };
      LT.InstantQuest = {
        init: function () {
          var setVal1 = setInterval(function () {
              if (QuestEmployerView.showQuest) {
                clearInterval(setVal1);
                QuestEmployerView.twlt_showQuest = QuestEmployerView.showQuest;
                QuestEmployerView.showQuest = function (e) {
                  QuestEmployerView.twlt_showQuest(e);
                  if (e.accepted === false) {
                    var req = e.requirements,
                    solvCnt = 0;
                    for (var f = 0; f < req.length; f++)
                      if (req[f].solved === true)
                        solvCnt += 1;
                    if (req.length == solvCnt)
                      $('div.quest_button_area_' + e.id + '').empty().append(new west.gui.Button(LTlang.accNfin, function () {
                          QuestWindow.acceptQuest(e.id);
                          var siVal = setInterval(function () {
                              if (QuestLog.quests[e.id]) {
                                clearInterval(siVal);
                                QuestWindow.finishQuest(e.id);
                              }
                            }, 200);
                        }).getMainDiv());
                  }
                };
              }
            }, 2000);
        }
      };
      LT.QuestWiki = {
        init: function () {
          $.getScript('https://tomrobert.safe-ws.de/repGroups.js').done(function () {
            QuestLog.solvedGroups = {};
            Ajax.remoteCallMode('building_quest', 'get_solved_groups', {}, function (json) {
              for (var sg in json.solved)
                QuestLog.solvedGroups[sg] = json.solved[sg].title;
              QuestLog.twlt_addSolvedQuestGroup = QuestLog.addSolvedQuestGroup;
              QuestLog.addSolvedQuestGroup = function (groupId, questGroup) {
                QuestLog.twlt_addSolvedQuestGroup.apply(this, arguments);
                QuestLog.solvedGroups[groupId] = questGroup.title;
              };
              var lang = Game.locale.substr(0, 2),
              repText = {
                de: ' (Wiederholbare Feiertagsquestreihe)',
                hu: ' (Ismételhető)',
                it: ' (Ripetibile)',
                pt: ' repetível',
                ru: ' - Снова праздник',
              };
              Quest.twlt_render = Quest.render;
              Quest.render = function () {
                Quest.twlt_render.apply(this, arguments);
                var wiki = 'https://wiki.the' + Game.masterURL.match(/the(.*)/)[1] + '/wiki/',
                gid = LT.repGroups[this.id],
                qGroup = QuestLog.solvedGroups[gid] || lang == 'de' && isNaN(gid) && gid,
                groupName = [69, 34].includes(this.group) && qGroup ? qGroup + repText[lang] || '' : this.groupTitle,
                questName = encodeURIComponent((lang == 'pl' ? 'Zadania: ' : '') + groupName + '#' + (lang == 'de' ? this.id : this.soloTitle));
                this.el.find('.quest_description_container .strong').append('<a class="questWiki" style="float:right;" title="' + LTlang.onWiki + '" href="' + wiki + questName + '" target="_blank"><img src="' + LTstart.Images('wiki') + '"/></a>');
              };
            });
          });
        }
      };
      LT.CityTravel = {
        init: function () {
          var setVal3 = setInterval(function () {
              if (west.window.Blackboard.cities.show) {
                clearInterval(setVal3);
                var wwBc = west.window.Blackboard.cities;
                wwBc.twlt_show = wwBc.show;
                wwBc.show = function () {
                  for (var c = 0; c < this.cities_.length; c++)
                    this.cities_[c].member += '<br>' +
                    Map.calcWayTime(Map.getLastQueuePosition(), {
                      x: this.cities_[c].x,
                      y: this.cities_[c].y
                    }).formatDuration();
                  wwBc.twlt_show.apply(this, arguments);
                  $('.cities .city.inlineblock .popup-title').css('margin-top', '-10px');
                };
              }
            }, 2000);
        }
      };
      LT.BetterSheriff = {
        onlyAttackable: false,
        init: function () {
          var columns = [
            'name" style="width:100px;',
            'distance" style="width:70px;',
            'amount" style="width:70px;',
            'not_dead_amount" style="width:70px;',
            'duellevel" style="width:50px;',
            'status" style="width:192px;'
          ], //max 552px
          wanted = [
            'Gesucht', 'Wanted', 'Poszukiwany', 'Gezocht', 'Efterlyst', 'Căutat', 'Procurado', 'Hledán', 'Buscado', 'В розыске', 'Aranıyor', 'Körözött', 'Καταζητείται', 'Eftersøgt', 'Odmena za ulovenie', 'Recherché', 'Ricercato',
          ],
          sortByObj,
          myPos,
          lvl,
          players,
          loadedIDs,
          counter,
          maxCount,
          updateTable = function (data) {
            LT.BetterSheriff.table.clearBody();
            var tmpCells = {};
            for (var i = 0; i < data.length; i++) {
              var rd = data[i];
              if (LT.BetterSheriff.onlyAttackable && !rd.status.includes('.startDuel'))
                continue;
              tmpCells[columns[0]] = '<a title="' + SheriffWindow.createWantedTooltip(rd).escapeHTML() + '" href="javascript:void(PlayerProfileWindow.open(' + rd.player_id + '));"> ' + rd.name + '</a>';
              tmpCells[columns[1]] = rd.distance.formatDuration();
              tmpCells[columns[2]] = format_number(rd.amount);
              tmpCells[columns[3]] = format_number(rd.not_dead_amount);
              tmpCells[columns[4]] = rd.duellevel;
              tmpCells[columns[5]] = '<span title=\'' + rd.status + '\'>' + rd.status + '</span>';
              LT.BetterSheriff.table.buildRow('" style="padding-left:5px;', tmpCells);
            }
          },
          startSortDispatcher = function (ev) {
            var sortBy = ev && (ev.target.tagName == 'SPAN' && ev.target.parentElement.classList[2] || ev.target.classList[2]) || 'distance';
            if (sortByObj == sortBy)
              players.reverse();
            else {
              sortByObj = sortBy;
              switch (sortBy) {
              case 'name':
              case 'status':
                players.sort(function (a, b) {
                  return a[sortBy].toUpperCase().replace(/^Ä/, 'A').replace(/^Ö/, 'O').replace(/^Ü/, 'U').replace(/^É/, 'E').replace(/\(.*?\)/, '') > b[sortBy].toUpperCase().replace(/^Ä/, 'A').replace(/^Ö/, 'O').replace(/^Ü/, 'U').replace(/^É/, 'E').replace(/\(.*?\)/, '') ? 1 : -1;
                });
                break;
              case 'distance':
                players.sort(function (a, b) {
                  return a[sortBy] - b[sortBy];
                });
                break;
              default:
                players.sort(function (a, b) {
                  return b[sortBy] - a[sortBy];
                });
                break;
              }
            }
            updateTable(players);
          },
          setStatus = function (player, string) {
            if (player) {
              player.status = string;
              players.push(player);
            }
            counter++;
            LT.BetterSheriff.progB.increase(1);
            if (counter == maxCount) {
              startSortDispatcher();
              $('div.sheriff-LTSheriff .fancytable .row_head').css('cursor', 'pointer').click(startSortDispatcher);
              $('div.sheriff-LTSheriff', SheriffWindow.DOM).append(LT.BetterSheriff.checkB.getMainDiv());
            }
          },
          loadPlayer = function (arr) {
            if (loadedIDs[arr.player_id])
              setStatus(arr, SaloonWindow.playerStat(loadedIDs[arr.player_id]));
            else
              Ajax.remoteCallMode('profile', 'init', {
                playerId: arr.player_id
              }, function (resp) {
                if (resp.error)
                  return new UserMessage(resp.message).show();
                if (!wanted.includes(resp.status))
                  setStatus(arr, resp.status);
                else if (resp.town) {
                  if (resp.town.town_id == Character.homeTown.town_id)
                    setStatus(arr, LTlang.ownTown);
                  else
                    Ajax.remoteCallMode('building_saloon', 'get_data', {
                      town_id: resp.town.town_id
                    }, function (data) {
                      if (data.error)
                        return new UserMessage(data.msg).show();
                      for (var l = 0; l < data.players.length; l++)
                        loadedIDs[data.players[l].player_id] = data.players[l];
                      setStatus(arr, SaloonWindow.playerStat(loadedIDs[arr.player_id]));
                    });
                } else
                  Ajax.remoteCall('task', 'add', {
                    'tasks': {
                      '0': {
                        'player_id': arr.player_id,
                        'taskType': 'duel'
                      }
                    }
                  }, function (data) {
                    if (data.tasks[0].error)
                      setStatus(arr, data.tasks[0].msg);
                    else {
                      setStatus(arr, SaloonWindow.playerStat({
                          player_id: arr.player_id,
                          holiday_duel: true,
                        }));
                      Ajax.remoteCall('task', 'cancel', {
                        'tasks': {
                          '0': {
                            'queueId': data.tasks[0].task.queue_id,
                            'type': 'duel'
                          }
                        }
                      });
                    }
                  });
              });
          },
          initData = function (pg) {
            Ajax.remoteCall('building_sheriff', 'load_page', {
              page: pg,
            }, function (json) {
              if (json.error) {
                new UserMessage(json.msg).show();
                return null;
              }
              if (pg === 0) {
                maxCount = json.count * 10;
                LT.BetterSheriff.progB.setMaxValue(maxCount);
              }
              for (var j = 0; j < 10; j++) {
                if (json.result[j]) {
                  var res = json.result[j];
                  res.distance = Map.calcWayTime(myPos, {
                      x: res.x,
                      y: res.y
                    });
                  res.not_dead_amount = res.not_dead_amount || 0;
                  if (lvl.min > res.duellevel)
                    setStatus(res, LTlang.tooLow);
                  else if (lvl.max < res.duellevel)
                    setStatus(res, LTlang.tooHigh);
                  else
                    loadPlayer(res);
                } else {
                  setStatus();
                }
              }
              if (pg < json.count - 1)
                initData(++pg);
            });
          },
          tabclick = function (win, id) {
            if (!SheriffWindow.window)
              return;
            SheriffWindow.window.activateTab(id).setTitle('BetterSheriff').$('div.tw2gui_window_content_pane > *', SheriffWindow.DOM).each(function (i, e) {
              if ($(e).hasClass('sheriff-' + id)) {
                $(e).children().fadeIn();
                $(e).show();
              } else {
                $(e).children().fadeOut();
                $(e).hide();
              }
            });
            if (LT.loadedSheriff)
              return;
            LT.loadedSheriff = true;
            myPos = Map.getLastQueuePosition();
            lvl = {
              min: Math.ceil(Character.duelLevel / 1.4),
              max: Math.floor(Character.duelLevel * 1.4 - 0.01)
            };
            players = [];
            loadedIDs = {};
            counter = 0;
            sortByObj = '';
            initData(0);
          },
          initBetterSheriff = function () {
            LT.loadedSheriff = false;
            SheriffWindow.window.addTab('BetterSheriff', 'LTSheriff', tabclick).appendToContentPane($('<div class="sheriff-LTSheriff" style="display:none;width:590px;position:relative;left:50px;"/>'));
            LT.BetterSheriff.table = new west.gui.Table().removeFooter();
            for (var k = 0; k < columns.length; k++)
              LT.BetterSheriff.table.addColumn(columns[k]).appendToThCell('head', columns[k], LTlang.sortBy + ' ' + LTlang[columns[k].split('"')[0]], LTlang[columns[k].split('"')[0]]);
            LT.BetterSheriff.progB = new west.gui.Progressbar(0, null);
            $(LT.BetterSheriff.progB.getMainDiv()).css('width', '587px');
            LT.BetterSheriff.checkB = new west.gui.Checkbox().setLabel('<img src="/images/window/dailyactivity/tasks_icon.png">').setTooltip(LTlang.attackable).setCallback(function (state) {
                LT.BetterSheriff.onlyAttackable = state;
                updateTable(players);
              }).setSelected(LT.BetterSheriff.onlyAttackable, true);
            $(LT.BetterSheriff.checkB.getMainDiv()).css({
              'position': 'absolute',
              'top': '35px',
              'right': '-65px'
            });
            $('div.sheriff-LTSheriff', SheriffWindow.DOM).empty().append(LT.BetterSheriff.table.getMainDiv()).append(LT.BetterSheriff.progB.getMainDiv());
            $('div.sheriff-LTSheriff .fancytable .tw2gui_scrollpane').css('height', '293px');
            Ajax.remoteCallMode('building_saloon', 'get_data', {
              town_id: Character.homeTown.town_id
            }, function (data) {
              if (data.error)
                return new UserMessage(data.msg).show();
              SaloonWindow.self = data.self;
            });
          };
          SheriffWindow.twlt_open = SheriffWindow.open;
          SheriffWindow.open = function (townId, tabId, wanted) {
            SheriffWindow.twlt_open.call(this, townId, tabId, wanted);
            if (townId === Character.homeTown.town_id) {
              initBetterSheriff();
            }
          };
        }
      };
      LT.ChatProfessions = {
        init: function () {
          Chat.Formatter.twlt_formatContactClient = Chat.Formatter.formatContactClient;
          Chat.Formatter.formatContactClient = function (client, room) {
            var cClient = Chat.Formatter.twlt_formatContactClient.call(this, client, room);
            if (client.professionId > -1)
              $(cClient[0].lastChild).prepend($(Chat.Formatter.getProfessionImage(client.professionId)).css('background-color', '#D5C6A2')[0]);
            return cClient;
          };
        }
      };
      LT.QuestBookSearch = {
        init: function () {
          QuestWindowView.clearSearch = function () {
            $('.window-quest_solved .employer_description .questlog_entrie').show();
            $('.window-quest_solved .solved_container .tw2gui_scrollpane_clipper_contentpane').empty();
          };
          QuestWindowView.searchQuest = function (txt) {
            if (txt) {
              txt = txt.toLowerCase();
              var questGroup = new QuestGroup('searchResult', {});
              for (var q in QuestLog.solved_group) {
                var Qq = QuestLog.solved_group[q];
                if (Qq.title.toLowerCase().includes(txt))
                  $('#solved_questgroup_' + q).show();
                else
                  $('#solved_questgroup_' + q).hide();
                for (var r in Qq.quests)
                  if (Qq.quests.hasOwnProperty(r)) {
                    var Qr = Qq.quests[r],
                    idMatch = r == txt;
                    if (Qr.toLowerCase().includes(txt) || idMatch)
                      questGroup.el.append($('<div>').prop({
                          id: 'solved_questgroup_quest_' + r,
                          className: 'questlog_entrie finish'
                        }).append($('<a>').attr({
                            href: '#',
                            className: 'shorten',
                            onclick: s('QuestGroupWindow.open(%1, %2);', q, r)
                          }).text((idMatch ? '#ID ' : '') + Qr)));
                  }
              }
              QuestWindowView.showSolvedGroup(questGroup);
            } else
              QuestWindowView.clearSearch();
          };
          QuestWindowView.twlt_renderGroupSolved = QuestWindowView.renderGroupSolved;
          QuestWindowView.renderGroupSolved = function () {
            QuestWindowView.twlt_renderGroupSolved.apply(this, arguments);
            var textF = new west.gui.Textfield('questbook_search').addListener(QuestWindowView.searchQuest),
            iconB = new west.gui.Iconbutton(new west.gui.Icon('search'), function () {
                QuestWindowView.searchQuest(textF.getValue());
              }),
            icon = new west.gui.Icon('abort').getMainDiv().click(function () {
                textF.setValue('');
                QuestWindowView.clearSearch();
              });
            $('.window-quest_solved .employer_description .quest_splitter').after($('<div id=QuestBookSearch>').append(textF.getMainDiv(), iconB.getMainDiv(), icon));
          };
        }
      };
      LT.MarketRights = {
        init: function () {
          MarketWindow.sellRights = [{
              i: 'town_new',
              t: LTlang.town
            }, {
              i: 'friends',
              t: LTlang.alliance
            }, {
              i: 'welt',
              t: LTlang.worldwide
            }
          ];
          MarketWindow.Sell.twlt_updateTable = MarketWindow.Sell.updateTable;
          MarketWindow.Sell.updateTable = function () {
            MarketWindow.Sell.twlt_updateTable.apply(this, arguments);
            if (Character.homeTown.town_id)
              Ajax.remoteCall('building_market', 'search', {
                visibility: 0
              }, function (json) {
                for (var i = 0; i < json.msg.search_result.length; i++) {
                  var jsr = json.msg.search_result[i];
                  if (jsr.seller_name == Character.name)
                    $('.marketSellsData_' + jsr.market_offer_id + ' .mps_pickup').prepend('<img src="images/icons/' + MarketWindow.sellRights[jsr.sell_rights].i + '.png" title="' + MarketWindow.sellRights[jsr.sell_rights].t + '">');
                }
              });
          };
          MarketWindow.Buy.twlt_updateTable = MarketWindow.Buy.updateTable;
          MarketWindow.Buy.updateTable = function (data) {
            MarketWindow.Buy.twlt_updateTable.call(this, data);
            if (Character.homeTown.town_id)
              for (var i = 0; i < data.length; i++)
                $('#mpb_vendor_' + data[i].market_offer_id).before('<img src="images/icons/' + MarketWindow.sellRights[data[i].sell_rights].i + '.png" title="' + MarketWindow.sellRights[data[i].sell_rights].t + '">');
          };
        }
      };
      LT.EquipManagerPlus = {
        init: function () {
          var current = {};
          var changeSlot = function (slot) {
            var ws = Wear.slots;
            if (slot == ws.length) {
              $('#equip_manager_list').html(EquipManager.buildEquipList());
              new UserMessage(LTlang.saveMessage2, 'success').show();
            } else if (current[ws[slot]])
              Ajax.remoteCall('inventory', 'carry', {
                item_id: current[ws[slot]].obj.item_id,
                last_inv_id: Bag.getLastInvId()
              }, function () {
                changeSlot(++slot);
              });
            else
              Ajax.remoteCall('inventory', 'uncarry', {
                last_inv_id: Bag.getLastInvId(),
                type: ws[slot]
              }, function () {
                changeSlot(++slot);
              });
          };
          var rename = function (equipId, nr, name) {
            if (name.length < 3)
              return new UserMessage(LTlang.longerName).show();
            new UserMessage(LTlang.loading, 'hint').show();
            current = $.extend({}, Wear.wear);
            Ajax.remoteCall('inventory', 'switch_equip', {
              id: equipId,
              last_inv_id: Bag.getLastInvId()
            }, function () {
              Ajax.remoteCall('inventory', 'delete_equip', {
                id: equipId
              }, function () {
                EquipManager.list.splice(nr, 1);
                Ajax.remoteCall('inventory', 'save_equip', {
                  name: name
                }, function (data) {
                  if (data.error)
                    new UserMessage(data.msg).show();
                  else
                    EquipManager.list.unshift(data.data);
                  changeSlot(0);
                });
              });
            });
          };
          EquipManager.renameEquip = function (equipId, nr) {
            var cont = $('<span>');
            var textF = new west.gui.Textfield('equip_rename').maxlength(25).setValue(EquipManager.list[nr].name).getMainDiv();
            cont.append(LTlang.newName + ': ', textF, '<p style="margin-top:10px;color:red;">' + LTlang.renameWarning + '</p>');
            new west.gui.Dialog(LTlang.rename + ': ' + EquipManager.list[nr].name, cont).addButton('ok', function () {
              rename(equipId, nr, $('#equip_rename').val());
            }).addButton('cancel').show();
          };
          EquipManager.twlt_showPopup = EquipManager.showPopup;
          EquipManager.showPopup = function () {
            EquipManager.twlt_showPopup.apply(this, arguments);
            setTimeout(function () {
              $('#max_equip_count').append(' | ' + LTlang.used + ': <span id="equip_used">' + EquipManager.list.length);
            }, 100);
          };
          EquipManager.twlt_buildEquipList = EquipManager.buildEquipList;
          EquipManager.buildEquipList = function () {
            if ($('#equip_used').length > 0)
              $('#equip_used')[0].innerHTML = EquipManager.list.length;
            EquipManager.list.sort(function (a, b) {
              var a1 = a.name.toUpperCase(),
              b1 = b.name.toUpperCase();
              return (a1 == b1) ? 0 : (a1 > b1) ? 1 : -1;
            });
            var html = EquipManager.twlt_buildEquipList().replace(/60%/g, '40%').replace(/20%/g, '15%');
            for (var i = 0; EquipManager.list.length > i; i++) {
              var id = EquipManager.list[i].equip_manager_id;
              html = html.replace('deleteEquip(' + id, 'renameEquip(' + id + ',' + i + ');\'>' + LTlang.rename + '&emsp;</a></td><td width=\'15%\'><a href=\'javascript:EquipManager.deleteEquip(' + id);
            }
            return html;
          };
        }
      };
      LT.ShortPopups = {
        init: function () {
          ItemPopup.twlt_getXHTML = ItemPopup.twlt_getXHTML || ItemPopup.getXHTML;
          ItemPopup.getXHTML = function () {
            var end = '';
            var html = ItemPopup.twlt_getXHTML.call(this).replace(/<br><span class="inventory_popup_requirement_text(.*?)>$/, function (str) {
                end = str;
                return '';
              }).replace('<div class="invPopup_body">', '').replace('inventory_popup"', 'invPopup_body $& style="max-width:385px;"><table><td').replace(/bonus_attr tw_green"/g, '$& style="white-space:nowrap;"').replace('<br><br><div class="item_set_bonus">', end + '</td><td style="padding-left:5px;">');
            if (!html.includes(end))
              html += end;
            return html;
          };
        }
      };
      LT.HideNotis = {
        init: function () {
          var setVal5 = setInterval(function () {
              var WNw = WestUi.NotiBar.work;
              if (WNw) {
                clearInterval(setVal5);
                WNw.setMaxSize(999);
                $('<div class="tw2gui_window_buttons_close" style="position:absolute;left:40px;z-index:2;" title="' + LTlang.removeWorkNotis + '" />').prependTo(WNw.element).click(function () {
                  var l = WNw.list.length;
                  while (l--)
                    if (WNw.list[l].tooltip.includes('job/danger.png'))
                      WNw.removeEntry(WNw.list[l]);
                });
              }
            }, 1000);
        }
      };
      LT.JobProducts = {
        init: function () {
          Map.PopupHandler.twlt_getJobPopup = Map.PopupHandler.twlt_getJobPopup || Map.PopupHandler.getJobPopup;
          Map.PopupHandler.getJobPopup = function (d) {
            var html = Map.PopupHandler.twlt_getJobPopup.apply(this, arguments);
            for (var i in d.yields) {
              var m = ItemManager.get(i);
              html = html.replace('<img src="' + Game.cdnURL + '/images/items/yield/' + m['short'] + '.', '<div class="item"><span class="count" style="display:block;top:29px;left:0px">' + Bag.getItemCount(i) + '</span></div>$&');
            }
            return html;
          };
        }
      };
      LT.MapDistance = {
        init: function () {
          LT.addStyle('div.job_way {left:61px;width:170px;}\n .mpb_distance, .wih_distance, .mpo_distance, .mpw_distance, .mps_distance {width:45px;}\n div.tw2gui_window.marketplace div.fancytable .row > div {text-overflow:unset;}');
          Map.twlt_calcWayTime = Map.twlt_calcWayTime || Map.calcWayTime;
          Map.calcWayTime = function () {
            var time = Map.twlt_calcWayTime.apply(this, arguments);
            this.newDist = time / Game.travelSpeed / Character.speed;
            return time;
          };
          Number.prototype.twlt_formatDuration = Number.prototype.twlt_formatDuration || Number.prototype.formatDuration;
          Number.prototype.formatDuration = function () {
            var dist = '';
            if (Map.newDist)
              dist = ' <small>' + (Math.floor(Map.newDist) / 1000).toFixed(3) + 'mi</small>';
            Map.newDist = 0;
            return Number.prototype.twlt_formatDuration.apply(this, arguments) + dist;
          };
          String.prototype.replaceAll = function () {
            return this.replace(/\D/g, '');
          };
        }
      };
      LT.TraderSell = {
        init: function () {
          var setVal8 = setInterval(function () {
              var wws = west.window.shop;
              if (wws) {
                clearInterval(setVal8);
                LT.addStyle('.focused_new_item_shop .sellIt, .focused_marketplace .auctIt {filter: grayscale(90%)}\n .focused_tailor .not_sellable::after, .focused_gunsmith .not_sellable::after, .focused_general .not_sellable::after, .focused_marketplace .not_auctionable::after {content:"";position:absolute;width:28px;height:28px;right:0;background:url("images/window/shop/shop_icons_sprite.png")no-repeat -167px 0;} .focused_tailor .not_sellable, .focused_gunsmith .not_sellable, .focused_general .not_sellable, .focused_marketplace .not_auctionable {opacity:0.5}');
                var mt = -1,
                itemsToSell = [null, null],
                attr = ['sellable', 'auctionable'],
                className = ['sellIt', 'auctIt'],
                sellItem = function (item) {
                  if (!item.obj[attr[mt]])
                    return this;
                  var inv_id = item.inv_id;
                  if (!itemsToSell[mt][inv_id]) {
                    itemsToSell[mt][inv_id] = item.count;
                    item.divMain[0].classList.add(className[mt]);
                  } else {
                    delete itemsToSell[mt][inv_id];
                    item.divMain[0].classList.remove(className[mt]);
                  }
                },
                setClickH = function () {
                  Inventory.setClickHandler({
                    callback: mt ? MarketWindow.onInventoryClick : wws.handleInventoryClick,
                    context: mt ? MarketWindow : wws,
                    window: mt ? MarketWindow.window : wws.getWindow()
                  });
                },
                exitSell = function (destroy) {
                  if (mt)
                    MarketWindow.onInventoryClick = MarketWindow.twlt_onInventoryClick || MarketWindow.onInventoryClick;
                  else
                    wws.handleInventoryClick = wws.twlt_handleInventoryClick || wws.handleInventoryClick;
                  $.each(itemsToSell[mt], function (invId) {
                    var bgbi = Bag.getItemIdByInvId(invId);
                    if (!bgbi)
                      return delete itemsToSell[mt][invId];
                    Bag.getItemByItemId(bgbi).divMain[0].classList.remove(className[mt]);
                  });
                  itemsToSell[mt] = null;
                  if (destroy)
                    return;
                  setClickH();
                  $(sellButton[mt]).css('filter', 'grayscale(90%)');
                },
                repItems = [
                  3, 201, 302, 325, 603, 802, 10003, 11003,
                ],
                initSell = function () {
                  if (!itemsToSell[mt]) {
                    if (mt) {
                      MarketWindow.twlt_onInventoryClick = MarketWindow.twlt_onInventoryClick || MarketWindow.onInventoryClick;
                      MarketWindow.onInventoryClick = function (item) {
                        if (this.window.currentActiveTabId != 'sell')
                          return false;
                        sellItem(item);
                        return true;
                      };
                    } else {
                      wws.twlt_handleInventoryClick = wws.twlt_handleInventoryClick || wws.handleInventoryClick;
                      wws.handleInventoryClick = function (item) {
                        sellItem(item);
                        return true;
                      };
                    }
                    setClickH();
                    $(sellButton[mt]).css('filter', 'grayscale(0%)');
                    itemsToSell[mt] = {};
                  } else {
                    if (Object.keys(itemsToSell[mt]).length) {
                      var cont = '<div>',
                      money = 0;
                      $.each(itemsToSell[mt], function (invId, count) {
                        var bgbi = Bag.getItemIdByInvId(invId);
                        if (!bgbi)
                          return delete itemsToSell[mt][invId];
                        var bgo = Bag.getItemByItemId(bgbi).obj,
                        bi = bgo.item_base_id;
                        cont += count + 'x ' + LT.GUI.getSetOrItem(bi, bgo, true) + (repItems.includes(bi) ? ' (repeatable quest!)' : '') + '<br>';
                        money += bgo.sell_price * count;
                      });
                      cont += '<br><span class="invPopup_sellicon"/> $' + money + '</span></div>';
                      new west.gui.Dialog(LTlang.sellItems, cont).setDraggable(true).addButton('yes', function () {
                        $.each(itemsToSell[mt], function (inv_id, amount) {
                          if (mt) {
                            var item = Bag.getItemByInvId(inv_id).obj;
                            var params = MarketWindow.Offer.getOfferObject(item.item_id, 0, (item.sell_price || Math.round(item.price / 2)) * amount, amount, 1, 0, 3, '');
                            Ajax.remoteCall('building_market', 'putup', params, function (resp) {
                              if (resp.error)
                                return new UserMessage(resp.msg).show();
                              Character.setMoney(resp.msg.money);
                              Character.setDeposit(resp.msg.deposit);
                              new UserMessage(s('Die Ware wird zum Kauf angeboten, die Gebühr beträgt $ %1', resp.msg.costs), 'success').show();
                            }, MarketWindow);
                          } else
                            wws.requestSell({
                              inv_id: inv_id,
                              count: amount
                            });
                        });
                        itemsToSell[mt] = {};
                        if (mt) {
                          EventHandler.signal('inventory_changed');
                          MarketWindow.Sell.initData();
                        }
                        exitSell();
                      }).addButton('cancel').show();
                    } else
                      exitSell();
                  }
                },
                sellButton = [null, null],
                icon = ['dollar', 'box'],
                addMtButton = function (winmt) {
                  mt = winmt;
                  if (!$('.LT_' + attr[mt] + '_button').length) {
                    sellButton[mt] = new west.gui.Iconbutton(new west.gui.Icon(icon[mt]), initSell).addClass('LT_' + attr[mt] + '_button').getMainDiv();
                    $(sellButton[mt]).css({
                      'position': 'absolute',
                      'left': 0,
                      'z-index': 1,
                      'filter': 'grayscale(90%)'
                    });
                    Inventory.DOM.children('.actions').prepend(sellButton[mt]);
                  }
                };
                wws.twlt_openSellInventory = wws.twlt_openSellInventory || wws.openSellInventory;
                wws.openSellInventory = function () {
                  exitSell(true);
                  wws.twlt_openSellInventory.apply(this, arguments);
                  addMtButton(0);
                };
                /*MarketWindow.twlt_open = MarketWindow.twlt_open || MarketWindow.open;
                MarketWindow.open = function () {
                exitSell(true);
                MarketWindow.twlt_open.apply(this, arguments);
                addMtButton(1);
                };*/
                Inventory.twlt_setClickHandler = Inventory.twlt_setClickHandler || Inventory.setClickHandler;
                Inventory.setClickHandler = function (h) {
                  if (sellButton[mt])
                    $(sellButton[mt]).hide();
                  var win = h && h.window.id,
                  winmt = ['new_item_shop', 'marketplace'].indexOf(win);
                  if (winmt > -1) {
                    mt = winmt;
                    h.callback = mt ? MarketWindow.onInventoryClick : wws.handleInventoryClick;
                    if (sellButton[mt])
                      $(sellButton[mt]).show();
                  }
                  Inventory.twlt_setClickHandler.apply(this, arguments);
                };
                Inventory.twlt_undock = Inventory.twlt_undock || Inventory.undock;
                Inventory.undock = function () {
                  if (itemsToSell[mt])
                    exitSell(true);
                  if (sellButton[mt])
                    sellButton[mt].remove();
                  return Inventory.twlt_undock.apply(this, arguments);
                };
                var tIp = tw2widget.InventoryItem.prototype;
                tIp.twlt_initDisplay = tIp.twlt_initDisplay || tIp.initDisplay;
                tIp.initDisplay = function () {
                  this.twlt_initDisplay.apply(this, arguments);
                  if (!this.obj.auctionable)
                    this.addClass('not_auctionable');
                };
                west.window.shop.trackBuyItem = function () {};
              }
            }, 1000);
        }
      };
      LT.TouchControl = {
        init: function () {
          var fingers = 0,
          wgSbp = west.gui.Scrollbar.prototype;
          wgSbp.twlt_init = wgSbp.twlt_init || wgSbp.init;
          wgSbp.init = function () {
            this.twlt_init.apply(this, arguments);
            var start,
            that = this;
            $(this.divMain).on('touchstart', function (e) {
              start = e.originalEvent.touches[0].clientY;
            }).on('touchmove', function (e) {
              e.stopPropagation();
              e.preventDefault();
              var move = e.originalEvent.changedTouches[0].clientY;
              that.move(move - start);
              start = move;
            });
          };
          var wgSpp = west.gui.Scrollpane.prototype;
          wgSpp.twlt_init = wgSpp.twlt_init || wgSpp.init;
          wgSpp.init = function () {
            this.twlt_init.apply(this, arguments);
            var start,
            coP = this.contentPane,
            clP = this.clipPane,
            vB = this.verticalBar,
            ratio;
            $(this.divMain).on('touchstart', function (e) {
              fingers++;
              start = e.originalEvent.touches[0].clientY;
              ratio = (vB._divPullArea.height() - vB._divPulley.height()) / (clP.height() - coP.height());
            }).on('touchmove', function (e) {
              if (fingers != 1)
                return;
              e.preventDefault();
              var move = e.originalEvent.changedTouches[0].clientY,
              topPos = move - start;
              vB.move(ratio * topPos);
              start = move;
            }).on('touchend', function (e) {
              fingers = 0;
            });
          };
          var start,
          currZoom = 1;
          $('#ui_minimap').on('touchstart', function (e) {
            fingers++;
            start = e.originalEvent.touches[0].clientY;
          }).on('touchmove', function (e) {
            if (fingers != 1)
              return;
            e.preventDefault();
            var move = e.originalEvent.changedTouches[0].clientY,
            cZmb = currZoom + (move - start) / 100;
            if (cZmb >= 0.65 && cZmb <= 5)
              document.getElementById('map').style.zoom = cZmb;
          }).on('touchend', function (e) {
            fingers = 0;
            currZoom = $('#map').css('zoom') * 1;
            Map.resize();
          });
          Map.twlt_getCurrentMid = Map.twlt_getCurrentMid || Map.getCurrentMid;
          Map.getCurrentMid = function () {
            var xy = this.twlt_getCurrentMid.apply(this, arguments);
            return {
              x: xy.x / currZoom,
              y: xy.y / currZoom
            };
          };
          Map.twlt_resize = Map.twlt_resize || Map.resize;
          Map.resize = function () {
            if (!Map.initialized)
              return;
            this.twlt_resize.apply(this, arguments);
            this.width /= currZoom;
            this.height /= currZoom;
          };
          var start2;
          $('#map').on('touchstart', function (e) {
            fingers++;
            var eoEt = e.originalEvent.touches[0];
            start2 = [eoEt.clientX, eoEt.clientY];
          }).on('touchmove', function (e) {
            if (fingers != 1)
              return;
            e.preventDefault();
            var eoEcT = e.originalEvent.changedTouches[0],
            move = [eoEcT.clientX, eoEcT.clientY];
            Map.Drag.scrollby((start2[0] - move[0]) / currZoom, (start2[1] - move[1]) / currZoom);
            start2 = move;
          }).on('touchend', function (e) {
            fingers = 0;
          });
          var wgWp = west.gui.Window.prototype;
          wgWp.twlt_init = wgWp.twlt_init || wgWp.init;
          wgWp.init = function () {
            this.twlt_init.apply(this, arguments);
            var start,
            that = this,
            tdM = that.divMain,
            currPos;
            $('div.tw2gui_inner_window_title', tdM).on('touchstart', function (e) {
              fingers++;
              var eoEt = e.originalEvent.touches[0];
              start = [eoEt.clientX, eoEt.clientY];
              that.bringToTop();
            }).on('touchmove', function (e) {
              if (fingers != 1)
                return;
              e.preventDefault();
              currPos = [tdM.offsetLeft, tdM.offsetTop];
              var eoEcT = e.originalEvent.changedTouches[0],
              move = [eoEcT.clientX, eoEcT.clientY],
              res = [currPos[0] + move[0] - start[0], currPos[1] + move[1] - start[1]];
              if (res[0] > -1) {
                tdM.style.left = res[0] + 'px';
                currPos[0] = res[0];
              }
              if (res[1] > -1) {
                tdM.style.top = res[1] + 'px';
                currPos[1] = res[1];
              }
              start = move;
            }).on('touchend', function (e) {
              fingers = 0;
            });
          };
          LT.addStyle('img {-webkit-touch-callout:none;}');
          var timer,
          timer2,
          wph = west.popup.handler;
          $(document).on('touchstart', function (e) {
            timer = setTimeout(function () {
                wph.handleMouseMove.call(wph, e);
              }, 500);
            timer2 = setTimeout(function () {
                e.ctrlKey = 1;
                LT.CalcTwdb.show(e);
              }, 2000);
          }).on('touchend', function (e) {
            clearTimeout(timer);
            clearTimeout(timer2);
          });
        }
      };
      LT.CalcTwdb = {
        show: function (e) {
          if (!e.ctrlKey && !e.altKey)
            return;
          var t = $(e.target).data();
          var tdi = t.itemId || t.itemid || t.setkey;
          if (!tdi)
            return;
          var add;
          if (e.altKey) {
            add = isNaN(tdi) ? 'supravy&set=' : 'item&id=';
            LT.GUI.open('openFrame', 'https://tw-db.info/?strana=' + add + tdi, [1000, 630]);
            LT.GUI.makeList();
          } else {
            add = isNaN(tdi) ? 'sets/' : 'item/';
            window.open('https://tw-calc.net/' + add + tdi);
          }
        },
        init: function () {
          $(document).click(function (e) {
            LT.CalcTwdb.show(e);
          });
          Inventory.clickHandler = function (item_id, e) {
            var item = Bag.getItemByItemId(item_id);
            if (e.shiftKey || e.ctrlKey || e.altKey)
              return;
            if (this.click && this.click.callback.apply(this.click.context, [item]))
              return;
            if (item.obj.action) {
              $.globalEval(item.obj.action);
              return;
            }
            if (wman.getById(Wear.uid)) {
              Wear.carry(item);
              return;
            }
            return;
          };
        }
        (),
      };
      LT.CollectReminder = function () {
        var setVal4 = setInterval(function () {
            if (window.Bag && Bag.loaded) {
              clearInterval(setVal4);
              var nulls = [];
              for (var y in LT.cooldown) {
                var cdwn = LT.Data.cooldown && LT.Data.cooldown[y] || LT.cooldown[y];
                var item = Bag.getItemsByBaseItemId(y)[0];
                if (cdwn == 1 && item) {
                  var coold = BuffList.cooldowns[item.obj.item_id] && BuffList.cooldowns[item.obj.item_id].time || item.cooldown;
                  var sec = coold * 1000 - new ServerDate().getTime();
                  if (!(sec > 0))
                    nulls.push(item);
                  else if (!LT.cooldownTimer[y])
                    LT.cooldownSetTime(y, [item], sec);
                } else if (cdwn == 0.5 && LT.cooldownTimer[y]) {
                  clearTimeout(LT.cooldownTimer[y]);
                  LT.cooldownTimer[y] = 0;
                }
              }
              if (nulls.length)
                LT.cooldownSetTime(0, nulls, 0);
            }
          }, 2000);
      };
      LT.SkipOpen = function () {
        ItemUse.twlt_use = ItemUse.use;
        ItemUse.use = function (itemId) {
          var baseId = itemId / 1000,
          skips = LT.Data.skipOpen && LT.Data.skipOpen[baseId] || LT.skipOpen[baseId];
          if (skips == 1)
            Ajax.remoteCall('itemuse', 'use_item', {
              item_id: itemId,
              lastInvId: Bag.getLastInvId()
            }, function (res) {
              if (res.error)
                return new UserMessage(res.msg).show();
              var m = res.msg.effects[0],
              widget;
              switch (m.type) {
              case 'lottery':
              case 'content':
                var mi = m.items[0],
                cont = {};
                cont[mi.item_id] = mi.count;
                widget = new tw2widget.Item(ItemManager.get(mi.item_id)).setCount(mi.count).getMainDiv();
                $.get('https://tw-calc.net/service/chest-export', {
                  chest: itemId,
                  count: 1,
                  content: cont,
                  version: Game.version
                }, function () {}, 'jsonp');
                if (ItemUse.twdb)
                  ItemUse.twdb(itemId, res);
                break;
              case 'ses':
                widget = ' <img src="images/icons/' + m.event + '.png" title="' + m.name.escapeHTML() + '" /> ' + m.amount;
                break;
              }
              var mess = $('<div>' + LTlang.skipDone + ':<br></div>').append(widget);
              new UserMessage(mess, 'success').show();
              Bag.updateChanges(res.msg.changes);
              EventHandler.signal('item_used', [itemId]);
            });
          else
            ItemUse.twlt_use.apply(this, arguments);
        };
      };
      LT.Skript.init();
    } else if (location.href.includes('?strana=invent&x=')) {
      var lg = LTstart.langs,
      lang = /lang=([a-z]+)/.exec(document.cookie),
      LTlang = lang && lg.hasOwnProperty(lang[1]) ? lg[lang[1]] : lg.en,
      done = false,
      i = document.getElementsByClassName('bag_empty'),
      wrld = document.getElementById('char_server').textContent,
      saveCounts = {},
      sameWorld = false,
      hide = function (it) {
        saveCounts = {};
        var sameItem = false;
        for (var j of i) {
          var m = j.children[1].innerHTML.match(/,\d,\d,\d,(\d),\d/),
          auct = m ? m[1] == 1 : true,
          id = j.id.slice(1),
          level = id.slice(-1) > 0;
          if (it)
            sameItem = sameWorld ? it[id] : !it[id];
          if (!auct || level || sameItem)
            j.style.display = 'none';
          else if (it && it[id]) {
            var count = j.firstChild.firstChild;
            if (count.textContent > it[id]) {
              saveCounts[j.id] = count.textContent;
              count.textContent = it[id];
            }
          }
        }
        $('.inputV2')[0].style.display = 'none';
      };
      LTstart.compInv = function () {
        if (done) {
          done = false;
          for (var h of i) {
            h.style.display = 'inline-block';
            if (saveCounts[h.id])
              h.firstChild.firstChild.textContent = saveCounts[h.id];
          }
          $('.inputV2')[0].style.display = 'inline-block';
        } else {
          done = true;
          var url = prompt(LTlang.compInv + ': ');
          if (url && url.includes('?strana=invent&x='))
            $.ajax({
              url: url
            }).done(function (data) {
              var regex = /<div id='i(\d+)' class='bag_empty'><span class="pocetx"><span class="pocet_cislox">(\d+)<\/span>/g,
              t,
              items = {},
              world = /id="char_server">(.*?)</.exec(data);
              if (!world) {
                alert('invalid inventory');
                done = false;
              }
              sameWorld = wrld == world[1];
              while (t = regex.exec(data)) {
                var u = sameWorld ? t[1].slice(0, -3) + '000' : t[1];
                items[u] = t[2];
              }
              hide(items);
            }).fail(function () {
              alert(arguments[1] + arguments[2]);
              done = false;
            });
          else {
            sameWorld = false;
            hide();
          }
        }
      };
      $('.inputV2').after('<img src="https://westzz.innogamescdn.com/images/items/yield/pick.png" width="25" style="position:absolute;right:0px;cursor:pointer;" onclick="LTstart.compInv();"/>');
    } else {
      window.onload = function () {
        var lg = LTstart.langs,
        LTlang = lg.hasOwnProperty(location.href.substr(21, 2)) ? lg[location.href.substr(21, 2)] : lg.en;
        Worlds.show = (function () {
          Worlds.twlt_show = Worlds.show;
          return function () {
            Worlds.twlt_show.apply(this, arguments);
            var first = true;
            var plyWrl = Worlds.playerWorlds,
            state = (JSON.parse(localStorage.getItem('TWLTcustom1')) || {}),
            t1 = [],
            t2 = [];
            for (var a in plyWrl) {
              if (plyWrl[a][1] !== null) {
                t1.push(a);
                if (!state[a])
                  state[a] = false;
                else if (state[a] == true)
                  t2.push(a);
              }
            }
            var loginNow = function (t) {
              for (var x = 0; x < t.length; x++) {
                if (first)
                  Auth.login(plyWrl[t[x]]);
                else
                  window.open(location.origin + '#loginWorld' + t[x], '_blank');
                first = false;
              }
            };
            $('#worldsWrapper').append('<div id="loginMore" />');
            $('#loginMore').append('<a id="loginAll" title="' + LTlang.loginAll2 + '" href="#" >' + LTlang.loginAll1 + '</a>').append('<a id="custom" title="' + LTlang.custom2 + '" href="#" >' + LTlang.custom1 + '</a>').append('<img id="cust1" title="' + LTlang.edit + '" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAYdEVYdFNvZnR3YXJlAHBhaW50Lm5ldCA0LjAuOWwzfk4AAAFOSURBVDhPY6A6KKnL4j60a2Xf1jWz/6PjQ5unbIUqww3WLpr0Hx0/vXXq/9e39/5fPL4VzAdZAlVOGFw6s9t49sQGsAF/f30GGwLiQ6UJA5Dio7tW/X/z6AIYgwxaNKPr7/1rh6ShSnADkJ/banPB/r9z+QDYIBAfRE9oKf7f2Vz8BKoUE+ydEfj/5Orm/88vb/1fVxwHdjZI88p5zc0gevemRWBxqHJUANP86+Wu/9f3TPu/Y1Yh2NbCskQWkPyiOTmiIM0gw8AakAFI88FFVWCbQYasn5iBVeG0SWWeUCYCLKl1B9sG0gwyZFl73P+99d79UGn8AKQZZBtIM8iQ2XXh2J2IDYA0g2x7cGwZ2JDJpf7E2zwnwwxsG0gzyJCuXC/iNYMAsubGFDvSNIMAyEaQFxoiDf93Vgb3QIWJBwtb3NJANoNoqBAJgIEBAEbiFXTTZGcSAAAAAElFTkSuQmCC"/>');
            $('#selectWorldText').css('margin-bottom', '20px');
            $('#loginAll').css({
              'background-image': 'url("' + LTstart.Images('LT_login') + '")',
              'height': '45px',
              'width': '180px',
              'line-height': '40px',
              'font-weight': 'bold',
              'font-size': '12px',
              'margin-left': '10px',
              'top': '35px',
              'z-index': '1',
              'position': 'absolute',
              'cursor': 'pointer',
            }).mouseenter(function () {
              $(this).css('background-position', '0px -45px');
            }).mouseleave(function () {
              $(this).css('background-position', '0px 0px');
            }).click(function () {
              loginNow(t1);
            });
            $('#custom').css({
              'background-image': 'url("' + LTstart.Images('LT_loginC') + '")',
              'background-repeat': 'no-repeat',
              'height': '36px',
              'width': '144px',
              'text-align': 'left',
              'padding-left': '15px',
              'line-height': '32px',
              'font-weight': 'bold',
              'font-size': '11px',
              'margin-left': '45px',
              'top': '70px',
              'z-index': '1',
              'position': 'absolute',
              'cursor': 'pointer',
            }).mouseenter(function () {
              $(this).css('background-position', '0px -36px');
            }).mouseleave(function () {
              $(this).css('background-position', '0px 0px');
            }).click(function () {
              loginNow(t2);
            });
            $('#cust1').css({
              'margin-left': '160px',
              'top': '78px',
              'z-index': '2',
              'position': 'absolute',
              'cursor': 'pointer',
            }).click(function () {
              var checkB = {},
              checkD = {};
              $('#loginMore').hide();
              $('#allWorlds').empty();
              $('#allWorlds').css('text-align', 'left');
              for (var k = 0; k < t1.length; k++) {
                checkB[t1[k]] = new west.gui.Checkbox().setLabel(Worlds.data[t1[k]].name).setSelected(state[t1[k]]).appendTo($('#allWorlds'));
                $('#allWorlds').append('<br><div style="height:5px;" />');
              }
              var butB = new west.gui.Button(LTlang.save, function () {
                  for (var l in checkB) {
                    checkD[l] = checkB[l].isSelected();
                    localStorage.setItem('TWLTcustom1', JSON.stringify(checkD));
                  }
                  new UserMessage(LTlang.saveMessage2, 'success').show();
                });
              butB.appendTo($('#allWorlds'));
            });
          };
        })();
      };
      if (location.hash.includes('loginWorld')) {
        setTimeout(function () {
          $('#loginButton').click();
          var val = setInterval(function () {
              var u = Worlds.playerWorlds;
              if (Object.keys(u).length !== 0) {
                clearInterval(val);
                Auth.login(u[parseFloat(location.hash.replace(/\D/g, ''))]);
              }
            }, 500);
        }, 1000);
      }
    }
  }
});