Greasy Fork is available in English.

TW Gold Jobs Finder (More Languages)

Shows a list of all silver and gold jobs!

Tính đến 19-03-2015. Xem phiên bản mới nhất.

// ==UserScript==
// @name TW Gold Jobs Finder (More Languages)
// @namespace TomRobert
// @author Macabre2077 (updated by Tom Robert)
// @author tw81 (Italian translation)
// @author Jakovlev (Hungarian translation)
// @author realfan2002 (Romanian translation)
// @author Vebuus (Polish translation)
// @author Ilja Iljic (Czech translation)
// @author pepe100 (Spanish translation)
// @author Tom Robert (German translation)
// @description Shows a list of all silver and gold jobs!
// @include http*://*.the-west.*/game.php*
// @version 1.01
// @grant none
// ==/UserScript==
(function (fn) {
  var script = document.createElement('script');
  script.setAttribute('type', 'application/javascript');
  script.textContent = '(' + fn + ')();';
  document.body.appendChild(script); // run the script
  document.body.removeChild(script); // clean up
}) (function () {
  GoldJobs = {
    version: '1.01',
    name: 'TW Gold Jobs Finder',
    author: 'Macabre2077 (updated by Tom Robert)',
    minGame: '2.05',
    maxGame: Game.version.toString(),
    website: 'https://greasyfork.org/scripts/7226',
    updateUrl: 'http://pastebin.com/raw.php?i=1NHRGWVx',
    toLoad: 0,
    loaded: 0,
    xMax: 181,
    yMax: 79,
    blockMaxLength: 300,
    dataLoaded: false,
    silverJobBbColor: '#708090',
    goldJobBbColor: '#f4c430',
    preferences: {
      jobName: '',
      showSilver: true,
      showGold: true,
      sortByName: 0,
      sortByDistance: 1
    },
    hiddenImageOpacity: 0.35,
    shownImageOpacity: 1,
    bestJobTime: 0
  };
  langs = {
    en_US: {
      language: 'None (English)',
      ApiGui: 'This script adds a button on the right side, where you can load all the silver and gold jobs.<br>So they can be easily found on the map.',
      contact: 'Contact',
      jobIcon: 'Icon',
      jobName: 'Job name',
      distanceTime: 'Travel time',
      showJob: 'Show',
      title: 'Gold And Silver Jobs',
      loading: 'Loading...',
      exportButtonTitle: 'Share',
      generatedBy: 'Generated by TW Gold Jobs Finder',
      generatedByBb: '[i][url=' + GoldJobs.website + ']Generated by TW Gold Jobs Finder[/url][/i]',
      plainText: 'Plain Text',
      bbCode: 'BB code',
      enqueue: 'Enqueue',
      openWindowTitle: 'Open window',
      refreshTitle: 'Refresh',
      feedbackTitle: 'Send feedback',
      feedbackWindowTitle: 'Gold Jobs Feedback',
      feedbackDescription: 'If you have encountered any bugs or have ideas how to improve this script, describe them..in English, German or French please..',
      update: 'Update',
      updateAvailable: 'A new version of the script is available',
      cancel: 'Cancel',
    },
    ru_RU: {
      language: 'Russian (ру́сский)',
      ApiGui: 'This script adds a button on the right side, where you can load all the silver and gold jobs.<br>So they can be easily found on the map.',
      contact: 'контакт',
      jobIcon: 'Иконка',
      jobName: 'Название работы',
      distanceTime: 'Время',
      showJob: 'Показать',
      title: 'Золотые и серебряные работы',
      loading: 'Загрузка...',
      exportButtonTitle: 'Поделиться',
      generatedBy: 'Получено с помощью TW Gold Jobs Finder',
      generatedByBb: '[i][url=' + GoldJobs.website + ']Получено с помощью TW Gold Jobs Finder[/url][/i]',
      plainText: 'Без BB-кода',
      bbCode: 'С BB-кодом',
      enqueue: 'Начать',
      openWindowTitle: 'Открыть',
      refreshTitle: 'Обновить данные',
      feedbackTitle: 'Обратная связь',
      feedbackWindowTitle: 'Golden Jobs, обратная связь',
      feedbackDescription: 'Если нашли баги, или есть идеи, как улучшить скрипт, отправить мне сообщение',
      update: 'обновление',
      updateAvailable: 'Доступно обновление скрипта',
      cancel: 'отменить',
    },
    it_IT: {
      language: 'Italian (italiano)',
      ApiGui: 'This script adds a button on the right side, where you can load all the silver and gold jobs.<br>So they can be easily found on the map.',
      contact: 'Contatto',
      jobIcon: 'Icona',
      jobName: 'Nome lavoro',
      distanceTime: 'Tempo di viaggio',
      showJob: 'Mostra',
      title: 'Lavoro Oro e Argento',
      loading: 'Caricamento in corso ... Ci vorrà un po \'',
      exportButtonTitle: 'Cita',
      generatedBy: 'Generato da TW Gold Jobs Finder',
      generatedByBb: '[i][url=' + GoldJobs.website + ']Generato da TW Gold Jobs Finder[/url][/i]',
      plainText: 'Testo normale',
      bbCode: 'BB code',
      enqueue: 'Inizia',
      openWindowTitle: 'Aperto',
      refreshTitle: 'Aggiornare dati',
      feedbackTitle: 'Invia feedback',
      feedbackWindowTitle: 'Gold Jobs Feedback',
      feedbackDescription: 'Se avete riscontrato qualche bug o avete idee su come migliorare questo script, vi prego di descriverle .. in inglese, tedesco o francese per favore.',
      update: 'Atualizar',
      updateAvailable: 'Script aggiornamento disponibile',
      cancel: 'Cancelar',
    },
    hu_HU: {
      language: 'Hungarian (Magyar)',
      ApiGui: 'This script adds a button on the right side, where you can load all the silver and gold jobs.<br>So they can be easily found on the map.',
      contact: 'Érintkezés',
      jobIcon: 'Ikon',
      jobName: 'Munka neve',
      distanceTime: 'Menetidő',
      showJob: 'Mutatás',
      title: 'Arany és ezüst munkák',
      loading: 'Kis türelmet, töltés alatt...',
      exportButtonTitle: 'Megosztás',
      generatedBy: 'TW Gold Jobs Finder által létrehozva',
      generatedByBb: '[i][url=' + GoldJobs.website + ']TW Gold Jobs Finder által létrehozva[/url][/i]',
      plainText: 'Szövegként',
      bbCode: 'BB kód',
      enqueue: 'Kezdés',
      openWindowTitle: 'Megnyitás',
      refreshTitle: 'Frissítés',
      feedbackTitle: 'Visszajelzés küldése',
      feedbackWindowTitle: 'Gold Jobs visszajelzés',
      feedbackDescription: 'Ha találkoztál hibákkal (bug), vagy javaslatod lenne a szkript bővítéséhez írd le őket. Értek angolul, németül és franciául.',
      update: 'Frissítés',
      updateAvailable: 'Egy új változata a script elérhető',
      cancel: 'Érvénytelenít',
    },
    ro_RO: {
      language: 'Romanian (român)',
      ApiGui: 'This script adds a button on the right side, where you can load all the silver and gold jobs.<br>So they can be easily found on the map.',
      contact: 'Contact',
      jobIcon: 'Imagine',
      jobName: 'Denumirea muncii',
      distanceTime: 'Distanţa',
      showJob: 'Arată',
      title: 'Munci aurii şi argintii',
      loading: 'Se încarcă... Poate dura ceva timp!',
      exportButtonTitle: 'Distribuiţi',
      generatedBy: 'Generat cu TW Gold Jobs Finder',
      generatedByBb: '[i][url=' + GoldJobs.website + ']Generat cu TW Gold Jobs Finder[/url][/i]',
      plainText: 'Text simplu',
      bbCode: 'BB code',
      enqueue: 'Start',
      openWindowTitle: 'Deschide',
      refreshTitle: 'Reîmprospăta',
      feedbackTitle: 'Trimite feedback',
      feedbackWindowTitle: 'Gold Jobs Feedback',
      feedbackDescription: 'If you have encountered any bugs or have ideas how to improve this script, describe them..in English, German or French please..',
      update: 'Actualizare',
      updateAvailable: 'O nouă versiune este disponibilă',
      cancel: 'Anula',
    },
    pl_PL: {
      language: 'Polish (polski)',
      ApiGui: 'This script adds a button on the right side, where you can load all the silver and gold jobs.<br>So they can be easily found on the map.',
      contact: 'Kontakt',
      jobIcob: 'Ikona',
      jobName: 'Nazwa pracy',
      distanceTime: 'Dystans',
      showJob: 'Pokaż',
      title: 'Złote i srebrne prace',
      loading: 'Ładowanie... To zajmie moment',
      exportButtonTitle: 'Eksport',
      generatedBy: 'Stworzone przez TW Gold Jobs Finder',
      generatedByBb: '[i][url=' + GoldJobs.website + ']Stworzone przez TW Gold Jobs Finder[/url][/i]',
      plainText: 'Zwykły tekst',
      bbCode: 'BB code',
      enqueue: 'Startuj',
      openWindowTitle: 'Otwierać',
      refreshTitle: 'Odświeżanie danych',
      feedbackTitle: 'Wysłać opinię',
      feedbackWindowTitle: 'Gold Jobs Opinię',
      feedbackDescription: 'If you have encountered any bugs or have ideas how to improve this script, describe them..in English, German or French please..',
      update: 'Aktualizacja',
      updateAvailable: 'Nowa wersja skryptu jest dostępny',
      cancel: 'Anuluj',
    },
    cs_CZ: {
      language: 'Czech (čeština)',
      ApiGui: 'This script adds a button on the right side, where you can load all the silver and gold jobs.<br>So they can be easily found on the map.',
      contact: 'Kontakt',
      jobIcon: 'Ikonka',
      jobName: 'Práce',
      distanceTime: 'Vzdálenost',
      showJob: 'Ukaž',
      title: 'Zlaté a stříbrné práce',
      loading: 'Nahrávám...',
      exportButtonTitle: 'Sdílet',
      generatedBy: 'Generated by TW Gold Jobs Finder',
      generatedByBb: '[i][url=' + GoldJobs.website + ']Generated by TW Gold Jobs Finder[/url][/i]',
      plainText: 'Prostý Text',
      bbCode: 'BB code',
      enqueue: 'Zadat',
      openWindowTitle: 'Otevřít okno',
      refreshTitle: 'Obnovit',
      feedbackTitle: 'Pošli zpětnou vazbu',
      feedbackWindowTitle: 'Gold Jobs Feedback',
      feedbackDescription: 'Pokud jste nalezli bug nebo máte nápad na zlepšení skriptu, napište je..v angličtině, němčině nebo francouzštině prosím..',
      update: 'Aktualizovat',
      updateAvailable: 'Nová verze skriptu je k dispozici',
      cancel: 'Zrušit',
    },
    es_ES: {
      language: 'Spanish (español)',
      ApiGui: 'This script adds a button on the right side, where you can load all the silver and gold jobs.<br>So they can be easily found on the map.',
      contact: 'Contacto',
      jobIcon: 'Icono',
      jobName: 'Nombre Trabajo',
      distanceTime: 'Tiempo viaje',
      showJob: 'Mostrar',
      title: 'Trabajos con Bonus Oro y Plata',
      loading: 'Cargando...',
      exportButtonTitle: 'Compartir',
      generatedBy: 'Generado por TW Gold Jobs Finder',
      generatedByBb: '[i][url=' + GoldJobs.website + ']Generado por TW Gold Jobs Finder[/url][/i]',
      plainText: 'Texto plano',
      bbCode: 'BB code',
      enqueue: 'Poner en cola',
      openWindowTitle: 'Abrir ventana',
      refreshTitle: 'Refrescar',
      feedbackTitle: 'Enviar comentarios',
      feedbackWindowTitle: 'Gold Jobs comentarios',
      feedbackDescription: 'Si ha encontrado algún error o tiene ideas de cómo mejorar este script, descríbalos.. por favor en inglés, alemán o francés..',
      update: 'Actualización',
      updateAvailable: 'Una nueva versión está disponible',
      cancel: 'Cancelar',
    },
    de_DE: {
      language: 'German (Deutsch)',
      ApiGui: 'Das Script fügt am rechten Rand einen Button hinzu, wo man alle Gold- und Silber-Arbeiten laden kann.<br>So findet man sie ganz einfach auf der Karte.',
      contact: 'Kontakt',
      jobIcon: 'Bild',
      jobName: 'Arbeit',
      distanceTime: 'Distanz',
      showJob: 'Zeigen',
      title: 'Gold und Silber Arbeiten',
      loading: 'Laden...',
      exportButtonTitle: 'Teilen',
      generatedBy: 'Gefunden mit TW Gold Jobs Finder',
      generatedByBb: '[i][url=' + GoldJobs.website + ']Gefunden mit TW Gold Jobs Finder[/url][/i]',
      plainText: 'Klartext',
      bbCode: 'BB Code',
      enqueue: 'Einstellen',
      openWindowTitle: 'Fenster öffnen',
      refreshTitle: 'Aktualisieren',
      feedbackTitle: 'Feedback',
      feedbackWindowTitle: 'Gold Jobs Feedback',
      feedbackDescription: 'Falls du auf Fehler gestossen bist oder Ideen hast, das Script zu verbesseren, beschreibe diese.. auf Deutsch, Englisch oder Französisch bitte..',
      update: 'Update',
      updateAvailable: 'Für das Script ist eine neue Version erhältlich',
      cancel: 'Abbrechen',
    },
  };
  lang = langs.hasOwnProperty(Game.locale) ? langs[Game.locale] : langs.en_US;
  var GoldJobsApi = TheWestApi.register('GoldJobs', GoldJobs.name, GoldJobs.minGame, GoldJobs.maxGame, GoldJobs.author, GoldJobs.website);
  GoldJobsApi.setGui('<br><i>Language detected: </i>' + lang.language + '<br><br>' + lang.ApiGui + '<br><br><i>' + GoldJobs.name + ' v' + GoldJobs.version + '</i>');
  GoldJobs.parseWholeMap = function (tiles, onLoad) {
    this.loaded = 0;
    var x,
    y;
    var arr = [
    ];
    var currentBlock = 0;
    var currentBlockLength = 0;
    for (x in tiles) {
      for (y in tiles[x]) {
        if (isNaN(x) || isNaN(y)) {
          continue;
        }
        if (currentBlockLength == 0) {
          arr[currentBlock] = [
          ];
        }
        arr[currentBlock].push([parseInt(x),
        parseInt(y)]);
        if (++currentBlockLength == this.blockMaxLength) {
          currentBlock++;
          currentBlockLength = 0;
        }
      }
    }
    var i,
    to = arr.length;
    this.toLoad = to;
    for (i = 0; i < to; i++) {
      Map.Data.Loader.load(arr[i], function () {
        GoldJobs.loaded++;
        if (GoldJobs.loaded == GoldJobs.toLoad) {
          onLoad();
        }
      });
    }
  };
  GoldJobs.getJobIcon = function (jobId, x, y, shortname, gold) {
    var pos = {
      'x': x,
      'y': y
    };
    var t = gold ? 'gold' : 'silver';
    return '<div class="job" style="left: 0; top: 0; position: relative;"><div  onclick="javascript:Map.JobHandler.openJob(' + jobId + ',{x:' + x + ',y:' + y + '})" class="featured ' + t + '"></div>' + this.getGotoIcon(x, y) + '<img src="../images/jobs/' + shortname + '.png" class="job_icon"></div>';
  };
  GoldJobs.getGotoIcon = function (x, y) {
    return '<div class="centermap" onclick="javascript:Map.center(' + x + ',' + y + ');"style="position: absolute;background-image: url(\'../images/map/icons/instantwork.png\');width: 20px;height: 20px;top: 0;right: 3px;cursor: pointer;"></div>';
  };
  GoldJobs.getBestJobTime = function () {
    var list = JobList.getDurations();
    var maxTime = 0;
    for (name in list) {
      if (list[name].requirement <= Character.level && list[name].duration > maxTime) {
        maxTime = list[name].duration;
      }
    }
    GoldJobs.bestJobTime = maxTime;
  };
  GoldJobs.getEnqueueButton = function (jobId, x, y) {
    var job = JobList.getJobById(jobId);
    var canDo = job.canDo();
    if (GoldJobs.bestJobTime == 0) {
      GoldJobs.getBestJobTime();
    }
    var duration = GoldJobs.bestJobTime;
    var b = this.gui.makeButton(lang.enqueue, function () {
      TaskQueue.add(new TaskJob(jobId, x, y, duration));
    });
    b.setWidth(100);
    if (!canDo) b.disable();
    return b.getMainDiv();
  };
  GoldJobs.addColumnsCss = function () {
    $('.goldenJobs .jobIcon').css('width', '60px');
    $('.goldenJobs .jobName').css('width', '140px');
    $('.goldenJobs .startJob').css('width', '100px');
    $('.goldenJobs .distanceTime').css('width', '60px');
    $('.goldenJobs .row').css('height', '56px');
    $('.goldenJobs .row').css('background', 'none');
    $('.goldenJobs .row_head .jobName').css('width', '135px');
    $('.goldenJobs .row_head .distanceTime').css('width', '95px');
    $('.goldenJobs .row_head .startJob').css('width', '0px');
    $('.goldenJobs .tfoot .jobIcon').css('width', '100%');
    $('.goldenJobs .tfoot').css('height', '35px');
    $('.goldenJobs').find('.tw2gui_scrollpane').css('height', '280px');
  };
  GoldJobs.calculateDistance = function (jobX, jobY) {
    var to = {
      x: jobX,
      y: jobY
    };
    return Map.calcWayTime(Character.position, to);
  };
  GoldJobs.addEventListener = function (event, callback) {
    if (EventHandler.hasOwnProperty('add')) {
      EventHandler.add(event, callback);
    } else {
      EventHandler.listen(event, callback);
    }
  };
  GoldJobs.openWindow = function () {
    var content = $('<div class=\'jobwindow\'/>');
    var table = this.makeJobsTable(this.preferences.jobName, this.preferences.showSilver, this.preferences.showGold, this.preferences.sortByName, this.preferences.sortByDistance);
    var win = wman.open('goldenJobs').setResizeable(true).setMinSize(450, 475).setSize(450, 475).setMiniTitle(lang.title);
    content.append(table.getMainDiv());
    win.appendToContentPane(content);
    this.addColumnsCss();
    this.addFilterEvent();
    this.addHeaderEvents();
    this.addEventListener('position_change', GoldJobs.refreshWindow);
  };
  GoldJobs.buildFooter = function (chosenJobName) {
    var footer = $('<div class="goldjobs_table_foot" style="margin-top: 3px"><span id="gj_job_search" style="position: relative; top: 0px; "/><span id="gj_share" style="position: absolute;top: 3px;right: 7px;"/></div>');
    var exportButton = this.gui.makeButton(lang.exportButtonTitle, function () {
      var jobName = $('#gj_job_search_textfield').val();
      var jobs = GoldJobs.jobsDataToBbString(jobName);
      GoldJobs.showExportWindow(jobs + lang.generatedByBb, true);
    }).setWidth(100);
    var textfield = this.gui.makeTextfield('gj_job_search_textfield').setSize(18).setWidth(137);
    var clearImage = $('<img/>', {
      src: '../images/chat/servicegrade_traitor.png',
      click: function () {
        $('#gj_job_search_textfield').val('');
        $('#gj_job_search_textfield').change();
      },
      css: {
        filter: 'grayscale(100%)',
        '-webkit-filter': 'grayscale(100%)',
        '-moz-filter': 'grayscale(100%)',
        '-o-filter': 'grayscale(100%)',
        position: 'absolute',
        top: '-1px',
        left: '130px'
      }
    });
    $('#gj_job_search', footer).append(textfield.getMainDiv());
    $('#gj_share', footer).append(exportButton.getMainDiv());
    $('#gj_job_search span.tw2gui_textfield span', footer).append('<span class=\'placeholder\' style=\'font-weight: lighter;color: #333;position: absolute;left: 12px; top: 1px;\'>' + lang.jobName + '</span>');
    var placeholder = $('#gj_job_search .placeholder', footer);
    placeholder.after(clearImage);
    placeholder.click(function () {
      $('#gj_job_search_textfield', footer).focus();
    });
    $('#gj_job_search_textfield', footer).focus(function () {
      placeholder.hide();
    });
    $('#gj_job_search_textfield', footer).focusout(function () {
      if ($('#gj_job_search_textfield').val() == '') {
        placeholder.show();
      }
    });
    if (chosenJobName != undefined && chosenJobName != '') {
      $('#gj_job_search_textfield', footer).val(chosenJobName);
      $('#gj_job_search_textfield', footer).focus();
    }
    return footer;
  };
  GoldJobs.getJobIconHeaderCell = function (showGold, showSilver) {
    var hiddenImageOpacity = this.hiddenImageOpacity;
    var shownImageOpacity = this.shownImageOpacity;
    return '<img src="../images/jobs/featured/goldjob.png" style="width: 15px; opacity: ' + (showGold ? shownImageOpacity : hiddenImageOpacity) + '; " onclick="javascript:GoldJobs.onJobIconFilterClick(&quot;gold&quot;, $(this))">+\t\t\t\t<img src="../images/jobs/featured/silverjob.png" style="width: 15px; opacity: '
    + (showSilver ? shownImageOpacity : hiddenImageOpacity) + '; " onclick="javascript:GoldJobs.onJobIconFilterClick(&quot;silver&quot;, $(this))">'
  };
  GoldJobs.onJobIconFilterClick = function (type, element) {
    var hiddenImageOpacity = this.hiddenImageOpacity;
    var shownImageOpacity = this.shownImageOpacity;
    var disabled = ($(element).css('opacity') != shownImageOpacity);
    if (type == 'gold') {
      this.preferences.showGold = disabled;
    } else {
      this.preferences.showSilver = disabled;
    }
    $(element).css('opacity', (disabled ? hiddenImageOpacity : shownImageOpacity));
    this.refreshWindow();
  };
  GoldJobs.getAllTiles = function (callback) {
    Ajax.get('map', 'get_minimap', {
    }, function (r) {
      if (r.error) {
        console.log(r.error);
        return;
      }
      var result = [
      ];
      var jobGroups = r.job_groups,
      i,
      j;
      for (i in jobGroups) {
        for (j in jobGroups[i]) {
          var coords = jobGroups[i][j];
          var xTile = Math.floor(coords[0] / Map.tileSize);
          var yTile = Math.floor(coords[1] / Map.tileSize);
          if (!result.hasOwnProperty(xTile)) {
            result[xTile] = {
            };
          }
          result[xTile][yTile] = 1;
        }
      }
      GoldJobs.tilesWithJobs = result;
      callback();
    });
  };
  GoldJobs.getFilteredData = function (chosenJobName, showSilver, showGold, sortByName, sortByDistance) {
    chosenJobName = chosenJobName.toLowerCase();
    var jobs = Map.JobHandler.Featured;
    var k,
    jobId,
    job,
    t,
    j;
    var result = [
    ];
    for (k in jobs) {
      var jobPlace = jobs[k];
      for (jobId in jobPlace) {
        job = JobList.getJobById(jobId);
        j = jobPlace[jobId];
        if ((j.silver && !showSilver) || (j.gold && !showGold)) {
          continue;
        }
        if (chosenJobName != '' && job.name.toLowerCase().indexOf(chosenJobName) < 0) {
          continue;
        }
        result.push({
          jobId: jobId,
          x: j.x,
          y: j.y,
          name: job.name,
          shortname: job.shortname,
          gold: j.gold,
          distance: this.calculateDistance(j.x, j.y)
        });
      }
    }
    var nameSortFunctionReversed = function (o1, o2) {
      var t1 = o1.name.toUpperCase();
      var t2 = o2.name.toUpperCase();
      return (t1 > t2) ? - 1 : (t1 < t2) ? 1 : 0;
    };
    var distanceSortFunctionReversed = function (o1, o2) {
      var t1 = parseInt(o1.distance);
      var t2 = parseInt(o2.distance);
      return (t1 > t2) ? - 1 : (t1 < t2) ? 1 : 0;
    };
    var nameSortFunction = function (o1, o2) {
      var t1 = o1.name.toUpperCase();
      var t2 = o2.name.toUpperCase();
      return (t1 < t2) ? - 1 : (t1 > t2) ? 1 : 0;
    };
    var distanceSortFunction = function (o1, o2) {
      var t1 = o1.distance;
      var t2 = o2.distance;
      return (t1 < t2) ? - 1 : (t1 > t2) ? 1 : 0;
    };
    if (sortByName != 0) {
      if (sortByName == 1) {
        result.sort(nameSortFunction);
      } else {
        result.sort(nameSortFunctionReversed);
      }
    } else if (sortByDistance != 0) {
      if (sortByDistance == 1) {
        result.sort(distanceSortFunction);
      } else {
        result.sort(distanceSortFunctionReversed);
      }
    }
    return result;
  };
  GoldJobs.makeJobsTable = function (chosenJobName, showSilver, showGold, sortByName, sortByDistance) {
    chosenJobName = chosenJobName || '';
    var arrow_desc = '&nbsp;<img src="../images/window/jobs/sortarrow_desc.png"/>';
    var arrow_asc = '&nbsp;<img src="../images/window/jobs/sortarrow_asc.png"/>';
    var footer = this.buildFooter(chosenJobName);
    var table = this.gui.makeTable();
    var data = this.getFilteredData(chosenJobName, showSilver, showGold, sortByName, sortByDistance);
    var k,
    j;
    table.addColumn('jobIcon', 'jobIcon').addColumn('jobName', 'jobName').addColumn('distanceTime', 'distanceTime').addColumn('startJob', 'startJob').appendToCell('head', 'jobIcon', this.getJobIconHeaderCell(showGold, showSilver)).appendToCell('head', 'jobName', lang.jobName + (sortByName == 1 ? arrow_asc : sortByName == - 1 ? arrow_desc : '')).appendToCell('head', 'distanceTime', lang.distanceTime + (sortByDistance == 1 ? arrow_asc : sortByDistance == - 1 ? arrow_desc : '')).appendToCell('head', 'startJob', '');
    $.each(data, function (k, j) {
      table.appendRow().appendToCell( - 1, 'jobIcon', GoldJobs.getJobIcon(j.jobId, j.x, j.y, j.shortname, j.gold)).appendToCell( - 1, 'jobName', j.name).appendToCell( - 1, 'distanceTime', j.distance.formatDuration()).appendToCell( - 1, 'startJob', GoldJobs.getEnqueueButton(j.jobId, j.x, j.y));
    });
    table.appendToFooter('jobIcon', footer);
    return table;
  };
  GoldJobs.refreshWindow = function () {
    GoldJobs.preferences.jobName = $('#gj_job_search_textfield').val();
    var newTable = GoldJobs.makeJobsTable(GoldJobs.preferences.jobName, GoldJobs.preferences.showSilver, GoldJobs.preferences.showGold, GoldJobs.preferences.sortByName, GoldJobs.preferences.sortByDistance);
    $('.goldenJobs .fancytable').remove();
    $('.jobwindow').prepend(newTable.getMainDiv());
    GoldJobs.addColumnsCss();
    GoldJobs.addFilterEvent();
    GoldJobs.addHeaderEvents();
    $('#gj_job_search_textfield').focus();
    var val = $('#gj_job_search_textfield').val();
    $('#gj_job_search_textfield').val('');
    $('#gj_job_search_textfield').val(val);
  };
  GoldJobs.addFilterEvent = function () {
    var f = function () {
      if (GoldJobs.filterTimeout != undefined) {
        clearTimeout(GoldJobs.filterTimeout);
      }
      GoldJobs.filterTimeout = setTimeout(function () {
        GoldJobs.refreshWindow();
      }, 500);
    };
    $('#gj_job_search_textfield').keypress(f);
    $('#gj_job_search_textfield').change(f);
  };
  GoldJobs.addHeaderEvents = function () {
    $('.goldenJobs .row_head .jobName').click(function () {
      GoldJobs.preferences.sortByName = GoldJobs.preferences.sortByName == 1 ? - 1 : 1;
      GoldJobs.preferences.sortByDistance = 0;
      GoldJobs.refreshWindow();
    });
    $('.goldenJobs .row_head .distanceTime').click(function () {
      GoldJobs.preferences.sortByName = 0;
      GoldJobs.preferences.sortByDistance = GoldJobs.preferences.sortByDistance == 1 ? - 1 : 1;
      GoldJobs.refreshWindow();
    });
  };
  GoldJobs.getMessageDialog = function (text, type, title) {
    title = title || '';
    if (type == 'warning') {
      type = west.gui.Dialog.SYS_WARNING;
    }
    if (type == 'question') {
      type = west.gui.Dialog.SYS_QUESTION;
    }
    return new west.gui.Dialog(text, title, type);
  };
  GoldJobs.getSelectBox = function () {
    var onLoad = function () {
      GoldJobs.openWindow();
      GoldJobs.dataLoaded = true;
    };
    var listener = function (k) {
      switch (k) {
        case 'feedback':
          GoldJobs.openFeedbackWindow();
          break;
        case 'open':
          if (!GoldJobs.hasOwnProperty('tilesWithJobs')) {
            new UserMessage(lang.loading, UserMessage.TYPE_SUCCESS).show();
            GoldJobs.getAllTiles(function () {
              GoldJobs.parseWholeMap(GoldJobs.tilesWithJobs, onLoad);
            });
          } else {
            onLoad();
          }
          break;
        case 'refresh':
          new UserMessage(lang.loading, UserMessage.TYPE_SUCCESS).show();
          if (!GoldJobs.hasOwnProperty('tilesWithJobs')) {
            GoldJobs.getAllTiles(function () {
              GoldJobs.parseWholeMap(GoldJobs.tilesWithJobs, onLoad);
            });
          } else {
            GoldJobs.parseWholeMap(GoldJobs.tilesWithJobs, onLoad);
          }
          break;
      }
    };
    this.selectBox = this.gui.makeSelectbox().setWidth(150).addListener(listener).addItem('open', lang.openWindowTitle).addItem('refresh', lang.refreshTitle).addItem('feedback', lang.feedbackTitle);
    return this.selectBox;
  };
  GoldJobs.toggleSelectbox = function () {
    var wrapPosition = GoldJobs.selectBox.divWrap.position();
    var isShown = (wrapPosition.left != 0 && wrapPosition.top != 0);
    if (isShown) {
      GoldJobs.selectBox.hide();
    } else {
      GoldJobs.selectBox.show();
    }
  };
  GoldJobs.init = function () {
    var selectbox = this.getSelectBox();
    var div = $('<div class="ui_menucontainer">/');
    var link = $('<div class="menulink" style="background: url(../images/map/icons/jobicon.png);background-position: -4px -3px;"></div>');
    link.click(function () {
      GoldJobs.toggleSelectbox();
    });
    div.append(link);
    div.append('<div class="loptions"></div><div class="menucontainer_bottom"></div>');
    $('#ui_menubar').append(div);
    this.setSelectboxPosition(div);
  };
  GoldJobs.setSelectboxPosition = function (nextTo) {
    var p = $(nextTo).offset();
    p.left -= GoldJobs.selectBox.divMain.width() + 150 + 15;
    GoldJobs.selectBox.divWrap.offset(p);
    GoldJobs.selectBox.divWrap.css('position', 'absolute');
  };
  GoldJobs.jobsDataToString = function (chosenJobName) {
    chosenJobName = chosenJobName.toLowerCase();
    var str = '';
    var jobs = Map.JobHandler.Featured;
    var k,
    jobId,
    job,
    t,
    j;
    for (k in jobs) {
      var jobPlace = jobs[k];
      for (jobId in jobPlace) {
        job = JobList.getJobById(jobId);
        if (chosenJobName != '' && job.name.toLowerCase().indexOf(chosenJobName) < 0) continue;
        j = jobPlace[jobId];
        t = j.gold ? 'gold' : 'silver';
        str += job.name + '; ' + t + '; x: ' + j.x + '; y: ' + j.y + '\n';
      }
    }
    return str;
  };
  GoldJobs.jobsDataToBbString = function (chosenJobName) {
    chosenJobName = chosenJobName.toLowerCase();
    var str = '';
    var jobs = Map.JobHandler.Featured;
    var k,
    jobId,
    job,
    color,
    j;
    for (k in jobs) {
      var jobPlace = jobs[k];
      for (jobId in jobPlace) {
        job = JobList.getJobById(jobId);
        if (chosenJobName != '' && job.name.toLowerCase().indexOf(chosenJobName) < 0) continue;
        j = jobPlace[jobId];
        color = j.gold ? GoldJobs.goldJobBbColor : GoldJobs.silverJobBbColor;
        str += '[img]http://www.the-west.ru/images/jobs/' + job.shortname + '.png[/img][b][color=' + color + ']' + job.name + '[/color][/b] (' + j.x + '; ' + j.y + ')' + '\n';
      }
    }
    return str;
  };
  GoldJobs.showExportWindow = function (jobs, isBb) {
    var textarea = '<textarea style="height: 100px; width: 400px; background-color: transparent; border-width: 0px;" onclick="$(this).select()">' + jobs + '</textarea>';
    var md = GoldJobs.getMessageDialog(lang.exportButtonTitle, '', textarea);
    var jobName = $('#gj_job_search_textfield').val();
    if (isBb) {
      md.addButton(lang.plainText, function () {
        var jobs = GoldJobs.jobsDataToString(jobName);
        GoldJobs.showExportWindow(jobs + lang.generatedBy, false);
      });
    } else {
      md.addButton(lang.bbCode, function () {
        var jobs = GoldJobs.jobsDataToBbString(jobName);
        GoldJobs.showExportWindow(jobs + lang.generatedByBb, true);
      });
    }
    md.addButton('ok').show();
  };
  GoldJobs.openFeedbackWindow = function () {
    var content = $('<div id=\'feedback_window_div\'/>');
    var win = wman.open('goldenJobsFeedback').setSize(550, 350).setMiniTitle(lang.feedbackWindowTitle).setTitle(lang.feedbackWindowTitle);
    content.append('<br>' + lang.feedbackDescription + '<br><br><br><b>' + lang.contact
    + ':</b><ul style="margin-left:15px;"><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="http://forum.the-west.de/private.php?do=newpm&u=24502">deutsches Forum</a> / '
    + '<a target=\'_blanck\' href="http://forum.the-west.net/private.php?do=newpm&u=37219">English forum</a> / <a target=\'_blanck\' href="http://forum.the-west.pl/private.php?do=newpm&u=32083">forum polski</a> / '
    + '<a target=\'_blanck\' href="http://forum.the-west.es/private.php?do=newpm&u=13770">foro español</a> /<br>/ <a target=\'_blanck\' href="http://forum.the-west.ru/private.php?do=newpm&u=27430">России форум</a> / '
    + '<a target=\'_blanck\' href="http://forum.the-west.fr/private.php?do=newpm&u=17783">forum français</a> / <a target=\'_blanck\' href="http://forum.the-west.it/private.php?do=newpm&u=14287">forum italiano</a> / '
    + '<a target=\'_blanck\' href="http://forum.beta.the-west.net/private.php?do=newpm&u=4072">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>');
    win.appendToContentPane(content);
  };
  GoldJobs.addNotification = function (title, jobId, jobX, jobY) {
    var n = new OnGoingEntry();
    n.init('', function () {
      Map.JobHandler.openJob(jobId, {
        x: jobX,
        y: jobY
      });
    }, 1);
    n.setTooltip('<b>' + title + '</b>', true);
    WestUi.NotiBar.add(n);
    var icon = JobList.getJobById(jobId).shortname;
    $(n.getMainDiv()).find('.image').css({
      'background-image': 'url(../images/jobs/' + icon + '.png)',
      'background-position': '-11px -9px'
    });
  };
  GoldJobs.getGameVersion = function () {
    return TheWestApi.version;
  };
  GoldJobs.isGameVersionSupported = function () {
    var gameVersion = this.getGameVersion();
    return (gameVersion >= this.minGame) && (gameVersion <= this.maxGame);
  };
  GoldJobs.gui = {
  };
  GoldJobs.gui.init = function () {
    GoldJobs.gui.makeButton = function (caption, callback) {
      return new west.gui.Button(caption, callback);
    };
    GoldJobs.gui.makeTextfield = function (id) {
      return new west.gui.Textfield(id);
    };
    GoldJobs.gui.makeTable = function () {
      return new west.gui.Table();
    };
    GoldJobs.gui.makeSelectbox = function () {
      return new west.gui.Selectbox();
    };
  };
  GoldJobs.Updater = function () {
    $.getScript(GoldJobs.updateUrl);
  };
  GoldJobs.compareVersions = function (actualVersion) {
    if (actualVersion > GoldJobs.version) {
      var updateMessage = new west.gui.Dialog(lang.update + ': ' + GoldJobs.name, lang.updateAvailable + ': v' + actualVersion, west.gui.Dialog.SYS_WARNING).addButton(lang.update, function () {
        updateMessage.hide();
        location.href = GoldJobs.website + '/code.user.js';
      }).addButton(lang.cancel, function () {
      }).show();
    }
  };
  $(document).ready(function () {
    try {
      GoldJobs.gui.init();
      GoldJobs.init();
      GoldJobs.Updater();
    } catch (e) {
      console.log(e.stack);
    }
  });
});