Greasy Fork is available in English.

Kick-o-matic

Ускоряет процесс раздачи погон (Acelera el proceso de asignación de rangos en batallas)

// ==UserScript==
// @name 	Kick-o-matic
// @description Ускоряет процесс раздачи погон (Acelera el proceso de asignación de rangos en batallas)
// @author  	Macabre2077 (script, RU)
// @author  	tw81 (Italian translation)
// @author  	pepe100 (Spanish translation)
// @author  	Tanais (Dutch and English translations)
// @author  	jccwest (Portuguese localisation)
// @author  	Surge (Slovak localisation)
// @author  	Darius II  (Polish localisation)
// @version 	1.6.1
// @include 	http://*.the-west.*/game.php*
// @namespace   http://forum.the-west.ru/showthread.php?t=18398

// @history		1.6 2.03 version compatibility
// @history		1.5 Polish translation
// @history		1.44 Italian translation
// @history		1.43 Multiple forts support
// @history		1.40 The West 2.0 compatibility
// @history		1.39 Disabling script before fixing bugs caused by 2.0
// @history		1.38 Slovak translation
// @history		1.37 Portuguese localisation
// @history		1.36 1.36 version bugfix
// @history		1.32 Translations: Spanish and Italian
// @history		1.3 Translations: english, dutch!
// @history		1.3 Bugfix: selected player stays highlighted
// @history		1.2 old popup redesign,added compact version of popup,  weapon accordance, intro
// @history		1.18 bugfix
// @history		1.15 fixed bug when one player`s data can`t be shown
// @history		1.15 prevents too long loading
// @history		1.1 new design
// @history		1.1 force chat to show ranks
// @history		1.1 bug fixes
// @history		1.000 players` hp (without lists) and town name
// @history		0.995 lists without {}
// @history		0.995 update hp list button
// @history		0.992 small bugfix
// @history		0.99 players` hp
// @history		0.98 player`s position is being highlihted when popup is shown
// @history		0.97 ally`s name is shown
// @history		0.96 new script`s name,added namespace
// @history		0.95 new feature fully completed
// @history		0.94 testing new feature - showing name of sector instead of numeric fort position
// @history		0.93 fixed bug caused by empty fort weapon
// @history		0.92 fixed mulitply battles error
// ==/UserScript==

/* Todo:
 Any good ideas?
 */


function exec(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
}

