Doublexp doubleskill.png Double Exp & Skill: Matar monstros rende o dobro de pontos de experiência. O progresso de skills é duas vezes mais rápido! Doublexp doubleskill.png
Bone Overlord.gif The Roost of the Graveborn Quest Spoiler!
Domine Graveborn: todos os bosses e mecânicas ilustradas!
Saiba mais ➔
Winter Tree.png Winter Update 2025
Acompanhe tudo sobre o Winter Update 2025!
Saiba mais ➔
Stag.gif The Order of the Stag Quest Spoiler!
Conheça Isle of Ada: sua quest, missões secundárias e todos os bosses!
Saiba mais ➔

Tibia Wiki:Imbuing/Codigo

De Tibia Wiki - A Enciclopédia do Tibia
Revisão de 15h10min de 23 de julho de 2025 por Njorn (discussão | contribs)
Ir para navegação Ir para pesquisar
<div class="main_panel">
        <div class="loading">
            <img src="https://www.tibiawiki.com.br/images/c/ce/The_Epic_Wisdom.gif" /><br />
            <label>Loading...</label>
            <span>@TibiaWiki</span>
        </div>
        <div class="menu">
            <div class="main_panel_title">Imbuing System</div>
            <div class="sub-menu">
                <div class="select-label">Categoria:
                    <select id="category">
                    </select>
                </div>
                <div class="select-label">Item:
                    <input type="text" id="search-item" placeholder="buscar por item..."/>
                    <select id="itemSelect" size="10">
                    </select>
                </div>
            </div>
            <div class="divisor-line"></div>
            <div class="selected-item-info">
                <label class="select-label">Dados do Item:</label>
                <div class="info-panel">
                    <div class="item-info">
                        <span class="select-label">Name: <span id="item-name">Magic Plate Armor</span> </span></br>
                        <span class="select-label" style="display: none;">Armor: <span id="item-def">17</span> </span>
                        <span class="select-label" style="display: none;">Weight: <span id="item-weight">85.00 oz</span> </span>
                        <span class="select-label">Slots: <span id="item-slots">2</span> </span></br>
                    </div>
                    <span class="item-img">
                        <a href="" target="_blank">
                            <img src="https://www.tibiawiki.com.br/images/3/35/Trans.gif" id="slot-imagem" align="right" />
                        </a>
                    </span>
                </div>
            </div>
            </br>
            <span class="divisor-line"></span>
            <span class="version-label">v2.0.0</span>
        </div>
        <div class="imbuement-panel">
            <label class="main_panel_title">Opções para Imbuir</label>
            <div class="slots">
                <div class="select-slot">
                    <label id="item-slot-1-label" class="disabled-slot">Slot 1</label>
                    <div id="item-slot-1" onclick="selectSlot(this.id)"><img src=""></div>
                </div>
                <div class="select-slot" >
                    <label id="item-slot-2-label" class="disabled-slot">Slot 2</label>
                    <div id="item-slot-2" onclick="selectSlot(this.id)"><img src=""></div>
                </div>
                <div class="select-slot">
                    <label id="item-slot-3-label" class="disabled-slot">Slot 3</label>
                    <div id="item-slot-3" onclick="selectSlot(this.id)"><img src=""></div>
                </div>
            </div>
            <span class="divisor-line"></span>
            <div class="imbuement-options">
                <div class="selections">
                    <div class="select-label">Imbuement:
                        <select id="imbuementSelect" class="border-left">
                        </select>
                    </div>
                    <div class="select-label">Nível:
                        <select id="imbuementLevelSelect" class="border-left">
                        </select>
                    </div>
                </div>
                <div class="imbuement-descriptions">
                    <b>Efeito: </b><label id="imbument-description">Converte 5% do dano para hit points com chance de 100%.</label>
                    </br>
                    </br>
                    <label>Dura por <b>20h00min</b> enquanto equipado.</label>
                </div>
                <label class="main_panel_title">Requer as seguintes fontes astrais: </label>
                <div class="imbuements-items">
                    <div class="item-slot" onclick="">
                        <div id="item-img-slot-1" class="item-img-slot">
                            <a href="" target="_blank">
                                <img src="">
                            </a>
                        </div>
                        <input id="item-quantity-1" class="item-quantity" value="0" disabled/>
                    </div>
                    <div class="item-slot" onclick="">
                        <div id="item-img-slot-2" class="item-img-slot">
                            <a href="" target="_blank">
                                <img src=""/>
                            </a>
                        </div>
                        <input id="item-quantity-2" class="item-quantity" value="0" disabled/>
                    </div>
                    <div class="item-slot" onclick="">
                        <div id="item-img-slot-3" class="item-img-slot">
                            <a href="" target="_blank">
                                <img src="">
                            </a>
                        </div>
                        <input id="item-quantity-3" class="item-quantity" value="0" disabled/>
                    </div>
                </div>
            </div>
            <span class="divisor-line"></span>
            <div class="result-panels">
                <div class="price-panel">
                    <div id="item-price-0" class="item-price-section price-gold-token">
                        <a href="https://www.tibiawiki.com.br/wiki/Gold_Token" target="_blank"><img src="https://www.tibiawiki.com.br/images/0/0b/Gold_Token.gif"/></a>
                        <div class="item-price-data">
                            <div>
                                <label style="font-weight: bold;">Nome:</label>
                                <label class="item-price-name">Gold Token</label>
                            </div>
                            <div>
                                <label style="font-weight: bold;">Quantidade: </label>
                                <input class="item-price-quantity" type="number" min="0" max="6" step="2" placeholder="0" oninput="updateValues(this.value, 'quantity', 'item-0')"/>
                            </div>
                            <div>
                                <label style="font-weight: bold;">Valor Unitário: </label>
                                <input class="item-price-value" type="number" min="0" placeholder="0" oninput="updateValues(this.value, 'price', 'item-0')"/>
                                <label style="font-weight: bold;"> GPs</label>
                            </div>
                        </div>
                    </div>
                    <span class="divisor-line price-gold-token"></span>
                    <div id="item-price-1" class="item-price-section">
                        <a href="" target="_blank"><img src=""/></a>
                        <div class="item-price-data">
                            <div>
                                <label style="font-weight: bold;">Nome:</label>
                                <label class="item-price-name">Vampire Tooth</label>
                            </div>
                            <div>
                                <label style="font-weight: bold;">Quantidade: </label>
                                <input class="item-price-quantity" type="number" min="0" placeholder="0" oninput="updateValues(this.value, 'quantity', 'item-1')"/>
                            </div>
                            <div>
                                <label style="font-weight: bold;">Valor Unitário: </label>
                                <input class="item-price-value" type="number" min="0" placeholder="0" oninput="updateValues(this.value, 'price', 'item-1')"/>
                                <label style="font-weight: bold;"> GPs</label>
                            </div>
                        </div>
                    </div>
                    <span class="divisor-line"></span>
                    <div id="item-price-2" class="item-price-section">
                        <a href="" target="_blank"><img src=""/></a>
                        <div class="item-price-data">
                            <div>
                                <label style="font-weight: bold;">Nome:</label>
                                <label class="item-price-name">Bloody Pincer</label>
                            </div>
                            <div>
                                <label style="font-weight: bold;">Quantidade: </label>
                                <input class="item-price-quantity" type="number" min="0" placeholder="0" oninput="updateValues(this.value, 'quantity', 'item-2')"/>
                            </div>
                            <div>
                                <label style="font-weight: bold;">Valor Unitário: </label>
                                <input class="item-price-value" type="number" min="0" placeholder="0" oninput="updateValues(this.value, 'price', 'item-2')"/>
                                <label style="font-weight: bold;"> GPs</label>
                            </div>
                        </div>
                    </div>
                    <span class="divisor-line item-price-2-divisor"></span>
                    <div id="item-price-3" class="item-price-section">
                        <a href="" target="_blank"><img src=""/></a>
                        <div class="item-price-data">
                            <div>
                                <label style="font-weight: bold;">Nome:</label>
                                <label class="item-price-name">Teste</label>
                            </div>
                            <div>
                                <label style="font-weight: bold;">Quantidade: </label>
                                <input class="item-price-quantity" type="number" min="0" placeholder="0" oninput="updateValues(this.value, 'quantity', 'item-3')"/>
                            </div>
                            <div>
                                <label style="font-weight: bold;">Valor Unitário: </label>
                                <input class="item-price-value" type="number" min="0" placeholder="0" oninput="updateValues(this.value, 'price', 'item-3')"/>
                                <label style="font-weight: bold;"> GPs</label>
                            </div>
                        </div>
                    </div>
                </div>
                <div class="result-panel">
                    <div class="enhance-select">
                        <div>
                            <input type="checkbox" id="enhance-imbuement-chance" name="enhance-imbuement-chance" value="enhance-imbuement-chance" onchange="updatePrice(this)"/>
                            <label for="enhance-imbuement-chance"> Aumentar Chance de sucesso para 100%?</label>
                        </div>
                    </div>
                    <div class="enhance-imbuement-data">
                        <div class="total-price-taxa">
                            <label style="font-weight: bold;">Taxa de Sucesso:</label>
                            <label id="percent-chance-rate">90%</label>
                        </div>
                        <div class="total-price-taxa">
                            <label style="font-weight: bold; font-size: 12px;">Valor da Taxa:</label>
                            <label id="price-tax" style="font-size: 12px;">????? <b>GPs</b></label>
                        </div>
                    </div>
                    <span class="divisor-line"></span>
                    <label class="main_panel_title">Preços | Taxas </label>
                    <div class="total-price-taxa">
                        <label style="font-weight: bold;">Taxa de Imbuement:</label>
                        <label id="total-imbuement-tax-value">????? <b>GPs</b></label>
                    </div>
                    <!-- <span class="divisor-line"></span> -->
                    <label class="main_panel_title">Preços dos Itens</label>
                    <div class="total-price-taxa price-gold-token">
                        <label style="font-weight: bold;">Total em Gold Token:</label>
                        <label id="total-item-0-value">????? <b>GPs</b></label>
                    </div>
                    <div id="total-price-item-1" class="total-price-taxa">
                        <label style="font-weight: bold;">Item 1:</label>
                        <label id="total-item-1-value">????? <b>GPs</b></label>
                    </div>
                    <div id="total-price-item-2" class="total-price-taxa">
                        <label style="font-weight: bold;">Item 2:</label>
                        <label id="total-item-2-value">????? <b>GPs</b></label>
                    </div>
                    <div id="total-price-item-3" class="total-price-taxa">
                        <label style="font-weight: bold;">Item 3:</label>
                        <label id="total-item-3-value">????? <b>GPs</b></label>
                    </div>
                    <div id="total-price-itens" class="total-price-taxa">
                        <label style="font-weight: bold;">Total dos Itens:</label>
                        <label id="total-item-imbuement-value">????? <b>GPs</b></label>
                    </div>
                    <div id="total-price-itens" class="total-price-taxa price-gold-token">
                        <label style="font-weight: bold;">Economia em Gold Tokens:</label>
                        <label id="total-item-economy-value">????? <b>GPs</b></label>
                    </div>
                    <div id="total-price-itens" class="total-price-taxa">
                        <label style="font-weight: bold;">Total Itens + Taxa:</label>
                        <label id="total-item-imbuement-tax-value">????? <b>GPs</b></label>
                    </div>
                    <div id="total-price-itens" class="total-price-taxa price-gold-token">
                        <label style="font-weight: bold;">Total Gold Token + Taxa:</label>
                        <label id="total-item-0-tax-value">????? <b>GPs</b></label>
                    </div>
                </div>
            </div>
        </div>
    </div>
