GobZilla

Outils d'aide au jeu

נכון ליום 07-11-2023. ראה הגרסה האחרונה.

// ==UserScript==
// @name           GobZilla
// @namespace      Gobland
// @description    Outils d'aide au jeu
// @include        http://games.gobland.fr/jeuC.html
// @include        http://games.gobland.fr/act.php
// @include        http://games.gobland.fr/Vue.php
// @include        http://games.gobland.fr/Menu.php
// @include        http://games.gobland.fr/Meute.php
// @include        http://games.gobland.fr/ProfilPerso.php
// @include        http://games.gobland.fr/SmallEquipement.php
// @include        http://games.gobland.fr/Options.php
// @include        http://games.gobland.fr/activDLA.php
// @include        http://games.gobland.fr/actions.php
// @include        http://games.gobland.fr/playActions.php
// @include        http://games.gobland.fr/goodies.php*
// @include        http://games.gobland.fr/stock.php?*
// @match          http://games.gobland.fr/index.php*
// @match          https://games.gobland.fr/index.php*
// @match          http://games.gobland.fr/playActions.php?todo=52
// @require        https://cdnjs.cloudflare.com/ajax/libs/raphael/2.3.0/raphael.js
// @require        https://greasemonkey.github.io/gm4-polyfill/gm4-polyfill.js
// @require        https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js
// @copyright      Lordslair, Seishin, Glak (393) et Death Métal (330)
// @author         DeathMétal 330 - Glak 393
// @license        https://creativecommons.org/licenses/by-sa/4.0/
// @version        1.9.3.1
// @icon           https://i.ibb.co/HB9XztJ/gobzilla.jpg
// ==/UserScript==




//==========================================================================================================================================================================================================================
// Page Option - Description de Gobzilla quand on clique sur Goodies et Gobzilla
//==========================================================================================================================================================================================================================

    // rename Goodies
if ($(location).attr('href').match(/http:\/\/(.*\.)?gobland\.fr\/Options\.php/i)) {
(function() {
    'use strict';

    var newLinkText = "[Googies et GobZilla]";

    var goodiesLink = document.querySelector('a[href="goodies.php"]');
    if (goodiesLink) {
        goodiesLink.textContent = newLinkText;
    }

})
();
}

    // ajoute un paragraphe de description de Gobzilla
if ($(location).attr('href').match(/http:\/\/(.*\.)?gobland\.fr\/Goodies\.php/i)) {
(function() {
    'use strict';

    var newLinkText = "[Googies et GobZilla]";

    var goodiesLink = document.querySelector('a[href="goodies.php"]');
    if (goodiesLink) {
        goodiesLink.textContent = newLinkText;
    }


    var newMessageLines = [
      "Roulé à la main sous les Aisselles par DeathMétal 330, puis grandement amélioré par Glak 393",
      "Fonctions principales :",
      "- GobCDM : Cliquez sur un monstre dans la page vue pour avoir sa cdm, si déja dans la base de donnée",
      " - Affiche une vue 2d activable ou non  ",
      " - Décoche le vestiaire, décoche l'activation de DLA ",
      ' - Masquer les petits monstres, masquer les arbres',
      " - Calcul auto de nombre d'entrainements pour passer lvl supérieur" ,
      " - Récupération des caracs et calculs des skills au survol de la souris. ",
      " - Calcul sur les Matériaux, page équipement et habitation",
      " - Modifie la Css et met en couleur les Gobelins et les gros monstres dans la vue . En rouge > 40, en orange >35, en orange clair >30",
      "-  Filtre et tri des monstres +  compteur, tri des plantes",
       "- Affiche les lieux étendus (lieux hors de vue), ainsi que les plantes étendues (plantes hors vue, activable via une coche)",
      " - Ajout d'icônes dans le profil et dans la vue ",
      " 🥰 amis",
      " 👨‍🍳 monstre à cuisiner  ",
      "👁️👁️👁️ VLC Totale",
      "👁️👁️ VLC Importante",
      "👁️ VLC partielle",
      " Bipez moi si vous voyez des erreurs, il doit y en avoir......."
    ];



    var developmentMessage = document.querySelector('font[color="RED"]');
    if (developmentMessage) {
        developmentMessage.textContent = ''; // Clear existing content

      // Add an image
      var imageElement = document.createElement('img');
        imageElement.src = 'https://i.ibb.co/cgqGVCt/g-OBZILLAICON.png'; // Replace with the URL of your image
        imageElement.style.maxWidth = '60%'; // Ensure the image fits within the content
        developmentMessage.appendChild(imageElement);

      var welcomeTitle = document.createElement('div');
        welcomeTitle.style.fontSize = '24px'; // Larger font size
        welcomeTitle.style.fontWeight = 'bold'; // Bold style
        welcomeTitle.style.marginBottom = '10px'; // Add some space below
        welcomeTitle.textContent = 'Bienvenue sur GobZilla';
        developmentMessage.appendChild(welcomeTitle);
        newMessageLines.forEach(function(line) {
            var paragraph = document.createElement('p');
           paragraph.style.color = 'black';
            if (line === "Fonctions principales :") {
                var underline = document.createElement('u');
                underline.textContent = line;
                paragraph.appendChild(underline);
            } else {
                paragraph.textContent = line;
            }
            developmentMessage.appendChild(paragraph);
        });
    }
})();

}



//==========================================================================================================================================================================================================================
// Page Meute - Récupération du niveau pour calcul des PX
//==========================================================================================================================================================================================================================
if ($(location).attr('href').match(/http:\/\/(.*\.)?gobland\.fr\/Meute\.php/i)) {
  var lvlmeute = $('center:contains("Niveau de la meute :")').text().match(/^(\D*)(\d+)/)[2];
  window.localStorage.setItem('lvlmeute', lvlmeute);
} else {
  var lvlmeute = window.localStorage.getItem('lvlmeute');
}


//==========================================================================================================================================================================================================================
// Page de résultat d'action - Envoi des CdM à GobZilla
//==========================================================================================================================================================================================================================
if ($(location).attr('href').match(/http:\/\/(.*\.)?gobland\.fr\/act\.php/i)) {
  // Extraction des caracs min - max d'une ligne de CdM
  function extractMinMax(intervalle) {
    var parse = intervalle.match(/entre (\d+) et (\d+)/);
    if (parse != null) {
      return new Array(parseInt(parse[1]), parseInt(parse[2]));
    } else {
      parse = intervalle.match(/inférieur ou égal à (\d+)/);
      if (parse != null) {
         return new Array(1, parseInt(parse[1]));
      } else {
        parse = intervalle.match(/supérieur ou égal à (\d+)/);
        if (parse != null) {
          return new Array(parseInt(parse[1]), parse[1]*1.5);
        } else {
          return null;
        }
      }
    }
  }

  $( document ).ready(function() {
    if ($("h1").text() == "Connaissance des Monstres") {
      // Analyse de la CdM
      var conteneur = $("#identite").find("div.deborde");
      var rang  = null;
      var executionLinesArr = conteneur.find("center:first").text().split("\n");
      $.each( executionLinesArr, function( key, value ) {
        if (value.indexOf("AVEZ RÉUSSI") > 0) {
          rang = value.substring(
                    value.indexOf("en tant que") + 12,
                    value.indexOf(" ("));
          return false;
        }
      });
      console.log("Rang = " + rang);
      // Vérification du rang : on ne traite pas les CdM des grouillots
      if (rang == "Maître" || rang == "Grand Maître") {
        var resultLinesArr = conteneur.text().split("\n");
        var cdm = {};
        cdm.gob = window.localStorage.getItem('gobId');
        cdm.rang = rang;
        $.each( resultLinesArr, function( key, value ) {
          lineArr = value.split(" : ");
          // Construction de la CdM en parsant la page
          switch (lineArr[0]) {
            case "Le monstre ciblé fait partie des":
              cdm.nom = lineArr[1].split("(")[1].split(" - ")[0];
              cdm.numMob = lineArr[1].split(" - N° ")[1].split(")")[0];
              break;
            case "Niveau":
              cdm.niveau = lineArr[1];
              break;
            case "Points de Vie":
              var arrMinMax = extractMinMax(lineArr[1]);
              cdm.pvMin = arrMinMax[0];
              cdm.pvMax = arrMinMax[1];
              break;
            case "Dés d'Attaque":
              var arrMinMax = extractMinMax(lineArr[1]);
              cdm.attMin = arrMinMax[0];
              cdm.attMax = arrMinMax[1];
              break;
            case "Dés d'Esquive":
              var arrMinMax = extractMinMax(lineArr[1]);
              cdm.esqMin = arrMinMax[0];
              cdm.esqMax = arrMinMax[1];
              break;
            case "Dés de Dégât":
              var arrMinMax = extractMinMax(lineArr[1]);
              cdm.degMin = arrMinMax[0];
              cdm.degMax = arrMinMax[1];
              break;
            case "Dés de Régénération":
              var arrMinMax = extractMinMax(lineArr[1]);
              cdm.regMin = arrMinMax[0];
              cdm.regMax = arrMinMax[1];
              break;
            case "Perception":
              var arrMinMax = extractMinMax(lineArr[1]);
              cdm.perMin = arrMinMax[0];
              cdm.perMax = arrMinMax[1];
              break;
            case "Armure Physique":
              var arrMinMax = extractMinMax(lineArr[1]);
              cdm.armurePhyMin = arrMinMax[0];
              cdm.armurePhyMax = arrMinMax[1];
              break;
            case "Armure Magique":
              var arrMinMax = extractMinMax(lineArr[1]);
              cdm.armureMagMin = arrMinMax[0];
              cdm.armureMagMax = arrMinMax[1];
              break;
            case "Durée du tour":
              var arrMinMax = extractMinMax(lineArr[1]);
              cdm.tourMin = arrMinMax[0];
              cdm.tourMax = arrMinMax[1];
              break;
            case "Créature volante":
              cdm.vol = lineArr[1];
              break;
            case "Attaque à distance":
              cdm.distance = lineArr[1];
              break;
            case "Pouvoir":
              cdm.pouvoir = lineArr[1];
              break;
            case "Nombre d'attaques":
              cdm.nbAttaques = lineArr[1];
              break;
            case "Habitat":
              cdm.habitat = lineArr[1];
              break;
            case "Comportement":
              cdm.comportement = lineArr[1];
              break;
            case "Intelligence":
              cdm.intelligence = lineArr[1];
              break;
            case "Vitesse de déplacement":
              cdm.vitesse = lineArr[1];
              break;
            case "Vision du Caché":
              cdm.vlc = lineArr[1];
              break;
          }
        });

        // Envoi de la CdM
        var url = "https://gobzilla.incaworld.fr/cdm";
        var result = $("<center></center>");
        console.log(cdm);
        var data = JSON.stringify(cdm);
        console.log(data);
        $.ajax({
          type: "PUT",
          url: url,
          contentType: "application/json",
          data: data
        })
        .done(function() {
          result.html("<br><b>**** CdM envoyée à GobZilla ****</b>");
        })
        .fail(function(err) {
          console.log(err);
          result.html("<br><b>**** Echec de l'envoi de la CdM à GobZilla ****</b>");
        })
        .always(function() {
          result.insertAfter(conteneur.find("center:last"));
        });
      }
    }
  });
}

//==========================================================================================================================================================================================================================
// Traitements spécifiques à la page MENU (left)
//==========================================================================================================================================================================================================================
if ($(location).attr('href').match(/http:\/\/(.*\.)?gobland\.fr\/Menu\.php/i)) {
  // Enregistrement dans le stockage local de l'identité du Gob
  var gobContainer = $(".presentation").find('a:first');
  window.localStorage.setItem('gobName', gobContainer.text());
  window.localStorage.setItem('gobId', gobContainer.attr('href').match(/javascript:EPV\((\d+)\)/)[1]);

  // Fonction pour effectuer une requête HTTP GET
  function httpGet(url) {
    return new Promise((resolve, reject) => {
      const xhr = new XMLHttpRequest();
      xhr.open("GET", url, true);

      xhr.onload = function() {
        if (xhr.status === 200) {
          resolve(xhr.responseText);
        } else {
          reject(new Error(`HTTP Error: ${xhr.status}`));
        }
      };

      xhr.onerror = function() {
        reject(new Error("Network Error"));
      };

      xhr.send();
    });
  }

  // Fonction pour extraire la valeur "valeurPA" de la page "http://games.gobland.fr/ProfilPerso.php"
  function extractValeurPA(pageText) {
    var regex = /reste (\d+) PA/;
    var match = regex.exec(pageText);
    if (match) {
      return parseInt(match[1]);
    }
    return 0; // Si la valeur n'est pas trouvée, retournez 0
  }

  // Effectuer une requête HTTP pour obtenir le contenu de la page "http://games.gobland.fr/ProfilPerso.php"
  httpGet("http://games.gobland.fr/ProfilPerso.php")
    .then(function(responseText) {
      // Extraire la valeur "valeurPA" de la page
      var valeurPA = extractValeurPA(responseText);
      localStorage.setItem('valeurPA', valeurPA);

      (function() {
        'use strict';

        // Définissez votre regex pour trouver la date
        var regex = /DLA: (\d{4})-(\d{2})-(\d{2}) (\d{2}:\d{2}:\d{2})/;

        // Récupérez le texte de la page
        var pageText = document.body.textContent;
        // Recherchez la correspondance avec la regex
        var match = regex.exec(pageText);

        if (match) {
          // Extraire les composants de la date
          var annee = parseInt(match[1]);
          var mois = parseInt(match[2]) - 1; // Les mois dans JavaScript sont indexés de 0 à 11
          var jour = parseInt(match[3]);
          var heures = parseInt(match[4].split(':')[0]);
          var minutes = parseInt(match[4].split(':')[1]);
          var secondes = parseInt(match[4].split(':')[2]);

          // Créez un objet Date avec la date extraite
          var dateEuropeenne = new Date(annee, mois, jour, heures, minutes, secondes);

          // Obtenez la date actuelle
          var maintenant = new Date();

          // Comparez les deux dates
          var containerElement = document.createElement('div');
          var contenuAffiche = '';

          if (maintenant > dateEuropeenne) {
            // La date est dépassée
            if (valeurPA !== 0) {
              var tempsRestantMinutes = (maintenant - dateEuropeenne) / (1000 * 60);
              var decalSecondes = (secondes >= maintenant.getSeconds()) ? (secondes - maintenant.getSeconds()) : (60 + secondes - maintenant.getSeconds());
              contenuAffiche = '<span style="color: red;">DLA dépassée<br> Décalez de ' + tempsRestantMinutes + ' minutes</span>';
            } else {
              contenuAffiche = '<p><span style="color: red;">DLA dépassée !</span></p>';
            }
          } else {
            var tempsRestantMillisecondes = dateEuropeenne - maintenant;
            var tempsRestantMinutes = Math.floor(tempsRestantMillisecondes / (1000 * 60));
            contenuAffiche = '<span style="color: green;">Prochaine DLA dans<br>' + tempsRestantMinutes + ' minutes</span>';
          }

          containerElement.innerHTML = contenuAffiche;

          var dlaElement = document.querySelector('.dla');
          dlaElement.innerHTML += '<br>' + containerElement.outerHTML;
        }
      })();
    })
    .catch(function(error) {
      console.error(error);
    });
}



//==========================================================================================================================================================================================================================
// Traitements spécifiques à la page ACTIONS (footer)
//==========================================================================================================================================================================================================================
if ($(location).attr('href').match(/http:\/\/(.*\.)?gobland\.fr\/playActions\.php/i)) {
  function showHideCdmNeededActions() {
    var displayCdmNeededChecked = window.localStorage.getItem('displayCdmNeededChecked');

    if(displayCdmNeededChecked == 1) {
      var cdmNeeded = window.localStorage.getItem('cdmNeeded');
      $.each(cdmNeeded.split(","), function(index, value) {
        $('option:contains("' + value + '")').css("background-color", "#FF99FF");
      });
    } else {
      $(".cdmNeeded").removeClass("cdmNeeded");
    }
  }

  // Après chargement de la page, lancement des enhancements
  $( document ).ready(function() {
    showHideCdmNeededActions();
  });
}