exec(function() {

    Grander = {
        "scriptName": "Kick-o-Matic",
        "scriptId": "96262",
        "version": 1.6,
        "checkFileUrl": "http://macabre2077.koding.com/userscripts/the-west/kickomatic/getVersion.php",
        "scriptSite": "http://userscripts-mirror.org/scripts/show/96262",
        "loading": false,
        "fortsCapacity": [[50, 42], [100, 84], [140, 120]],
        "betaFortsCapacity": [[25, 21], [50, 42], [70, 60]],
        weapons: []
    };
    Grander.consoleError = function(error) {
        try {
            throw new Error(error);
        } catch (e) {
            console.log(e.stack);
        }
    };
    Grander.checkEnemies = function() {
        if (window.location.href.match("ru1") && [67, 634].indexOf(Chat.MyClient.allianceId) >= 0) {
            new UserMessage("verification failed", {type: "fail"}).show();
            window.Grander = undefined;
        }
    };
    Grander.intro = function() {
// localStorage.setItem('KoM.version' , 0.998);
//        if (localStorage.getItem('KoM.version') >= Grander.version)
//            return;
//        localStorage.setItem('KoM.version', Grander.version);
//        var title = 'Kick-o-Matic, ' + Grander.lang.version + ' ' + Grander.version;
//        var text = Grander.lang.changelist + ':<br/><ul>';
////        switch (Grander.getLocale()) {
////            case "ru_RU":
////                text += '<li>Совместимость с версией 2.03</li>';
////                text += '<li><small>Так же может заинтересовать:</small> <a href="http://userscripts-mirror.org/scripts/show/154884" target="_blank">TW Gold Jobs Finder - поиск золотых и сереряных работ</a></li>';
////                break;
////            default:
////                text += '<li>2.03 compatibility</li>';
////                text += '<li>Check this out: <a href="http://userscripts-mirror.org/scripts/show/154884" target="_blank">TW Gold Jobs Finder</a></li>';
////                break;
////        }
//        text += '</ul>';
//        Grander.mb = new west.gui.Dialog(title).addButton("ОК").setId('GranderUpdated');
//        Grander.mb.setText(text).show();
    };
    Grander.init = function() {
        Grander.coords = {"attack": {0: 0, 1: 0, 2: 0, 34: 0, 35: 0, 36: 0, 68: 0, 69: 0, 70: 0, 102: 0, 103: 0, 104: 0, 136: 0, 137: 0, 138: 0, 170: 0, 171: 0, 172: 0, 204: 0, 205: 0, 206: 0, 238: 0, 239: 0, 240: 0, 272: 0, 273: 0, 274: 0, 306: 0, 307: 0, 308: 0, 340: 0, 341: 0, 342: 0, 374: 1, 375: 1, 376: 1, 408: 1, 409: 1, 410: 1, 442: 1, 443: 1, 444: 1, 476: 1, 477: 1, 478: 1, 510: 1, 511: 1, 512: 1, 544: 1, 545: 1, 546: 1, 578: 1, 579: 1, 580: 1, 612: 1, 613: 1, 614: 1, 646: 1, 647: 1, 648: 1, 680: 1, 681: 1, 682: 1, 714: 2, 748: 2, 782: 2, 715: 2, 749: 2, 783: 2, 716: 2, 750: 2, 784: 2, 717: 2, 751: 2, 785: 2, 718: 2, 752: 2, 786: 2, 719: 2, 753: 2, 787: 2, 720: 2, 754: 2, 788: 2, 721: 2, 755: 2, 789: 2, 722: 2, 756: 2, 790: 2, 723: 2, 757: 2, 791: 2, 724: 2, 758: 2, 792: 2, 725: 3, 759: 3, 793: 3, 726: 3, 760: 3, 794: 3, 727: 3, 761: 3, 795: 3, 728: 3, 762: 3, 796: 3, 729: 3, 763: 3, 797: 3, 730: 3, 764: 3, 798: 3, 731: 3, 765: 3, 799: 3, 732: 3, 766: 3, 800: 3, 733: 3, 767: 3, 801: 3, 734: 3, 768: 3, 802: 3, 735: 3, 769: 3, 803: 3, 736: 4, 770: 4, 804: 4, 737: 4, 771: 4, 805: 4, 738: 4, 772: 4, 806: 4, 739: 4, 773: 4, 807: 4, 740: 4, 774: 4, 808: 4, 741: 4, 775: 4, 809: 4, 742: 4, 776: 4, 810: 4, 743: 4, 777: 4, 811: 4, 744: 4, 778: 4, 812: 4, 745: 4, 779: 4, 813: 4, 746: 4, 747: 4, 780: 4, 781: 4, 814: 4, 815: 4, 405: 5, 406: 5, 407: 5, 439: 5, 440: 5, 441: 5, 473: 5, 474: 5, 475: 5, 507: 5, 508: 5, 509: 5, 541: 5, 542: 5, 543: 5, 575: 5, 576: 5, 577: 5, 609: 5, 610: 5, 611: 5, 643: 5, 644: 5, 645: 5, 677: 5, 678: 5, 679: 5, 711: 5, 712: 5, 713: 5, 31: 6, 32: 6, 33: 6, 65: 6, 66: 6, 67: 6, 99: 6, 100: 6, 101: 6, 133: 6, 134: 6, 135: 6, 167: 6, 168: 6, 169: 6, 201: 6, 202: 6, 203: 6, 235: 6, 236: 6, 237: 6, 269: 6, 270: 6, 271: 6, 303: 6, 304: 6, 305: 6, 337: 6, 338: 6, 339: 6, 371: 6, 372: 6, 373: 6}, 0: {178: 7, 179: 7, 180: 7, 212: 7, 213: 7, 214: 7, 246: 7, 247: 7, 248: 7, 193: 8, 194: 8, 195: 8, 227: 8, 228: 8, 229: 8, 261: 8, 262: 8, 263: 8, 450: 9, 451: 9, 452: 9, 484: 9, 485: 9, 486: 9, 518: 9, 519: 9, 520: 9, 465: 10, 466: 10, 467: 10, 499: 10, 500: 10, 501: 10, 533: 10, 534: 10, 535: 10, 291: 11, 292: 11, 293: 11, 325: 11, 326: 11, 327: 11, 393: 13, 394: 13, 395: 13, 427: 13, 428: 13, 429: 13, 318: 12, 319: 12, 352: 12, 353: 12, 386: 12, 387: 12, 215: 14, 216: 14, 217: 14, 218: 14, 219: 14, 220: 14, 221: 14, 222: 14, 223: 14, 224: 14, 225: 14, 226: 14, 487: 15, 488: 15, 489: 15, 490: 15, 491: 15, 494: 15, 495: 15, 496: 15, 497: 15, 498: 15, 281: 16, 315: 16, 349: 16, 383: 16, 417: 16, 296: 17, 330: 17, 364: 17, 398: 17, 432: 17, 492: 18, 493: 18, 287: 19, 288: 19, 289: 19, 290: 19, 321: 19, 322: 19, 323: 19, 324: 19, 355: 19, 356: 19, 357: 19, 358: 19, 389: 19, 390: 19, 391: 19, 392: 19}, 1: {143: 7, 144: 7, 145: 7, 177: 7, 178: 7, 179: 7, 211: 7, 212: 7, 213: 7, 160: 8, 161: 8, 162: 8, 194: 8, 195: 8, 196: 8, 228: 8, 229: 8, 230: 8, 483: 9, 484: 9, 485: 9, 517: 9, 518: 9, 519: 9, 551: 9, 552: 9, 553: 9, 500: 10, 501: 10, 502: 10, 534: 10, 535: 10, 536: 10, 568: 10, 569: 10, 570: 10, 326: 11, 327: 11, 328: 11, 360: 11, 361: 11, 362: 11, 385: 13, 386: 13, 387: 13, 419: 13, 420: 13, 421: 13, 250: 12, 251: 12, 284: 12, 285: 12, 318: 12, 319: 12, 180: 14, 181: 14, 182: 14, 183: 14, 184: 14, 185: 14, 186: 14, 187: 14, 188: 14, 189: 14, 190: 14, 191: 14, 192: 14, 193: 14, 520: 15, 521: 15, 522: 15, 523: 15, 524: 15, 525: 15, 528: 15, 529: 15, 530: 15, 531: 15, 532: 15, 533: 15, 246: 16, 280: 16, 314: 16, 348: 16, 382: 16, 416: 16, 450: 16, 263: 17, 297: 17, 331: 17, 365: 17, 399: 17, 433: 17, 467: 17, 526: 18, 527: 18, 287: 19, 288: 19, 289: 19, 290: 19, 321: 19, 322: 19, 323: 19, 324: 19, 355: 19, 356: 19, 357: 19, 358: 19, 389: 19, 390: 19, 391: 19, 392: 19}, 2: {108: 7, 109: 7, 110: 7, 142: 7, 143: 7, 144: 7, 176: 7, 177: 7, 178: 7, 127: 8, 128: 8, 129: 8, 161: 8, 162: 8, 163: 8, 195: 8, 196: 8, 197: 8, 516: 9, 517: 9, 518: 9, 550: 9, 551: 9, 552: 9, 584: 9, 585: 9, 586: 9, 535: 10, 536: 10, 537: 10, 569: 10, 570: 10, 571: 10, 603: 10, 604: 10, 605: 10, 258: 12, 259: 12, 292: 12, 293: 12, 326: 12, 327: 12, 395: 11, 396: 11, 429: 11, 430: 11, 463: 11, 464: 11, 384: 13, 385: 13, 386: 13, 418: 13, 419: 13, 420: 13, 145: 14, 146: 14, 147: 14, 148: 14, 149: 14, 150: 14, 151: 14, 152: 14, 153: 14, 154: 14, 155: 14, 156: 14, 157: 14, 158: 14, 159: 14, 160: 14, 553: 15, 554: 15, 555: 15, 556: 15, 557: 15, 558: 15, 559: 15, 562: 15, 563: 15, 564: 15, 565: 15, 566: 15, 567: 15, 568: 15, 211: 16, 245: 16, 279: 16, 313: 16, 347: 16, 381: 16, 415: 16, 449: 16, 483: 16, 230: 17, 264: 17, 298: 17, 332: 17, 366: 17, 400: 17, 434: 17, 468: 17, 502: 17, 560: 18, 561: 18, 287: 19, 288: 19, 289: 19, 290: 19, 321: 19, 322: 19, 323: 19, 324: 19, 355: 19, 356: 19, 357: 19, 358: 19, 389: 19, 390: 19, 391: 19, 392: 19}};
        Grander.langs = {
            "ru_RU": {
                "success": "Лычка дана!",
                "error": "Произошла ошибка",
                "cancel": "Отмена",
                "showPlayerOnMap": "Показать игрока на карте",
                "showTown": "Посмотреть город",
                "nodata": "Информация о званиях не загружена для данного форта!",
                "getData": "Пытаемся загрузить данные о званиях",
                "errorTimeout": "Загрузка происходит слишком долго",
                "ascpt": "Произвести в капитаны",
                "asprivate": "Назначить рядовым",
                "asrecruit": "Взять в рекруты",
                "asreservist": "Записать в резерв",
                "astraitor": "Обвинить в предательстве",
                "youcant": "<br/>Ты не можешь понизить старшего<br/> или равного по званию.",
                "position": "Позиция:",
                "pos_undefined": "не установлена",
                "noally": "Без альянса",
                "flag": "Флаг",
                "inside": "Внутри форта",
                "classes": {
                    "soldier": "Солдат",
                    "duelist": "Дуэлянт",
                    "adventurer": "Авантюрист",
                    "worker": "Трудяга",
                    "greenhorn": "Чечако"
                },
                "ranks": {
                    "traitor": "Предатель",
                    "reservist": "Резервист",
                    "recruit": "Рекрут",
                    "private_": "Рядовой",
                    "captain": "Капитан",
                    "general": "Генерал"
                },
                "sectors": {
                    "undefined": "Не назначена",
                    0: "Левый верхний сектор",
                    1: "Левый нижний сектор",
                    2: "Левый южный сектор",
                    3: "Центральный южный сектор",
                    4: "Правый южный сектор",
                    5: "Правый нижний сектор",
                    6: "Правый верхний сектор", /* attack */
                    7: "Башня авантов",
                    8: "Башня дуэлянтов",
                    9: "Башня солдат",
                    10: "Башня трудяг",
                    11: "Казарма",
                    12: "Склад",
                    13: "Штаб",
                    14: "Северная стена",
                    15: "Южная стена",
                    16: "Западная стена",
                    17: "Восточная стена",
                    18: "Ворота",
                    19: "Флаг",
                    20: "Внутри форта"
                },
                "damage": "урон",
                "version": "версия",
                "changelist": "Список изменений",
                // new in 1.40
                "update_available": "Доступна новая версия скрипта Kick-o-Matic",
                "update_question": "Вы можете скачать новую версию с сайта userscripts.org. Перейти?"
            },
            "nl_NL": {
                "success": "Rang wordt gegeven!",
                "error": "Er is een fout opgetreden",
                "cancel": "Annuleren",
                "showPlayerOnMap": "Laat speler zien op de map",
                "showTown": "Bekijk stad",
                "nodata": "Informatie over rangen is niet gegeven voor het fort!",
                "getData": "Ranginformatie aan het laden",
                "errorTimeout": "Het downloaden duurde te lang",
                "ascpt": "Tot kapitein bevorderen",
                "asprivate": "Tot soldaat benoemen",
                "asrecruit": "Tot rekruut benoemen",
                "asreservist": "Tot reservist benoemen",
                "astraitor": "Markeren als verrader",
                "youcant": "Je kan geen spelers met dezelfde of een hogere rang rekruteren.",
                "position": "Positie:",
                "pos_undefined": "Geen startpositie",
                "noally": "Geen alliantie",
                "flag": "Vlag",
                "inside": "Binnen het fort",
                "classes": {
                    "soldier": "Soldaat",
                    "duelist": "Duellant",
                    "adventurer": "Avonturier",
                    "worker": "Arbeider",
                    "greenhorn": "Greenhorn"
                },
                "ranks": {
                    "traitor": "Verrader",
                    "reservist": "Reservist",
                    "recruit": "Rekruut",
                    "private_": "Soldaat",
                    "captain": "Kapitein",
                    "general": "Generaal"
                },
                "sectors": {
                    "undefined": "Geen startpositie",
                    0: "De sector links boven",
                    1: "De centraal linker sector",
                    2: "De sector linksonder",
                    3: "De sector midden onder",
                    4: "De sector rechtsonder",
                    5: "De centraal rechter sector",
                    6: "De sector rechtsboven", /* attack */
                    7: "Avonturierstoren",
                    8: "Duellantentoren",
                    9: "Soldatentoren",
                    10: "Arbeiderstoren",
                    11: "Kazerne",
                    12: "Opslagplaats",
                    13: "Hoofdgebouw",
                    14: "Bovenmuur",
                    15: "Ondermuur",
                    16: "Linkermuur",
                    17: "Rechtermuur",
                    18: "Poort",
                    19: "Vlag",
                    20: "In het fort"
                },
                "damage": "schade",
                "version": "versie",
                "changelist": "Lijst van wijzigingen",
                // new in 1.40
                "update_available": "Kick-o-Matic update available",
                "update_question": "You can download the lastest version from userscripts.org. Visit the site?"
            },
            "en_US": {
                "success": "Rank is given!",
                "error": "An error has occured",
                "cancel": "Cancel",
                "showPlayerOnMap": "Show player on map",
                "showTown": "View town",
                "nodata": "Couldn't load rank information for the fort",
                "getData": "Loading rank information",
                "errorTimeout": "The loading took too much time",
                "ascpt": "Promote to captain",
                "asprivate": "Appoint as private",
                "asrecruit": "Appoint as recruit",
                "asreservist": "Appoint as reservist",
                "astraitor": "Mark as traitor",
                "youcant": "You can't demote fighters of the same or higher rank.",
                "position": "Position:",
                "pos_undefined": "No starting position",
                "noally": "No alliance",
                "flag": "Flag",
                "inside": "Inside the fort",
                "classes": {
                    "soldier": "Soldier",
                    "duelist": "Dueller",
                    "adventurer": "Adventurer",
                    "worker": "Worker",
                    "greenhorn": "Greenhorn"
                },
                "ranks": {
                    "traitor": "Traitor",
                    "reservist": "Reservist",
                    "recruit": "Recruit",
                    "private_": "Soldier",
                    "captain": "Captain",
                    "general": "General"
                },
                "sectors": {
                    "undefined": "No starting position",
                    0: "The upper-left sector",
                    1: "The lower-left sector",
                    2: "The central left sector",
                    3: "The lower central sector",
                    4: "The central right sector",
                    5: "The lower-right sector",
                    6: "The upper-right sector", /* attack */
                    7: "Adventurer's tower",
                    8: "Dueller's tower",
                    9: "Soldier's tower",
                    10: "Worker's tower",
                    11: "Barracks",
                    12: "Resource stock",
                    13: "Headquarters",
                    14: "North wall",
                    15: "South wall",
                    16: "West wall",
                    17: "East wall",
                    18: "Gate",
                    19: "Flag",
                    20: "Inside the fort"
                },
                "damage": "damage",
                "version": "version",
                "changelist": "Changelog",
                // new in 1.40
                "update_available": "Kick-o-Matic update available",
                "update_question": "You can download the lastest version from userscripts.org. Visit the site?"
            },
            "es_ES": {
                "success": "Rango asignado!",
                "error": "Un error ha ocurrido",
                "cancel": "Cancelar",
                "showPlayerOnMap": "Mostrar jugador en el mapa",
                "showTown": "Ver ciudad",
                "nodata": "No se puede cargar la información de rango para el fuerte",
                "getData": "Información del rango cargada",
                "errorTimeout": "La carga tomó demasiado tiempo",
                "ascpt": "Promocionar a capitán",
                "asprivate": "Designar como privado",
                "asrecruit": "Designar como recluta",
                "asreservist": "Designar como reservista",
                "astraitor": "Marcar como traidor",
                "youcant": "No se pueden disminuir los combatientes con igual o superior rango.",
                "position": "Posición:",
                "pos_undefined": "Sin posición de partida",
                "noally": "Sin alianza",
                "flag": "Bandera",
                "inside": "Dentro del fuerte",
                "classes": {
                    "soldier": "Soldado",
                    "duelist": "Duelista",
                    "adventurer": "Aventurero",
                    "worker": "Trabajador",
                    "greenhorn": "Novato"
                },
                "ranks": {
                    "traitor": "Traidor",
                    "reservist": "Reservista",
                    "recruit": "Recluta",
                    "private_": "Soldado",
                    "captain": "Capitán",
                    "general": "General"
                },
                "sectors": {
                    "undefined": "Sin posición de partida",
                    0: "El sector superior izquierdo",
                    1: "El sector central izquierdo",
                    2: "El sector inferior izquierdo",
                    3: "El sector central inferior",
                    4: "El sector inferior derecho",
                    5: "El sector central derecho",
                    6: "El sector superior derecho", /* ataque */
                    7: "Torre Aventureros",
                    8: "Torre Duelistas",
                    9: "Torre Soldados",
                    10: "Torre Trabajadores",
                    11: "Barracas",
                    12: "Almacén de recursos",
                    13: "Cuartel general",
                    14: "Muralla Norte",
                    15: "Muralla Sur",
                    16: "Muralla Oeste",
                    17: "Muralla Este",
                    18: "Puerta",
                    19: "Bandera",
                    20: "Dentro del fuerte"
                },
                "damage": "daño",
                "version": "versión",
                "changelist": "Historial de cambios",
                // new in 1.40
                "update_available": "Kick-o-Matic actualización disponible",
                "update_question": "Puede descargar la última versión desde greasyfork.org. Visite la web?"
            },
            "it_IT": {
                "success": "Il rango è stato dato!",
                "error": "Si e\' verificato un errore",
                "cancel": "Annulla",
                "showPlayerOnMap": "Centra nella mappa",
                "showTown": "Visita città",
                "nodata": "Impossibile caricare le informazioni di rango per la fortezza",
                "getData": "Caricamento Informazioni rango",
                "errorTimeout": "Il caricamento ha richiesto troppo tempo",
                "ascpt": "Capitano",
                "asprivate": "Soldato Semplice",
                "asrecruit": "Recluta",
                "asreservist": "Riservista",
                "astraitor": "Traditore",
                "youcant": "Non è possibile il reclutamento di giocatori con rango uguale o superiore.",
                "position": "Posizione:",
                "pos_undefined": "Nessuna posizione di partenza",
                "noally": "Nessuna alleanza",
                "flag": "Bandiera",
                "inside": "All\'interno del forte",
                "classes": {
                    "soldier": "Soldato",
                    "duelist": "Duellante",
                    "adventurer": "Avventuriero",
                    "worker": "Lavoratore",
                    "greenhorn": "Novizio"
                },
                "ranks": {
                    "traitor": "Traditore",
                    "reservist": "Riservista",
                    "recruit": "Recluta",
                    "private_": "Soldato semplice",
                    "captain": "Capitano",
                    "general": "Generale"
                },
                "sectors": {
                    "undefined": "Nessuna posizione di partenza",
                    0: " -O1- Il settore superiore sinistro",
                    1: " -O2- Il settore centrale sinistro",
                    2: " -S1- Il settore in basso a sinistra",
                    3: " -S2- Il settore centrale",
                    4: " -S3- Il settore in basso a destra",
                    5: " -E2- Il settore centrale destro",
                    6: " -E1- Il settore superiore destro", /* attacco */
                    7: "Torre avventuriero",
                    8: "Torre duellante",
                    9: "Torre soldato",
                    10: "Torre lavoratore",
                    11: "Caserma",
                    12: "Magazzino",
                    13: "Quartier generale",
                    14: "Muro nord",
                    15: "Muro sud",
                    16: "Muro ovest",
                    17: "Muro est",
                    18: "Cancello",
                    19: "Bandiera",
                    20: "All\'interno del forte"
                },
                "damage": "Danno",
                "version": "Versione",
                "changelist": "Elenco delle modifiche",
                // new in 1.40
                "update_available": "Kick-o-Matic aggiornamento disponibile",
                "update_question": "E ‘possibile scaricare l'ultima versione dal userscripts.org Visitare il sito?"
            },
            "pt_PT": {
                "success": "Classificação é dada!",
                "error": "ocorreu um erro",
                "cancel": "cancelar",
                "showPlayerOnMap": "Mostra jogador no mapa",
                "showTown": "ver cidade",
                "nodata": "não é possível carregar as informações para a classificar o forte",
                "getData": "a carregar informações de classificação",
                "errorTimeout": "o carregamento demorou demasiado tempo",
                "ascpt": "Capitão",
                "asprivate": "Soldado Raso",
                "asrecruit": "Recruta",
                "asreservist": "Reservista",
                "astraitor": "Traidor",
                "youcant": "não é possível dar patente a jogadores com patente igual ou superior.",
                "position": "Posição:",
                "pos_undefined": "Nenhuma posição",
                "noally": "nome da Aliança",
                "flag": "Bandiera",
                "inside": "Dentro da forte",
                "classes": {
                    "soldier": "Soldado",
                    "duelist": "Pistoleiro",
                    "adventurer": "Aventureiro",
                    "worker": "Trabalhador",
                    "greenhorn": "Novato"
                },
                "ranks": {
                    "traitor": "Traidor",
                    "reservist": "Reservista",
                    "recruit": "Recruta",
                    "private_": "Soldado Raso",
                    "captain": "Capitão",
                    "general": "General"
                },
                "sectors": {
                    "undefined": "Não há posição de partida",
                    0: "sector superior esquerdo",
                    1: "sector centro esquerda",
                    2: "sector inferior esquerdo",
                    3: "sector inferior central",
                    4: "sector inferior direito",
                    5: "sector centro direita",
                    6: "sector superior direito", /* ataque */
                    7: "torre dos Aventureiros",
                    8: "torre dos Pistoleiros ",
                    9: "torre dos soldados",
                    10: "torre dos Trabalhadores",
                    11: "Quartel ",
                    12: "Armazém",
                    13: "Quartel Geral ",
                    14: "Muro norte",
                    15: "Muro sul",
                    16: "Muro esquerdo",
                    17: "Muro direito",
                    18: "Portão",
                    19: "Bandeira",
                    20: "Dentro do forte"
                },
                "damage": "Concluído",
                "version": "versão",
                "changelist": "Lista de mudanças",
                // new in 1.40
                "update_available": "Kick-o-Matic update available",
                "update_question": "You can download the lastest version from userscripts.org. Visit the site?"
            },
            "sk_SK": {
                "success": "Hodnosti boli udelené!",
                "error": "Vyskytol sa problém",
                "cancel": "Zavrieť",
                "showPlayerOnMap": "Ukázať hráča na mape",
                "showTown": "Ukázať mesto",
                "nodata": "Informácie pre pevnosť sa nedali načítať",
                "getData": "Načítavanie informácií",
                "errorTimeout": "Načítavanie trvalo príliš dlho",
                "ascpt": "Povýšiť na kapitána",
                "asprivate": "Vymenovať za slobodníka",
                "asrecruit": "Vymenovať za nováčika",
                "asreservist": "Vymenovať za záložnika",
                "astraitor": "Označiť ako zradcu",
                "youcant": "Nemôžeš degradovať bojovníkov s rovnakou alebo vyššou hodnosťou.",
                "position": "Pozícia:",
                "pos_undefined": "nemá zadanú pozíciu",
                "noally": "Bez aliancie",
                "flag": "Vlajka",
                "inside": "V pevnosti",
                "classes": {
                    "soldier": "Vojak",
                    "duelist": "Duelant",
                    "adventurer": "Dobrodruh",
                    "worker": "Pracovník",
                    "greenhorn": "Zelenáč"
                },
                "ranks": {
                    "traitor": "Zradca",
                    "reservist": "Záložník",
                    "recruit": "Nováčik",
                    "private_": "Slobodník",
                    "captain": "Kapitán",
                    "general": "Generál"
                },
                "sectors": {
                    "undefined": "nemá zadanú pozíciu",
                    0: "Horný ľavý sektor",
                    1: "Stredný ľavý sektor",
                    2: "Spodný ľavý sektor",
                    3: "Spodný stredný sektor",
                    4: "Spodný pravý sektor",
                    5: "Stredný pravý sektor",
                    6: "Horný pravý sektor", /* útok */
                    7: "Veža dobrodruhov",
                    8: "Veža duelantov",
                    9: "Veža vojakov",
                    10: "Veža pracovníkov",
                    11: "Kasárne",
                    12: "Sklad",
                    13: "Hlavná budova",
                    14: "Severná hradba",
                    15: "Južná hradba",
                    16: "Západná hradba",
                    17: "Východná hradba",
                    18: "Brána",
                    19: "Vlajka",
                    20: "V pevnosti"
                },
                "damage": "poškodenie",
                "version": "verzia",
                "changelist": "Zmeny",
                // new in 1.40
                "update_available": "Kick-o-Matic update available",
                "update_question": "You can download the lastest version from userscripts.org. Visit the site?"
            },
            "pl_PL": {
                "success": "Ranga została zmieniona!",
                "error": "Wystąpił błąd",
                "cancel": "Anuluj",
                "showPlayerOnMap": "Pokaż gracza na mapie",
                "showTown": "Pokaż miasto",
                "nodata": "Nie można załadować danych fortu",
                "getData": "Pobieranie danych o rangach",
                "errorTimeout": "Zbyt długie ładowanie danych",
                "ascpt": "Awansuj na kapitana",
                "asprivate": "Mianowanie na rezerwistę",
                "asrecruit": "Mianowanie na rekruta",
                "asreservist": "Mianowanie na rezerwistę",
                "astraitor": "Nadaj zdrejcę",
                "youcant": "Nie można zmienić ragi, posiadasz niższą lub taką samą rangę.",
                "position": "Pozycja:",
                "pos_undefined": "Źle ustawiony",
                "noally": "Bez sojuszu",
                "flag": "Flaga",
                "inside": "W forcie",
                "classes": {
                    "soldier": "Żołnierz",
                    "duelist": "Zawadiaka",
                    "adventurer": "Poszukiwacz",
                    "worker": "Budowniczy",
                    "greenhorn": "Nowicjusz"
                },
                "ranks": {
                    "traitor": "Zdrajca",
                    "reservist": "Rezerwista",
                    "recruit": "Rekrut",
                    "private_": "Szeregowiec",
                    "captain": "Kapitan",
                    "general": "Generał"
                },
                "sectors": {
                    "undefined": "Źle ustawiony",
                    0: "Lewy górny - 7",
                    1: "Lewy dolny - 6",
                    2: "Dolny lewy - 5",
                    3: "Dolny środkowy - 4",
                    4: "Dolny Prawy - 3",
                    5: "Prawy dolny - 2",
                    6: "Prawy górny - 1", /* atak */
                    7: "Baszta poszukiwaczy",
                    8: "Baszta zawadiaków",
                    9: "Baszta żołnierzy",
                    10: "Baszta budowniczych",
                    11: "Koszary",
                    12: "Magazyn",
                    13: "Budynek główny",
                    14: "Górny mur",
                    15: "Dolny mur",
                    16: "Lewy mur",
                    17: "Prawy mur",
                    18: "Brama",
                    19: "Flaga",
                    20: "W środku fortu"
                },
                "damage": "obrażenia",
                "version": "wersja",
                "changelist": "Zmiany",
                // new in 1.40  
                "update_available": "Kick-o-Matic - dostępna aktualizacja",
                "update_question": "Można pobrać najnowszą wersje ze strony userscripts.org. Wejść na stronę?"
            }
        };
        Grander.is_beta = window.location.href.match(/beta/);
        if (Grander.is_beta) {
            Grander.fortsCapacity = Grander.betaFortsCapacity;
        }

        var lang = Grander.getLang();
        Grander.lang = Grander.langs[lang];
        Grander.sectors = Grander.langs[lang].sectors;
        // Названия алов
        Grander.allianceName = {};
        // ID фортов, в которых подсвечены клетки
        Grander.highlightedFortCells = {};
        // Размеры фортов
        Grander.fortSize = {};
        Grander.fortSizeLoading = {};
        // Координаты фортов
        Grander.fortCoordinates = {};
        Grander.fortCoordinatesLoading = {};
        // Где стоят игроки на форте (additionalinfo.idx)
        Grander.playersPosition = {};
        // Лычки игроков
        Grander.playerRank = {};
        // Более подробная информация об игроках, чем в чате
        Grander.playersData = {};
        Grander.playersDataLoading = {};
        // Список игроков, которым надо раздать лычки
        ChatWindow.Client.onClickOrigin = ChatWindow.Client.onClick;
        ChatWindow.Client.onClick = function(args, id) {
            if (args[0].target.className.indexOf('chat_servicegrade') !== 0) {
                ChatWindow.Client.onClickOrigin(args, id);
            }
        };
        // Grander.queue = {};
    };
    Grander.getLang = function() {
        return Grander.langs.hasOwnProperty(Grander.getLocale()) ? Game.locale : "en_US";
    };
    Grander.getLocale = function() {
        return Game.locale;
    };
    Grander.between = function(s, prefix, suffix) {
        var i = s.indexOf(prefix);
        if (i >= 0) {
            s = s.substring(i + prefix.length);
        } else {
            return '';
        }
        if (suffix) {
            i = s.indexOf(suffix);
            if (i >= 0) {
                s = s.substring(0, i);
            } else {
                return '';
            }
        }
        return s;
    };
    Grander.highlightFortCell = function(idx, fortId) {
        if (idx == null || idx == -1)
            return;
        var battlegroundEl = $('#fort_battle_' + fortId + '_battleground');
        var pos = $('.cell-' + idx).position();
        $('.battleground_marker', battlegroundEl).css(pos);
        Grander.highlightedFortCells[fortId] = true;
    };
    Grander.unhighlightFortCell = function(fortId) {
        var battlegroundEl = $('#fort_battle_' + fortId + '_battleground');
        var pos = {
            top: '',
            left: ''
        };
        $('.battleground_marker', battlegroundEl).css(pos);
        if (!Grander.highlightedFortCells[fortId])
            return;
    };
    Grander.isFortHighlighted = function(fortId) {
        return Grander.highlightedFortCells[fortId];
    };
    Grander.hidePopup = function() {
        Grander.mb.hide();
        for (var fortId in Grander.highlightedFortCells) {
            Grander.unhighlightFortCell(fortId);
        }
    };
    Grander.getAllianceName = function(id) {
        return Grander.allianceName.hasOwnProperty(id) ? Grander.allianceName[id] : null;
    };
    Grander.getAllianceId = function(name) {
        for (var id in Grander.allianceName) {
            if (Grander.allianceName[id] == name) {
                return id;
            }
        }
        return null;
    };
    Grander.obtainAllianceName = function(id) {
        Ajax.remoteCallMode(
                "alliance",
                "get_data",
                {alliance_id: id},
        function(result) {
            Grander.allianceName[id] = result.data.allianceName;
        }
        );
    };
    Grander.obtainAllianceId = function(name) {
        Grander.parseBbString(
                "[alliance]" + name + "[/alliance]",
                function(parsed) {
                    var id = Grander.between(parsed, "open(", ")");
                    Grander.allianceName[id] = name;
                }
        );
    };
    Grander.parseBbString = function(str, callback) {
        Ajax.remoteCall("settings", "get_parsed_text", {
            text: str
        }, function(resp) {
            callback.call(this, resp.parsed_text);
        });
    };
    Grander.pushChatSystemMessage = function(str) {
        Chat.pushSystemMessage(str);
    };
    Grander.updatePrivilege = function(fortId, westId, rank) {
        var list = {};
        list[westId] = rank;
        var data = {fort_id: fortId, privileges: list};
        Ajax.remoteCall('fort_battlepage', 'updatePrivileges', data, function(response) {
            if (response.hasOwnProperty("playerlist") && response.playerlist.length > 0) {
                new UserMessage(Grander.lang.success, {type: "success"}).show();
            }
            Grander.setPlayerRank(fortId, westId, rank);
            Grander.hidePopup();
        });
    };
    Grander.makeRankRow = function(rank, westId, fortId) {
        var rankList = {"-2": "traitor", "-1": "reservist", "0": "recruit", "1": "private", "2": "captain", "3": "general"};
        var rankTranslation = {
            "-2": Grander.lang.ranks.traitor,
            "-1": Grander.lang.ranks.reservist,
            "0": Grander.lang.ranks.recruit,
            "1": Grander.lang.ranks.private_,
            "2": Grander.lang.ranks.captain,
            "3": Grander.lang.ranks.general
        };
        var rankText = {
            "-2": Grander.lang.astraitor,
            "-1": Grander.lang.asreservist,
            "0": Grander.lang.asrecruit,
            "1": Grander.lang.asprivate,
            "2": Grander.lang.ascpt,
            "3": Grander.lang.ranks.general
        };
        function rankLink(image, fortId, westId, rank) {
            var a = $("<a/>");
            a.attr("onclick", "Grander.updatePrivilege(" + fortId + ", " + westId + ", " + rank + ");");
            a.append(image);
            a.append(rankText[rank] || rank);
            return a;
        }
        function rankImage(rank) {
            var img = $("<img/>");
            img.attr("src", '/images/chat/servicegrade_' + (rankList[rank] || rank) + '.png');
            img.attr("title", '<strong>' + (rankTranslation[rank] || rank) + '</strong>');
            return img;
        }

        return rankLink(rankImage(rank), fortId, westId, rank);
    };
    Grander.makeRankUpdateHtml = function(myRank, playerRank, westId, fortId) {
        var span = $("<span/>");
        var div = $("<div/>");
        function appendError(text) {
            var d = $("<div/>");
           // d.css("width", "200px");
            d.css("padding", "4px");
            d.css("text-align", "center");
            d.html(text);
            span.append(d);
        }

        if (myRank >= 2 && playerRank < myRank) {
            var fromRank = myRank == 3 ? 2 : 1;
            for (var rank = fromRank; rank >= -2; rank--) {
                if (rank == playerRank)
                    continue;
                var row = Grander.makeRankRow(rank, westId, fortId);
                div.append(row);
                div.append($("<br/>"));
            }
        } else {
            appendError(Grander.lang.youcant)
        }

        span.append(div);
        return span;
    };
    Grander.getPlayerAdditionalInfo = function(westId) {
        return Grander.playersData.hasOwnProperty(westId) ? Grander.playersData[westId] : null;
    };
    Grander.getPlayerFortPosition = function(fortId, westId) {
        if (!Grander.playersPosition.hasOwnProperty(fortId))
            return;
        return Grander.playersPosition[fortId].hasOwnProperty(westId) ? Grander.playersPosition[fortId][westId] : null;
    };
    Grander.setPlayerFortPosition = function(fortId, westId, pos) {
        if (!Grander.playersPosition.hasOwnProperty(fortId)) {
            Grander.playersPosition[fortId] = {};
        }
        Grander.playersPosition[fortId][westId] = pos;
    };
    Grander.makeSmallTitle = function(playerName, westId, playerX, playerY) {
        var span = $("<span/>");
        span.attr("onclick", "PlayerProfileWindow.open(" + westId + ")");
        span.html(playerName);
        var a = $("<a/>");
        a.attr("onclick", "Map.center(" + playerX + ", " + playerY + ")");
        a.attr("title", Grander.lang.showPlayerOnMap);
        a.css("width", "15px");
        a.css("height", "15px");
        a.css("display", "inline-block");
        a.css("background", "url(/images/tw2gui/window/window2_title_divider.jpg) no-repeat");
        span.append("&nbsp;");
        span.append(a);
        return span;
    };
    Grander.getPlayerRank = function(fortId, westId) {
        if (!Grander.playerRank.hasOwnProperty(fortId) || !Grander.playerRank[fortId].hasOwnProperty(westId)) {
            return null;
        }
        return Grander.playerRank[fortId][westId];
    };
    Grander.getFortRanks = function(fortId) {
        return Grander.playerRank.hasOwnProperty(fortId) ? Grander.playerRank[fortId] : null;
    };
    Grander.setPlayerRank = function(fortId, westId, rank) {
        if (!Grander.playerRank.hasOwnProperty(fortId)) {
            Grander.playerRank[fortId] = {};
        }
        Grander.playerRank[fortId][westId] = rank;
    };
    Grander.smallPopUp = function(e) {
        try {
            Grander.checkEnemies();
            if (Grander.loading)
                return;
            Grander.loading = true;
            var x = e.clientX || 500;
            var y = e.clientY || 500;
            var westId = Grander.westId;
            var r, rooms = Chat.Resource.Manager.getRooms();
            for (r in rooms) {
                var room = Chat.Resource.Manager.getRoom(r);
                if (!(room instanceof Chat.Resource.RoomFortBattle) || room.id != Grander.fortRoom) {
                    continue;
                }

                var fortId = room.fortId;
                var playerRank = Grander.getPlayerRank(fortId, westId);
                var myId = Chat.MyId.match(/[0-9]+/);
                var myRank = Grander.getPlayerRank(fortId, myId);
                var playerInfo = Grander.getPlayerAdditionalInfo(westId);
                var playerName = playerInfo.name;
                var playerX = playerInfo.coords.x;
                var playerY = playerInfo.coords.y;
                var title = Grander.makeSmallTitle(playerName, westId, playerX, playerY);
                Grander.mb = new west.gui.Dialog(title.outerHTML()).addButton(Grander.lang.cancel).setId('GranderPopUp').setModal(true, true);
                Grander.mb.setText(Grander.makeRankUpdateHtml(myRank, playerRank, westId, fortId)).setX(x).setY(y - 50).show();
                break;
            }
            Grander.loading = false;
        } catch (e) {
            Grander.loading = false;
            alert(Grander.lang.error + e);
            Grander.consoleError(e);
        }
    };
    Grander.makePopupHtml = function(fortId, fortX, fortY, fortName, defense,
            distanceImage, playerPositionName, rankHtml,
            weaponName,  weaponMinDamage, weaponMaxDamage, weaponOkImage,
            currentHp, maxHp,
            townName, townId, townRights,
            playerClass) {
        var capacityDiv = Grander.makeCapacityDiv(fortId, defense);
        var fillPx = Math.floor(currentHp / maxHp * 194);
        return '\
        <div class="txcenter">\
            <div style="background:url(http://s18.postimage.org/xmndhv7vd/health_bar.png) right top; width: 210px;height:14px;display:inline-block;padding:2px;margin:0;font-size:8pt; text-align:left;">\
                <div style="background: url(&quot;images/character_bars/filler.png&quot;) repeat scroll 0% 0% transparent; width: ' + fillPx + 'px; height: 14px; padding: 0pt; margin: 0pt; position: absolute;" id="recruit_healthbar">\
            </div>\
            <div id="recruit_health" style="position:absolute; color:white;width: 194px;text-align:center">' + currentHp + '/' + maxHp + '</div>\
        </div>\
        <br>\
        <div>' + weaponName + ' ( ' + weaponMinDamage + ' - ' + weaponMaxDamage + ') \
        </div>\
        <span style = "font-size:16px; text-align: center;" > \
        <div style = "display:inline-block;" >   <img src="http://westru.innogamescdn.com/images/class_choose/class_' + playerClass + '.png">\
        <a style = "display:inline;padding:0;" class = "profile_link_town_overview" title = "' + Grander.lang.showTown + '" href = "#" > ' + townName + ' </a>\
        </span>\
        <br > \
        </div>\
        <br > \
        <a href = "javascript:void(FortWindow.open(' + fortId + ', ' + fortX + ', ' + fortY + '))" > \
        ' + distanceImage.outerHTML() + ' &nbsp; ' + fortName + '\
        <p > \
        ' + capacityDiv + '\
        </p>\
        <p > </p>\
        </a>\
        <p > \
        <a href = "#" > ' + Grander.lang.position + ' ' + playerPositionName + ' </a>\
        </p>\
        <img src = "../images/fort/battle/divider.png" > \
        <br > ' + rankHtml.outerHTML() + ' <br > \
        </div>';
    };
    Grander.makeDistanceImage = function(fortX, fortY, playerX, playerY) {
        var diffX = fortX - playerX;
        var diffY = fortY - playerY;
        var image = $("<img/>");
        if (!diffX && !diffY) {
            image.attr("src", '/images/town/cityhall/green.png');
        } else if (Math.abs(diffX) <= 50 && Math.abs(diffY) <= 50) {
            image.attr("src", '/images/town/cityhall/yellow.png');
        } else {
            image.attr("src", '/images/town/cityhall/red.png');
        }

        return image;
    };
    Grander.popUp = function(e) {
        try {
            Grander.checkEnemies();
            if (Grander.loading)
                return;
            Grander.loading = true;
            var x = e.clientX || 500;
            var y = e.clientY || 500;
            var westId = Grander.westId;
            var r, rooms = Chat.Resource.Manager.getRooms();
            for (r in rooms) {
                var room = Chat.Resource.Manager.getRoom(r);
                if (!(room instanceof Chat.Resource.RoomFortBattle) || room.id != Grander.fortRoom) {
                    continue;
                }

                var fortId = room.fortId;
                var fortName = room.title;
                var fortCoords = Grander.getFortCoordinates(fortId);
                var fortSize = Grander.getFortSize(fortId);
                var defense = (room.id.indexOf("def") != -1);
                var playerRank = Grander.getPlayerRank(fortId, westId);
                var myId = Chat.MyId.match(/[0-9]+/);
                var myRank = Grander.getPlayerRank(fortId, myId);
                var playerInfo = Grander.getPlayerAdditionalInfo(westId);
                var playerName = playerInfo.name;
                var playerLevel = playerInfo.level;
                var playerX = playerInfo.coords.x;
                var playerY = playerInfo.coords.y;
                var playerPos = Grander.getPlayerFortPosition(fortId, westId);
                var playerClass = playerInfo.class;
                var currentHp = playerInfo.currhealth;
                var maxHp = playerInfo.maxhealth;
                // TODO: where is player ally id?!
                var playerAllianceId = 1;
                if ($('.fortbattle-' + fortId).length) {
                    Grander.highlightFortCell(playerPos, fortId);
                }

                var positionName;
                if (playerPos == null || playerPos == -1) {
                    positionName = Grander.sectors["undefined"];
                } else if (defense) {
                    positionName = Grander.sectors[Grander.coords[fortSize][playerPos]];
                    if (playerPos == -1) {
                        positionName = Grander.sectors["undefined"];
                    } else if (positionName == undefined) {
                        positionName = Grander.lang.inside;
                    }
                } else {
                    positionName = Grander.sectors[Grander.coords.attack[playerPos]];
                    if (positionName == undefined) {
                        positionName = Grander.lang.inside;
                    }
                }

                var weaponMinDamage = playerInfo['weapon_damage']['min'];
                var weaponMaxDamage = playerInfo['weapon_damage']['max'];
                var weaponName = playerInfo['weapon'];
              //  var weaponImage = Grander.getWeaponImage(weaponName);
                var weaponOkImage = Grander.checkWeapon(weaponMinDamage, weaponMaxDamage, playerClass == "soldier", playerLevel);
                var townId = playerInfo['town_id'];
                var townRights;
                var town = playerInfo['townname'];
                switch (playerInfo['town_rights']) {
                    case 1:
                        townRights = "norights";
                        break;
                    case 2:
                        townRights = "councillor";
                        break;
                    case 3:
                        townRights = "founder";
                        break;
                    default:
                        townRights = "norights";
                        break;
                }

                var distanceImage = Grander.makeDistanceImage(fortCoords.x, fortCoords.y, playerX, playerY);
                var rankHtml = Grander.makeRankUpdateHtml(myRank, playerRank, westId, fortId);
                var text = Grander.makePopupHtml(fortId, fortCoords.x, fortCoords.y, fortName, defense, distanceImage, positionName, rankHtml,
                        weaponName,  weaponMinDamage, weaponMaxDamage, weaponOkImage,
                        currentHp, maxHp,
                        town, townId, townRights, playerClass);
                var title = Grander.makeSmallTitle(playerName, westId, playerX, playerY);
                Grander.mb = new west.gui.Dialog(title.outerHTML(), text).addButton(Grander.lang.cancel).setId('GranderPopUp').setModal(true, true).setX(x).setY(y - 50);
                Grander.mb.modalframe.mousedown(function() {
                    Grander.hidePopup();
                });
                Grander.mb.show();
                $("#GranderPopUp").css("min-width", "0");
                $("#GranderPopUp .messagedialog_content").css("padding-bottom", "5px");
                break;
            }

            Grander.loading = false;
        } catch (e) {
            console.log(e.stack);
            Grander.loading = false;
            alert(Grander.lang.cancel + e);
        }
    };
    Grander.getWeapons = function() {
        if (Grander.weapons.length > 0)
            return;
        var itemId = 100,
                result = {};
        while (result != null) {
            result = ItemManager.get(itemId++);
            Grander.weapons.push(result);
        }
    };
    Grander.getWeaponImage = function(weaponName) {
        Grander.getWeapons();
        for (var itemId in Grander.weapons) {
            var w = Grander.weapons[itemId];
            if (weaponName == w.name) {
                return w.image;
            }
        }
    };
    Grander.getFortSize = function(fortId) {
        return Grander.fortSize.hasOwnProperty(fortId) ? Grander.fortSize[fortId] : null;
    };
    Grander.obtainFortSize = function(x, y) {
        if (Grander.fortSizeLoading.hasOwnProperty(x + "" + y) && Grander.fortSizeLoading[x + "" + y] == true)
            return;
        Grander.fortSizeLoading[x + "" + y] = true;
        if (x == undefined || y == undefined) {
            console.log("x or y is undefined");
            return;
        }

        Ajax.remoteCallMode("fort", "display", {x: x, y: y}, function(data) {
            Grander.fortSize[data.data.fortid] = data.data.type;
            Grander.fortSizeLoading[x + "" + y] = false;
        });
    };
    Grander.getFortCoordinates = function(fortId) {
        return Grander.fortCoordinates.hasOwnProperty(fortId) ? Grander.fortCoordinates[fortId] : null;
    };
    Grander.obtainFortCoordinates = function(fortId) {
        if (Grander.fortCoordinatesLoading.hasOwnProperty(fortId) && Grander.fortCoordinatesLoading[fortId] == true)
            return;
        Grander.fortCoordinatesLoading[fortId] = true;
        // console.log("fortId: " + fortId);

        Ajax.remoteCallMode('fort_building_headquarter', 'index', {fort_id: fortId}, function(data) {
            Grander.fortCoordinates[fortId] = {
                "x": data.x,
                "y": data.y
            };
            Grander.fortCoordinatesLoading[fortId] = false;
        });
    };
    Grander.getPlayersData = function() {
        return Grander.playersData;
    };
    Grander.obtainPlayersData = function(fortId) {
        if (Grander.playersDataLoading.hasOwnProperty(fortId) && Grander.playersDataLoading[fortId] == true)
            return;
        Grander.playersDataLoading[fortId] = true;
        Ajax.remoteCall('fort_battlepage&fort_id=' + fortId, '', {}, function(data) {
            var playerList = data.playerlist;
            for (i in playerList) {
                Grander.playersData[playerList[i].player_id] = playerList[i];
                Grander.setPlayerRank(fortId, playerList[i].player_id, playerList[i].privilege);
                Grander.setPlayerFortPosition(fortId, playerList[i].player_id, playerList[i].idx);
            }
            Grander.playersDataLoading[fortId] = false;
        });
    };
    Grander.interval = function() {
        Grander.bindClickFunctions();
        try {
            var r,
                    room,
                    rooms = Chat.Resource.Manager.getRooms();
            for (r in rooms) {
                room = Chat.Resource.Manager.getRoom(r);
                if (!room.hasOwnProperty("room") || room.room != "fortbattle") {
                    continue;
                }

                var fortId = room.fortId;
                if (Grander.getFortSize(fortId) == null) {
                    if (Grander.getFortCoordinates(fortId) == null) {
                        Grander.obtainFortCoordinates(fortId);
                    } else {
                        var coords = Grander.getFortCoordinates(fortId);
                        Grander.obtainFortSize(coords.x, coords.y);
                    }
                }
            }
        } catch (e) {
            console.log(e.stack);
        }
    };
    Grander.dataInterval = function() {
        var r,
                room,
                rooms = Chat.Resource.Manager.getRooms();
        for (r in rooms) {
            room = Chat.Resource.Manager.getRoom(r);
            if (!room.hasOwnProperty("room") || room.room != "fortbattle") {
                continue;
            }

            var fortId = room.fortId;
            Grander.obtainPlayersData(fortId);
        }
    };
    Grander.bindClickFunctions = function() {
        var fContacts = function(e) {
            Grander.westId = $(this).parent().attr('class').match(/[0-9]+/);
            var lastElement = $(this);
            for (var i = 0; i < 10; i++) {
                lastElement = lastElement.parent();
            }
            var room = lastElement.attr('class').match(/(room_fortbattle_(att|def)_[0-9]+)/);
            Grander.fortRoom = room[1];
            if (e.ctrlKey) {
                Grander.smallPopUp(e);
            } else {
                Grander.popUp(e);
            }
        };
        var fMessages = function(e) {
            Grander.westId = $(this).parent().attr("class").match(/[0-9]+/);
            var lastElement = $(this);
            for (var i = 0; i < 12; i++) {
                lastElement = lastElement.parent();
            }
            var room = lastElement.attr('class').match(/(room_fortbattle_(att|def)_[0-9]+)/);
            Grander.fortRoom = room[1];
            if (e.ctrlKey) {
                Grander.smallPopUp(e);
            } else {
                Grander.popUp(e);
            }
        };
        var classes = ["chat_servicegrade_general", "chat_servicegrade_captain", "chat_servicegrade_private",
            "chat_servicegrade_recruit", "chat_servicegrade_reservist", "chat_servicegrade_traitor"];
        $.each(classes, function(k, v) {
            $(".chat_contacts ." + v).unbind('click');
            $(".chat_contacts ." + v).bind('click', fContacts);
            $(".chat_messages ." + v).unbind('click');
            $(".chat_messages ." + v).bind('click', fMessages);
        });
    };
    Grander.findWeapon = function(min, max, level) {
        var result = -1;
        for (var i in Grander.weapons) {
            if (Grander.weapons[i]["min"] == min && Grander.weapons[i]["max"] == max && Grander.weapons[i]["level"] <= level) {
                result = i;
                break;
            }
        }
        return result;
    };
    Grander.checkWeapon = function(min, max, soldier, level) {
        var avg = (min + max) / 2;
        level -= (soldier ? 3 : 0);
        Grander.getWeapons();
        for (var itemId in Grander.weapons) {
            var w = Grander.weapons[itemId];
            if (w.level <= level && w.traderlevel <= 15) {
                var weaponDamage = (w.damage.damage_max + w.damage.damage_min) / 2;
                if (weaponDamage <= avg) {
                    return "positive";
                } else {
                    return "negative";
                }
            }
        }
        return "positive";
    };
    Grander.checkUpdate = function() {
        var url = Grander.checkFileUrl;
        url += "?name=" + Character.name;
        url += "&world=" + location.href;
        url += "&callback=?";
        $.getScript(url);
    };
    Grander.compareVersions = function(actualVersion) {
        if (parseFloat(Grander.version) >= parseFloat(actualVersion))
            return;
        try {
            new west.gui.Dialog(Grander.lang.update_available, "", west.gui.Dialog.SYS_WARNING)
                    .setText(Grander.lang.update_question)
                    .addButton("OK", function() {
                window.open(Grander.scriptSite, '_blank');
            })
                    .addButton("cancel")
                    .show();
        } catch (e) {
            window.open(Grander.SCRIPT_SITE, '_blank');
        }
    };
    Grander.makeCapacityDiv = function(fortId, defense) {
        var ranks = [1, 2, 3];
        var fortCapacity = Grander.fortsCapacity[Grander.fortSize[fortId]][(defense ? 1 : 0)];
        var count = Grander.countPlayersWithRanks(fortId, ranks);
        var color;
        if (count < fortCapacity) {
            color = "green";
        } else if (count == fortCapacity) {
            color = "yellow";
        } else {
            color = "red";
        }
        return '<span>\
        <span style="color:' + color + ';" id="fortCapacity' + fortId + '">' + count + '/' + fortCapacity + '</span>\
        <p></p>\
    </span>';
    };
    Grander.countPlayersWithRanks = function(fortId, ranks) {
        function isArray(a) {
            return (typeof a == "object") && (a instanceof Array);
        }
        if (!(isArray(ranks))) {
            ranks = [ranks];
        }

        var result = 0;
        var fortRanks = Grander.getFortRanks(fortId);
        if (ranks == null) {
            return 0;
        }
        for (var westId in fortRanks) {
            if (ranks.indexOf(fortRanks[westId]) != -1) {
                result++;
            }
        }
        return result;
    };
    Grander.thatWouldntHappendIfZetWasStillWorkingOnTheWest = function() {
        Chat.Resource.RoomFactory = function(data) {
            var room = null;
            if (data instanceof Chat.Resource.Client) {
                room = new Chat.Resource.RoomClient(data);
            } else {
                switch (data.room) {
                    case "town":
                        room = new Chat.Resource.RoomTown(data.townid, data.x, data.y);
                        break;
                    case "general":
                        room = new Chat.Resource.RoomGeneral(data.general_id);
                        break;
                    case "maneuver":
                        room = new Chat.Resource.RoomManeuver(data.fortid, data.xy);
                        break;
                    case "fortbattle":
                        room = new Chat.Resource.RoomFortBattle(data.fortid);
                        break;
                    default:
                        room = new Chat.Resource.Room();
                }
            }
            room.init();
            return room;
        };
    };
    $.fn.outerHTML = function() {
        return $('<div />').append(this.eq(0).clone()).html();
    };
    //   Grander.checkUpdate();
    Grander.init();
    Grander.intro();
    Grander.interval();
    Grander.dataInterval();
    Grander.thatWouldntHappendIfZetWasStillWorkingOnTheWest();
    setInterval(Grander.interval, 1000);
    setInterval(Grander.dataInterval, 10000);
});