.main_panel {
        position: relative;
        display: flex;
        width: 815px;
        border: 2px solid #a2a9b1;
        background: #ffffff;
        border-radius: 5px;
        margin: 2px;
        -webkit-box-shadow: 0px 0px 10px 2px rgba(255, 255, 255, 1);
        -moz-box-shadow: 0px 0px 10px 2px rgba(255, 255, 255, 1);
        box-shadow: 0px 0px 10px 2px rgba(255, 255, 255, 1);
        font-family: Verdana, Arial, Times New Roman, sans-serif;
        font-size: 13px;
        color: black;
    }
    .loading {
        z-index: 9999;
        background-color: rgba(255, 255, 255, 0.98);
        display: inline-block;
        border-radius: 3px;
        position: absolute;
        height: 100%;
        width: 100%;
        top: 0;
        left: 0;
        align-content: center;
        text-align: center;
    }
    
    .loading>label {
        position: relative;
        bottom: 0px;
        text-align: center;     
        font-size: math;
        background: transparent;
    }
    .loading > span {
        text-align: center;
        align-content: center;
        background-color: #c7451d;
        height: 32px;
        width: 100%;
        position: absolute;
        bottom: 0px;
        left: 0px;
        text-align: center;     
        font-size: math;
        border-bottom-left-radius: 3px;
        border-bottom-right-radius: 3px;
    }
    .border-left {
        border-left: #c7451d 5px solid;
    }
    .divisor-line {
        display: flex;
        flex-flow: row wrap;
        justify-content: center;
        align-items: center;
        gap: 0.5rem;
        border-bottom: 1px solid #a2a9b1;
        padding: 0.75rem;
    }

    .version-label {
        font-size: 14px;
        margin-top: 30px;
        font-weight: bold;
        bottom: 5px;
        width: 100%;
        text-align: center;
        display: block;
        position: absolute;
    }

    .result-panels {
        display: flex;
    }

    .menu {
        position: absolute;
        border-top-left-radius: 3px;
        border-bottom-left-radius: 3px;
        position: relative;
        left: 0px;
        border-right: 2px solid #a2a9b1;
        max-width: 250px;
        background: #c7451d;
        padding: 5px;
    }
    .menu > .divisor-line {
        border-bottom: 1px solid black;
    }

    .main_panel_title {
        height: 32px;
        width: 100%;
        line-height: 32px;
        text-align: center;
        font-weight: bold;
        font-size: 12px;
    }
    .sub-menu {
        width: 100%;
    }

    .source,
    .item-img img {
        /* position: relative; */
        display: inline;
        padding: 5px;
        margin: 1px 2px 0 2px;
        border-radius: 5px;
        border: #a2a9b1 1px solid;
        background: #f8f8f8;
        padding: 0 auto;
        height: 32px;
        width: 32px;
        text-align: center;
        cursor: default;
    }

    .source {
        margin: 0 auto;
        width: 34px;
    }

    select#category, select#itemSelect {
        width: 250px;
    }

    select#itemSelect {
        height: 250px;
    }
    input#search-item {
        width: 205px;
        border: 1px solid #a2a9b1;
        border-radius: 5px;
    }

    select {
        font-family: Verdana, Arial, Times New Roman, sans-serif;
        border-radius: 5px;
        border: #a2a9b1 1px solid;
        background: #f8f8f8;
        border-collapse: separate;
        margin-top: 5px;
        height: 24px;
        text-align: center;
        display: inline-block;
        vertical-align: top;
        white-space: nowrap;
        font-size: 13px;
        color: black;
    }
    .select-label {
        font-size: 14px;
        text-align: left;
        margin-top: 10px;
        font-weight: bold;
    }
    .select-label > span {
        font-size: 12px;
        font-weight: bold;
    }
    .selected-item-info {
        margin-top: 10px;
    }
    .info-panel {
        margin-top: 15px;
        height: 25px;
    }
    .item-info {
        left: 0px;
        max-width: 200px;
        display: inline-table;
        position: absolute;
        padding: 5px;
    }
    .imbuement-panel {
        position: relative;
        right: 0px;
        width: 100%;
    }
    .imbuement-panel > .main_panel_title {
        display: inline-block;
        width: 100%;
    }

    .imbuement-panel > .slots {
        display: flex;
        justify-content: center; /* Centers horizontally */
        align-items: center;  
        height: 50px;
        width: 100%;
    }
    .slots > .select-slot {
        position: relative;
        display: block;
        width: 35px;
        height: 64px;
        align-content: center;
        margin: 15px;
    }
    .slots > .select-slot > div {
        width: 32px;
        height: 32px;
    }
    .slots > .select-slot > div > img {
        width: 31px;
        height: 31px;
        border-radius: 5px;
        border: 1px solid #a2a9b1;
    }
    .slots > .select-slot > label {
        display: block;
        width: 35px;
        font-weight: bold;
        font-size: 10px;
        text-align: center;
    }
    .imbuement-options {
        position: relative;
        width: 100%;
    }
    .imbuement-options > .main_panel_title {
        display: block;
    }
    .imbuement-options > .imbuement-descriptions {
        margin: 15px;
    }
    .imbuement-options > .selections {
        display: flex;
        justify-content: center; /* Centers horizontally */
        align-items: center;  
        width: 100%;
    }
    .selections > .select-label {
        position: relative;
        display: block;
        align-content: center;
        margin: 15px;
    }
    .selections > .select-label > select {
        width: 230px;
    }

    .imbuements-items {
        display: flex;
        justify-content: center; /* Centers horizontally */
        align-items: center;  
        height: 50px;
        width: 100%;
    }

    .imbuements-items > .item-slot {
        position: relative;
        display: inline-block;
        width: 64px;
        height: 32px;
        align-content: center;
        margin: 15px;
    }
    .imbuements-items > .item-slot > .item-img-slot {
        width: 64px;
        height: 32px;
        align-content: center;
        border-top-left-radius: 5px;
        border-top-right-radius: 5px;
        border-top: #a2a9b1 1px solid;
        border-left: #a2a9b1 1px solid;
        border-right: #a2a9b1 1px solid;
        display: flex;
        justify-content: center;
    }
    .imbuements-items > .item-slot > .percent-imbuement {
        height: 50px;
        width: 64px;
        font-weight: bold;
        position: relative;
        display: inline-block;
        align-content: center; 
        background-color: #c7451d;
        border-radius: 5px;
        border: #a2a9b1 1px solid;
    }

    .imbuements-items > .item-slot > .item-quantity {
        width: 60px;
        border-bottom-left-radius: 5px;
        border-bottom-right-radius: 5px;
        border: #a2a9b1 1px solid;
        text-align: center;
    }
    .price-panel { 
        width: 50%;
        border-right: 1px solid #a2a9b1;
    }
    .result-panel { 
        width: 50%;
    }

    .result-panel > .main_panel_title { 
        display: block;
    }

    .price-panel > .item-price-section {
        width: 100%;
        height: 64px;
        display: inline-flex;
        justify-content: center;
        align-items: center;
    }
    .price-panel > .item-price-section > img {
        display: inline;
        padding: 1px;
        margin: 1px 2px 0 2px;
        border-radius: 5px;
        border: #a2a9b1 1px solid;
        background: #f8f8f8;
        padding: 0 auto;
        height: 32px;
        width: 32px;
        text-align: center;
        cursor: default;
    }
    .price-panel > .item-price-section > .item-price-data {
        right: 0px;
        max-width: calc(100% - 66px);
        display: inline-table;
    }
    .price-panel > .item-price-section > div {
        /* width: 100%; */
        margin-left: 15px;
        text-align: left;
    }
    .price-panel > .item-price-section > div > div {
        margin-top: 3px;
    }
    .price-panel > .item-price-section > div > div > input {
        width: 60px;
        text-align: center;
        border-radius: 5px;
        border: #a2a9b1 1px solid;
    }

    .enhance-select {
        height: 40px;
    }
    .enhance-select > div {
        margin-top: 25px;
        height: 5px;
        display: flex;
        align-items: center;
        width: fit-content;
        float: left;
        margin-left: 5px;
    }

    .enhance-select > div > label {
        font-weight: bold;
        font-size: 12px;
    }
    input[type=checkbox] {
        width: 20px;
        height: 20px;
    }

    .enhance-imbuement-data {
        width: 100%;
        height: 10px;
        margin: 10px;
    }
    .enhance-imbuement-data > .total-price-taxa {
        margin: 0px;
    }
    .total-price-taxa {
        margin: 10px;
    }
    .unselected-slot {
        color: black;
    }
    .selected-slot {
        color: lime;
    }
    .disabled-slot {
        color: #a2a9b1;
    }
    #total-price-itens > label {
        display: inline-table;
    }