//==========================================================================================================================================================================================================================
// Traitements spécifiques à la page VUE
//==========================================================================================================================================================================================================================
if ($(location).attr('href').match(/^http:\/\/(.*\.)?gobland\.fr\/vue\.php$/i)) {





  // Intégration de CSS pour le loader et la CDM
  var myCSS = `
    #preFilter label {
      padding-left: 10px;
    }
    #preFilter {
      padding: 5px;
      margin-bottom: 5px;
      border: 1px solid black;
      text-align: center;
    }
    #btnRefresh {
      display: block;
      text-align: center;
      margin: auto;
    }
    #filterDiv {
      padding-bottom: 5px;
    }
    #filterDiv label {
      padding-left: 10px;
    }
    .ckbFilter {
      vertical-align: middle;
    }
    .cdmNeeded {
      background-color: #FF99FF;
    }
    .cuisine {
      background-color: #99FF99;
    }
    .cdmContainer {
      background: url(http://images.gobland.fr/v1.0/grande-fenetre/gf-centre.png);
      border: 2px solid #666;
      font-family: sans-serif;
      font-size: 12px;
      padding: 10px;
      display: inline-block;
      background-color: #ddd;
      position: fixed;
      width: 400px;
      left: 270px;
      top: 10%;
    }
    .cdmContainer .title {
      font-weight: bold;
      font-size: 14px;
    }
    .cdmContainer span {
      display: block;
      padding: 2px;
    }
    .lds-roller {
      display: inline-block;
      position: fixed;
      width: 80px;
      height: 80px;
      left: 415px;
      top: 50%;
      z-index: 1000;
    }
    .lds-roller div {
      animation: lds-roller 1.2s cubic-bezier(0.5, 0, 0.5, 1) infinite;
      transform-origin: 40px 40px;
    }
    .lds-roller div:after {
      content: " ";
      display: block;
      position: absolute;
      width: 7px;
      height: 7px;
      border-radius: 50%;
      background: #000;
      margin: -4px 0 0 -4px;
    }
    .lds-roller div:nth-child(1) {
      animation-delay: -0.036s;
    }
    .lds-roller div:nth-child(1):after {
      top: 63px;
      left: 63px;
    }
    .lds-roller div:nth-child(2) {
      animation-delay: -0.072s;
    }
    .lds-roller div:nth-child(2):after {
      top: 68px;
      left: 56px;
    }
    .lds-roller div:nth-child(3) {
      animation-delay: -0.108s;
    }
    .lds-roller div:nth-child(3):after {
      top: 71px;
      left: 48px;
    }
    .lds-roller div:nth-child(4) {
      animation-delay: -0.144s;
    }
    .lds-roller div:nth-child(4):after {
      top: 72px;
      left: 40px;
    }
    .lds-roller div:nth-child(5) {
      animation-delay: -0.18s;
    }
    .lds-roller div:nth-child(5):after {
      top: 71px;
      left: 32px;
    }
    .lds-roller div:nth-child(6) {
      animation-delay: -0.216s;
    }
    .lds-roller div:nth-child(6):after {
      top: 68px;
      left: 24px;
    }
    .lds-roller div:nth-child(7) {
      animation-delay: -0.252s;
    }
    .lds-roller div:nth-child(7):after {
      top: 63px;
      left: 17px;
    }
    .lds-roller div:nth-child(8) {
      animation-delay: -0.288s;
    }
    .lds-roller div:nth-child(8):after {
      top: 56px;
      left: 12px;
    }
    @keyframes lds-roller {
      0% {
        transform: rotate(0deg);
      }
      100% {
        transform: rotate(360deg);
      }
    }`;
  var myStyle = document.createElement("style");
  myStyle.setAttribute("type", "text/css");
  myStyle.appendChild(document.createTextNode(myCSS));
  document.body.appendChild(myStyle);

  // HTML pour le loader
  var loader = $("<div id=\"loader\" class=\"lds-roller\"><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div></div>");
  $("#content").append(loader);
  $("#loader").hide();

  // HTML pour les CdM
  var cdm = $("<div id=\"cdm\" class=\"cdmContainer\"></div>");
  $("#content").append(cdm);
  cdm.click(function(evt) {
    evt.preventDefault();
    $("#cdm").hide();
  });
  $("#cdm").hide();

  const raceGobs = ["Musculeux", "Mentalo", "Nodef", "Trad Scion", "Vis Yonnair", "Zozo Giste"];
  const monstreAMasquer = ["Lémure", "Sprigan", "Larbin démoniaque"];
  const ArbresAMasquer = ["Arbre"];
  const suivants =["Créature mécanique", "Squelette", "Pierreux" , "Esprit-rôdeur" , "Zombi"];

  /// Coloration des gros mobs et indication px
  $("#TCREATURES > center > table > tbody > tr").each( function(){
    var race = $(this).find('td').eq(4).text();
    if (jQuery.inArray(race, raceGobs) < 0) {
      var tdlevel = $(this).find('td');
      var lvl = parseInt(tdlevel.eq(3).text(), 10);
      if (isNaN(lvl)) return;
      if (lvl > 39) {
        $(this).css("background-color","#f55442")
      } else if (lvl > 29) {
        $(this).css("background-color","#f59c42")
      } else if (lvl > 25) {
        $(this).css("background-color","#f5b342")
      }


      var id = 0;
      var infosMob = $(this).find('a:first').attr('href').match(/javascript:EMV\((\d+)\)/);
      if (infosMob != null) {
        id = infosMob[1];
      }

      // Ajout de l'affichage d'une CDM au clic sur la race
      $(this).find('td').eq(4).css("cursor", "pointer");
      $(this).find('td').eq(4).click(function(evt) {
        evt.preventDefault();

        $("#loader").show();

        var url = "https://gobzilla.incaworld.fr/cdm/"+race+"/"+lvl+"/"+id;
        $.getJSON( url, function( data ) {
          if (data["race"] != undefined) {
            $("#loader").hide();
            $("#cdm").html(
                "<div class=\"title\">" + data["nom"] + (data["numMob"]?" (n° " + data["numMob"] + ")":"") + "</div>"
                + "<p>Le monstre fait partie des : " + data["race"] + "</p>"
                + "<span>Niveau moyen : " + data["niveau"] + "</span>"
                + "<span>Points de Vie : entre " + data["pvMin"] + " à " + data["pvMax"] + "</span>"
                + "<span>Dés d'Attaque : entre " + data["attMin"] + " et " + data["attMax"] + "</span>"
                + "<span>Dés d'Esquive : entre " + data["esqMin"] + " et " + data["esqMax"] + "</span>"
                + "<span>Dés de Dégât : entre " + data["degMin"] + " et " + data["degMax"] + "</span>"
                + "<span>Dés de Régénération : entre " + data["regMin"] + " et " + data["regMax"] + "</span>"
                + "<span>Perception : entre " + data["perMin"] + " et " + data["perMax"] + "</span>"
                + "<span>Armure Physique : entre " + data["armurePhyMin"] + " et " + data["armurePhyMax"] + "</span>"
                + "<span>Armure Magique : entre " + data["armureMagMin"] + " et " + data["armureMagMax"] + "</span>"
                + "<span>Tour : entre " + data["tourMin"] + "h et " + data["tourMax"] + "h</span>"
                + "<span>Pouvoir : " + data["pouvoir"] + "</span>"
                + "<span>Créature volante : " + (data["vol"]?"Oui":"Non") + "</span>"
                + "<span>Attaque à distance : " + (data["distance"]?"Oui":"Non") + "</span>"
                + "<span>Nombre d'attaques : " + data["nbAttaques"] + "</span>"
                + "<span>Comportement : " + data["comportement"] + "</span>"
                + "<span>Intelligence : " + data["intelligence"] + "</span>"
                + "<span>Vitesse : " + data["vitesse"] + "</span>"
                + "<span>VLC : " + data["vlc"] + "</span>"
                + "<span>" + data["magie"] + "</span></br>"
                + "<b>Moyenne basée sur " + data["nbCdm"] + " CdM</b>");
          } else {
            $("#loader").hide();
            $("#cdm").html("Pas de CDM en stock !");
          }
          $("#cdm").show();
        });
      });

      if (lvlmeute != undefined) {
        var px = Math.max(0, 20+2*(lvl-lvlmeute)+lvl);
        tdlevel.prop('title', px + "px");
      } else {
        tdlevel.prop('title', "Merci de visiter la page meute pour charger le niveau");
      }
    }
  });

  // Coloration des gobs
  $.each(raceGobs, function(index, value) {
    $('#TCREATURES > center > table > tbody > tr > td:contains("' + value + '")').parent().css("background-color","#ccccff");
  });

  // Coloration des suivants
   $.each(suivants, function(index, value) {
    $('#TCREATURES > center > table > tbody > tr > td:contains("' + value + '")').parent().css("background-color","#ffadde");
  });




 // fonction filtre creatures dans la vue
(function() {
    'use strict';

    const table = document.querySelector('#TCREATURES table');

    if (table) {
        const headers = table.querySelectorAll('th');

        headers.forEach(header => {
            if (!header.hasAttribute('colspan')) {
                header.style.cursor = 'pointer';

                const arrowUp = document.createElement('span');
                arrowUp.textContent = ' ▲';
                arrowUp.className = 'sortIndicator';
                arrowUp.style.display = 'none';

                const arrowDown = document.createElement('span');
                arrowDown.textContent = ' ▼';
                arrowDown.className = 'sortIndicator';
                arrowDown.style.display = 'none';

                header.appendChild(arrowUp);
                header.appendChild(arrowDown);

                let ascending = false;

                header.addEventListener('click', () => {
                  // reset sort indicators
                  $(".sortIndicator").css("display", 'none');

                  const headerIndex = Array.from(headers).indexOf(header);
                  let rows = Array.from(table.querySelectorAll('tbody tr'));

                  rows.sort((a, b) => {
                      const aValue = a.cells[headerIndex].textContent.trim();
                      const bValue = b.cells[headerIndex].textContent.trim();

                    // La 1ère ligne est toujours en haut
                      if (a.cells[0].textContent.trim().match("^Dist.")) return -1;

                      let result = aValue.localeCompare(bValue, undefined, { numeric: true });

                      if (!ascending) {
                          result *= -1;
                      }

                      return result;
                  });

                  ascending = !ascending;

                  arrowUp.style.display = ascending ? 'none' : 'inline-block';
                  arrowDown.style.display = ascending ? 'inline-block' : 'none';

                  table.querySelector('tbody').innerHTML = '';
                  rows.forEach(row => table.querySelector('tbody').appendChild(row));
                });
            }
        });
    }
})();

  // fonction filtre trésors dans la vue
(function() {
    'use strict';

    const table = document.querySelector('#TOBJETS table');

    if (table) {
        const headers = table.querySelectorAll('th');

        headers.forEach(header => {
            if (!header.hasAttribute('colspan')) {
                header.style.cursor = 'pointer';

                const arrowUp = document.createElement('span');
                arrowUp.textContent = ' ▲';
                arrowUp.className = 'sortIndicator';
                arrowUp.style.display = 'none';

                const arrowDown = document.createElement('span');
                arrowDown.textContent = ' ▼';
                arrowDown.className = 'sortIndicator';
                arrowDown.style.display = 'none';

                header.appendChild(arrowUp);
                header.appendChild(arrowDown);

                let ascending = false;

                header.addEventListener('click', () => {
                  // reset sort indicators
                  $(".sortIndicator").css("display", 'none');

                  const headerIndex = Array.from(headers).indexOf(header);
                  let rows = Array.from(table.querySelectorAll('tbody tr'));

                  rows.sort((a, b) => {
                      const aValue = a.cells[headerIndex].textContent.trim();
                      const bValue = b.cells[headerIndex].textContent.trim();

                    // La 1ère ligne est toujours en haut
                      if (a.cells[0].textContent.trim().match("^Dist.")) return -1;

                      let result = aValue.localeCompare(bValue, undefined, { numeric: true });

                      if (!ascending) {
                          result *= -1;
                      }

                      return result;
                  });

                  ascending = !ascending;

                  arrowUp.style.display = ascending ? 'none' : 'inline-block';
                  arrowDown.style.display = ascending ? 'inline-block' : 'none';

                  table.querySelector('tbody').innerHTML = '';
                  rows.forEach(row => table.querySelector('tbody').appendChild(row));
                });
            }
        });
    }
})();


    // fonction filtre plantes dans la vue
(function() {
    'use strict';

    const table = document.querySelector('#TPLANTS table');

    if (table) {
        const headers = table.querySelectorAll('th');

        headers.forEach(header => {
            if (!header.hasAttribute('colspan')) {
                header.style.cursor = 'pointer';

                const arrowUp = document.createElement('span');
                arrowUp.textContent = ' ▲';
                arrowUp.className = 'sortIndicator';
                arrowUp.style.display = 'none';

                const arrowDown = document.createElement('span');
                arrowDown.textContent = ' ▼';
                arrowDown.className = 'sortIndicator';
                arrowDown.style.display = 'none';

                header.appendChild(arrowUp);
                header.appendChild(arrowDown);

                let ascending = false;

                header.addEventListener('click', () => {
                  // reset sort indicators
                  $(".sortIndicator").css("display", 'none');

                  const headerIndex = Array.from(headers).indexOf(header);
                  let rows = Array.from(table.querySelectorAll('tbody tr'));

                  rows.sort((a, b) => {
                      const aValue = a.cells[headerIndex].textContent.trim();
                      const bValue = b.cells[headerIndex].textContent.trim();

                    // La 1ère ligne est toujours en haut
                      if (a.cells[0].textContent.trim().match("^Dist.")) return -1;

                      let result = aValue.localeCompare(bValue, undefined, { numeric: true });

                      if (!ascending) {
                          result *= -1;
                      }

                      return result;
                  });

                  ascending = !ascending;

                  arrowUp.style.display = ascending ? 'none' : 'inline-block';
                  arrowDown.style.display = ascending ? 'inline-block' : 'none';

                  table.querySelector('tbody').innerHTML = '';
                  rows.forEach(row => table.querySelector('tbody').appendChild(row));
                });
            }
        });
    }
})();

  //compteur de créatures
(function() {
    'use strict';

    function updateRowCount() {
        var table = document.getElementById("TCREATURES");
        var rowCount = table.getElementsByTagName("tr").length - 1;
$('a[name="CREATURES"]').next().html("Créatures (" + rowCount + " visibles)");
    }

    var observer = new MutationObserver(updateRowCount);
    var target = document.querySelector("#TCREATURES tbody");
    var config = { childList: true, subtree: true };
    observer.observe(target, config);

    updateRowCount();
})();




  var show2DChecked = window.localStorage.getItem('show2DChecked');
  var displayLieuxChecked = window.localStorage.getItem('displayLieuxChecked');
  var displayPlantesChecked = window.localStorage.getItem('displayPlantesChecked');
  var displayCdmNeeded = window.localStorage.getItem('displayCdmNeededChecked');
  var displayCuisine = window.localStorage.getItem('displayCuisineChecked');
  var displayMiniMobs = window.localStorage.getItem('displayMiniMobsChecked');
  var displayTrees = window.localStorage.getItem('displayTreesChecked');
  var displayFullWidth = window.localStorage.getItem('displayFullWidthChecked');
  var vue2DBuilt = false;
  var extendedLieuxBuilt = false;
   var extendedPlantesBuilt = false;
  var R;

  function showHideVue2d() {
    if($('#ckbDisplay2D').is(":checked")) {
      window.localStorage.setItem('show2DChecked', 1);
      if (!vue2DBuilt) build2DView();
      $("#vue2D").show();
      $("#filterDiv").show();
    } else {
      window.localStorage.setItem('show2DChecked', 0);
      $("#vue2D").hide();
      $("#filterDiv").hide();
    }
  }


  function showHideExtendedLieux() {
    if($('#ckbDisplayLieux').is(":checked")) {
      window.localStorage.setItem('displayLieuxChecked', 1);
      if (!extendedLieuxBuilt) buildExtendedLieux();
      $(".extendedLieu").show();
    } else {
      window.localStorage.setItem('displayLieuxChecked', 0);
      $(".extendedLieu").hide();
    }
  }


    function showHideExtendedPlantes() {
    if($('#ckbDisplayPlantes').is(":checked")) {
      window.localStorage.setItem('displayPlantesChecked', 1);
      if (!extendedPlantesBuilt) buildExtendedPlantes();
      $(".extendedPlante").show();
    } else {
      window.localStorage.setItem('displayPlantesChecked', 0);
      $(".extendedPlante").hide();
    }
  }


  function refreshCdmNeeded() {
    $("#loader").show();
    var urlCdMNeeded = "https://gobzilla.incaworld.fr/mobs/cdm/5";
    $.getJSON( urlCdMNeeded, function( data ) {
      if (data != undefined) {
        window.localStorage.setItem('cdmNeeded', data.monstres);
        window.localStorage.setItem('cdmNeededUpdate', new Date());
      }
      $("#loader").hide();
    });
  }

  function showHideCdmNeeded() {
    if($('#ckbDisplayCdmNeeded').is(":checked")) {
      window.localStorage.setItem('displayCdmNeededChecked', 1);
      var cdmNeededUpdate = new Date(window.localStorage.getItem('cdmNeededUpdate'));
      var delta = (new Date() - cdmNeededUpdate)/1000/60/60/24;
      if (delta > 5) {
        refreshCdmNeeded();
      }
      var cdmNeeded = window.localStorage.getItem('cdmNeeded');
      $.each(cdmNeeded.split(","), function(index, value) {
        $('#TCREATURES td:contains("' + value + '")').closest('tr').find('td:eq(5)').text("CdM manquante !");
      });
    } else {
      window.localStorage.setItem('displayCdmNeededChecked', 0);
      $(".cdmNeeded").removeClass("cdmNeeded");
      $('#TCREATURES td:contains("CdM manquante !")').text("");
    }
  }

  function refreshCuisine() {
    $("#loader").show();
    var urlCuisine = "https://gobzilla.incaworld.fr/mobs/insecte";
    $.getJSON( urlCuisine, function( data ) {
      if (data != undefined) {
        window.localStorage.setItem('cuisine', data.monstres);
        window.localStorage.setItem('cuisineUpdate', new Date());
      }
      $("#loader").hide();
    });
  }

  function showHideCuisine() {
    if($('#ckbDisplayCuisine').is(":checked")) {
      window.localStorage.setItem('displayCuisineChecked', 1);
      var cuisineUpdate = new Date(window.localStorage.getItem('cuisineUpdate'));
      var delta = (new Date() - cuisineUpdate)/1000/60/60/24;
      if (delta > 30) {
        refreshCuisine();
      }
      var cuisine = window.localStorage.getItem('cuisine');
      $.each(cuisine.split(","), function(index, value) {
        $('#TCREATURES td:contains("' + value + '")').parent().addClass("cuisine");
      });
    } else {
      window.localStorage.setItem('displayCuisineChecked', 0);
      $(".cuisine").removeClass("cuisine");
    }
  }

  function showHideMiniMobs() {
    if($('#ckbDisplayMiniMobs').is(":checked")) {
      window.localStorage.setItem('displayMiniMobsChecked', 1);
      // Suppression des mobs trop nombreux
      $.each(monstreAMasquer, function(index, value) {
        $('#TCREATURES > center > table > tbody > tr > td:contains("' + value + '")').parent().hide();
      });
    } else {
      window.localStorage.setItem('displayMiniMobsChecked', 0);
      $.each(monstreAMasquer, function(index, value) {
        $('#TCREATURES > center > table > tbody > tr > td:contains("' + value + '")').parent().show();
      });
    }
  }

    function showHideTrees() {
    if($('#ckbDisplayTrees').is(":checked")) {
      window.localStorage.setItem('displayTreesChecked', 1);
      // Suppression des arbres
      $.each(ArbresAMasquer, function(index, value) {
        $('#TLIEUX > center > table > tbody > tr > td:contains("' + value + '")').parent().hide();
      });
    } else {
      window.localStorage.setItem('displayTreesChecked', 0);
      $.each(ArbresAMasquer, function(index, value) {
        $('#TLIEUX > center > table > tbody > tr > td:contains("' + value + '")').parent().show();
      });
    }
  }

  function showVueFullWidth() {
    if($('#ckbDisplayFullWidth').is(":checked")) {
      window.localStorage.setItem('displayFullWidthChecked', 1);
      // Vue en pleine largeur
    } else {
      window.localStorage.setItem('displayFullWidthChecked', 0);
      // Vue normale
    }
  }

  function refreshListes() {
    refreshCuisine();
    showHideCuisine();
    refreshCdmNeeded();
    showHideCdmNeeded();
  }

  // Après chargement de la page, lancement des enhancements
  $( document ).ready(function() {

    // Full width
    if (displayFullWidth == 1) {
      $('#ckbDisplayFullWidth').prop( "checked", displayFullWidth );
    }
    showVueFullWidth();

    // Mini mobs
    if (displayMiniMobs == 1) {
      $('#ckbDisplayMiniMobs').prop( "checked", displayMiniMobs );
    }
    showHideMiniMobs();

    // showhide trees
        if (displayTrees == 1) {
      $('#ckbDisplayTrees').prop( "checked", displayTrees );
    }
    showHideTrees();


    // Vue 2D
    if (show2DChecked == 1) {
      $('#ckbDisplay2D').prop( "checked", show2DChecked );
    }
    showHideVue2d();

    // Liste des lieux étendue
    if (displayLieuxChecked == 1) {
      $('#ckbDisplayLieux').prop( "checked", displayLieuxChecked );
    }
    showHideExtendedLieux();


    //Liste des plantes étendue
       if (displayPlantesChecked == 1) {
      $('#ckbDisplayPlantes').prop( "checked", displayPlantesChecked );
    }
    showHideExtendedPlantes();


    // CdM manquantes
    if (displayCdmNeeded == 1) {
      $('#ckbDisplayCdmNeeded').prop( "checked", displayCdmNeeded );
    }
    showHideCdmNeeded();

    // A cuisiner
    if (displayCuisine == 1) {
      $('#ckbDisplayCuisine').prop( "checked", displayCuisine );
    }
    showHideCuisine();

    $('#btnRefresh').click(function(evt) {
      evt.preventDefault();
      $("#btnRefresh").val("...");
      refreshListes();
      $("#btnRefresh").val("Done !");
    });

  });

  var cells = {};
  var niveau = 0;
  var _X=0, _Y=0, _N=0;

  var div = $("<div id=\"vue2D\"></div>");
  div.insertBefore($("form[action*='newMail.php']"));


  //=======================================================================
  // Filters
  //=======================================================================
  var prediv = $("<div id=\"preFilter\"></div>");
  prediv.css({
  'background-color': 'gainsboro',  // Couleur de fond sombre
  'border': '2px solid black',     // Bordure noire
  'padding': '10px',               // Espacement intérieur
  'margin': '10px'                 // Marge extérieure
});


  prediv.append($('<label />', { 'for': 'lvlherbo', text: '   Lvl Herbo ', style: 'color: darkgreen;' }));
  var select = document.createElement('select');
  select.id = 'lvlherbo';
  select.innerHTML = `

    <option value="1.5">A</option>
    <option value="2">C</option>
    <option value="2.5">M</option>
    <option value="3">GM</option>`;
  prediv.append(select);
  prediv.append("</br>");
  prediv.insertBefore(div);
  prediv.append($('<label />', { 'for': 'ckbDisplay2D', text: 'Vue 2D' }));
  prediv.append($("<input type=\"checkbox\" id=\"ckbDisplay2D\" title=\"affiche une vue 2d des éléments qui vous entoure\" name=\"ckbDisplay2D\" class=\"ckbFilter\" >"));
  prediv.append($('<label />', { 'for': 'ckbDisplayLieux', text: '   Lieux étendus' }));
  prediv.append($("<input type=\"checkbox\" id=\"ckbDisplayLieux\" title=\"affiche tous les lieux déja connus hors de votre vue\" name=\"ckbDisplayLieux\" class=\"ckbFilter\" >"));
  prediv.append($('<label />', { 'for': 'ckbDisplayPlantes', text: '   Plantes étendues' }));
  prediv.append($("<input type=\"checkbox\" id=\"ckbDisplayPlantes\" title=\"affiche toutes les plantes déja connues hors de votre vue\" name=\"ckbDisplayPlantes\" class=\"ckbFilter\" >"));
  prediv.append($('<label />', { 'for': 'ckbDisplayCdmNeeded', text: '   CdM manquantes' }));
  prediv.append($("<input type=\"checkbox\" id=\"ckbDisplayCdmNeeded\" title=\"permet de savoir quel monstres sont manquants dans la base de données des CdM\" name=\"ckbDisplayCdmNeeded\" class=\"ckbFilter\" >"));
  prediv.append($('<label />', { 'for': 'ckbDisplayCuisine', text: '   Mobs à cuisiner' }));
  prediv.append($("<input type=\"checkbox\" id=\"ckbDisplayCuisine\" title=\"met en surbrillance les monstres les + efficaces pour la cuisine\" name=\"ckbDisplayCuisine\" class=\"ckbFilter\" >"));
  prediv.append("</br>");
  prediv.append($('<label />', { 'for': 'ckbDisplayMiniMobs', text: '   Masquer Lémures,...' }));
  prediv.append($("<input type=\"checkbox\" id=\"ckbDisplayMiniMobs\" title=\"masquer les tout petits monstres (lémures, larbins ..)\" name=\"ckbDisplayMiniMobs\" class=\"ckbFilter\" >"));
  prediv.append($('<label />', { 'for': 'ckbDisplayTrees', text: '   Masquer Arbres.' }));
  prediv.append($("<input type=\"checkbox\" id=\"ckbDisplayTrees\" title=\"masque les arbres\" name=\"ckbDisplayTrees\" class=\"ckbFilter\" >"));
  prediv.append($('<label />', { 'for': 'ckbDisplayFullWidth', text: '   Vue pleine largeur' }));
  prediv.append($("<input type=\"checkbox\" id=\"ckbDisplayFullWidth\" title=\"pour les grandes vue. Permet d'élargir la vue 2d pour une meilleure visualisation\" name=\"ckbDisplayFullWidth\" class=\"ckbFilter\" >"));
  prediv.append($("<input type=\"button\" id=\"btnRefresh\" name=\"btnRefresh\" value=\"Rafraîchir les listes\">"));


  var filterDiv = $("<div id=\"filterDiv\"></div>");
  filterDiv.insertBefore(div);
  filterDiv.append($('<label />', { 'for': 'ckbNiveau', text: 'Même niveau' }));
  filterDiv.append($("<input type=\"checkbox\" id=\"ckbNiveau\" name=\"ckbNiveau\" class=\"ckbFilter\" >"));
  filterDiv.append($('<label />', { 'for': 'ckbObject', text: 'Trésor' }));
  filterDiv.append($("<input type=\"checkbox\" id=\"ckbObject\" name=\"ckbObject\" class=\"ckbFilter\" checked=\"checked\" >"));
  filterDiv.append($('<label />', { 'for': 'ckbMonster', text: 'Monstre' }));
  filterDiv.append($("<input type=\"checkbox\" id=\"ckbMonster\" name=\"ckbMonster\" class=\"ckbFilter\" checked=\"checked\" >"));
  filterDiv.append($('<label />', { 'for': 'ckbPlant', text: 'Plante' }));
  filterDiv.append($("<input type=\"checkbox\" id=\"ckbplants\" name=\"ckbplants\" class=\"ckbFilter\" checked=\"checked\" >"));
  filterDiv.append($('<label />', { 'for': 'ckbPlace', text: 'Lieu' }));
  filterDiv.append($("<input type=\"checkbox\" id=\"ckbPlace\" name=\"ckbPlace\" class=\"ckbFilter\" checked=\"checked\" >"));


  //=======================================================================
 ///  masquer via une petite fleche tout ce beau monde
  //=======================================================================

var isPreFilterVisible = localStorage.getItem('isPreFilterVisible') === 'true'; // Lire l'état depuis localStorage
// Créez un div contenant la flèche pour afficher/masquer preFilter
var toggleDiv = $("<div id=\"togglePreFilter\" style=\"cursor: pointer; font-size: 10px; color: black;\">▼ Ouvrir les Filtres</div>");
// Ajoutez le div avant prediv
toggleDiv.insertBefore(prediv);
// Fonction pour mettre à jour l'état et le texte du div
function updateToggleDiv() {
    if (isPreFilterVisible) {
        prediv.show(); // Afficher preFilter
        toggleDiv.html('▼ Masquer les filtres'); // Affiche la flèche vers le bas (▼)
    } else {
        prediv.hide(); // Masquer preFilter
        toggleDiv.html('&#9658; Ouvrir les filtres'); // Affiche la flèche de droite (→)
    }
}

// Définissez un gestionnaire d'événements pour le div
toggleDiv.on('click', function() {
    isPreFilterVisible = !isPreFilterVisible; // Inverse l'état
    updateToggleDiv();
    // Sauvegarde l'état dans localStorage
    localStorage.setItem('isPreFilterVisible', isPreFilterVisible);
});

// Assurez-vous que preFilter est initialement visible
updateToggleDiv();


  //=======================================================================
  // Construction de la liste étendue des lieux sur la base d'une API externe
  //=======================================================================
  function buildExtendedLieux() {
    var reflieux = new Array();
    $("#TLIEUX > table > tbody > tr").each( function(){
      reflieux.push($(this).find('td').eq(1).text());
    });

    var url = "https://gobzilla.incaworld.fr/lieux/"+_X+"/"+_Y+"/"+_N;
    $.getJSON( url, function( data ) {
      // alert(JSON.stringify(data));
      $.each( data, function( key, val ) {
        if (( reflieux.indexOf(val["id"]) == -1 ) && (val["id"] !== -1))
        {
          var row = "<tr bgcolor=\"#E0E0E0\" class=\"extendedLieu\"><td>" + val["distance"] ;
          row += "</td><td>" + val["id"] ;
          row += "</td><td>" + val["nom"] ;
          row += "</td><td>" + val["type"] ;
          row += "</td><td>" + val["x"] ;
          row += "</td><td>" + val["y"] ;
          row += "</td><td>" + val["z"] ;
          row += "</td></tr>";
          $(row).insertAfter("#TLIEUX table tr:last");
        }
        });
    });

    extendedLieuxBuilt = true;
  }


    //=======================================================================
  // Construction de la liste étendue des plantes sur la base d'une API externe
  //=======================================================================

(function() {
    'use strict';


    var text = $("ul:contains('Ma vue peut porter')").text();
    var matches = text.match(/Ma vue peut porter à (\d+) cases horizontalement et (\d+) verticalement/);


    if (matches) {
        var perh = matches[1]; // PER max (X Y)
        var perv = matches[2]; // PER max (N)
        var herbomax = perh * 1.5;
        var herbomin = +perh +1;

     // Récupérez la liste déroulante
        var lvlherbo = $('#lvlherbo');

        // Ajoutez un gestionnaire d'événements pour écouter les changements de la liste déroulante
        lvlherbo.on('change', function() {
            var xfactor = parseFloat(lvlherbo.val()); // Obtenez la valeur sélectionnée en tant que nombre
            var herbomax = perh * xfactor;
            var herbomin = +perh + 1;
           window.localStorage.setItem('xfactor', xfactor);
           window.localStorage.setItem('herbomax', herbomax);
           console.log("Nouvelle valeur de herbomax : " + herbomax);
            console.log("Nouvelle valeur de herbomin : " + herbomin);
        });


      // Lorsque la page est chargée, vérifiez s'il y a des valeurs précédemment enregistrées et utilisez-les si elles existent
  var storedXFactor = window.localStorage.getItem('xfactor');
  var storedHerboMax = window.localStorage.getItem('herbomax');

if (storedXFactor) {
    lvlherbo.val(storedXFactor); // Mettez à jour la liste déroulante avec la valeur précédemment enregistrée
}

if (storedHerboMax) {
    // Utilisez la valeur précédemment enregistrée pour herbomax
    herbomax = parseFloat(storedHerboMax);
    console.log("Utilisation de la valeur précédemment enregistrée pour herbomax : " + herbomax);
}

        function buildExtendedPlantes() {
            var refplantes = new Array();
            $("#TPLANTS> table > tbody > tr").each(function() {
                refplantes.push($(this).find('td').eq(1).text());
            });

            var url = "https://fzffz.000webhostapp.com/plantes.json";

            $.getJSON(url, function(data) {
                // alert(JSON.stringify(data));
                $.each(data, function(key, val) {
                    var dist = Math.max(
                        Math.abs(val["x"] - _X),
                        Math.abs(val["y"] - _Y),
                        Math.abs(val["z"] - _N)
                    );

                    if (refplantes.indexOf(val["ID"]) == -1 && val["ID"] !== -1) {
                        var bgColor =
                            dist >= herbomin && dist <= herbomax
                                ? 'background-color: #93d278;'
                                : 'background-color: #E0E0E0;';
                        var row =
                            "<tr style='" +
                            bgColor +
                            "' class='extendedPlante'><td>" +
                            dist;
                        row += "</td><td>" + val["ID"];
                        row += "</td><td>" + val["nom"] + " (" + val["espèce"] + ")";
                        row += "</td><td>" + val["x"];
                        row += "</td><td>" + val["y"];
                        row += "</td><td>" + val["z"];
                        row += "</td></tr>";
                        $(row).insertAfter("#TPLANTS table tr:last");
                    }
                });
            });

            extendedPlantesBuilt = true;
        }

        // Appeler votre fonction
        buildExtendedPlantes();

        console.log("portée herboriser: " + herbomax);
        console.log("limite mini d'herboriser: " + herbomin);

    } else {
        console.log("Aucune correspondance trouvée.");
    }
})();




  //=======================================================================
  // VUE 2D. Piqué à Stéphane Beauquis (Extention Chrome)
  // Grab the data for Vue2D
  //=======================================================================
	var _terre="", _PX=0, _PY=0;

	// Get the name and num of the actual goblin
	var nom = $('#identite').attr("nom");
	var num = $('#identite').attr("num");

	// Get the actual position and view size
	$('li').each(function(){
		// cache jquery var
		var current = $(this);

		var matches = current.text().match(/Ma position actuelle est : X = ([\-0-9]+), Y = ([\-0-9]+), N = ([\-0-9]+)([^\-]+)/);
		if (matches) {
			_X = parseInt(matches[1]);
			_Y = parseInt(matches[2]);
			_N = parseInt(matches[3]);
			niveau = _N;
			_terre = matches[4];
		}

		matches = current.text().match(/L'affichage est limité à (\d+) cases horizontalement et (\d+) verticalement/);
		if (matches) {
			_PX = (parseInt(matches[1])>50)?50:parseInt(matches[1]);
			_PY = (parseInt(matches[2])>20)?20:parseInt(matches[2]);
		}
	});

  if (displayFullWidth == 1) {
    var width = 1800, height = 1800, leftgutter = 20, bottomgutter = 30, coordOffset = 1790;
    var tailleTxt = "16px sans-serif";
    $("#content").css("width" , "2000px");
    $("html > body > div").css("left" , "1800x");
  } else {
    var width = 630, height = 650, leftgutter = 30, bottomgutter = 20, coordOffset = 1190;
    var tailleTxt = "10px sans-serif";
  }

  var offset = 40,
      nbCase = _PX * 2 + 1,
      carre = Math.floor((width-offset-5) / nbCase),
      txt = {"font": '10px Fontin-Sans, Arial', stroke: "none", fill: "#000"};

  var alllieux = {};

  // Compute grid limits
  var xmin = _X - _PX,
      ymin = _Y - _PX,
      ymax = _Y + _PX,
      Dx = xmin * -1,
      Dy = ymin * -1;


  //=============================================================
  //  Gestion des changements de filtre
  //=============================================================
  $("input.ckbFilter").change(function () {

    showVueFullWidth();
    showHideMiniMobs();
    showHideTrees();
    showHideVue2d();
    showHideExtendedLieux();
    showHideExtendedPlantes();
    showHideCdmNeeded();
    showHideCuisine();

    for( var key in cells ) {
      x = cells[key].x;
      y = cells[key].y;

      mapping = "i" + getMapping(key) + ".src";

      alllieux[key].remove();
      if (mapping != "i0000.src")
      {
        alllieux[key] = R.image(eval(mapping), x, y, carre-1, carre-1);
      }
    }



  for (var key in alllieux) {
  (function (st, key) {
      if (st[0]) {
          st[0].style.cursor = "pointer";
          var tooltipOpen = false; // Variable pour suivre l'état de la tooltip

          st[0].onclick = function () {
              x = cells[key].x; // X Co-Ords
              y = cells[key].y; // Y Co-Ords

              // Compute tic position
              tic = "";
              tic += (y >= (Math.floor(nbCase / 2)) * carre) ? "bottom" : "top";
              tic += (x > (Math.floor(nbCase / 2)) * carre) ? "left" : "right";

              var s = compute_text(key);

              if (tooltipOpen) {
                  // Si la tooltip est déjà ouverte, fermez-la
                  draw_tooltip(this, 0);
                  tooltipOpen = false;
              } else {
                  if (s != "") {
                      // Si la tooltip n'est pas encore ouverte, ouvrez-la
                      draw_tooltip(this, 1, s, x, y, carre, tic);
                      tooltipOpen = true;
                  }
              }
          };

           st[0].onmouseover = function () {
              x = cells[key].x; // X Co-Ords
              y = cells[key].y; // Y Co-Ords

              // Compute tic position
              tic = "";
              tic += (y >= (Math.floor(nbCase / 2)) * carre) ? "bottom" : "top";
              tic += (x > (Math.floor(nbCase / 2)) * carre) ? "left" : "right";

           var s = compute_text(key);

    // Show the tooltip by setting `show` to 1
    draw_tooltip(this, 1, s, x, y, carre, tic);
};


          st[0].onmouseout = function () {
                draw_tooltip(this, 0);
              };
      }
  })(alllieux[key], key);
}


  });


  // Images
  //ancienne adresse $("<img src=\"http://images.gobland.fr/addons/GGVue2D/0001.jpg\" id=\"i0001\" style=\"display:none;\" />").insertBefore(div);

  $("<img src=\"https://fzffz.000webhostapp.com/images/0001.png\" id=\"i0001\" style=\"display:none;\" />").insertBefore(div);
  $("<img src=\"https://fzffz.000webhostapp.com/images/0010.png\" id=\"i0010\" style=\"display:none;\" />").insertBefore(div);
  $("<img src=\"https://fzffz.000webhostapp.com/images/0011.png\" id=\"i0011\" style=\"display:none;\" />").insertBefore(div);
  $("<img src=\"https://fzffz.000webhostapp.com/images/0100.png\" id=\"i0100\" style=\"display:none;\" />").insertBefore(div);
  $("<img src=\"https://fzffz.000webhostapp.com/images/0101.png\" id=\"i0101\" style=\"display:none;\" />").insertBefore(div);
  $("<img src=\"https://fzffz.000webhostapp.com/images/0110.png\" id=\"i0110\" style=\"display:none;\" />").insertBefore(div);
  $("<img src=\"https://fzffz.000webhostapp.com/images/0111.png\" id=\"i0111\" style=\"display:none;\" />").insertBefore(div);
  $("<img src=\"https://gobzilla.incaworld.fr/0200.png\" id=\"i0200\" style=\"display:none;\" />").insertBefore(div);
  $("<img src=\"https://gobzilla.incaworld.fr/0201.png\" id=\"i0201\" style=\"display:none;\" />").insertBefore(div);
  $("<img src=\"https://gobzilla.incaworld.fr/0210.png\" id=\"i0210\" style=\"display:none;\" />").insertBefore(div);
  $("<img src=\"https://gobzilla.incaworld.fr/0211.png\" id=\"i0211\" style=\"display:none;\" />").insertBefore(div);
  $("<img src=\"https://fzffz.000webhostapp.com/images/0300.png\" id=\"i0300\" style=\"display:none;\" />").insertBefore(div);
  $("<img src=\"https://fzffz.000webhostapp.com/images/0400.png\" id=\"i0400\" style=\"display:none;\" />").insertBefore(div);
  $("<img src=\"https://fzffz.000webhostapp.com/images/0401.png\" id=\"i0401\" style=\"display:none;\" />").insertBefore(div);
  $("<img src=\"https://fzffz.000webhostapp.com/images/0410.png\" id=\"i0410\" style=\"display:none;\" />").insertBefore(div);
  $("<img src=\"https://fzffz.000webhostapp.com/images/0411.png\" id=\"i0411\" style=\"display:none;\" />").insertBefore(div);
  $("<img src=\"https://fzffz.000webhostapp.com/images/1410.png\" id=\"i1410\" style=\"display:none;\" />").insertBefore(div);
  $("<img src=\"https://fzffz.000webhostapp.com/images/1411.png\" id=\"i1411\" style=\"display:none;\" />").insertBefore(div);
  $("<img src=\"https://fzffz.000webhostapp.com/images/0500.png\" id=\"i0500\" style=\"display:none;\" />").insertBefore(div);
  $("<img src=\"https://fzffz.000webhostapp.com/images/0501.png\" id=\"i0501\" style=\"display:none;\" />").insertBefore(div);
  $("<img src=\"https://fzffz.000webhostapp.com/images/0510.png\" id=\"i0510\" style=\"display:none;\" />").insertBefore(div);
  $("<img src=\"https://fzffz.000webhostapp.com/images/0511.png\" id=\"i0511\" style=\"display:none;\" />").insertBefore(div);
  $("<img src=\"https://fzffz.000webhostapp.com/images/1000.png\" id=\"i1000\" style=\"display:none;\" />").insertBefore(div);
  $("<img src=\"https://fzffz.000webhostapp.com/images/1001.png\" id=\"i1001\" style=\"display:none;\" />").insertBefore(div);
  $("<img src=\"https://fzffz.000webhostapp.com/images/1010.png\" id=\"i1010\" style=\"display:none;\" />").insertBefore(div);
  $("<img src=\"https://fzffz.000webhostapp.com/images/1011.png\" id=\"i1011\" style=\"display:none;\" />").insertBefore(div);
  $("<img src=\"https://fzffz.000webhostapp.com/images/1100.png\" id=\"i1100\" style=\"display:none;\" />").insertBefore(div);
  $("<img src=\"https://fzffz.000webhostapp.com/images/1101.png\" id=\"i1101\" style=\"display:none;\" />").insertBefore(div);
  $("<img src=\"https://fzffz.000webhostapp.com/images/1110.png\" id=\"i1110\" style=\"display:none;\" />").insertBefore(div);
  $("<img src=\"https://fzffz.000webhostapp.com/images/1111.png\" id=\"i1111\" style=\"display:none;\" />").insertBefore(div);
  $("<img src=\"https://fzffz.000webhostapp.com/images/1113.png\" id=\"i1113\" style=\"display:none;\" />").insertBefore(div);
  $("<img src=\"https://fzffz.000webhostapp.com/images/1111.png\" id=\"i1130\" style=\"display:none;\" />").insertBefore(div);
  $("<img src=\"https://gobzilla.incaworld.fr/1200.png\" id=\"i1200\" style=\"display:none;\" />").insertBefore(div);
  $("<img src=\"https://gobzilla.incaworld.fr/1201.png\" id=\"i1201\" style=\"display:none;\" />").insertBefore(div);
  $("<img src=\"https://gobzilla.incaworld.fr/1210.png\" id=\"i1210\" style=\"display:none;\" />").insertBefore(div);
  $("<img src=\"https://gobzilla.incaworld.fr/1211.png\" id=\"i1211\" style=\"display:none;\" />").insertBefore(div);
  $("<img src=\"https://fzffz.000webhostapp.com/images/1300.png\" id=\"i1300\" style=\"display:none;\" />").insertBefore(div);
  $("<img src=\"https://fzffz.000webhostapp.com/images/1301.png\" id=\"i1301\" style=\"display:none;\" />").insertBefore(div);
  $("<img src=\"https://fzffz.000webhostapp.com/images/1310.png\" id=\"i1310\" style=\"display:none;\" />").insertBefore(div);
  $("<img src=\"https://fzffz.000webhostapp.com/images/1141.png\" id=\"i1141\" style=\"display:none;\" />").insertBefore(div);

  $("<img src=\"https://fzffz.000webhostapp.com/images/1400.png\" id=\"i1400\" style=\"display:none;\" />").insertBefore(div);

  $("<img src=\"https://fzffz.000webhostapp.com/images/1114.png\" id=\"i1114\" style=\"display:none;\" />").insertBefore(div);
  $("<img src=\"https://fzffz.000webhostapp.com/images/0301.png\" id=\"i0301\" style=\"display:none;\" />").insertBefore(div);
  $("<img src=\"https://fzffz.000webhostapp.com/images/0310.png\" id=\"i0310\" style=\"display:none;\" />").insertBefore(div);
  $("<img src=\"https://fzffz.000webhostapp.com/images/0311.png\" id=\"i0311\" style=\"display:none;\" />").insertBefore(div);
  $("<img src=\"https://fzffz.000webhostapp.com/images/3001.png\" id=\"i3001\" style=\"display:none;\" />").insertBefore(div);
  $("<img src=\"https://fzffz.000webhostapp.com/images/3010.png\" id=\"i3010\" style=\"display:none;\" />").insertBefore(div);
  $("<img src=\"https://fzffz.000webhostapp.com/images/3011.png\" id=\"i3011\" style=\"display:none;\" />").insertBefore(div);
  $("<img src=\"https://fzffz.000webhostapp.com/images/3100.png\" id=\"i3100\" style=\"display:none;\" />").insertBefore(div);
  $("<img src=\"https://fzffz.000webhostapp.com/images/3101.png\" id=\"i3101\" style=\"display:none;\" />").insertBefore(div);
  $("<img src=\"https://fzffz.000webhostapp.com/images/1311.png\" id=\"i1311\" style=\"display:none;\" />").insertBefore(div);
  $("<img src=\"https://fzffz.000webhostapp.com/images/3110.png\" id=\"i3110\" style=\"display:none;\" />").insertBefore(div);
  $("<img src=\"https://fzffz.000webhostapp.com/images/3111.png\" id=\"i3111\" style=\"display:none;\" />").insertBefore(div);
  $("<img src=\"https://fzffz.000webhostapp.com/images/1500.png\" id=\"i1500\" style=\"display:none;\" />").insertBefore(div);
  $("<img src=\"https://fzffz.000webhostapp.com/images/1501.png\" id=\"i1501\" style=\"display:none;\" />").insertBefore(div);
  $("<img src=\"https://fzffz.000webhostapp.com/images/1510.png\" id=\"i1510\" style=\"display:none;\" />").insertBefore(div);
  $("<img src=\"https://fzffz.000webhostapp.com/images/1511.png\" id=\"i1511\" style=\"display:none;\" />").insertBefore(div);





  //initialisation de la vue2d
  //=============================================================
  //  D r a w
  //=============================================================
  function build2DView() {
    Raphael.fn.drawGrid = function (x, y, w, h, wv, hv, color) {
      color = color || "#000";
      var path = ["M", Math.round(x) + .5, Math.round(y) + .5, "L", Math.round(x + w) + .5, Math.round(y) + .5, Math.round(x + w) + .5, Math.round(y + h) + .5, Math.round(x) + .5, Math.round(y + h) + .5, Math.round(x) + .5, Math.round(y) + .5],
          rowHeight = h / hv,
          columnWidth = w / wv;
      for (var i = 1; i < hv; i++) {
          path = path.concat(["M", Math.round(x) + .5, Math.round(y + i * rowHeight) + .5, "H", Math.round(x + w) + .5]);
      }
      for (i = 1; i < wv; i++) {
          path = path.concat(["M", Math.round(x + i * columnWidth) + .5, Math.round(y) + .5, "V", Math.round(y + h) + .5]);
      }
      return this.path(path.join(",")).attr({stroke: color});
    };

    var i0001 = document.getElementById("i0001");
    var i0010 = document.getElementById("i0010");
    var i0011 = document.getElementById("i0011");
    var i0100 = document.getElementById("i0100");
    var i0101 = document.getElementById("i0101");
    var i0110 = document.getElementById("i0110");
    var i0111 = document.getElementById("i0111");


    var i1000 = document.getElementById("i1000");
    var i1001 = document.getElementById("i1001");
    var i1010 = document.getElementById("i1010");
    var i1011 = document.getElementById("i1011");
    var i1100 = document.getElementById("i1100");
    var i1101 = document.getElementById("i1101");
    var i1101 = document.getElementById("i1110");

    var i1111 = document.getElementById("i1111");


    var i0200 = document.getElementById("i0200");
    var i0201 = document.getElementById("i0201");
    var i0210 = document.getElementById("i0210");
    var i0211 = document.getElementById("i0211");
    var i1200 = document.getElementById("i1200");
    var i1201 = document.getElementById("i1201");
    var i1210 = document.getElementById("i1210");
    var i1211 = document.getElementById("i1211");


    var i0300 = document.getElementById("i0300");

    var i1113 = document.getElementById("i1113");
    var i1130 = document.getElementById("i1130");
    var i1300 = document.getElementById("i1300");
    var i1301 = document.getElementById("i1301");
    var i1310 = document.getElementById("i1310");

    var i3001 = document.getElementById("i3001");
    var i3011 = document.getElementById("i3011");
    var i3100 = document.getElementById("i3100");
    var i3101 = document.getElementById("i3101");
    var i3110 = document.getElementById("i3110");
    var i3010 = document.getElementById("i3010");
    var i3111 = document.getElementById("i3111");

    var i0400 = document.getElementById("i0400");
    var i0401 = document.getElementById("i0401");
    var i0410 = document.getElementById("i0410");
    var i0411 = document.getElementById("i0411");
    var i1104 = document.getElementById("i1104");
    var i1114 = document.getElementById("i1114");
    var i1141 = document.getElementById("i1141");
    var i1411 = document.getElementById("i1411");


    var i0500 = document.getElementById("i0500");
    var i0501 = document.getElementById("i0501");
    var i0510 = document.getElementById("i0510");
    var i0511 = document.getElementById("i0511");
    var i1500 = document.getElementById("i1500");
    var i1501 = document.getElementById("i1501");
    var i1510 = document.getElementById("i1510");
    var i1511 = document.getElementById("i1511");


    R = Raphael("vue2D", width, height);

    // Draw the grid
    R.drawGrid(offset, offset, nbCase*carre, nbCase*carre, nbCase, nbCase, "#000");

    // Draw legend for X-axis and Y-axis
    for( var i = 0 ; i < nbCase ; i++ ) {
      // X coordinates top/bottom
      R.text( Math.round(offset+(i+.5)*carre), 10, (xmin+i).toString() ).attr(txt);
      R.text( Math.round(offset+(i+.5)*carre), coordOffset, (xmin+i).toString() ).attr(txt);

      // Y coordinates
      R.text( 10, Math.round(offset+(i+.5)*carre), (ymax-i).toString() ).attr(txt);
    }

    // Add to the list the current Goblin
    x = _PX*carre + offset + 1;
    y = _PX*carre + offset + 1;
    var key = ( x + Dx ) + Math.abs( y + Dy ) * nbCase + 1;
    cells[key] = { "x":x, "y":y, "realx":_X, "realy":_Y };
    cells[key][_N] = { "gob":[nom+" ("+num+")\n"], "monster":[], "redMonster":[], "orangeMonster":[], "yellowMonster":[], "place":[], "object":[], "plant":[] };

    var creatures = $('#TCREATURES').find("table");
    $("tbody tr", creatures).each(function (index, tr) {
      var lines = $('td', tr).map(function(index, td) {
          return $(td).text();
      });

      if ( typeof lines[0] != "undefined" )
      {
        x = (_PX + parseInt(lines[6]) - _X)*carre + offset + 1;
        y = (_PX - parseInt(lines[7]) + _Y)*carre + offset + 1;
        var key = ( x + Dx ) + Math.abs( y + Dy ) * nbCase + 1;

        // Get level
var lvl = lines[8];
if (!(key in cells)) {
  // Add the new cell
  cells[key] = { "x": x, "y": y, "realx": lines[6], "realy": lines[7] };
  cells[key][lvl] = { "gob": [], "monster": [], "redMonster": [], "orangeMonster": [], "yellowMonster": [], "place": [], "object": [], "plant": [] };
}
if (!(lvl in cells[key])) {
  // Add a new level for this cell
  cells[key][lvl] = { "gob": [], "monster": [], "redMonster": [], "orangeMonster": [], "yellowMonster": [], "place": [], "object": [], "plant": [] };
}

if (lines[4] === "Mentalo" ||
    lines[4] === "Nodef" ||
    lines[4] === "Musculeux" ||
    lines[4] === "Vis Yonnair" ||
    lines[4] === "Trad Scion" ||
    lines[4] === "Zozo Giste") {
  cells[key][lvl]["gob"].push(lines[2] + ' - ' + lines[3]);
} else if (lines[3] >= 40) {
  cells[key][lvl]["redMonster"].push(lines[2] + ' - ' + lines[3]);
} else if (lines[3] >= 30) {
  cells[key][lvl]["orangeMonster"].push(lines[2] + ' - ' + lines[3]);
} else if (lines[3] >= 25) {
  cells[key][lvl]["yellowMonster"].push(lines[2] + ' - ' + lines[3]);
} else {
  cells[key][lvl]["monster"].push(lines[2] + ' - ' + lines[3]);
}
}
});

    // Get all 'lieux' to display
    var lieux = $('#TLIEUX').find("table");
    $("tbody tr", lieux).each(function (index, tr) {
      var lines = $('td', tr).map(function(index, td) {
          return $(td).text();
      });

      if ( typeof lines[0] != "undefined" )
      {
        x = (_PX + parseInt(lines[4]) - _X)*carre + offset + 1;
        y = (_PX - parseInt(lines[5]) + _Y)*carre + offset + 1;
        var key = ( x + Dx ) + Math.abs( y + Dy ) * nbCase + 1;

        // Get level
        var lvl = lines[6];
        if (!(key in cells))
        {
          cells[key] = { "x":x, "y":y, "realx":lines[4], "realy":lines[5] };
          cells[key][lvl] = { "gob":[], "monster":[], "redMonster":[], "orangeMonster":[],  "yellowMonster":[], "place":[], "object":[], "plant":[] };
        }
        if (!(lvl in cells[key]))
        {
          cells[key][lvl] = { "gob":[], "monster":[], "redMonster":[], "place":[], "orangeMonster":[],  "yellowMonster":[], "object":[], "plant":[] };
        }
        cells[key][lvl]["place"].push(lines[2]);
      }
    });


    // Get all 'tresor' to display
    var tresors = $('#TOBJETS').find("table");
    $("tbody tr", tresors).each(function (index, tr) {
      var lines = $('td', tr).map(function(index, td) {
          return $(td).text();
      });

      if ( typeof lines[0] != "undefined" )
      {
        x = (_PX + parseInt(lines[3]) - _X)*carre + offset + 1;
        y = (_PX - parseInt(lines[4]) + _Y)*carre + offset + 1;
        var key = ( x + Dx ) + Math.abs( y + Dy ) * nbCase + 1;

        // Get level
        var lvl = lines[5];
        if (!(key in cells))
        {
          cells[key] = { "x":x, "y":y, "realx":lines[3], "realy":lines[4] };
          cells[key][lvl] = { "gob":[], "monster":[], "redMonster":[], "orangeMonster":[],  "yellowMonster":[], "place":[], "object":[], "plant":[] };
        }
        if (!(lvl in cells[key]))
        {
          cells[key][lvl] = { "gob":[], "monster":[], "redMonster":[], "orangeMonster":[],  "yellowMonster":[], "place":[], "object":[], "plant":[] };
        }
        cells[key][lvl]["object"].push(lines[2]);
      }
    });

        // Get all 'plantes' to display
    var plantes = $('#TPLANTS').find("table");
    $("tbody tr", plantes).each(function (index, tr) {
      var lines = $('td', tr).map(function(index, td) {
          return $(td).text();
      });

      if ( typeof lines[0] != "undefined" )
      {
        x = (_PX + parseInt(lines[3]) - _X)*carre + offset + 1;
        y = (_PX - parseInt(lines[4]) + _Y)*carre + offset + 1;
        var key = ( x + Dx ) + Math.abs( y + Dy ) * nbCase + 1;

        // Get level
        var lvl = lines[5];
        if (!(key in cells))
        {
          cells[key] = { "x":x, "y":y, "realx":lines[3], "realy":lines[4] };
          cells[key][lvl] = { "gob":[], "monster":[], "redMonster":[], "orangeMonster":[],  "yellowMonster":[], "place":[], "object":[], "plant":[] };
        }
        if (!(lvl in cells[key]))
        {
          cells[key][lvl] = { "gob":[], "monster":[], "redMonster":[], "orangeMonster":[],  "yellowMonster":[], "place":[], "object":[], "plant":[] };
        }
        cells[key][lvl]["plant"].push(lines[2]);
      }
    });




    alllieux = {};

    for( var key in cells ) {
      x = cells[key].x;
      y = cells[key].y;
      mapping = "i" + getMapping(key) + ".src";
      alllieux[key] = R.image(eval(mapping), x, y, carre-1, carre-1);
    }

for (var key in alllieux) {
    (function (st, key) {
        if (st[0]) {
            st[0].style.cursor = "pointer";
            var tooltipOpen = false; // Variable to track the state of the tooltip

            st[0].onclick = function () {
                x = cells[key].x; // X Co-Ords
                y = cells[key].y; // Y Co-Ords

                // Compute tic position
                tic = "";
                tic += (y >= (Math.floor(nbCase / 2)) * carre) ? "bottom" : "top";
                tic += (x > (Math.floor(nbCase / 2)) * carre) ? "left" : "right";

                var s = compute_text(key);

                if (tooltipOpen) {
                    // If the tooltip is already open, close it with a double-click
                    draw_tooltip(this, 0);
                    tooltipOpen = false;
                } else {
                    if (s != "") {
                        // If the tooltip is not open, open it with a single-click
                        draw_tooltip(this, 1, s, x, y, carre, tic);
                        tooltipOpen = true;
                    }
                }
            };

            st[0].onmouseover = function () {
                x = cells[key].x; // X Co-Ords
                y = cells[key].y; // Y Co-Ords

                // Compute tic position
                tic = "";
                tic += (y >= (Math.floor(nbCase / 2)) * carre) ? "bottom" : "top";
                tic += (x > (Math.floor(nbCase / 2)) * carre) ? "left" : "right";

                var s = compute_text(key);

                // Show the tooltip by setting `show` to 1
                draw_tooltip(this, 1, s, x, y, carre, tic);
            };

            st[0].ondblclick = function () {
                // Double-click event to close the tooltip
                draw_tooltip(this, 0);
                tooltipOpen = false;
            };

            st[0].onmouseout = function () {
                draw_tooltip(this, 0);
            };
        }
    })(alllieux[key], key);
}

    vue2DBuilt = true;
  }

	function getMapping(k) {
		var result = "";
		var cptGob = 0, cptMob = 0, cptPlace = 0, cptObj = 0, cptRedMobs = 0, cptorandedMobs = 0, cptyellowedMobs = 0 , cptplants = 0 ;

		if ($('input[name=ckbNiveau]').is(':checked')) {
 			if (niveau in cells[k]) {
				cptGob   += cells[k][niveau]["gob"].length;
				cptMob   += cells[k][niveau]["monster"].length;
        cptRedMobs += cells[k][niveau]["redMonster"].length;
				cptPlace += cells[k][niveau]["place"].length;
				cptObj   += cells[k][niveau]["object"].length;
        cptplants   += cells[k][niveau]["plant"].length;
        cptorandedMobs += cells[k][niveau]["orangeMonster"].length;
        cptyellowedMobs += cells[k][niveau]["yellowMonster"].length;
			}
		} else {
			for( var lvl in cells[k] )
			{
				if (( lvl != "x" ) && ( lvl != "y" ) &&
				    ( lvl != "realx" ) && ( lvl != "realy" ))
				{
					cptGob   += cells[k][lvl]["gob"].length;
					cptMob   += cells[k][lvl]["monster"].length;
          cptRedMobs += cells[k][lvl]["redMonster"].length;
					cptPlace += cells[k][lvl]["place"].length;
					cptObj   += cells[k][lvl]["object"].length;
          cptplants   += cells[k][lvl]["plant"].length;
          cptorandedMobs += cells[k][lvl]["orangeMonster"].length;
          cptyellowedMobs += cells[k][lvl]["yellowMonster"].length;
				}
			}
		}
		result += (cptGob > 0)? "1" : "0";
    if ((cptplants > 0) && ($('input[name=ckbplants]').is(':checked'))) {
      result += "3";

    } else if ((cptRedMobs > 0) && ($('input[name=ckbMonster]').is(':checked'))) {
      result += "2";

    } else if ((cptorandedMobs > 0) && ($('input[name=ckbMonster]').is(':checked'))) {
      result += "4";

    } else if ((cptyellowedMobs > 0) && ($('input[name=ckbMonster]').is(':checked'))) {
      result += "5";


    } else if ((cptMob > 0) && ($('input[name=ckbMonster]').is(':checked'))) {
      result += "1";
    } else {
      result += "0";
    }
		//result += ((cptMob > 0) && ($('input[name=ckbMonster]').is(':checked')))? "1" : "0";
		result += ((cptObj > 0) && ($('input[name=ckbObject]').is(':checked')))? "1" : "0";
		result += ((cptPlace > 0) && ($('input[name=ckbPlace]').is(':checked')))? "1" : "0";

		return result;
	}

	//=======================================================================================
	// Compute the global text that must be display in the popup.
	//=======================================================================================
	function compute_text(k) {
		var result = "X=" + cells[k].realx + ", Y=" + cells[k].realy + "\n";
		var n = [];

		if ($('input[name=ckbNiveau]').is(':checked'))
		{
 			if (niveau in cells[k])
 			{
	 			n.push(niveau);
 			}
		} else {
			for( var lvl in cells[k] )
			{
				if (( lvl != "x" ) && ( lvl != "y" ) &&
				    ( lvl != "realx" ) && ( lvl != "realy" ))
				{
					n.push(lvl);
				}
			}
		}

		var data = ""
		for( i = 0; i<n.length; i++ ) {
			k2 = n[i];
			data += getString(cells[k][k2]["gob"]);
			data += getString(cells[k][k2]["monster"],true);
      data += getString(cells[k][k2]["redMonster"],true);
      data += getString(cells[k][k2]["orangeMonster"],true);
      data += getString(cells[k][k2]["yellowMonster"],true);
			data += getString(cells[k][k2]["place"]);
      data += getString(cells[k][k2]["plant"]);


			if ($('input[name=ckbObject]').is(':checked'))
			{
				data += getString(cells[k][k2]["object"],true);
			}

			if (data != "")
			{
				result += " \nNiveau: " + k2 + "\n" + data;
				data = "";
			}
		}
		return result;
	}

	//=======================================================================================
	// Process the data array and generate the string to display in the popup
	// If compressed = true, the number of items are counted to be displayed as N x items
	//=======================================================================================
	function getString(data,compressed) {
		if(typeof(compressed)==='undefined') compressed = false;
		var result = "";

		if (compressed)
		{
			var tmp = {};
			for( var i=0; i < data.length; i++ )
			{
				n = data[i];
				if (!(n in tmp))
				{
					tmp[n] = 0;
				}
				tmp[n] = tmp[n] + 1;
			}

			for( var k in tmp )
			{
				result += "\t" + tmp[k] + " x " + k + "\n";
			}
		}
		else
		{
			for( var i=0; i < data.length; i++ )
			{
				result += "\t" + data[i] + "\n";
			}
		}
		return result;
	}


var tooltipOpen = false;
function draw_tooltip(object, show, text, x, y, carre, from) {
	if(show == 0) {
			popup.remove();
			popup_txt.remove();
	        transparent_txt.remove();
			return;
		}


		// Center X on middle of the cell.
		x +=  Math.floor(carre/2);

		//draw text somewhere to get its dimensions and make it transparent
		transparent_txt = R.text(10,10, text).attr({fill: "transparent",font: tailleTxt});

	    //get text dimensions to obtain tooltip dimensions
		var txt_box = transparent_txt.getBBox();


		if (from=="topright") {
			// Move to bottom of the cell
			y += carre;

		    // Compute position
			Xtext = x+5;
			Ytext = y+Math.floor(txt_box.height/2)+5;

		    //draw text
			popup_txt = R.text(Xtext, Ytext, text).attr({fill: "black",font: tailleTxt,'text-anchor': 'start'});

			var bb = popup_txt.getBBox();

		    // Compute path for tooltip box
			pathText = 	// 'M'ove to the 'dent' in the bubble
						"M" + (x) + " " + (y) +
						// 'v'ertically draw a line 5 pixels more than the height of the text
						"v" + (bb.height+5) +
						// 'h'orizontally draw a line 10 more than the text's width
						"h" + (bb.width+10) +
						// 'v'ertically draw a line to the bottom of the text
						"v" + -bb.height +
						// 'h'orizontally draw a line so we're 5 pixels from the left side
						"h" + -(bb.width+5) +
						// 'Z' closes the figure
						"Z";
		} else if (from=="topleft") {
			// Move to bottom of the cell
			y += carre;

		    // Compute position
			Xtext = x-(txt_box.width+5);
			Ytext = y+Math.floor(txt_box.height/2)+5;

		    //draw text
			popup_txt = R.text(Xtext, Ytext, text).attr({fill: "black",font: tailleTxt,'text-anchor': 'start'});

			var bb = popup_txt.getBBox();

		    // Compute path for tooltip box
			pathText = 	// 'M'ove to the 'dent' in the bubble
					   	"M" + (x) + " " + (y) +
						// 'v'ertically draw a line 5 pixels more than the height of the text
						"v" + (bb.height+5) +
						// 'h'orizontally draw a line 10 more than the text's width
						"h" + -(bb.width+10) +
						// 'v'ertically draw a line to the bottom of the text
						"v" + -bb.height +
						// 'h'orizontally draw a line so we're 5 pixels from the left side
						"h" + (bb.width+5) +
						// 'Z' closes the figure
						"Z";
		} else if (from=="bottomleft") {
		    // Compute position
			Xtext = x-(txt_box.width+5);
			Ytext = y-Math.floor(txt_box.height/2)-6;

		    //draw text
			popup_txt = R.text(Xtext, Ytext, text).attr({fill: "black",font: tailleTxt,'text-anchor': 'start'});

			var bb = popup_txt.getBBox();

		    // Compute path for tooltip box
			pathText = 	// 'M'ove to the 'dent' in the bubble
						"M" + (x) + " " + (y) +
						// 'v'ertically draw a line 5 pixels more than the height of the text
						"v" + -(bb.height+5) +
						// 'h'orizontally draw a line 10 more than the text's width
						"h" + -(bb.width+10) +
						// 'v'ertically draw a line to the bottom of the text
						"v" + bb.height +
						// 'h'orizontally draw a line so we're 5 pixels from the left side
						"h" + (bb.width+5) +
						// 'Z' closes the figure
						"Z";
		}	else // bottom right
		{
		    // Compute position
			Xtext = x+5;
			Ytext = y-Math.floor(txt_box.height/2)-6;

		    //draw text
			popup_txt = R.text(Xtext, Ytext, text).attr({fill: "black",font: tailleTxt,'text-anchor': 'start'});

			var bb = popup_txt.getBBox();

		    // Compute path for tooltip box
			pathText = 	// 'M'ove to the 'dent' in the bubble
					   	"M" + (x) + " " + (y) +
						// 'v'ertically draw a line 5 pixels more than the height of the text
						"v" + -(bb.height+5) +
						// 'h'orizontally draw a line 10 more than the text's width
						"h" + (bb.width+10) +
						// 'v'ertically draw a line to the bottom of the text
						"v" + bb.height +
						// 'h'orizontally draw a line so we're 5 pixels from the left side
						"h" + -(bb.width+5) +
						// 'Z' closes the figure
						"Z";
		}

    //draw path for tooltip box
  popup = R.path( pathText ).attr( {fill: "yellow"} );

		//finally put the text in front
		popup_txt.toFront();

	}




};


//----------------------
///FIN DE LA VUE 2D
//----------------------


//==========================================================================================================================================================================================================================
// Traitements spécifiques à la page PROFIL
//==========================================================================================================================================================================================================================
if ($(location).attr('href').match(/^http:\/\/(.*\.)?gobland\.fr\/ProfilPerso\.php$/i)) {

  var skills = {};



  //fait apparaitre comp et tech et dons en couleurs dans MonProfil
  $('td:contains("Connaissance des Monstres")').parent().css("background-color","cefeda");
  $('td:contains("Identification des Trésors")').parent().css("background-color","fec8f1");
  $('td:contains("Limier")').parent().css("background-color","f9ffbc");
  $('td:contains("Dur")').parent().css("background-color","f9ffbc");

  //fait apparaitre "Grand Maître" en Gras dans Mon Profil
  $('td:contains("(Grand Maître)")').css("font-weight", "bold");

  $( document ).ready(function() {
    displayNextLevel();
    buildSkillsStats();
    buildSkillsMagie();
    addToolTipsTalents();

    // Met en rouge le malus de concentration
    if (skills.CON < 0) {
      $('td:contains("Bonus de concentration")').css("color","red");
    } else {
      $('td:contains("Bonus de concentration")').css("color","green" , "font-weight", "bold");
    }
  });



 //================================================================================================================
/// INFO BULLES TALENTS (au survol de la souris sur une comp ou tech, fait le calcul si c'est possible)
//=================================================================================================================
  function addToolTipsTalents() {

    $('a:contains("Symphonie Intestinale")').prop('title',
      'Apprenti...........ATT/ESQ/PER -' + Math.floor((skills.PV/30)) + "\n" +
      'Compagnon...ATT/ESQ/PER -' + Math.floor((skills.PV/25)) + "\n" +
      'Maître...............ATT/ESQ/PER -' + Math.floor((skills.PV/20)) + "\n" +
      'Grand Maître..ATT/ESQ/PER -' + Math.floor((skills.PV/15))) ;

    $('a:contains("Afflux Sanguin")').prop('title',
      'Apprenti ' + Math.floor((skills.PV/30) )  + 'D3'  + ' (' + Math.floor((skills.PV/30) )*2 + ')' + "\n"  +
      'Compagnon ' + Math.floor((skills.PV/25) ) + 'D3'  + ' (' + Math.floor((skills.PV/25) )*2 + ')' + "\n"  +
      'Maître ' + Math.floor((skills.PV/20) ) + 'D3'  + ' (' + Math.floor((skills.PV/20) )*2 + ')' + "\n"  +
      'Grand Maître ' + Math.floor((skills.PV/15) )+ 'D3' + ' (' + Math.floor((skills.PV/15) )*2 + ')') ;

    $('a:contains("Appel des Ombres")').prop('title',
      'Apprenti......' + ' MT +' + (skills.MTP/2)+ ' | ' + ' RT +0 ' + ' | ' + ' MP +0 ' + ' | ' + ' RT -' + (skills.RPP/2) + "\n"  +
      'Compagnon......' + ' MT +' + (skills.MTP)+ ' | '  + ' RT +0 '+ ' | '  + ' MP +0 '+ ' | '  + ' RP -' + (skills.RPP) + "\n"  +
      'Maître......' + ' MT +' + (skills.MTP)+ ' | '  + ' RT +' + (skills.RTP/2) + ' | '  + ' MP -' +(skills.MPP/2) + ' | ' + ' RP -' + (skills.RPP) + "\n"  +
      'Grand Maître......' + ' MT +' + (skills.MTP)+ ' | '  + ' RT +' + (skills.RTP)+ ' | '   + ' MP -' +(skills.MPP)+ ' | '  + ' RP -' + (skills.RPP));

    $('a:contains("Appel de la Nature")').prop('title',
      'Apprenti......' + ' MS +' + (skills.MSP/2)+ ' | ' + ' RS +0 ' + ' | ' + ' MC +0 ' + ' | ' + ' RC -' + (skills.RCP/2)   + "\n"  +
      'Compagnon......' + ' MS +' + (skills.MSP)+ ' | '  + ' RS +0 '+ ' | '  + ' MC +0 '+ ' | '  + ' RC -' + (skills.RCP) + "\n"  +
      'Maître......' + ' MS +' + (skills.MSP)+ ' | '  + ' RS +' + (skills.RSP/2) + ' | '  + ' MC -' +(skills.MCP/2) + ' | ' + ' RC -' + (skills.RCP) + "\n"  +
      'Grand Maître......' + ' MS +' + (skills.MSP)+ ' | '  + ' RS +' + (skills.RSP)+ ' | '   + ' MC -' +(skills.MCP)+ ' | '  + ' RC -' + (skills.RCP));

    $('a:contains("Alchimie")').prop('title',
      'ATT ' + Math.floor(skills.ATT )  + 'D6'  + skills.ATTP +  ' (' + Math.floor(((+skills.ATT) )*3.5 + +skills.ATTP)   + ')' + "\n"  +
      '......DEG......' + "\n"  +
      'Apprenti...... ' +  Math.floor(skills.ATT )  + 'D6'  + skills.ATTP +  ' (' + Math.floor(((+skills.ATT) )*3.5 + +skills.ATTP)   + ')' + "\n"  +
      'Compagnon...... ' + Math.floor((skills.PV/25) ) + 'D3'  + ' (' + Math.floor((skills.PV/25) )*3.5 + ')' + "\n"  +
      'Maître...... ' + Math.floor((skills.PV/20) ) + 'D3'  + ' (' + Math.floor((skills.PV/20) )*3.5 + ')' + "\n"  +
      'Grand Maître...... ' + Math.floor((skills.PV/15) )+ 'D3' + ' (' + Math.floor((skills.PV/15) )*3.5 + ')') ;

    $('a:contains("Renforcement magique")').prop('title',
      'Apprenti......' + ' MM +' + (skills.MMP/2)+ ' | ' + ' RM +0 ' + ' | ' + ' MR +0 ' + ' | ' + ' RR -' + (skills.RCP/2)   + "\n"  +
      'Compagnon......' + ' MM +' + (skills.MMP)+ ' | '  + ' RM +0 '+ ' | '  + ' MR +0 '+ ' | '  + ' RR -' + (skills.RCP) + "\n"  +
      'Maître......' + ' MM +' + (skills.MMP)+ ' | '  + ' RM +' + (skills.RMP/2) + ' | '  + ' MR -' +(skills.MRP/2) + ' | ' + ' RR -' + (skills.RRP) + "\n"  +
      'Grand Maître......' + ' MM +' + (skills.MMP)+ ' | '  + ' RM +' + (skills.RMP)+ ' | '   + ' MR -' +(skills.MRP)+ ' | '  + ' RR -' + (skills.RRP));

    $('a:contains("Connaissance des Monstres")').prop('title', 'portée : ' + (Math.floor((+skills.PER)+(+skills.PERM)+(+skills.PERP))));

    $('a:contains("Projectile")').prop('title',
      'ATT ' +  Math.floor(((skills.PER/2 +   skills.ATT/2)) - Math.max(0,(2/4-0))) + 'D6 +' + Math.floor(skills.PERM/2 + skills.ATTM/2 ) + '---> ' +
      (Math.floor((((skills.PER/2 +   skills.ATT/2)) - Math.max(0,2/4-0)))*3.5  + Math.floor(skills.PERM/2 + skills.ATTM/2 )) + "\n"   +
      'DEG ' +  Math.floor((skills.PER/2 +   skills.ATT/2)) + 'D3 +' + (skills.ATTM/2 + skills.PERM/2 ) + '---> ' +
      ((Math.floor((skills.PER/2 +   skills.ATT/2)))*2 + Math.floor(skills.PERM/2 + skills.ATTM/2 )) + ' (' +
      ((((Math.floor((skills.PER/2 +   skills.ATT/2)))*2 + Math.floor(skills.PERM/2 + skills.ATTM/2 ))) + ((((Math.floor((skills.PER/2 +   skills.ATT/2)))*2 + Math.floor(skills.PERM/2 + skills.ATTM/2 )))/2))  + ')' + "\n"  +
      'Divisé par 2 si résisté');

    $('a:contains("Baratin")').prop('title',
      'Apprenti......' +  Math.floor((1)+((skills.PER)/5 + (skills.REG)/5))+'D6' + ' (' + Math.floor(1+((skills.PER)/5 + (skills.REG)/5)*3.5)  + ')' +  "\n"  +
      'Compagnon......'  + Math.floor((1)+((skills.PER)/4 + (skills.REG)/4)) +'D6' + ' (' + Math.floor(1+((skills.PER)/4 + (skills.REG)/4)*3.5)  + ')' + "\n"  +
      'Maître ......'  + Math.floor((1)+((skills.PER)/3 + (skills.REG)/3))+'D6' + ' (' + Math.floor(1+((skills.PER)/3 + (skills.REG)/3)*3.5)  + ')' + "\n"  +
      'Grand Maître ......' +  Math.floor((1)+((skills.PER)/2 + (skills.REG)/2))+'D6' + ' (' + Math.floor(1+((skills.PER)/2 + (skills.REG)/2)*3.5)  + ')');

    $('a:contains("Chirurgie")').prop('title',
      'Apprenti...... ' + Math.floor((3/2)*skills.REG) + 'D3'+ ' (' + Math.floor((3/2)*skills.REG) *2 + ')' + "\n"  +
      'Compagnon...... ' + Math.floor((4/2)*skills.REG) + 'D3' + ' (' + Math.floor((4/2)*skills.REG) *2 + ')' + "\n"  +
      'Maître...... ' + Math.floor((5/2)*skills.REG) + 'D3' + ' (' + Math.floor((5/2)*skills.REG) *2 + ')' + "\n"  +
      'Grand Maître...... ' + Math.floor((6/2)*skills.REG) + 'D3' + ' (' + Math.floor((6/2)*skills.REG) *2 + ')');

    $('a:contains("Soins")').prop('title',
      'Apprenti...... ' + '+' + Math.floor(+skills.REG*1 + +skills.REGM) + ' PV' + "\n"  +
      'Compagnon...... ' + '+' + Math.floor(+skills.REG*2 + +skills.REGM) + ' PV' +"\n"  +
      'Maître...... ' + '+' + Math.floor(+skills.REG*3 + +skills.REGM) + ' PV' + "\n"  +
      'Grand Maître...... ' + '+' + Math.floor(+skills.REG*4 + +skills.REGM) + ' PV');

    $('a:contains("Téléportation")').prop('title',
      'Apprenti...... ' +  'Portée horizontale : ' + ((Math.floor(Math.sqrt(19+8*skills.MM*1/5+3))-7)/2 + 20 +  + skills.PER + +skills.PERM )  + ' Portée verticale : ' +((Math.floor(((Math.sqrt(19+8*skills.MM*1/5+3))-7)/2/3+3))) + "\n"  +
      'Compagnon...... ' +  'Portée horizontale : ' + ((Math.floor(Math.sqrt(19+8*skills.MM*1.1/5+3))-7)/2 + 20 +  + skills.PER + +skills.PERM )  + ' Portée verticale : ' +((Math.floor(((Math.sqrt(19+8*skills.MM*1.1/5+3))-7)/2/3+3))) + "\n"  +
      'Maître...... ' +  'Portée horizontale : ' + ((Math.floor(Math.sqrt(19+8*skills.MM*1.2/5+3))-7)/2 + 20 +  + skills.PER + +skills.PERM )  + ' Portée verticale : ' +((Math.floor(((Math.sqrt(19+8*skills.MM*1.2/5+3))-7)/2/3+3))) + "\n"  +
      'Grand Maître...... ' +  'Portée horizontale : ' + ((Math.floor(Math.sqrt(19+8*skills.MM*1.3/5+3))-7)/2 + 20 +  + skills.PER + +skills.PERM )  + ' Portée verticale : ' +((Math.floor(((Math.sqrt(19+8*skills.MM*1.3/5+3))-7)/2/3+3))));

    $('a:contains("Double Dague")').prop('title',
      'Grand Maître : 1ere attaque : ' + skills.ATT+ 'D6'+ '+' + skills.ATTP*1+ '+' + +skills.ATTM +
      '2eme attaque : ' + Math.floor(skills.ATT-+skills.ATT*0.25) + 'D6'+ '+' +  Math.floor(skills.ATTP*1*0.25)+ '+' +  Math.floor(skills.ATTM*0.25) +
      '3eme attaque : ' + Math.floor(skills.ATT-+skills.ATT*0.5) + 'D6'+ '+' +  Math.floor(skills.ATTP*1*0.5)+ '+' +  Math.floor(skills.ATTM*0.5) +
      '4eme attaque : ' + Math.floor(skills.ATT-+skills.ATT*0.75) + 'D6'+ '+' +  Math.floor(skills.ATTP*1*0.75)+ '+' +  Math.floor(skills.ATTM*0.75) +
      'Dégâts : ' + skills.DEG  + 'D3'+ '+' +  Math.floor(skills.DEGP*1.5)+ '+' +  Math.floor(skills.DEGM)) ;

    $('a:contains("Flairer le gibier")').prop('title',
      'Apprenti...... ' +  'Portée  : ' + 1.5*(+skills.PER+(+skills.PERP)) + "\n"  +
      'Compagnon......' +  'Portée  : '+ 2*(+skills.PER+(+skills.PERP)) + "\n"  +
      'Maître...... ' +  'Portée  : ' + 2.5*(+skills.PER+(+skills.PERP)) + "\n"  +
      'Grand Maître...... ' +  'Portée  : ' + 3*(+skills.PER+(+skills.PERP)) + "\n"  );

    $('a:contains("Jet de Pierres")').prop('title',
      'Apprenti...... ' +  'Portée  : 1'  + "\n"  +
      'Compagnon......' +  'Portée  : 2'  + "\n"  +
      'Maître...... ' +  'Portée  : 3'  + "\n"  +
      'Grand Maître...... ' +  'Portée  : 4'   );

    $('a:contains("Attaque Défensive")').prop('title',
      'Apprenti.............. ' +  'ESQ +' + Math.floor(Math.max(skills.ESQ/3,1)) + " | ATT -1\n"  +
      'Compagnon....... ' +  'ESQ +' + Math.floor(Math.max(skills.ESQ/2.5,2)) + " | ATT -1\n"  +
      'Maître................... ' + 'ESQ +' + Math.floor(Math.max(skills.ESQ/2,3))  + " | ATT -1\n"  +
      'Grand Maître..... ' + 'ESQ +' + Math.floor(Math.max(skills.ESQ/1.5,4)) + " | ATT -1");

    $('a:contains("Forme spectrale")').prop('title',
      'Apprenti...... ' +  'ESQ +3 ARMM +1' + '.... total ARMM après conversion : ' + (Math.floor(skills.ARMP*0.15)+(+skills.ARMM)+1) + "\n"  +
      'Compagnon......' +  'ESQ +4 ARMM +2' + '.... total ARMM après conversion : ' + (Math.floor(skills.ARMP*0.20)+(+skills.ARMM)+2) + "\n"  +
      'Maître...... ' +  'ESQ +5 ARMM +3' + '.... total ARMM après conversion : ' + (Math.floor(skills.ARMP*0.25)+(+skills.ARMM)+3) + "\n"  +
      'Grand Maître...... ' + 'ESQ +6 ARMM +4' + '.... total ARMM après conversion : ' + (Math.floor(skills.ARMP*0.30)+(+skills.ARMM)+4));

    $('a:contains("Herboriser")').prop('title',
      'Apprenti...... ' +  'Portée  : ' + 1.5*(+skills.PER+(+skills.PERP+(+skills.PERM))) + " (Fleur,Baie) " + "\n"  +
      'Compagnon......' +  'Portée  : '+ 2*(+skills.PER+(+skills.PERP)+(+skills.PERM)) + ' (Fleur,Baie, Plante grasse, Champignon)'  + "\n"  +
      'Maître...... ' +  'Portée  : ' + 2.5*(+skills.PER+(+skills.PERP)+(+skills.PERM)) + ' (Fleur,Baie, Plante grasse, Champignon, Mousse)'  +  "\n"  +
      'Grand Maître...... ' +  'Portée  : ' + 3*(+skills.PER+(+skills.PERP)+(+skills.PERM)) + ' (tout)');

    $('a:contains("Rafale")').prop('title',
      'FULL'  + "\n"  +
      'Apprenti...... ' +  'DEG '  + skills.DEG + 'D3' + skills.DEGM + ' (pas de malus de REG)' + "\n"  +
      'Compagnon......' +  'DEG '  + skills.DEG + 'D3' + skills.DEGM + ' (Malus REG : ' + (Math.floor(skills.DEG/2)) + 'D3' + ')' + "\n"  +
      'Maître...... ' +  'DEG '  + skills.DEG + 'D3' + skills.DEGM +  ' (Malus REG : ' + (Math.floor(skills.DEG)) + 'D3' + ')' + "\n"  +
      'Grand Maître...... ' + 'DEG '  + skills.DEG + 'D3' + skills.DEGM +  ' (Malus REG : ' + (Math.floor(skills.DEG*2))  + 'D3' + ')' + "\n"  +
      'RES' + "\n"  +
      'Apprenti...... ' +  'DEG '  + (Math.floor(skills.DEG*0.3)) + 'D3' + skills.DEGM + ' (pas de malus de REG)' + "\n"  +
      'Compagnon......' +  'DEG '  + (Math.floor(skills.DEG*0.4))  + 'D3' + skills.DEGM +  ' (pas de malus de REG)' + "\n"  +
      'Maître...... ' +  'DEG '  + (Math.floor(skills.DEG*0.5))  + 'D3' + skills.DEGM +  ' (Malus REG : ' + (Math.floor(skills.DEG/2)) + 'D3' + ')' + "\n"  +
      'Grand Maître...... ' + 'DEG '  + (Math.floor(skills.DEG*0.6))  + 'D3' + skills.DEGM +  ' (Malus REG : ' + (Math.floor(skills.DEG) + 'D3' + ')'))  ;


    // DONS
    $('a:contains("Dans")').prop('title', 'ATTM + ' + skills.danslmil);
    $('a:contains("Limier")').prop('title', 'PERM + ' + skills.limier);
    $('a:contains("Chef")').prop('title', 'Bonus Cuisine :  + ' + 5*skills.grandchef);
    $('a:contains("Dur à cuir")').prop('title', '+ ' + skills.duracuir*5 + ' PV');
  };

  function displayNextLevel() {
    // calcul du nombre d'entrainements pour passer au lvl sup
    var gobExperience = $('th:contains("Expérience")').parent().closest('tr');
    var tdExp = $('td:first', gobExperience);
    var sExp = tdExp.html();
    res = sExp.match(/: (\d+) \((\d+) PI \| Niveau (\d+) : (\d+)/);
    var nbTrain = Math.ceil((res[4].valueOf() - res[2].valueOf())/( 2 * res[1].valueOf()));
    var pExp = sExp.indexOf(")");
    var sTrain = (nbTrain > 1) ? " entraînements" : " entraînement";
    tdExp.html(sExp.substr(0, pExp + 1 ) + " ---> Il te reste " + nbTrain + sTrain + sExp.substr(pExp + 1));
  };

  function buildSkillsStats() {
    // Recup position et PER
    var gobPosition = $('th:contains("Position")').parent().closest('tr').text();
    var pos = gobPosition.match(/X = ([-]*\d+) \| Y = ([-]*\d+) \| N = ([-]*\d+)/);
    skills.X = pos[1];
    skills.Y = pos[2];
    skills.N = pos[3];

    var per =  gobPosition.match(/Perception......: (\d+)/);
    skills.PER = per[1];
    var perp = gobPosition.match(/Cases (\W(\d+))/);
    skills.PERP = perp[1];
    var perm = gobPosition.match(/Cases (\W(\d+))(\W(\d+))/);
    skills.PERM = perm[3];

    var permax = +skills.PER +   +skills.PERP  + +skills.PERM
    window.localStorage.setItem('permax', permax);

    // Recup de la concentration (pour la modif css plus haut)
    var concentration = $('th:contains("Affinités")').parent().closest('tr').text();
    var conc = concentration.match(/Bonus de concentration : (\d+)/);
    skills.CON = conc[1];

    // Recup de la dla
    var gobdla = $('th:contains("Echéance du Tour")').parent().closest('tr').text();
    var dla = gobdla.match(/(\d+)-(\d+)-(\d+)/);
    skills.DLA = dla[1];


    // Recup PV, PVMax et REG
    var gobSante = $('th:contains("Santé")').parent().closest('tr');
    var tdSante = $('td:first', gobSante);
    res = tdSante.html().split(/<BR>/i); //gobSante.match(/: (\d+)([^:]+): (\d+)([^:]+): (\d+)/);
    skills.PV = res[0].match(/: (\d+)/)[1];
    skills.PVMax = res[1].match(/: (\d+)/)[1];


    var regensgob = $('td:contains("Régénération")').parent().closest('tr').text();
    var reg = regensgob.match(/Régénération..: (\d+)/);
    skills.REG = reg[1];
    var regp = regensgob.match(/D3(\W(\d+))/);
    skills.REGP = regp[1];
    var regm = regensgob.match(/D3(\W(\d+))(\W(\d+))/);
    skills.REGM = regm[3];

    /// recup DEG
    var degatsgob = $('div:contains("Dégâts")').parent().closest('tr').text();
    var deg = degatsgob.match(/: (\d+)/);
    skills.DEG = deg[1];
    var degp = degatsgob.match(/D3(\W(\d+))/);
    skills.DEGP = degp[1];
    var degm = degatsgob.match(/D3(\W(\d+))(\W(\d+))/);
    skills.DEGM = degm[3];

    /// recup ARM
    var armuresgob = $('div:contains("Armure")').parent().closest('tr').text();
    var armp = armuresgob.match(/Armure.....: (\d+)/);
    skills.ARMP = armp[1];
    var armm = armuresgob.match(/Armure.....: (\d+)(\W)(\d+)/);
    skills.ARMM = armm[3];

    /// recup ATT
    var attaquesgob = $('td:contains("Attaque")').parent().closest('tr').text();
    var att = attaquesgob.match(/Attaque.....: (\d+)/);
    skills.ATT = att[1];
    var attp = attaquesgob.match(/Attaque.....: (\d+)D6(\W(\d+))/);
    skills.ATTP = attp[2];
    var attm = attaquesgob.match(/Attaque.....: (\d+)D6(\W(\d+))(\W(\d+))/);
    skills.ATTM = attm[4];

    /// recup ESQ
    var esquivesgob = $('td:contains("Esquive")').parent().closest('tr').text();
    var esq = esquivesgob.match(/Esquive....: (\d+)/);
    skills.ESQ = esq[1];
    var esqp = esquivesgob.match(/Esquive....: (\d+)D6(\W(\d+))(\W)(\d+)/);
    skills.ESQP = esqp[2];
    var esqm = esquivesgob.match(/Esquive....: (\d+)D6(\W)(\d+)(\W(\d+))/);
    skills.ESQM = esqm[4];
  };

  function getDon(don) {
    try {
      return $('td:contains("' + don + '")').next('td').text().match(/(\d) (\W) (\d)/)[1];
    } catch (err) {
      return null;
    }
  };

  function buildSkillsMagie() {
    //recup dons
    skills.danslmil = getDon("Dans");
    skills.limier = getDon("Limier");
    skills.grandchef = getDon("Grand Chef");
    skills.duracuir = getDon("Dur à cuir");

    ///recup Magies (a finir)
    skills.RM = $('td.invisible:contains("(RM)")').next('td').text().match(/= ([-]*\d+)/)[1];
    skills.RMP = $('td.invisible:contains("(RM)")').next('td').text().match(/(\d+)(\W(\d+))/)[1];
    skills.RMM = $('td.invisible:contains("(RM)")').next('td').text().match(/(\d+)(\W(\d+))/)[2];

    skills.MM = $('td.invisible:contains("(MM)")').next('td').text().match(/= ([-]*\d+)/)[1];
    skills.MMP = $('td.invisible:contains("(MM)")').next('td').text().match(/(\d+)(\W(\d+))/)[1];
    skills.MMM = $('td.invisible:contains("(MM)")').next('td').text().match(/(\d+)(\W(\d+))/)[2];

    skills.RS = $('td.invisible:contains("(RS)")').next('td').text().match(/= ([-]*\d+)/)[1];
    skills.RSP = $('td.invisible:contains("(RS)")').next('td').text().match(/(\d+)(\W(\d+))/)[1];
    skills.RSM = $('td.invisible:contains("(RS)")').next('td').text().match(/(\d+)(\W(\d+))/)[2];

    skills.MS = $('td.invisible:contains("(MS)")').next('td').text().match(/= ([-]*\d+)/)[1];
    skills.MSP = $('td.invisible:contains("(MS)")').next('td').text().match(/(\d+)(\W(\d+))/)[1];
    skills.MSM = $('td.invisible:contains("(MS)")').next('td').text().match(/(\d+)(\W(\d+))/)[2];

    skills.RT = $('td.invisible:contains("(RT)")').next('td').text().match(/= ([-]*\d+)/)[1];
    skills.RTP = $('td.invisible:contains("(RT)")').next('td').text().match(/(\d+)(\W(\d+))/)[1];
    skills.RTM = $('td.invisible:contains("(RT)")').next('td').text().match(/(\d+)(\W(\d+))/)[2];

    skills.MT = $('td.invisible:contains("(MT)")').next('td').text().match(/= ([-]*\d+)/)[1];
    skills.MTP = $('td.invisible:contains("(MT)")').next('td').text().match(/(\d+)(\W(\d+))/)[1];
    skills.MTM = $('td.invisible:contains("(MT)")').next('td').text().match(/(\d+)(\W(\d+))/)[2];

    skills.RC = $('td.invisible:contains("(RC)")').next('td').text().match(/= ([-]*\d+)/)[1];
    skills.RCP = $('td.invisible:contains("(RC)")').next('td').text().match(/(\d+)(\W(\d+))/)[1];
    skills.RCM = $('td.invisible:contains("(RC)")').next('td').text().match(/(\d+)(\W(\d+))/)[2];

    skills.MC = $('td.invisible:contains("(RT)")').next('td').text().match(/= ([-]*\d+)/)[1];
    skills.MCP = $('td.invisible:contains("(RT)")').next('td').text().match(/(\d+)(\W(\d+))/)[1];
    skills.MCM = $('td.invisible:contains("(RT)")').next('td').text().match(/(\d+)(\W(\d+))/)[2];

    skills.RP = $('td.invisible:contains("(RP)")').next('td').text().match(/= ([-]*\d+)/)[1];
    skills.RPP = $('td.invisible:contains("(RP)")').next('td').text().match(/(\d+)(\W(\d+))/)[1];
    skills.RPM = $('td.invisible:contains("(RP)")').next('td').text().match(/(\d+)(\W(\d+))/)[2];

    skills.MP = $('td.invisible:contains("(MP)")').next('td').text().match(/= ([-]*\d+)/)[1];
    skills.MPP = $('td.invisible:contains("(MP)")').next('td').text().match(/(\d+)(\W(\d+))/)[1];
    skills.MPM = $('td.invisible:contains("(MP)")').next('td').text().match(/(\d+)(\W(\d+))/)[2];

    skills.RR = $('td.invisible:contains("(RR)")').next('td').text().match(/= ([-]*\d+)/)[1];
    skills.RRP = $('td.invisible:contains("(RR)")').next('td').text().match(/(\d+)(\W(\d+))/)[1];
    skills.RRM = $('td.invisible:contains("(RR)")').next('td').text().match(/(\d+)(\W(\d+))/)[2];
    //manque MR
  };
}

//================================================================================================================
/// Affichage des carats
//================================================================================================================
const regMinerai = /^(\D*)(\d+)(\D*)$/
  const qualites = {
    'Médiocre': 2,
    'Moyenne': 2.75,
    'Normale': 3.5,
    'Bonne': 4.25,
    'Exceptionnelle': 5
  };

$( document ).ready(function() {
  $('a:contains("taille")').each(function() {
    arr = this.text.match(regMinerai);
    carats = arr[2] * qualites[arr[3].split(' ')[3]];
    this.text = arr[0] + ' [Carats = ' + carats + ']'
  })
});


//====================================================================================
/// Décocher par défaut la case activer sa DLA sur la page de Log-In piqué a Seishin
//====================================================================================
(function() {
    'use strict';

 $('input[type=checkbox][name=aDLA]').prop( "checked", false);
})();

//===================================================
// Décocher par défaut le vestaire piqué a Seishin
//===================================================
(function() {
    'use strict';

    $('input[type=checkbox][name=VESTIAIRE]').prop( "checked", false );
})();



//========================================================================================================
///fonction RemplaceText () pour remplacer le texte et ajouter des icones dans Gobland (inspiré par Lordslair))
//========================================================================================================
if ($(location).attr('href').match(/http:\/\/(.*\.)?gobland\.fr\/Vue\.php|http:\/\/(.*\.)?gobland\.fr\/ProfilPerso\.php/i)) {

  const words = {
      // Clan et CM
      '((50125|346|330|286|388|386|387|407|164|407|385|405|393|46237|95720|130171|46237|47717|95720|130171|53|101759|101|50127|95982|108284|100794|94082|108|121|129|141|180|48520|66516|69423|119472|32954|135982|137884|146091|141303|141548|145977|153064|153598|147777|153645))' : '🥰',

    // méchants
    '((50|104|151691|270|267))' : '🔴',


      // icones monstres
      'Abishaii Multicolore ' : 'Abishaii Multicolore 👁️👁️ 💉 ',
      'Abishaii Blanc ' :  'Abishaii Blanc 👁️ 💉 ',
      'Abishaii Bleu ' :  'Abishaii Bleu 👁️ 💉 ',
      'Abishaii Noir ' :  'Abishaii Noir 👁️ 💉 ',
      'Abishaii Rouge ' :  'Abishaii Rouge 👁️ 💉 ',
      'Abishaii Vert ' :  'Abishaii Vert 👁️ 💉 ',
      'Ankheg ': 'Ankheg 🙈 ',
      'Ame-en-peine ' :  'Ame-en-peine 👁️ ',
      'Amibe Géante ' : 'Amibe Géante 🙈 ',
      'Anaconda des Catacombes ' : 'Anaconda des Catacombes 🙈 ',
      'Araignée Géante ' : 'Araignée Géante 🙈 ' ,
      'Arbre à gobelins ' : 'Arbre à gobelins 🙈 ',
      'Automate ' : 'Automate 👁️👁️ ',
      'Barghest ' : 'Barghest 👁️👁️ ',
      'Babélien ' : 'Babélien 🙈 ',
      'Basilic ' : 'Basilic 🙈 ',
      'Béhir ' :  'Béhir 👁️ ',
      'Boggart ' : 'Boggart 🙈 ',
      'Bondin ' : 'Bondin 🙈 ',
      'Brontoscorpion ' : 'Brontoscorpion 🙈 💉 ',
      'Bulette ' :  'Bulette 👁️ ',
      'Cattis ' : 'Cattis 👁️👁️ ' ,
      'Caillouteux ' : 'Caillouteux 🙈 ',
      'Cerbère ' :  'Cerbère 👁️👁️👁️ 💉💉 ',
      'Centaure ' : 'Centaure 🙈 ' ,
      'Chauve-souris Géante ' : 'Chauve-souris Géante 🙈 ',
      'Chimère ' : 'Chimère 👁️👁️ ' ,
      'Cockatrice ' : 'Cockatrice 🙈 ',
      'Colosse de pierre ' :  'Colosse de pierre 👁️👁️👁️ ',
      'Crapaud démoniaque ' :  'Crapaud démoniaque 👁️ ',
      'Crapaud Géant ' : 'Crapaud Géant 🙈 ',
      'Croquemitaine ' : 'Croquemitaine 🙈 ',
      'Cyclope ' : 'Cyclope 🙈 ',
      'Danseur de Mort ' :  'Danseur de Mort 👁️ ',
      'Diablotin ' : 'Diablotin 👁️',
      'Dao' : 'Dao 👁️👁️',
      'Dumb ' : 'Dumb 🙈 ',
      'Djinn ' : 'Djinn 👁️👁️ ',
      'Dragon ' : 'Dragon 🔥 ',
      'Dryade ' :  'Dryade 👁️👁️👁️ ',
      'Effrit ' : 'Effrit 🔥 ',
      'Elémentaire de Terre ' :  'Elémentaire de Terre 👁️ 🔥 ',
      "Elémentaire d'Eau "  :  "Elémentaire d'Eau 👁️ 🔥 ",
      'Elémentaire de Feu ' :  'Elémentaire de Feu 👁️ 🔥 ',
      'Elfe ' : 'Elfe 🙈 ',
      'Ent ' : 'Ent 👁️👁️ ',
      'Erinyes ' : 'Erinyes 👁️ ',
      'Escargot ' : 'Escargot 🙈 ',
      'Ettercap ' : 'Ettercap 🙈 ',
      'Ettin ' : 'Ettin 🙈 ',
      'Eusmilus ' : 'Eusmilus 🙈 ',
      'Fantôme ' : 'Fantôme 🙈 ',
      'Feu follet ' : 'Feu follet 🙈 🔥 ',
      'Fongoïde ' : 'Fongoïde 🙈 ',
      'Furgolin ' : 'Furgolin 🙈 ',
      'Fungus Géant ' :  'Fungus Géant 👁️ ',
      'Galopin ' : 'Galopin 🙈',
      'Géant des Collines ' : 'Géant des Collines 🙈 ',
      'Géant du Feu ' : 'Géant du Feu 🙈 ' ,
      'Géant des Nuages ' :  'Géant des Nuages 👁️ ',
      'Géant des Tempêtes ' :  'Géant des Tempêtes 👁️ ',
      'Géant du Froid ' :  'Géant du Froid 👁️ ',
      'Géant de Pierre ' :  'Géant de Pierre 👁️ ',
      'Gnoll ' : 'Gnoll 🙈 ',
      'Gnome de pierre ' :  'Gnome de pierre 👁️ ',
      'Gelée ocre ' : 'Gelée ocre 🙈 ',
      'Glouton ' : 'Glouton 🙈 ',
      'Glouton Sanguinaire ' : 'Glouton Sanguinaire 🙈 ',
      'Gnome Artificier ' : 'Gnome Artificier 🙈 ',
      'Goblours ' : 'Goblours 🙈 ',
      'Golem de Fer ' : 'Golem de Fer 🙈 ',
      'Golem de Pierre ' : 'Golem de Pierre 🙈',
      'Gorgone ' :  'Gorgone 👁️ ',
      'Goule ' :  'Goule 👁️ ',
      'Gremlins ' : 'Gremlins 🙈 ',
      'Grouilleux ' : 'Grouilleux 🙈 ',
      'Griffon ' :  'Griffon 👁️ ',
      'Guêpe géante ' :  'Guêpe géante 👁️ 💉 ',
      'Harpie ' : 'Harpie 🙈 ',
      'Hellrot ' : 'Hellrot 👁️👁️ ',
      'Homme-Lézard ' : 'Homme-Lézard 🙈 ',
      'Homothérium ' :  'Homothérium 👁️ ',
      'Horreur chasseresse ' : 'Horreur chasseresse 👁️👁️ ',
      'Hippopotame furieux ' : 'Hippopotame furieux 🙈 ',
      'Hippogriffe ' :  'Hippogriffe 👁️ ',
      'Halfelin ' : 'Halfelin 🙈 ',
      'Hurleur ' : 'Hurleur 🙈 ',
      'Incube ' :  'Incube 👁️ ',
      'Illithid ' :  'Illithid 👁️👁️👁️ ',
      'Kappa ' : 'Kappa 🙈 ',
      'Kobold ' : 'Kobold 🙈 ',
     	'Lacodon ' : 'Lacodon 🙈 ',
      'Lapin Sanguinaire ' : 'Lapin Sanguinaire 🙈 ',
      'Larbin démoniaque ' :  'Larbin démoniaque 👁️ ',
      'Légion-en-peine ' : 'Légion-en-peine 👁️👁️ 😵 ',
      'Lémure ' :  'Lémure 👁️ ',
      'Lézard Géant ' : 'Lézard Géant 🙈 ',
      'Licorne ' : 'Licorne 🙈 ',
      'Limace Géante ' : ' Limace Géante 🙈 ',
      'Loup-garou ' : 'Loup-garou 🙈 ',
      'Lutin ' : 'Lutin 🙈 💉 ',
      'Macrauchenia ' : 'Macrauchenia 🙈 ' ,
      'Mante religieuse géante ' : 'Mante religieuse géante 🙈 ',
      'Manticore ' : 'Manticore 🙈 ',
      'Marid ' : 'Marid 👁️👁️ ',
      'Marmotte ' : 'Marmotte 🙈 ' ,
      'Méduse ' : 'Méduse 🙈 ',
      'Meganeura ' : 'Meganeura 🙈 ',
      'Megantereon ' : 'Megantereon 🙈 ',
      'Méphite Aérien ' : 'Méphite Aérien 🙈 🔥 ',
      'Méphite de Feu ' : 'Méphite de Feu 🙈 🔥 ',
      'Méphite Aqueux ' : 'Méphite Aqueux 🙈 🔥 ' ,
      'Méphite de Glace ' : 'Méphite de Glace 🙈 🔥 ',
      'Méphite de Verre ' : 'Méphite de Verre 🙈 🔥 ',
      'Méphite Magmatique ' : 'Méphite Magmatique 🙈 🔥 ',
      'Méphite Sulfureux ' : 'Méphite Sulfureux 🙈 🔥 ',
     	'Mille-pattes géant ' : 'Mille-pattes géant 👁️  ',
      'Mimique ' : 'Mimique 🙈 ',
      'Minotaure ' : 'Minotaure 🙈 ',
      'Molosse Satanique ' :  'Molosse Satanique 👁️ 🔥 ',
      'Momie ' : 'Momie 👁️ ',
      'Monstre Rouilleur ' : 	'Monstre Rouilleur 🙈 ',
      'Naga ' : 'Naga 🙈 ',
      'Nécrophage ' : 'Nécrophage 🙈 💉 ',
      "Nuage d'insectes " : "Nuage d'insectes 🙈 ",
      'Nuée de Vermines ' : 'Nuée de Vermines  🙈 ',
      'Ombre ' :  'Ombre 👁️ ',
      'Ondine ' : 'Ondine 👁️ 🔥 ',
      'Oni ' : 'Oni 👁️👁️ 😵 ',
      'Oiseau-Tonnerre ' : 'Oiseau-Tonnerre 🙈 ',
      'Onyx ' : 'Onyx 🙈 ' ,
      'Orque Noir ' : 'Orque Noir 🙈 ',
      'Otyugh ' : 'Otyugh 🙈 ',
      'Ours hibou ' : 'Ours hibou 👁️ ',
      'Ours des Montagnes ' : 'Ours des Montagnes 🙈 ',
      'Orque ': 'Orque 🙈 ',
      'Plante Carnivore ' :  'Plante Carnivore 👁️ ',
      'Pégase ' : 'Pégase 🙈 ',
      'Rakshah ' : 'Rakshah 👁️👁️ ',
      'Rat-garou ' : 'Rat-garou 🙈 ',
      'Rat Géant ' : 'Rat Géant 🙈 ',
      'Rocketeux ' : 'Rocketeux 🙈 ',
      'Sagouin ' : 'Sagouin 🙈 ',
      'Scarabée Géant ' : 'Scarabée Géant 🙈 💉 ',
      'Scorpion Géant ' : 'Scorpion Géant 🙈 ',
      'Shai ' : 'Shai 👁️👁️ 🔥 ',
      'Sphinx ' : 'Sphinx 👁️👁️ ',
      'Slaad ' : 'Slaad 🙈 ',
      'Salamandre ' :  'Salamandre 👁️ 🔥 ',
      'Strige ': 'Strige 👨‍🙈 ',
      'Squelette ' :  'Squelette 👁️ ',
      'Spectre ' :  'Spectre 👁️ ',
      'Sprigan ' : 'Sprigan 🙈 ',
      'Sylphide ' :  'Sylphide 👁️ 🔥 ',
      'Taureau démoniaque ' : 'Taureau démoniaque 👁️👁️ ',
      'Tertre errant ' :  'Tertre errant 👁️ ',
      'Thri-kreen ' : 'Thri-kreen 🙈 ',
     	'Tigre à Dents de Sabre ' : 'Tigre à Dents de Sabre 🙈 ',
      'Tigre-garou ' : 'Tigre-garou 🙈 ',
      'Titan ' : 'Titan 🙈 ',
      'Tortue Carnivore ' : 'Tortue Carnivore 🙈 ',
      'Tutoki ': 'Tutoki 🙈 ',
      'Troglodyte ' :  'Troglodyte 👁️ ',
      'Troll ' :  'Troll 👁️ ',
      'Vampire ' : 'Vampire 👁️👁️ 😵 ',
      'Vampire Archaïque ' : 'Vampire Archaïque 👁️👁️ 😵 ',
      'Viverne ' : 'Viverne 🙈 💉💉 ',
      'Worg ' : 'Worg 🙈 ',
      'Yéti ' : 'Yéti 🙈 ',
      'Zombi ' :  'Zombi 👁️ ',



      // Icônes équipement
      'Potion' : 'Potion 🧪',
      'Parchemin' : 'Parchemin 📜📜📜📜📜📜📜alerte📜📜📜📜📜📜📜📜📜📜',
      'CT| Canines de Trõll' : ' CT 💰',
      'Anneau' : 'Anneau 💍 ',
      'Bouclier' : 'Bouclier 🛡️',
      'Corps' : 'Corps ☠️',
      'Arme 1 Main' : 'Arme 1 main 🗡️',
      'Outil' : "Outil 🔧",
      'Nourriture' : 'Nouriture 🍔',
      'Rondin' : 'Rondin 🪵',

      // Dans Mon Profil
      'Santé' : 'Santé ❤️',
      'Echéance du Tour' : 'Echéance du Tour⏱️',
      'Combat' : 'Combat ⚔️',
      'Affinités' : 'Affinités ✨',
      'Position' : 'Position 🧭',
      'Description' : 'Description 📜',
      'Expérience' : 'Expérience 🇽🇵',
      'Actions programmées': 'Actions programmées ⏰',
      'Suivants' : 'Suivants 🦙',

      'Empathie' : 'Empathie 🫂',
      'Sociale' : 'Sociale 🫂',
      'Flux Obscur' : 'Flux Obscur ⚫',
      'Voile Obscur' : 'Voile Obscur ⚫',
      'Magie' : 'Magie 🪄',
      'Psychique' : 'Psychique 🧠',
      'Physique' : 'Physique 💪',
      'Corporelle' :  'Corporelle💪',
      'Technologie' : 'Technologie ⚙️',

      // Diverses icônes
      'Baguette' : 'Baguette 🪄 ',
      'Escalier' : 'Escalier 🪜 ',
      //'Baie' : 'Baie 🫐',
      //'Arbre' :     'Arbre 🌳',
      //'Fleur' : 'Fleur 🌷',
      'Zone de ténèbres' : 'Zone de ténèbres 🌫️',
      'Porte' : 'Porte 🚪',
      '':''
    };

  const tagsWhitelist = ['PRE', 'BLOCKQUOTE', 'CODE', 'INPUT', 'BUTTON', 'TEXTAREA'];

  function prepareRegex(string) {
    return string.replace(/(\({2}|([\[\]\^\&\$\.\?\/\\\+\{\}])|\)$)/g, '\\$1');
  }

  function isTagOk(tag) {
    return tagsWhitelist.indexOf(tag) === -1;
  }

  function enhanceText() {
    'use strict';

    // enclenchement des remplacements et ajouts d'icones
    var regexs = [],
        replacements = [],
        rIsRegexp = /^\/(.+)\/([gim]+)?$/,
        word, text, texts, i, userRegexp;

    for (word in words) {
      if ( typeof word === 'string' && words.hasOwnProperty(word) ) {
        userRegexp = word.match(rIsRegexp);

        // add the search/needle/query
        if (userRegexp) {
            regexs.push(new RegExp(userRegexp[1], 'g'));
        } else {
            regexs.push(
                new RegExp(prepareRegex(word).replace(/\\?\*/g, function (fullMatch) {
                    return fullMatch === '\\*' ? '*' : '[^ ]*';
                }), 'g')
            );
        }
        replacements.push(words[word]);
      }
    }

    texts = document.evaluate('//body//text()[ normalize-space(.) != "" ]', document, null, 6, null);
    for (i = 0; text = texts.snapshotItem(i); i += 1) {
        if ( tagsWhitelist.indexOf(text.parentNode.tagName) ) {
            regexs.forEach(function (value, index) {
                text.data = text.data.replace( value, replacements[index] );
            });
        }
    }
  };

  $( document ).ready(function() {
    enhanceText();
  });

};






//========================================================================================================================================================================================================
///                                      Fonction principale pour remplacer le texte et ajouter des icones dans Gobland (inspiré par Lordslair) FIN
//========================================================================================================================================================================================================