Greasy Fork

Inventaire tools

Recupere les informations sur la page inventaire d'ogame et affiche le temps de reduction possible ainsi que la production supplémentaire acquise par les boosters

// ==UserScript==
// @name       Inventaire tools
// @namespace  http://userscripts.org/scripts/show/138760
// @version    4 
// @description  Recupere les informations sur la page inventaire d'ogame et affiche le temps de reduction possible ainsi que la production supplémentaire acquise par les boosters
// @include    http*://*.ogame.gameforge.com/game/index.php?page=shop*
// @include    http*://*.ogame.gameforge.com/game/index.php?page=resourceSettings*
// @copyright  19 juillet 2012, nitneuc -- Libre d'être modifié ou reproduit, tant que cette ligne @copyright reste identique
// ==/UserScript==11

/*
// ****** Informations ******
Inventaire tools
----------------

Installation:
-------------
http://userscripts.org/scripts/show/138760
compatible chrome et firefox


Variables persistantes stockées:
--------------------------------
*booléen= texte.script + "_" +  pseudoJeu + "_" + universJeu + "_" + langue + "_premiereExecution"
*array= texte.script + "_" + pseudoJeu + "_" + universJeu + "_" + langue + "_proprietesPlanetes_production"


ChangeLog:
----------

v1.0: 19 juillet 2012
*première version stable

v1.1:
*Correction bug affichage
*Correction: le tableau ne s'affichait pas si on passait de la boutique à l'inventaire

v1.2:
*Simplification du code
*Amélioration de l'affichage

v2.0:
*intégration du changelog dans le script
*nom du script = Inventaire tools
*séparation de la fonction afficherSurPage() et constructionElementHTML()
*ajout du tableau de production hebdomadaire des boosters
*tableau des productions sur planète se MAJ si changement quantité production/déménagement/renommage

v2.1: 25 juillet 2012
*les 2 tableaux sont mis-en-page et réunis en bas
*nouvel emplacement pour les variables persistantes
*simplification du code

v2.1.1: 26 juillet 2012
*compatible Firefox

v2.1.2: 27 juillet 2012
*correction: initialisation programme

v2.1.3: 27 juillet 2012
*correction: les productions nulles étaient exclues
*correction: les lunes étaient incluses (production nulle)

v2.2: 28 juillet 2012
*ajout du 3ème tableau: cumul des gains booster (en nombre de ressources)
*simplification du code du 1er tableau (temps cumulés)
*nouvelle mise-en-page du 1er tableau (temps cumulés)

v2.3:
*utilisation d'un CSS
*travail de compatibilité avec autres script (uniformisation)
*modification de la structure de la variable permanente des propriétés

v2.4: 29 septembre 2012
*compatibilité v5
*modification de l'affichage des alertes

v3: 23 octobre 2012
*modification du stockage des variables
*transformation de fonctions en prototypes
*Refonte et grande simplification de l'affichage

v3.1: 24 octobre 2012
*Correction bug d'affichage

v3.2: 24 octobre 2012
*rétablissement de l'affichage après 'contentWrapper' en raisons de retours de bugs

v3.2.1: 24 octobre 2012
*réctification mineure

v3.2.2 : 25 octobre 2012
*correction de l'affichage

**********************************************************************************
** ** ** Suspension de la maintenance du script ** ** ** Pas de repreneur ** ** **
**********************************************************************************

v3.3 : 23 mai 2016.
*HTTP et HTTPS tolérés
*document.getElementById = $
*lecture de la production par planète sur la page 'resourceSettings' au lieu de la page 'resource'. Modifier la doc au passage
*affichage d'alerte sur la page 'resourceSettings' au lieu de la page 'resource'
*simplification de la fonction d'affichage d'alerte
*correction sytaxes css

v3.3.1 : 24 mai 2016
*@include modifié pour chrome : *.ogame.* -> *.ogame.gameforge.com

v3.4 : 30 mai 2016
*prototypes
*fonction get_buildLevel() et get_temp()
*inclue la page 'resources' et 'overview'
**Suppression de la ligne document.body.appendChild() qui faisait s(exécuter 2 fois le script si avec window.onload

v4 : 03 juin 2016
*réécriture partielle du code : simplifications de parties du code écrit à l'époque où je débutais le js. Ajout de fonctions, transformations de fonctions en prototypes, simplification des syntaxes, concaténations,  simplification des noms de variables, ...
*les tableaux affichés dans l'onglet 'Inventaire' s'effacent bien en retournant sur l'onglet 'Boutique'
*modification du caractère "séparateur de milliers"
*les alertes positives s'affichent en vert
*page inventaire : alerte si les productions de toutes les planètes ne sont pas renseignées
*la remise à zéro des productions se fait désormais par un bouton, plus besoin de décommenter la ligne
*désactivation du script sur le pages 'resources' et 'overview'
*border-radius sur les alertes
*les planètes s'affichent dans le même ordre que dans ogame

*/