var version = "2.0.7";
        
        // Imbuements
        var imbuements = new Object();

        // Objetos - Armors, Backpacks, Boots, Helmets, Clubs, Distance, Shields, Swords, Axes, Spellbooks, Wands and Rods.
        var armors = new Object();
        var shields = new Object();
        var boots = new Object();
        var swords = new Object();
        var axes = new Object();
        var clubs = new Object();
        var helmets = new Object();
        var wandsRods = new Object();
        var distance = new Object();
        var spellbooks = new Object();
        var backpacks = new Object();
        var fists = new Object();

        // Lista Categorias
        var categories = new Object();

        // Popula o Select de Categorias
        var loadCategories = () => {
            Object.keys(categories).forEach((category) => {
                $("#category").append(new Option(category, category));
            });
            // Inicializa o campote Item, selecionando o primeiro item.
            setSelectedOption('category', "Armaduras");
            
        } 

        // Carrega a lista de items de acordo com a Categoria selecionada
        var loadItems = () => {
            let items = getItemList();
            loadItemSelect(items);
        }

        // Popula a lista de Items a serem selecionados para fazer os imbuements.
        var loadItemSelect = (items) => {
            
            $("#itemSelect").empty();
            $("#itemSelect").append('<input type="text" placeholder="Search...">');
            Object.keys(items).forEach(itemName => {
                $("#itemSelect").append(new Option(itemName, itemName));
            });
            setSelectedOption('itemSelect', Object.keys(items)[0]);
        }
        
        var selectItem = (itemName) => {
            cleanSlotsImages();
            $('#item-name').text(itemName);
            $('.item-img a').attr('href', 'https://www.tibiawiki.com.br/wiki/' + itemName);
            $('#slot-imagem').attr("src", "https://www.tibiawiki.com.br/wiki/Especial:Redirecionar/file/" + itemName + ".gif")
            $('#item-slots').text(getItemList()[itemName].slots);
            selectedItem["name"] = itemName;
            selectedItem["slots_quantity"] = getItemList()[itemName].slots;
            selectedItem["imbuements"] = getItemList()[itemName].imbuements;
            selectedItem["slots"] = new Object();
            for (let i = 1; i <= selectedItem["slots_quantity"]; i++) {
                selectedItem["slots"][i] = {
                    "selected": (i === 1),
                    "imbuement": {
                        "name": "",
                        "level": "",
                        "itens": {
                            0: {
                                value: 0,
                                quantity: 0,
                            },
                            1: {
                                value: 0,
                                quantity: 0,
                            },
                            2: {
                                value: 0,
                                quantity: 0,
                            },
                            3: {
                                value: 0,
                                quantity: 0,
                            }
                        }
                    }
                };
            }
            selectSlot('item-slot-1');
        }

        // Busca Item na lista de Items.
        var searchItems = (input) => {
            let items = getItemList();
            let filteredKeys = Object.keys(items).filter(name => name.toLowerCase().includes(input.value.toLowerCase()));
            if (filteredKeys.length === 0) {
                return
            }
            let filteredItems = new Object();
            filteredKeys.forEach(itemName => {
                filteredItems[itemName] = items[itemName];
            });
            loadItemSelect(filteredItems);
        }

        var getItemList = () => {
            let selectedCategory = getSelectedValueFromSelect('category');
            return categories[selectedCategory];
        }

        var loadSelectImbuements = () => {
            $("#imbuementSelect").empty();
            let selectedImbuementsOnAnotherSlots = getSelectedImbuementsInAnotherSlots();
            Object.keys(selectedItem.imbuements).forEach(imbuementName => {
                if (!selectedImbuementsOnAnotherSlots.includes(imbuementName) || selectedItem.slots[getSelectedSlotName()].imbuement.name === imbuementName) {
                    $("#imbuementSelect").append(new Option(imbuementName + ' (' + imbuements[imbuementName].name + ')', imbuementName));
                }
            });

            if (selectedItem.slots[getSelectedSlotName()].imbuement.name.length !== 0) {
                setSelectedOption('imbuementSelect', selectedItem.slots[getSelectedSlotName()].imbuement.name);
            } else {
                setSelectedOption('imbuementSelect', $("select#imbuementSelect option")[0].value);
            }
        }

        var selectImbuement = (imbuementName) => {
            let slotName = getSelectedSlotName();
            selectedItem.slots[slotName].imbuement.name = imbuementName;
            showHideGoldToken()
        }

        var loadSelectImbuementLevel = (imbuementName) => {
            let imbuementLevels = selectedItem.imbuements[imbuementName];
            $("#imbuementLevelSelect").empty();
            imbuementLevels.forEach(imbuementLevel => {
                $("#imbuementLevelSelect").append(new Option(imbuements[imbuementName].level[imbuementLevel].name + ((imbuements[imbuementName].level[imbuementLevel].premium) ? ' (premium)' : '' ), imbuementLevel));
            });

            if (selectedItem.slots[getSelectedSlotName()].imbuement.level.length !== 0) {
                setSelectedOption('imbuementLevelSelect', selectedItem.slots[getSelectedSlotName()].imbuement.level);
            } else {
                setSelectedOption('imbuementLevelSelect', $("#imbuementLevelSelect option")[0].value);
            }
        }
        var selectImbuementLevel = (imbuementLevel) => {
            let slotName = getSelectedSlotName();
            selectedItem.slots[slotName].imbuement.level = imbuementLevel;

            $('#item-slot-' + slotName + ' > img').attr('src', imbuements[selectedItem.slots[slotName].imbuement.name].level[imbuementLevel].image);
            $('#imbument-description').text(imbuements[selectedItem.slots[slotName].imbuement.name].level[selectedItem.slots[slotName].imbuement.level].description);
            
            // Mostra os itens necessários.
            cleanAllImbuementItensSlots();
            updatePrice();
            checkItensValue();
            let imbuementItens = imbuements[selectedItem.slots[slotName].imbuement.name].level[selectedItem.slots[slotName].imbuement.level].itens;
            let index = 1;
            imbuementItens.forEach(item => {
                updateItensPrice(index);
                $('#item-img-slot-' + index + ' img').attr('src', item.image);
                $('#item-img-slot-' + index + ' a').attr('href', item.link);
                $('#item-img-slot-' + index + ' a').attr('target', '_blank');
                $('#item-price-' + index + ' img').attr('src', item.image);
                $('#item-price-' + index + ' a').attr('href', item.link);
                $('#item-quantity-' + index).val(item.quantity);
                $('#item-price-' + index + ' div input.item-price-quantity ').attr('min', 0);
                $('#item-price-' + index + ' div input.item-price-quantity ').attr('max', item.quantity);
                $('#item-price-' + index + ' div input.item-price-quantity ').val(item.quantity);
                $('#item-price-' + index + ' div input.item-price-value ').val(selectedItem.slots[getSelectedSlotName()].imbuement.itens[index].value);

                $('#item-price-' + index + ' div label.item-price-name ').text(item.name);
                document.getElementById('item-price-' + index).style.display = '';
                if (document.getElementsByClassName('item-price-' + index + '-divisor')[0] != null) {
                    document.getElementsByClassName('item-price-' + index + '-divisor')[0].style.display = '';
                }
                document.getElementById('total-price-item-' + index).style.display = '';
                document.querySelectorAll('div[id="total-price-item-' + index + '"] > label')[0].innerHTML = item.name + ": ";
                index++;
            });
            let currentSelectedImbuement = imbuements[selectedItem.slots[getSelectedSlotName()].imbuement.name];
            if (currentSelectedImbuement.gold_token) {
                let gpQuantity = selectedItem.slots[getSelectedSlotName()].imbuement.itens[0].quantity;
                if (selectedItem.slots[slotName].imbuement.level === 'Powerful') {
                    gpQuantity = 6;
                } else if (selectedItem.slots[slotName].imbuement.level === 'Intricate') {
                    gpQuantity = 4;
                } else {
                    gpQuantity = 2;
                }
                $('#item-price-0 div input.item-price-quantity ').val(gpQuantity);
                $('#item-price-0 div input.item-price-value ').val(selectedItem.slots[getSelectedSlotName()].imbuement.itens[0].value);
                updateItensPrice(0);
            } else {
                $('#item-price-0 div input.item-price-quantity ').val(0);
            }
            updateTotalPrices();
        }

        var getSelectedSlotName = () => {
            return Object.keys(selectedItem.slots).find(slot => selectedItem.slots[slot].selected);
        }
        var getSelectedImbuementsInAnotherSlots = () => {
            let arrImbuements = new Array();
            Object.keys(selectedItem.slots).forEach(slot => {
                arrImbuements.push(selectedItem.slots[slot].imbuement.name);
            });
            return arrImbuements;
        }

        var selectSlot = (slotId) => {
            $('#' + slotId + ' > label')
            slotId = slotId.replace(/item-slot-/gi, '')
            let selectedSlotName = getSelectedSlotName();
            if (selectedItem.slots[slotId] == null) {
                return
            }
            disableSlot();
            unselectAllSlotsLabels();
            selectSlotLabel('item-slot-' + slotId);
            selectedItem.slots[selectedSlotName].selected = false;
            selectedItem.slots[slotId].selected = true;
            loadSelectImbuements();
        }

        var cleanSlotsImages = () => {
            $('#item-slot-1 > img').attr('src', 'https://www.tibiawiki.com.br/images/3/35/Trans.gif');
            $('#item-slot-2 > img').attr('src', 'https://www.tibiawiki.com.br/images/3/35/Trans.gif');
            $('#item-slot-3 > img').attr('src', 'https://www.tibiawiki.com.br/images/3/35/Trans.gif');
        }
        var selectSlotLabel = (slotId) => {
            $('#' + slotId + '-label').addClass('selected-slot');
            $('#' + slotId + '-label').removeClass('unselected-slot');
            $('#' + slotId + '-label').removeClass('disabled-slot');
        }
        var disableSlot = () => {
            // disabled-slot
            for (let i = 3; i > 0; i--) {
                $('#item-slot-' + i + '-label').addClass('disabled-slot');
                $('#item-slot-' + i + '-label').removeClass('selected-slot');
                $('#item-slot-' + i + '-label').removeClass('unselected-slot');
            }
        }
        var unselectAllSlotsLabels = () => {
            for (let i = selectedItem.slots_quantity; i > 0; i--) {
                $('#item-slot-' + i + '-label').addClass('unselected-slot');
                $('#item-slot-' + i + '-label').removeClass('selected-slot');
                $('#item-slot-' + i + '-label').removeClass('disabled-slot');
            }
        }

        var cleanAllImbuementItensSlots = () => {
            for (let i = 3; i > 0; i--) {
                $('#item-img-slot-' + i + ' img').attr('src', 'https://www.tibiawiki.com.br/images/3/35/Trans.gif');
                $('#item-img-slot-' + i + ' a').attr('href', 'javascript:;');
                $('#item-img-slot-' + i + ' a').attr('target', '');
                $('#item-quantity-' + i).val(0);
                $('#item-price-' + i + ' img').attr('src', 'https://www.tibiawiki.com.br/images/3/35/Trans.gif');
                $('#item-price-' + i + ' div input.item-price-quantity ').val(0);
                $('#item-price-' + i + ' div input.item-price-quantity ').attr('min', 0);
                $('#item-price-' + i + ' div input.item-price-quantity ').attr('max', 0);
                // $('#item-price-' + i + ' div input.item-price-value ').val(0);
                $('#item-price-' + i + ' div label.item-price-name ').text('');
                document.getElementById('item-price-' + i).style.display = 'none';
                if (document.getElementsByClassName('item-price-' + i + '-divisor')[0] != null) {
                    document.getElementsByClassName('item-price-' + i + '-divisor')[0].style.display = 'none';
                }
                document.getElementById('total-price-item-' + i).style.display = 'none';
            }
            // $('#item-price-0 div input.item-price-value ').val(0);
        }

        var showHideGoldToken = () => {
            let currentSelectedImbuement = imbuements[selectedItem.slots[getSelectedSlotName()].imbuement.name];
            let components = $('.price-gold-token');
            if (currentSelectedImbuement.gold_token != null && currentSelectedImbuement.gold_token) {
                Object.keys(components).forEach(component => {
                    if (!isNaN(Number(component))) {
                        components[component].style.display = "";
                    }
                })
            } else {
                Object.keys(components).forEach(component => {
                    if (!isNaN(Number(component))) {
                        components[component].style.display = "none";
                    }
                })
            }
        }

        var updatePrice = () => {
            let imbuementLevel = selectedItem.slots[getSelectedSlotName()].imbuement.level;
            let tax = '0';
            let percent = '0';
            if (imbuementLevel === 'Powerful') {
                percent = 50;
                tax = (document.getElementById('enhance-imbuement-chance').checked) ? '250,000' : '200,000';
                document.getElementById('price-tax').innerHTML = '50,000' + ' <b>GPs</b>';
            } else if (imbuementLevel === 'Intricate') {
                percent = 70;
                tax = (document.getElementById('enhance-imbuement-chance').checked) ? '60,000' : '30,000';
                document.getElementById('price-tax').innerHTML = '30,000' + ' <b>GPs</b>';
            } else {
                percent = 90;
                tax = (document.getElementById('enhance-imbuement-chance').checked) ? '15,000' : '5,000';
                document.getElementById('price-tax').innerHTML = '10,000' + ' <b>GPs</b>';
            }
            document.getElementById('percent-chance-rate').innerHTML = ((document.getElementById('enhance-imbuement-chance').checked) ? 100 : percent) + '%';
            document.getElementById('percent-chance-rate').style.color = (document.getElementById('enhance-imbuement-chance').checked) ? 'lime' : 'red';
            document.getElementById('total-imbuement-tax-value').innerHTML = tax + ' <b>GPs</b>';
            updateTotalPrices();
        }

        var updateValues = (value, type, id) => {
            let itemIndex = id.replace(/item-/gi, '');
            
            if (type === 'price') {
                selectedItem.slots[getSelectedSlotName()].imbuement.itens[itemIndex].value = value
                selectedItem.slots[getSelectedSlotName()].imbuement.itens[itemIndex].quantity = $('#item-price-' + itemIndex + ' input.item-price-quantity').val()
            } else {
                selectedItem.slots[getSelectedSlotName()].imbuement.itens[itemIndex].quantity = value
                selectedItem.slots[getSelectedSlotName()].imbuement.itens[itemIndex].price = $('#item-price-' + itemIndex + ' input.item-price-value').val()
            }
            updateItensPrice(itemIndex);
            updateTotalPrices();
        }

        var updateItensPrice = (idIndex) => {
            let value = calcValues(idIndex);
            setTotalValuesToFields(idIndex, value);
        }

        var updateTotalPrices = () => {
            let total = 0;
            let tax = Number(document.getElementById('total-imbuement-tax-value').innerHTML.replace(/\s<b>GPs<\/b>/gi, '').replace(/,/gi, ''));
            if (selectedItem.slots[getSelectedSlotName()].imbuement.level === 'Basic') {
                let value = calcValues(1);
                total += value;
            }
            if (selectedItem.slots[getSelectedSlotName()].imbuement.level === 'Intricate') {
                let value = calcValues(1);
                value += calcValues(2);
                total += value;
            }
            if (selectedItem.slots[getSelectedSlotName()].imbuement.level === 'Powerful') {
                let value = calcValues(1);
                value += calcValues(2);
                value += calcValues(3);
                total += value;
            }
            if (imbuements[selectedItem.slots[getSelectedSlotName()].imbuement.name].gold_token) {
                let goldToken = calcValues(0);
                setTotalValuesToFields('economy', total - goldToken);
                setTotalValuesToFields('0-tax', goldToken + tax);
            }
            setTotalValuesToFields('imbuement', total);
            setTotalValuesToFields('imbuement-tax', total + tax);
        }

        var setTotalValuesToFields = (idIndex, value) => {
            document.getElementById('total-item-' + idIndex + '-value').innerHTML = value.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",") + ' <b>GPs</b>';
        }

        var checkItensValue = () => {
            
            for (let i = 3; i >= 0; i--) {
                let value = selectedItem.slots[getSelectedSlotName()].imbuement.itens[i];
                $('#item-price-' + i + ' div input.item-price-value ').val(value);
            }
        }
        var calcValues = (idIndex) => {
            let quantity = selectedItem.slots[getSelectedSlotName()].imbuement.itens[idIndex].quantity;
            let value = selectedItem.slots[getSelectedSlotName()].imbuement.itens[idIndex].value;

            return Number(quantity * value);
        }

        // Limpa Campos.
        var cleanSearchField = () => {
            let searchInput = document.getElementById('search-item');
            searchInput.value = '';
        }

        /**
         * Adiciona Evento para quando houver interação nos selects, disparar uma ação/função.
         */
        var addEventListeners = () => {
            // Category Select
            document.getElementById('category').addEventListener('change', function() {
                cleanSearchField();
                loadItems();
            }, false);

            // Item Select
            document.getElementById('itemSelect').addEventListener('change', function() {
                let option = getSelectedValueFromSelect('itemSelect');
                selectItem(option);
            }, false);

            let searchInput = document.getElementById('search-item');
            searchInput.addEventListener('input', () => {
                searchItems(searchInput);
            });

            // ImbuementSelect
            document.getElementById('imbuementSelect').addEventListener('change', function() {
                let option = getSelectedValueFromSelect('imbuementSelect');
                selectImbuement(option);
                loadSelectImbuementLevel(option);
            }, false);

            // Imbuement Level Select
            document.getElementById('imbuementLevelSelect').addEventListener('change', function() {
                let option = getSelectedValueFromSelect('imbuementLevelSelect');
                selectImbuementLevel(option);
            }, false);
        }

        /**
         * Pega a Opção selecionada de um Select.
         */
        var getSelectedValueFromSelect = (selectId) => {
            let selectElement = document.getElementById(selectId);
            return selectElement.options[selectElement.selectedIndex].value; 
        }
        /**
         * Seta uma opção forçando a seleção e disparando o evento de ação/função.
         */
        var setSelectedOption = (selectId, value) => {
            let selectElement = document.getElementById(selectId);
            selectElement.value = value;
            // Trigger the change event
            var event = new Event('change');
            selectElement.dispatchEvent(event);
        }

        var loadAllItens = async () => {
            let baseURL = 'https://mypper.com/tibia/v1/tibiawiki/';
            $('.loading label').text('Loading Imbuements and Itens for You, Adventurer!...');
            await Promise.all([
                loadData(baseURL, 'imbuements', 'Imbuements'),
                loadData(baseURL, 'armors', 'Armors'),
                loadData(baseURL, 'backpacks', 'Backpacks'),
                loadData(baseURL, 'boots', 'Boots'),
                loadData(baseURL, 'fists', 'Fists'),
                loadData(baseURL, 'helmets', 'Helmets'),
                loadData(baseURL, 'clubs', 'Clubs'),
                loadData(baseURL, 'distance', 'Distance'),
                loadData(baseURL, 'shields', 'Shields'),
                loadData(baseURL, 'swords', 'Swords'),
                loadData(baseURL, 'axes', 'Axes'),
                loadData(baseURL, 'spellbooks', 'Spellbooks'),
                loadData(baseURL, 'wandsRods', 'WandsRods')
            ]).then((results) => {
                categories = {
                    "Armaduras": armors,
                    "Backpacks": backpacks,
                    "Botas": boots,
                    "Capacetes": helmets,
                    "Clavas": clubs,
                    "Distância": distance,
                    "Escudos": shields,
                    "Espadas": swords,
                    "Machados": axes,
                    "Punhos": fists,
                    "Spellbooks": spellbooks,
                    "Wands e Rods": wandsRods
                }
                loadCategories();
                $('.loading')[0].style.display = 'none';
                console.log("Load Done!");
            }).catch((error) => {
                console.error('Error:', error);
            });
            // executedPromises();
        }

        var loadData = async (baseURL, varName, path) => {
            return new Promise((resolve, reject) => {
                $.ajax({
                    contentType: 'text/plain; charset=utf-8',
                    url: baseURL + '/index.php?title=Tibia_Wiki:' + path + '/json&action=raw',
                    type: 'GET',
                    success: function(data) {
                        callbacks(data.replace(/<pre id="[^"]*">/gi, '').replace(/<\/pre>/gi, ''), varName);
                        resolve('Loaded: ' + varName);
                    },
                    error: function(error) {
                        console.error(error);
                        callbacks(null, varName);
                    }
                });
            });
        }

        var callbacks = (codigo, varName) => {
            if (codigo == null) {
                codigo = "";
            } else {
                console.log('Loaded:', varName);
                window[varName] = JSON.parse(codigo);
            }
            // executedPromises();
        }

        var executedPromises = async () => {
            // await Promise.all(promises).
        }

        var selectedItem = new Object();
        var promises = [];
        $(document).ready(function () {

            $(".version-label").text("v" + version);

            // Adiona os eventos aos componentes.
            addEventListeners();

            loadAllItens();
        });