Kick-o-matic

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

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==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);
});