// var strFunc = (window.onload = function(){     // Fait s'exécuter 2 fois le script
var strFunc = (function(){    

    // ****** Prototypes ******
    Storage.prototype.setObj = function(key, obj) {
		return this.setItem(key, JSON.stringify(obj));
    };
    
	Storage.prototype.getObj = function(key) {
		return JSON.parse(this.getItem(key));
	};
    
    Number.prototype.ajoutSeparateurMilliers = function(car) {
	// v1: fonction ; v2: prototype ; v2.1: prise en charge des nombres négatifs ; v2.2: prise en charge des nombre décimaux
        var dec = "";
        if ( this < 0 ) var neg = true;
        if ( this != Math.floor(this) ) {
            dec = ((this-Math.floor(this))+"").substr(1, (this+"").length-(Math.floor(this)+"").length);
            var str = Math.floor(this)+"";
        } else {
            var str = this+"";
        }
        if (neg) str = str.substring(1);
        var str_decoupe = new Array();
        for (var tmp=0; tmp<Math.ceil(str.length/3) ; tmp++) str_decoupe[tmp] = str.substring(str.length-3*tmp-3,str.length-3*tmp); // on remplit un array() de groupes de 3 chiffres  
        var str_2 = str_decoupe[str_decoupe.length-1]; // on cree une string composée des groupes de 3 chiffres + du signe
        for (var tmp = str_decoupe.length-2; tmp>=0; tmp--) str_2 = str_2 + car + str_decoupe[tmp];
        if (neg) str_2 = "-"+str_2;
        return str_2+dec;
    };
	
	Number.prototype.divEuclidienne = function(diviseur) {
        return new Array(Math.floor(this/diviseur) , this-Math.floor(this/diviseur)*diviseur);
	};
    
    Array.prototype.niemeValeurDifferenteDe = function(n, val) {
        var tmp_2=0;
        for (var tmp=0; tmp<this.length; tmp++) {
            if ( this[tmp] != val ) tmp_2++;
            if ( tmp_2 == n ) return tmp;
        }
        return -1;       
    };
	
	Array.prototype.max = function() {
		return Math.max.apply(null, this);
	};
	
	Array.prototype.nbOccurences = function(val) { // Compte le nombre d'occurences de val
		var incr = 0;
		for (var i=0; i<this.length; i++) if ( this[i] == val ) incr++;
		return incr;
	};
	
	Array.prototype.nbOccurencesDifferentDe = function(val) { // Compte le nombre d'occurences de toute valeur sauf val.
	// *** *** Dépendance : Array.prototype.nbOccurences(val)
		return this.length - this.nbOccurences(val);
	};
	
	
	// !!!!!!!!!!!!!!!!!!!!!!!!!
	// !!! PROTOTYPES LOCAUX !!!
	// !!!!!!!!!!!!!!!!!!!!!!!!!

	// !! J'utilise ici des prototypes, n'ayant pas réussi à définir une méthode propre aux objets Array sans passer par un prototype. Cependant, et contrairement aux autres prototypes, ceux-cis sont spécifiques à ce script et n'ont pas vocation à être réutilisable !!
	Array.prototype.testPlaneteExiste = function(el) {
		for ( var i=0 ; i<this.length ; i++ ) if ( this[i][0][0] == el ) return i;
		return -1;
	};
	
	Array.prototype.max_prod = function() { // Renvoie un tableau des 3 maximums de ressources pour toutes les planètes (this)
		var tabl_max = new Array();
		for (var ress=0; ress<=2; ress++) {
			var tabl_temp = new Array();
			for (var i=0; i<this.length; i++) tabl_temp[i] = this[i][1][ress];
			tabl_max[ress] = tabl_temp.max();
		}
        return tabl_max;
	};
	
	Array.prototype.reorgPlanete = function() { // Réorganise le tableau enregistré des planètes, afin de placer les planètes dans le même ordre que le volet droite d'ogame. Cette réorganisation est à exécuter avant chaque affichage (page 'shop'), et son résultat n'a donc pas à être sauvegardé.
		var liste = $('planetList').getElementsByClassName('smallplanet');
		var tabl_temp = new Array(); // La table dans laquelle sera transférée this, éléments positionnés pour l'affichage
		for (var i=0; i<liste.length; i++) for (var j=0; j<this.length; j++) if ( this[j][0][1] == liste[i].getElementsByClassName('planet-koords')[0].innerHTML.supprNonNumEtDeuxPoints() ) tabl_temp.push(this[j]); // Parcours les planètes dans le volet de droite et réécrit la table this en les repositionnant, dans tabl_temp
		return tabl_temp;
	};
	
	// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    // !!! FIN PROTOTYPES LOCAUX !!!
	// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!

	String.prototype.supprSpaces = function() {
		// Supprime le ou les espaces se trouvant en fin de chaîne
		return this.replace(/\s/g,'');
	};

	String.prototype.cutLongString = function(lmax) {
		// Coupe la chaîne en remplaçant les caractères de la position lmmax jusqu'à la fin de la chaîne par '...'
		return ( this.length <= lmax ) ? this : this.substr(0,lmax)+"...";
	};
	
	String.prototype.supprNonNum = function() { // Supprime tous les caractères non numériques d'une chaîne
		return this.replace(/[^0-9-]/g,'');
	};
	
	String.prototype.supprNonNumEtDeuxPoints = function() { // Supprime tous les caractères non numériques d'une chaîne
		return this.replace(/[^0-9-:]/g,'');
	};
	
	Element.prototype.remove_HTML = function() {
		this.parentNode.removeChild(this);
	};


    // ****** fonctions 'hard' ******
    
	function $(id) {	// Abrégé de document.getElementById(id);
		return document.getElementById(id);
	}

    function minutes2hhmm(minutes) {
        var div = minutes.divEuclidienne(60);
        if ( div[1] == 0 ) div[1] = '';
        return div;
    }
	
	function accord_pluriel(nb, str_sin, str_plu) { // Selon le nombre, renvoie la chaîne singulier ou pluriel (typiquement avec un 's' final)
		return ( nb > 1 ) ? str_plu : str_sin;
	}

    function positionPlanete2nombre(position) { // Convertit la position de planète en nombre (pour le stockage)
        return 1000000*parseInt(position.split(":")[0])+1000*parseInt(position.split(":")[1])+parseInt(position.split(":")[2]);
    }

    
    // ****** fonctions affichage ******
    
    function creer_CSS() { // ajoute des classes CSS
		document.getElementsByTagName("head")[0].innerHTML = '<style type="text/css">'
            +'.table1 { width:'+ config.table1_width +'px; padding-top: 20px; padding-bottom: 20px;} '
            +'.table { width:100%; border-width: 3px; border-style: double; border-color: #666666; text-align: center; font-size:' +config.valeur_fontSize +'px;} '
            +'.header2 { background-color:'+ config.header2_bgColor+ '; color:'+ config.header2_fontColor +'; font-size:'+ config.header2_fontSize +'px; font-weight:'+ config.header2_fontBold +'; text-align:'+ config.header2_textAlign +';} '
            +'.header3 { background-color:'+ config.header3_bgColor+ '; color:'+ config.header3_fontColor +'; font-size:'+ config.header3_fontSize +'px; font-weight:'+ config.header3_fontBold +'; text-align:'+ config.header3_textAlign +';} '
            +'.headerLigne { background-color:'+ config.headerLigne_bgColor+ '; color:'+ config.headerLigne_fontColor +'; font-size:'+ config.headerLigne_fontSize +'px; font-weight:'+ config.headerLigne_fontBold +';} '
            +'.valeur { background-color:'+ config.valeur_bgColor+ '; color:'+ config.valeur_fontColor +'; font-size:'+ config.valeur_fontSize +'px; font-weight:'+ config.valeur_fontBold +'; text-align:'+ config.valeur_textAlign +';} '
            +'.valeursMax { background-color:'+ config.valeursMax_bgColor+ '; color:'+ config.valeursMax_fontColor +'; font-size:'+ config.valeursMax_fontSize +'px; font-weight:'+ config.valeursMax_fontBold +';} '
            +'.alerte_red { background-color:'+ config.alerte_red_bgColor+ '; color:'+ config.alerte_fontColor +'; font-size:'+ config.alerte_fontSize +'px; font-weight:'+ config.alerte_fontBold +'; text-align:'+ config.alerte_textAlign +'; border-radius: 4px;} '
            +'.alerte_green { background-color:'+ config.alerte_green_bgColor+ '; color:'+ config.alerte_fontColor +'; font-size:'+ config.alerte_fontSize +'px; font-weight:'+ config.alerte_fontBold +'; text-align:'+ config.alerte_textAlign +'; border-radius: 4px;} '
            +'</style>' + document.getElementsByTagName("head")[0].innerHTML;
    }
    
    
    function affichageAlerte(texteAAfficher, type) { // affiche alerte. Type prend comme valeur "green" ou "red"
        $("inhalt").innerHTML = '<div id="InventaireToolsAlert" class="alerte_'+type+'">' +texteAAfficher +'</div>'+$("inhalt").innerHTML;
    }
    
	function alerte_planetesNonVisitees(nb) { // Agfiche une alerte disant qu'il reste nb planètes sans production enregistrée
		affichageAlerte('Attention : La production de '+ nb +' '+ accord_pluriel(nb, 'planète', 'planètes')+' reste inconnue !', 'red');
	}
    
    function afficherTable(tout, affichageTempsCumules, affichageGainBooster, affichageProdBooster) {
        var ajoutHTML_2 = ""; // Déclaration
        var ajoutHTML_1 = '<div align="center" id="inventairetoolstable"><div id="eraseDataInventaireTools" style="margin-top: 20px;">[ Effacer données Inventaire tools ]</div><table class="table1"><tr><td style="padding-bottom: 12px;" align="center"><table style="width:250px; align: center;" class="table">'
            +'<tr><td colspan="3" style="padding-top: 5px, padding-bottom: 5px;" class="header2">CUMULS DES GAINS</td></tr><tr>';
        for (var i=0; i<=2 ; i++) ajoutHTML_1 += '<td class="header3" width="33%">'+affichageTempsCumules[i].split(":")[0] +'</td>';
        ajoutHTML_1 += '</tr><tr>';
        for (var i=0; i<=2 ; i++) ajoutHTML_1 += '<td class="valeur">'+affichageTempsCumules[i].split(":")[1] +'</td>';
        ajoutHTML_1 += '</tr>';
        if (tout) { // si tous les tableaux doivent être affichés
            ajoutHTML_1 += '<tr>';
            for (var i=0; i<=2 ; i++) ajoutHTML_1 += '<td class="header3" width="33%">'+ressource[0][i] +'</td>';
            ajoutHTML_1 += '</tr><tr>';
            for (var i=0; i<=2 ; i++) ajoutHTML_1 += '<td class="valeur">'+affichageGainBooster[i].ajoutSeparateurMilliers("'")+'</td>';
            ajoutHTML_1 += '</tr>';
        }
        ajoutHTML_1 += '</table></td></tr>';
		
		if ( affichageProdBooster == undefined ) { // Si aucune production sauvegardée pour l'instant
			alerte_planetesNonVisitees(get_nbCol().split("/")[0]);
		} else { // Si des productions sont sauvegardées, mais pas toutes
			var nbPlaneteInconnues = get_nbCol().split("/")[0] - affichageProdBooster.length;
			if ( nbPlaneteInconnues > 0 ) alerte_planetesNonVisitees(nbPlaneteInconnues);
		}
		if (tout) {
			var nombre_type_booster = nombre_booster.nbOccurencesDifferentDe(0);; // définit le nombre de colonnes à fabriquer dans le grand tableau

            ajoutHTML_2 = '<tr><td style="padding-bottom: 30px;" align="center"><table class="valeur table" width="'+ (142+nombre_type_booster*(config.prodBooster_largeurColonne+2)) +'px"><tr><td colspan="'+(nombre_type_booster+2)+'" style="padding-top: 5px; padding-bottom: 5px;" class="header2">GAIN SUR 1 SEMAINE</td></tr><tr>';
            for (var i=0; i<=nombre_type_booster+1; i++) {
                ajoutHTML_2 += '<td class="header3" width=';
                if ( i==0 ) ajoutHTML_2 += '"91px" align="left">'+ affichageProdBooster.length + "/" + get_nbCol().split("/")[0] + ' planètes</td>';
                if ( i==1 ) ajoutHTML_2 += '"45px">position</td>';
                if ( i>=2 ) {
                    var j = nombre_booster.niemeValeurDifferenteDe(i-1,0);
                    ajoutHTML_2 += '"'+ config.prodBooster_largeurColonne +'px">'+ (j-3*Math.ceil((j+1)/3)+4) + '0% '+ ressource[1][Math.floor(j/3)] +'/' + nombre_booster[j] +'</td>';
                }
            }
            ajoutHTML_2 += '</tr>';
			
			var maxProd = affichageProdBooster.max_prod();  // Maximum de production entre les planètes
			
            for (var i=0; i<affichageProdBooster.length; i++) { // i = les lignes du tableau
                ajoutHTML_2 += '<tr><td class="headerLigne" align="left">' + '<a href="http://uni'+ universJeu +'.ogame.'+ langue +'/game/index.php?page=shop&cp='+ affichageProdBooster[i][0][0] + '#page=inventory" style="color:'+ config.headerLigne_fontColor +'; text-decoration:none;">' + affichageProdBooster[i][0][2].cutLongString(14) + '</a></td><td class="headerLigne">'+ affichageProdBooster[i][0][1] +'</td>';;
                for (var k=0; k<=2; k++) { // k= chaque ressource
                    for (var l=1 ; l<=3 ; l++) {                        
                        if ( nombre_booster[3*k+l-1] != 0 ) { // le contenu du td est nul si le booster n'est pas dans l'inventaire
                            ajoutHTML_2 += '<td';
                            if ( affichageProdBooster[i][1][k] == maxProd[k] ) ajoutHTML_2 += ' class="valeursMax"';
                            ajoutHTML_2 += '>'+ Math.ceil((affichageProdBooster[i][1][k])*l*.1*168).ajoutSeparateurMilliers("'") +'</td>';  
                        }
                    }
                }
                ajoutHTML_2 += '</tr>';
            }
            ajoutHTML_2 += '</table></td></tr>';
        }
        document.getElementsByClassName("footer")[0].innerHTML += ajoutHTML_1+ajoutHTML_2;
		
		$('eraseDataInventaireTools').addEventListener("click", function(event) { // Bouton de RAZ data
			if ( confirm('Attention, Les valeurs de production de toutes les planètes seront remises à zéro.') ) {
				localStorage.removeItem(texte.script + "_" + pseudoJeu + "_" + universJeu + "_" + langue + "_premiereExecution");
				window.location.reload();
			}
		}, true);
    }    
    
    // ****** Fonctions 'get' ******	
	
	function get_infoInventaire() {
        var inventaire = $("js_inventorySlider").getElementsByClassName("item_img_box"); // On récupère un élément HTML de la page
        var liste = new Array();
        
        for (var i=0 ; i < inventaire.length ; i++) { // fais le tour des objets de la page
            var inventaire2 = inventaire[i].getElementsByTagName("a");
            var nbObjet = inventaire2[0].getElementsByClassName("level amount")[0].innerHTML; // récupère le nombre de l'objet
            var attributObjet = inventaire2[0].getAttribute("title").split("|")[0]; // récupère le titre de l'objet
            liste[i] = (attributObjet.split(" en ")[0] + ":" + attributObjet.split(" en ")[1] + ":" + nbObjet).toLowerCase();
        }
        return liste;
    }
    
    
    function get_nbCol() {
        return $("countColonies").getElementsByTagName("span")[0].innerHTML;
    }
    
    
    function get_infoPlaneteCourante() {
        var ensembleBaliseMeta = document.getElementsByTagName("meta"); // récupère toutes les balises meta du <head>
        var info = new Array();
        for (var i=0 ; i<ensembleBaliseMeta.length ; i++) { //trouve certaines balises dans la liste
			var balise_name = ensembleBaliseMeta[i].getAttribute("name");
			var balise_content = ensembleBaliseMeta[i].getAttribute("content");
            if ( balise_name == "ogame-planet-id" ) info[0] = balise_content;
            if ( balise_name == "ogame-planet-coordinates" ) info[1] = balise_content;
            if ( balise_name == "ogame-planet-name" ) info[2] = balise_content;
            if ( balise_name == "ogame-planet-type" ) info[3] = balise_content;
        }
        return info;
    }
    
    
    function get_prodCourante() { // renvoie la production M,C et D, sous forme d'Array(). Attention les objets s'appliquent sur les mines et pas sur la prod totale de la planète (hors plasma, hors prod initiale, hors objets, ...)
        var production = new Array();
		lignesTabl = $('inhalt').getElementsByClassName('list listOfResourceSettingsPerPlanet')[0].getElementsByTagName('tr');
		for (var i=2; i<lignesTabl.length; i++) { // Les 2 premières lignes ne sont concernent en aucun cas les mines (en-têtes)
			var txt = lignesTabl[i].getElementsByTagName('td')[0].innerHTML;
			if ( txt.indexOf('Mine de métal') != -1 ) production[0] = lignesTabl[i].getElementsByTagName('td')[2].getElementsByTagName('span')[0].innerHTML.supprNonNum()
			if ( txt.indexOf('Mine de cristal') != -1 ) production[1] = lignesTabl[i].getElementsByTagName('td')[3].getElementsByTagName('span')[0].innerHTML.supprNonNum();
			if ( txt.indexOf('Synthétiseur de deutérium') != -1 ) production[2] = lignesTabl[i].getElementsByTagName('td')[4].getElementsByTagName('span')[0].innerHTML.supprNonNum();
		}
		return production;
    }
    
    
    // ****** Autres fonctions ******        
    
    function affichageInventaire() {
        if ( $("js_inventorySlider") ) {
            if ( ! pageCouranteEstInventaire ) {
				pageCouranteEstInventaire = true;
                
                // Préparation du tableau tempsCumulés
				var duree_obj = new Array(0,0,0); // remise à zéro des compteurs de duree/nombre pour chaque type d'items (kraken, detroid, newtron)
                var listeItem = get_infoInventaire();
                
                for (var i=0 ; i<listeItem.length ; i++) { // Modifie les compteurs de durée des 3 types d'item
                    if ( listeItem[i].split(":")[0] == "kraken") duree_obj[0] += niveauItem2temps(listeItem[i].split(":")[1], listeItem[i].split(":")[2]);
                    if ( listeItem[i].split(":")[0] == "detroid") duree_obj[1] += niveauItem2temps(listeItem[i].split(":")[1], listeItem[i].split(":")[2]);
                    if ( listeItem[i].split(":")[0] == "newtron") duree_obj[2] += niveauItem2temps(listeItem[i].split(":")[1], listeItem[i].split(":")[2]);
                    
					if (( listeItem[i].split(":")[0] == "booster de métal" ) || ( listeItem[i].split(":")[0] == "booster de cristal" ) || ( listeItem[i].split(":")[0] == "booster de deutérium" )) {
                        // Calcule l'emplacement de la case de l'array() à incrémenter                    
                        if ( listeItem[i].split(":")[0] == "booster de métal" ) var a = 1;
                        if ( listeItem[i].split(":")[0] == "booster de cristal" ) var a = 2;
                        if ( listeItem[i].split(":")[0] == "booster de deutérium" ) var a = 3;
                        if ( listeItem[i].split(":")[1] == "bronze" ) var b = 1;
                        if ( listeItem[i].split(":")[1] == "argent" ) var b = 2;
                        if ( listeItem[i].split(":")[1] == "or" ) var b = 3;
                        nombre_booster[3*a+b-4] = listeItem[i].split(":")[2];
                    }
                }                
                var affichage = new Array(// les valeurs à afficher à l'écran sont entrées dans un array()
                    "Bâtiments : "+ minutes2hhmm(duree_obj[0])[0]+ "h"+ minutes2hhmm(duree_obj[0])[1],
                    "Chantier spatial : "+ minutes2hhmm(duree_obj[1])[0]+ "h"+ minutes2hhmm(duree_obj[1])[1],
                    "Recherche : "+ minutes2hhmm(duree_obj[2])[0]+ "h"+ minutes2hhmm(duree_obj[2])[1]
                ); 
                if (( nombre_booster.nbOccurencesDifferentDe(0) != 0 ) && ( typeof proprietesPlanetes_production[0] != 'undefined' )) { // si on affiche les 3 tables
                    afficherTable(true, affichage, gainTotalBooster(proprietesPlanetes_production), proprietesPlanetes_production.reorgPlanete());
                } else { // si on affiche qu'une table 
                    afficherTable(false, affichage);
                }
            }
        }
        else { // si la page courante n'est pas l'inventaire, la div contenant les tableaux affichés précédemment doit être efffacée
			pageCouranteEstInventaire = false;
			if ( $('InventaireToolsAlert') != undefined ) $('InventaireToolsAlert').remove_HTML();
			$('inventairetoolstable').remove_HTML();
        }
    }
    
    
    function niveauItem2temps(niveau, nombre) { // renvoie la durée associée à chaque item en fonction de son nombre
        if ( niveau == "bronze" ) return nombre*config.duree_bronze;
        if ( niveau == "argent" ) return nombre*config.duree_argent;
        if ( niveau == "or" ) return nombre*config.duree_or;
    }
    
    
    function ajouterPlanete(info, proprietesAAjouter, tableProprietes, nomVariablePersistante) { // ajout d'une planète (id) +ses proprietes (array de 3 cases) à la liste
        var pos = 0;
        if ( tableProprietes.length != 0 ) for (var pos=0; pos<tableProprietes.length; pos++) if ( positionPlanete2nombre(info[1]) < positionPlanete2nombre(tableProprietes[pos][0][1]) ) break;
		tableProprietes.splice(pos, 0, new Array(info,proprietesAAjouter));
        localStorage.setObj(texte.script+ "_"+ pseudoJeu+ "_"+ universJeu+ "_"+ langue+ "_"+ nomVariablePersistante,tableProprietes);
        affichageAlerte(texte.alerte_planeteAjoutee, 'green'); // affiche alerte de confirmation
    }
    
    
    function maxProdEmpire(tableProprietes) { // trouve les meilleures productions de l'empire, pour trouver les meilleures planètes où appliquer les boosters
        var maxProd_temp = new Array(0,0,0);
        for (var i=0 ; i<tableProprietes.length ; i++) for (var j=0 ; j<=2 ; j++) if (parseInt(tableProprietes[i][1][j]) > maxProd_temp[j]) maxProd_temp[j] = parseInt(tableProprietes[i][1][j]);
        return maxProd_temp;
    }
    
    
    function gainTotalBooster(tableProprietes) {
        var maxProd_temp = maxProdEmpire(tableProprietes);
        var gain_parRessource = new Array(0,0,0);
        for (var i=0 ; i<=2 ; i++) for (var j=3*i ; j<=3*i+2 ; j++) gain_parRessource[i] = gain_parRessource[i] + nombre_booster[j]*Math.ceil(maxProd_temp[i]*168*(j+1-3*Math.floor(j/3))/10);
        return gain_parRessource;
    }
    
    
    function initialiserDonneesUtilisateur() { // initialise les données utilisateur du script
        var proprietes = new Array();  
        localStorage.setObj(texte.script + "_" + pseudoJeu + "_" + universJeu + "_" + langue + "_proprietesPlanetes_production",proprietes);
        localStorage.setObj(texte.script + "_" + pseudoJeu + "_" + universJeu + "_" + langue + "_premiereExecution",false);
        return proprietes;
    }
    
    
    // ****** Initialisations valeurs ******
    
    const langue = location.href.split("/")[2].split(".")[2];
    const universJeu = location.href.split("/")[2].split(".")[0].replace("uni","");
    const pseudoJeu = document.getElementsByName("ogame-player-name")[0].getAttribute("content");
    var pageCouranteEstInventaire = false;
    var nombre_booster = new Array(0,0,0,0,0,0,0,0,0); // array() contenant le nombre de chaque booster
    
    
    // ****** Paramètres utilisateur ******
    
    var config = {
        duree_bronze:30,
        duree_argent:120,
        duree_or:360,
        
        header2_fontColor:"#FFFFFF",
        header2_fontSize:"9",
        header2_fontBold:"bold",
        header2_bgColor:"#00002D",
        header2_textAlign:"center",
        
        header3_fontColor:"#FFFF00",
        header3_fontSize:"9",
        header3_fontBold:"bold",
        header3_bgColor:"#00002D",
        header3_textAlign:"center",
        
        headerLigne_fontColor:"#FF8000",
        headerLigne_fontSize:"9",
        headerLigne_fontBold:"bold",
        headerLigne_bgColor:"#000000",
        
        valeur_fontColor:"#FFFFFF",
        valeur_fontSize:"9",
        valeur_fontBold:"normal",
        valeur_bgColor:"#000000",
        valeur_textAlign:"center",
        
        
        valeursMax_fontColor:"#FFFFFF",
        valeursMax_fontSize:"9",
        valeursMax_fontBold:"normal",
        valeursMax_bgColor:"#FF0000",
        
        prodBooster_largeurColonne:70,
        
        alerte_fontColor:"#FFFFFF",
        alerte_fontSize:"9",
        alerte_fontBold:"bold",
        alerte_red_bgColor:"#FF0000",
        alerte_green_bgColor:"#009900",
        alerte_textAlign:"center",        
    };
    
    var texte = {
        script:"Inventaire tools",
        alerte_planeteAjoutee:"Inventaire tools: Planète ajoutée",
        alerte_proprietesModifiees:"Inventaire tools: Propriétés modifiees",
    };
    
    var ressource = new Array(
        new Array("Métal","Cristal","Deutérium"),
        new Array("mét","cri","deut")
    );
    
    // ****** script ******
    
    creer_CSS();
    
    if ( localStorage.getObj(texte.script + "_" + pseudoJeu + "_" + universJeu + "_" + langue + "_premiereExecution") != false )  { // teste si l'utilisateur est à sa première exécution ou non
        var proprietesPlanetes_production = initialiserDonneesUtilisateur();
    } else {
        var proprietesPlanetes_production = localStorage.getObj(texte.script + "_" + pseudoJeu + "_" + universJeu + "_" + langue + "_proprietesPlanetes_production");
    }
    
    var url = location.href.split("page=")[1].split("&")[0].split("#")[0];
	
    if ( url == "resourceSettings" ) { // si la page courante est la page 'ressourcesSettings'
        // Récuperation des infos sur la planète courante 
        var infoPlanete = get_infoPlaneteCourante();
        var productionPlaneteCourante = get_prodCourante();
		
        if ( infoPlanete[3] == "planet" ) { // teste si la planète courante n'est pas une lune
            var n_planete = proprietesPlanetes_production.testPlaneteExiste(infoPlanete[0]); // teste si la planète courante a déjà été enregistrée			
            if ( n_planete == -1 ) { // si la planète n'existe pas dans la liste
				ajouterPlanete(infoPlanete, productionPlaneteCourante, proprietesPlanetes_production, "proprietesPlanetes_production");
            } else { // si la planète est déjà dans la liste
                if (( proprietesPlanetes_production[n_planete][0][1] != infoPlanete[1] )
                    || ( proprietesPlanetes_production[n_planete][0][2] != infoPlanete[2] )
                    || ( proprietesPlanetes_production[n_planete][1][0] != productionPlaneteCourante[0] )
                    || ( proprietesPlanetes_production[n_planete][1][1] != productionPlaneteCourante[1] )
                    || ( proprietesPlanetes_production[n_planete][1][2] != productionPlaneteCourante[2] )) { // on test si les valeurs des productions+nom+emplacement ont changées
                    proprietesPlanetes_production[n_planete] = new Array(infoPlanete,productionPlaneteCourante);
                    localStorage.setObj(texte.script + "_" + pseudoJeu + "_" + universJeu + "_" + langue + "_proprietesPlanetes_production",proprietesPlanetes_production);
                    affichageAlerte(texte.alerte_proprietesodifiees, 'green');
                }
            }  
        }
    }
    
    if ( url == "shop" ) setInterval(affichageInventaire,500);
	
}).toString();

var script = document.createElement("script");
script.setAttribute("type","text/javascript");
script.text = "(" + strFunc + ")();";
document.body.appendChild(script);