<!DOCTYPE html>
<html>

  <head>
    <link rel="stylesheet" href="style.css">
    <!-- Définition des valeurs dans le code -->
    <script>
      var valeurs = [12, 5, 21, 18, 14],
          modalites = ["A", "B", "C", "E", "Z"];
    </script>
    <!-- 
      Chargement des scripts JS dans lesquels sont définis les fonctions
      de remplissage du tableau et de créations des graphiques
    -->
    <script src="script1.js"></script>
    <script src="script2.js"></script>
    <script src="script3.js"></script>
  </head>

  <body>
    <h1>Exemple</h1>
    <!-- 3 boutons pour exécuter les différents scripts -->
    <button onclick = "creationRendu1();">script 1</button>
    <button onclick = "creationRendu2();">script 2</button>
    <button onclick = "creationRendu3();">script 3</button>
    <!-- squelette du tableau à remplir -->
    <table id = "tableau">
      <caption>Données</caption>
      <thead>
        <tr><th>Libellé</th><th>Valeur</th></tr>
      </thead>
      <tbody>
      </tbody>
    </table>
  </body>

</html>
// Déclaration de la fonction de création du 1er graphique
var creationRendu2 = function() {
  // Récupération du pointeur sur body et création d'un div qui va contenir le graphique
  var body = document.getElementsByTagName("body")[0],
      graph = document.createElement("div");
  body.appendChild(graph);
  // définition de l'identifiant du graphique
  graph.id = "graph";
  // Pour chaque valeur, on créé un div
  valeurs.forEach(function (e, i) {
    // Création de la div
    var barre = document.createElement("div");
    // Définition de sa classe CSS (permettant de lui attribuer un style spécifique)
    barre.className = "bar";
    // Définition de la largeur (en fonction de la valeur) et de la hauteur (fixe)
    barre.style.width = (e*10)+"px";
    barre.style.height = "1em";
    // Définition de son contenu
    barre.innerHTML = modalites[i] + " : " + e;
    graph.appendChild(barre);
  });
};


/*
  Changement du style pour toute la page (sauf modification locale)
    Police d'écriture
    Couleur de fond
    Couleur de la police
*/
body {
  font-family: "Helvetica";
  background-color: black;
  color: #eee;
}

/* Spécification pour le titre général */
h1 {
  text-align: center;
  color: #ddd;
}

/* 
  Spécification pour le tableau
    la deuxième ligne permet de ne pas afficher le tableau 
*/
#tableau {
    margin: 10px;
    visibility: hidden;
}

/*
  Spécification pour le 1er graphique
    Pour la police, on définit en une fois sa taille et sa couleur
    Pour les barres, on passe par la classe "bar"
*/
#graph {
  background-color: white;
  color: #222;
  font: 80% "Courrier New";
  margin: 10px;
}
#graph .bar {
  background-color: orange;
  color: #111;
}

/* Code CSS pour 2ème graphique à faire */
# Exemple d'utilisation HTML, CSS et JS

## Pour un TP de Web-Reporting à destination d'étudiants de MIAGE Paris Descartes

Petit exemple d'utilisation de HTML, CSS et JS pour créer dynamiquement, à 
partir de données codées en dur, un tableau et un graphique à base de div.

## A faire

Créer un script permettant de faire un diagramme avec les contraintes suivantes :
- barres verticales, 
- largeur du graphique égale à celle de la fenêtre,
- largeur des barres en fonction du nombre de celles-ci (et donc du nombre de modalités),
- modalités affichées en dessous de chaque barre,
- valeurs affichées au dessus de chaque barre,
- résultat fonctionnel quelque soit le nombre de modalités données (tester avec
  différentes valeurs)
- changement de couleur de la barre sur laquelle passe la souris
- gestion des plusieurs clics sur les boutons :
  - le premier clique créé et affiche le diagramme
  - le deuxième le cache, sans le supprimer
  - le troisième l'affiche de nouveau, sans le recréer donc

Pour améliorer le graphique, on choisit de ne plus afficher directement la
valeur sur le graphique. On veut une fenêtre *pop-up* qui s'affiche lorsque la
souris passe sur une barre. Dans cette fenêtre, on veut la modalité et la valeur
associée. On souhaite que cette fenêtre suive le curseur de la souris. On doit
faire attention à l'affichage si la souris est proche d'un bord de la fenêtre.

Pour encode améliorer, on souhaite récupérer les données à partir d'un fichier
texte au format **JSON**, de ce type :
```
{
  valeurs: [12, 5, 21, 18, 14],
  modalites: ["A", "B", "C", "E", "Z"]
}
```
// Déclaration de la fonction de remplissage du tableau
var creationRendu1 = function() {
  /* 
    Création de deux variables pointeurs vers des éléments du DOM
      - le tableau (la partie tbody)
      - la balise body
  */
  var tableau = document.getElementById("tableau"),
      tabBody = tableau.getElementsByTagName("tbody")[0];
  /*
    Modification en JS du CSS
      - on rend visible le tableau
      - on aligne les cellules de tbody à droite
  */
  tableau.style.visibility = "visible";
  tabBody.style.textAlign = "right";
  /*
    Utilisation de la fonction forEach() sur un objet de type Array
      - permet d'itérer sur l'ensemble des valeurs du tableau
      - prend en paramètre soit une fonction prédéfinie, soit une fonction
        anonyme (définie directement) pouvant prendre deux paramètres :
          - la valeur actuelle (ici "e")
          - l'index de la valeur (ici "i")
    Pour chaque valeur, on va créer une ligne du tableau à deux cellules
  */
  valeurs.forEach(function(e, i) {
    /*
      Création d'éléments du DOM
        - tr : ligne du tableau
        - td : cellule d'une ligne (une pour la modalité, une pour la valeur)
    */
    var tr = document.createElement("tr"),
        tdMod = document.createElement("td"),
        tdVal = document.createElement("td");
    // définition du contenu de la cellule puis insertion dans la ligne
    tdMod.innerHTML = modalites[i];
    tr.appendChild(tdMod);
    // idem
    tdVal.innerHTML = e;
    tr.appendChild(tdVal);
    // insertion dans le tableau
    tabBody.appendChild(tr);
  })
};
var creationRendu3 = function() {
  // script JS pour création du 2ème graphique à faire
};