// Affichage une colonne par intervenant
//function afficher_planning_atos_2(unModeAffichage) {


function ajouterClientColonne(client, colonne, indexCol) {
  if (colonne[indexCol].indexOf(client) == -1) {
    colonne[indexCol] += '/' + client;
  }
}

datagrid_hooks['calendar_intervenants'] = function(){
  let element = document.querySelector("#datagrid");

  let filtre = getTrigrammeCollaborateur(getContexteValeur('intervenant'));

  let lebreak = 0;
  let annee = new Date().getFullYear();
  let ladate = dateGetPrevMonday(new Date(annee, 0, 1));
  let ladateToString;
  let intervenants = [];
  let jours_semaine = ["D", "L", "M", "M", "J", "V", "S"];
  let lastWeekNumber = 99;
  let tamponWeek = "";
  let tamponWeekFlag = false;
  let header = '';

  let jours_feries = [];

  let contenu = '';

  // Tout le calendirer est encapsulé dans une cellule d'un tableau
  //     Permet de garantir le comportement du scroll avec le sticky des thead et tfoot
  /*
  contenu += '<table width="100vw">';
  contenu += '<thead><tr><th>Calendrier</th></tr></thead>';
  contenu += '<tr><td align="center" style="background:#aaaaaa">';
  */

  sortItemsByStartDate();

  setItemsVisibility();

  if (getContexteValeur('debut'))
  {
    ladate = stringdateToDate(getContexteValeur('debut'));
    ladate = dateGetPrevMonday(ladate);  
  }

  ladateToString = formatDatetoStringDate(ladate);

  // Se limiter à un an
  annee = ladate.getFullYear() + 1;
  annee += 1;
  // Et à 2 ans si calendrier glissant
  // TODO : ajouter un contexte qui indique si on est en calendrier annuel ou glissant
  //if (select_date_debut == 2) annee += 1;

  // Définir la liste des intervenants
  items.forEach(element => {
    let item = getItemFromElement(element);
    let debut = item['debut'].substring(0,8);
    let fin = item['fin'].substring(0,8);
    
    // On ne s'occupe que des feuilles
    if (item.childs.length != 0) return true;

    // Au passage alimenter les jours fériés , mais ne pas les compter
    if (item['client'] == 'FER') {
      jours_feries.push(item['fin'].substring(0,8));
      return true;
    }

    // On élimine ce qui est masqué
    if (!item["visible"]) return true;

    // On élimine les items non affectés
    if (parseInt(item["intervenant"]) == 0) return true;

    // Ne pas compter les Releases
    if (item['client'] == 'REL') return true;

    // Appliquer le filtre
    if (filtre != 'ANO')
      if (getTrigrammeCollaborateur(item['intervenant']) != filtre) return true;

    // On ne compte pas ce qui n'est pas dans la période concernée
    if (fin < ladateToString ) return true;
    if (fin == '99999999' ) return true;
    if (debut > (annee+'1231') ) return true;

    if (intervenants.indexOf(item["intervenant"]) == -1) {
        intervenants.push(item["intervenant"]);
    }
  });
  intervenants.sort();

  header += '    <th colspan="3">Calendrier</th>';
  intervenants.forEach((intervenant) => {
    let trigramme = getTrigrammeCollaborateur(intervenant);
    header += '<th colspan="11"><center>' + trigramme + "</center></th>";
  });

  contenu += '<table width="100vw">';

  contenu += " <thead><tr>" + header +"</tr></thead>";

  contenu += " <tbody>";
  
  let semaine_vide = "";
  let semaine_paire = false;
  let couleur = '';
  semaine_vide += '<tr class="calendrier" style="background:#777777">';
  semaine_vide += '<td width="30px" style="border-top:1px solid black;font-size:2vh">SXX</td>';
  semaine_vide += '<td colspan="' + ( 2  + (11 * intervenants.length)) + '" align="center" style="border-top:1px solid black;font-size:2vh">&nbsp;</td>';
  semaine_vide += "</tr>";

  while (annee > ladate.getFullYear()) {
    let bgcolor = "white";
    let font_weight = 'normal';
    let jour = ladate.getDay();
    let jour_courant = formatDatetoStringDate(ladate);
    let weekNumber = stringdateGetWeekOfYear(jour_courant)%100;
    let colonnes = [];
    let colonnes_bw = []; // Before Work
    let colonnes_am = []; // Matin
    let colonnes_md = []; // Midi
    let colonnes_pm = []; // Après-Midi
    let colonnes_aw = []; // After Work
    let style_tr = '';
    let style_td = '';
    let jour_libelle = '';

    intervenants.forEach((intervenant) => {
      colonnes.push("");
      colonnes_bw.push("");
      colonnes_am.push("");
      colonnes_md.push("");
      colonnes_pm.push("");
      colonnes_aw.push("");
    });

    // On change de semaine
    // Si la semaine est vide, tamponWeekFlag == false
    if (weekNumber != lastWeekNumber) {
      let semaine = '';
      if (lastWeekNumber != 99) semaine = semaine_vide.replace("SXX", "S" + stringDatePadDigits(lastWeekNumber,2));
      if (tamponWeekFlag) {
        semaine = tamponWeek;
        semaine_paire = !semaine_paire;
      }
      contenu += semaine;
      tamponWeek = "";
      tamponWeekFlag = false;
    }

    // Couleur pour les samedi et dimanche
    if (jour == 0 || jour == 6) bgcolor = "#f1d4af";
    // Couleur pour les lundi et vendredi 
    if (jour == 1 || jour == 5) bgcolor = "#eeeeee";
    // Couleur pour les jours fériés
    if (jours_feries.includes(jour_courant)) bgcolor = "#f1d4af";

    // Couleur d'aujourd'hui
    if (jour_courant == todayStringDate){ 
      bgcolor='#87cefa';
      font_weight='bold';
      tamponWeekFlag = true;
    }

    items.forEach((element) => {
      let item = getItemFromElement(element);

      let debut = item["debut"];
      let fin = item["fin"];
      let jour_debut;
      let jour_fin;

      let ajout = false;

      if (isDebugItem(item)){
        myLog('item ICI');
      }

      if (!item["visible"]) return true;           // Invisible
      if (item["intervenant"] == 0) return true;   // Non affecté
      if (item.childs.length != 0) return true;    // Noeud

      if ((fin.substring(8,12) == '0000')||(fin.substring(8,12) == '9999')) fin = fin.substring(0,8)+'2000';
      
      if (item['type'] == 'TODO') debut = fin;     // Un TODO est un jalon

      jour_debut = debut.substring(0,8);
      jour_fin = fin.substring(0,8);

      // if (jour_debut > jour_courant) return false;

      // Ceci n'est pas réellement planifié
      if ((jour_debut == '00000000') && (jour_fin.substring(0,8) == (1+parseInt(todayStringDate.substring(0,4))+'1231'))) {
        return true;
      }

      // L'item débute ou finit le jour courant
      if (jour_debut == jour_courant) ajout = true;
      if (jour_fin == jour_courant) ajout = true;

      // Le jour courant est entièrement contenu dans l'item
      if (jour_debut < jour_courant && jour_fin > jour_courant) ajout = true;

      if (ajout) {
        let indexCol = intervenants.indexOf(item["intervenant"]);
        let client = item["client"];
        let horaire_debut = 0;
        let horaire_fin = 20;
        let colonne = null;

        tamponWeekFlag = true;

        if (jour_courant == jour_debut) horaire_debut = parseInt(debut.substring(8, 10));
        if (jour_courant == jour_fin) horaire_fin = parseInt(fin.substring(8, 10));

        // Pour les releases et les jour fériés, on affiche le libellé
        if ((client == 'REL')||(client == 'FER')) {
          jour_libelle = item['libelle'];
          return true;
        }

        if (client == 'REL') return true;
        if (client == 'FER') return true;

        //if (client == "ABS") bgcolor = "#f1d4af";
        //if (client == "CGI") font_weight += ";color:blue";

        if (indexCol == -1) {
          myLog(item["intervenant"] + " inconnu");
          return true;
        }

        if ((horaire_debut <= 9) && (horaire_fin<=9))   ajouterClientColonne(client, colonnes_bw, indexCol);
        if ((horaire_debut >= 12) && (horaire_fin<=14)) ajouterClientColonne(client, colonnes_md, indexCol);
        if ((horaire_debut >= 17) && (horaire_fin<=21)) ajouterClientColonne(client, colonnes_aw, indexCol);   

        if ((horaire_debut < 12) && (horaire_fin > 9)) ajouterClientColonne(client, colonnes_am, indexCol);
        if ((horaire_debut < 17) && (horaire_fin > 14)) ajouterClientColonne(client ,colonnes_pm, indexCol);
      }
    });

    style_tr = 'background:'+bgcolor+';font-weight:'+font_weight;
    tamponWeek += '<tr style="'+style_tr+'" class="js-open-modal-trigger" data-modal-info="type=calendrier:jour=' + jour_courant + '">';

    if (weekNumber != lastWeekNumber) {
      if (semaine_paire) couleur = '#eeeeee';
      else couleur = 'white';
      lastWeekNumber = weekNumber;
      /*
      tamponWeek += '<td class="calendrier"  width="10px" style="font-family: fixed; width: 30px;background: ' + couleur + '; font-weight: bold" rowspan="7" align="center">';
      tamponWeek += "S" + lastWeekNumber.toLocaleString(undefined, { minimumIntegerDigits: 2 });
      tamponWeek += "</td>";
      */
    }

    
    if (jour == 1) style_td = 'border-top:1px solid black'; // Le lundi

    tamponWeek += '<td style="font-family: fixed; width: 30px; background:'+couleur+';text-align:center;border-right:1px solid;font-size:2vh;'+style_td+'">';
    if (jour == 4) tamponWeek += 'S'+lastWeekNumber.toLocaleString(undefined, { minimumIntegerDigits: 2 });
    tamponWeek += '&nbsp;</td>';

    tamponWeek += '<td style="font-family: fixed;font-size:2vh; width: 20px;background:'+bgcolor+';font-weight:bold;'+style_td+'">'+jours_semaine[jour]+'</td>';

    if (jour_libelle != '' ) {
      tamponWeek += '<td style="font-family: fixed;font-size:2vh;width:80px;background:'+bgcolor+';color:red;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;border-right:1px solid black;'+style_td+'"><small>'+ jour_libelle +'</small></td>';
    } else {
      tamponWeek += '<td style="font-family: fixed;font-size:2vh;width: 80px;background:'+bgcolor+';font-weight:bold;border-right:1px solid;'+style_td+'">';
      tamponWeek +=
        ladate.getDate().toLocaleString(undefined, { minimumIntegerDigits: 2 }) +
        " / " +
        (ladate.getMonth() + 1).toLocaleString(undefined, { minimumIntegerDigits: 2 });
      tamponWeek += "</td>";
    }

    intervenants.forEach((intervenant) => {
      let index = intervenants.indexOf(intervenant);
      let aligne = "center";
      let colonne = colonnes[index].substring(1);
      let colonne_bw = colonnes_bw[index];
      let colonne_am = colonnes_am[index];
      let colonne_md = colonnes_md[index];
      let colonne_pm = colonnes_pm[index];
      let colonne_aw = colonnes_aw[index];
      let style_am = "";
      let style_pm = "";
      let style_tr_td = "";

      // if (colonne_bw != '' || colonne_am != '' || colonne_md != '' || colonne_pm != '' || colonne_aw != '') {
        //tamponWeekFlag = true;
        if (colonne != '') {
          let tempo = colonne.replace('</span>','');
          let valeurs = tempo.split('/');
          valeurs.forEach(valeur => {
            if (!colonne_am.includes(valeur)) colonne_am += '/'+valeur+'</span>';
            if (!colonne_pm.includes(valeur)) colonne_pm += '/'+valeur+'</span>';
            // if (!colonne_aw.includes(valeur)) colonne_aw += '/'+valeur+'</span>';
          })
        }

        colonne_bw = colonne_bw.substring(1);
        colonne_am = colonne_am.substring(1);
        colonne_md = colonne_md.substring(1);
        colonne_pm = colonne_pm.substring(1);
        colonne_aw = colonne_aw.substring(1);
  
	if (jour == 0 || jour ==6) {
	  colonne_bw = "";
	  colonne_am = "";
	  colonne_md = "";
          colonne_pm = "";
	  colonne_aw = "";
	}
	
	style_tr  = 'overflow: hidden;white-space: nowrap;text-overflow:ellipsis';
        style_tr += ';border-color:black;border-width:1px';
        style_tr += ';padding-left: 5px; padding-right: 5px';
        style_tr += ';background:' + bgcolor;

	style_tr_td = style_tr+";"+style_td;

	if (colonne_am.includes("ABS")) style_am+=";background:#f004";
	if (colonne_pm.includes("ABS")) style_pm+=";background:#f004";

	if (colonne_am.includes("CGI")) style_am+=";color:blue";
	if (colonne_pm.includes("CGI")) style_pm+=";color:blue";
        
        tamponWeek += '<td style="width:40px;font-size:2vh;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;' + style_td + ';opacity:0.5" align="' + aligne + '"><center>' + colonne_bw + "</center></td>";
        tamponWeek += '<td colspan="4" style="width:80px;font-size:2vh;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;' + style_tr_td+';'+style_am + '"' + aligne + '"><center>' + colonne_am + "</center></td>";
        tamponWeek += '<td style="width:40px;font-size:2vh;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;' + style_td + ';opacity:0.5" align="' + aligne + '"><center>' + colonne_md + "</center></td>";
        tamponWeek += '<td colspan="4" style="width:80px;font-size:2vh;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;' + style_tr_td+';'+style_pm+ ';" align="' + aligne + '"><center>' + colonne_pm + "</center></td>";
        tamponWeek += '<td style="width:40px;font-size:2vh;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;' + style_td + ';opacity:0.5;border-right: 1px solid" align="' + aligne + '"><center>' + colonne_aw + "</center></td>";

      /*} else {
        //if (colonne != '') tamponWeekFlag = true;
        tamponWeek += '<td colspan="5" style="background:' + bgcolor + ';min-width: 60px;padding-left: 5px; padding-right: 5px" align="' + aligne + '"><center>' + colonne + "</center></td>";
      }
      */
    });

    tamponWeek += "</tr>";

    // Pour ne pas boucler indéfiniment
    if (++lebreak > 400) break;

    /*
    if (select_date_debut == 1) {
      // Planning glissant
      // Stop au dimanche suivant anniversaire
      if (intJourCourant > intValToDay + 10000) if (jour == 0) break;
    }
    */

    ladate.setDate(ladate.getDate() + 1);
  }

  contenu += tamponWeek;

  contenu += " <tfoot><tr>" + header +"</tr></tfoot>";
  contenu += "</table>";

  /*
  contenu += "</td></tr>";
  contenu += "<tfoot><tr><th>Calendrier</th></tr></tfoot>";
  contenu += "</table>";
  */

  //element.innerHTML = '<div align="center" style="background:#aaaaaa">'+contenu+'</div>';

  element.innerHTML = contenu;
}

datagrid_hooks['calendar_clients'] = function(){
  let element = document.querySelector("#datagrid");

  let filtre = getContexteValeur('client');

  let lebreak = 0;
  let annee = new Date().getFullYear();
  let ladate = dateGetPrevMonday(new Date(annee, 0, 1));
  let ladateToString;
  let entetes = [];
  let jours_semaine = ["D", "L", "M", "M", "J", "V", "S"];
  let lastWeekNumber = 99;
  let tamponWeek = "";
  let tamponWeekFlag = false;
  let header = '';

  let jours_feries = [];

  let contenu = '';

  sortItemsByStartDate();

  setItemsVisibility();

  if (getContexteValeur('debut'))
  {
    ladate = stringdateToDate(getContexteValeur('debut'));
    ladate = dateGetPrevMonday(ladate);
  }

  ladateToString = formatDatetoStringDate(ladate);

  // Se limiter à un an
  annee = ladate.getFullYear() + 1;
  annee += 1;
  // Et à 2 ans si calendrier glissant
  // TODO : ajouter un contexte qui indique si on est en calendrier annuel ou glissant
  //if (select_date_debut == 2) annee += 1;

  // Définir la liste des intervenants
  items.forEach(element => {
    let item = getItemFromElement(element);
    let debut = item['debut'].substring(0,8);
    let fin = item['fin'].substring(0,8);

    // On ne s'occupe que des feuilles
    if (item.childs.length != 0) return true;

    // Au passage alimenter les jours fériés , mais ne pas les compter
    if (item['client'] == 'FER') {
      jours_feries.push(item['fin'].substring(0,8));
      return true;
    }

    // Ne pas compter les Releases
    if (item['client'] == 'REL') return true;

    if (filtre != '')
      if (item['client'] != filtre) return true;

    // On élimine ce qui est masqué
    if (!item["visible"]) return true;

    // On élimine les items non affectés
    if (parseInt(item["client"]) == 0) return true;

    // On ne compte pas ce qui n'est pas dans la période concernée
    if (fin < ladateToString ) return true;
    if (fin == '99999999' ) return true;
    if (debut > (annee+'1231') ) return true;
    
    if (entetes.indexOf(item['client']) == -1) {
      entetes.push(item['client']);
    }
  });
  entetes.sort();

  header += '    <th colspan="3">Calendrier</th>';
  entetes.forEach((entete) => {
    header += '<th colspan="11"><center>' + entete + "</center></th>";
  });

  contenu += '<table width="100vw">';

  contenu += " <thead><tr>" + header +"</tr></thead>";

  contenu += " <tbody>";
  
  let semaine_vide = "";
  let semaine_paire = false;
  let couleur = '';
  semaine_vide += '<tr class="calendrier" style="background:#777777">';
  semaine_vide += '<td width="30px" style="border-top:1px solid black;font-size:2vh">SXX</td>';
  semaine_vide += '<td colspan="' + ( 2  + (11 * entetes.length)) + '" align="center" style="border-top:1px solid black;font-size:2vh">&nbsp;</td>';
  semaine_vide += "</tr>";

  while (annee > ladate.getFullYear()) {
    let bgcolor = "white";
    let font_weight = 'normal';
    let jour = ladate.getDay();
    let jour_courant = formatDatetoStringDate(ladate);
    let weekNumber = stringdateGetWeekOfYear(jour_courant)%100;
    let colonnes = [];
    let colonnes_bw = []; // Before Work
    let colonnes_am = []; // Matin
    let colonnes_md = []; // Midi
    let colonnes_pm = []; // Après-Midi
    let colonnes_aw = []; // After Work
    let style_tr = '';
    let style_td = '';
    let jour_libelle = '';

    entetes.forEach((intervenant) => {
      colonnes.push("");
      colonnes_bw.push("");
      colonnes_am.push("");
      colonnes_md.push("");
      colonnes_pm.push("");
      colonnes_aw.push("");
    });

    // On change de semaine
    // Si la semaine est vide, tamponWeekFlag == false
    if (weekNumber != lastWeekNumber) {
      let semaine = '';
      if (lastWeekNumber != 99) semaine = semaine_vide.replace("SXX", "S" + stringDatePadDigits(lastWeekNumber,2));
      if (tamponWeekFlag) {
        semaine = tamponWeek;
        semaine_paire = !semaine_paire;
      }
      contenu += semaine;
      tamponWeek = "";
      tamponWeekFlag = false;
    }

    // Couleur pour les samedi et dimanche
    if (jour == 0 || jour == 6) bgcolor = "#f1d4af";
    // Couleur pour les lundi et vendredi 
    if (jour == 1 || jour == 5) bgcolor = "#eeeeee";
    // Couleur pour les jours fériés
    if (jours_feries.includes(jour_courant)) bgcolor = "#f1d4af";

    // Couleur d'aujourd'hui
    if (jour_courant == todayStringDate){ 
      bgcolor='#87cefa';
      font_weight='bold';
      tamponWeekFlag = true;
    }

    items.forEach((element) => {
      let item = getItemFromElement(element);

      let debut = item["debut"];
      let fin = item["fin"];
      let jour_debut;
      let jour_fin;

      let ajout = false;

      if (isDebugItem(item)){
        myLog('item ICI');
      }

      if (!item["visible"]) return true;           // Invisible
      if (item["client"] == 0) return true;   // Non affecté
      if (item.childs.length != 0) return true;    // Noeud

      if ((fin.substring(8,12) == '0000')||(fin.substring(8,12) == '9999')) fin = fin.substring(0,8)+'2000';
      
      if (item['type'] == 'TODO') debut = fin;     // Un TODO est un jalon

      jour_debut = debut.substring(0,8);
      jour_fin = fin.substring(0,8);

      // if (jour_debut > jour_courant) return false;

      // Ceci n'est pas réellement planifié
      if ((jour_debut == '00000000') && (jour_fin.substring(0,8) == (1+parseInt(todayStringDate.substring(0,4))+'1231'))) {
        return true;
      }

      // L'item débute ou finit le jour courant
      if (jour_debut == jour_courant) ajout = true;
      if (jour_fin == jour_courant) ajout = true;

      // Le jour courant est entièrement contenu dans l'item
      if (jour_debut < jour_courant && jour_fin > jour_courant) ajout = true;

      if (ajout) {
        let indexCol = entetes.indexOf(item["client"]);
        let intervenant = getTrigrammeCollaborateur(item["intervenant"]);
        let client = item["client"];
        let horaire_debut = 0;
        let horaire_fin = 20;
        let colonne = null;

        tamponWeekFlag = true;

        if (jour_courant == jour_debut) horaire_debut = parseInt(debut.substring(8, 10));
        if (jour_courant == jour_fin) horaire_fin = parseInt(fin.substring(8, 10));

        // Pour les releases et les jour fériés, on affiche le libellé
        if ((client == 'REL')||(client == 'FER')) {
          jour_libelle = item['libelle'];
          return true;
        }

        if (client == 'REL') return true;
        if (client == 'FER') return true;

        if (client == "ABS") bgcolor = "#f1d4af";
        if (client == "CGI") font_weight += ";color:blue";

        if (indexCol == -1) {
          myLog(item["client"] + " inconnu");
          return true;
        }

        if ((horaire_debut <= 9) && (horaire_fin<=9))   ajouterClientColonne(intervenant, colonnes_bw, indexCol);
        if ((horaire_debut >= 12) && (horaire_fin<=14)) ajouterClientColonne(intervenant, colonnes_md, indexCol);
        if ((horaire_debut >= 17) && (horaire_fin<=21)) ajouterClientColonne(intervenant, colonnes_aw, indexCol);   

        if ((horaire_debut < 12) && (horaire_fin > 9)) ajouterClientColonne(intervenant, colonnes_am, indexCol);
        if ((horaire_debut < 17) && (horaire_fin > 14)) ajouterClientColonne(intervenant ,colonnes_pm, indexCol);
      }
    });
  
    style_tr = 'background:'+bgcolor+';font-weight:'+font_weight;
    tamponWeek += '<tr style="'+style_tr+'" class="js-open-modal-trigger" data-modal-info="type=calendrier:jour=' + jour_courant + '">';

    if (weekNumber != lastWeekNumber) {
      if (semaine_paire) couleur = '#eeeeee';
      else couleur = 'white';
      lastWeekNumber = weekNumber;
      /*
      tamponWeek += '<td class="calendrier"  width="10px" style="font-family: fixed; width: 30px;background: ' + couleur + '; font-weight: bold" rowspan="7" align="center">';
      tamponWeek += "S" + lastWeekNumber.toLocaleString(undefined, { minimumIntegerDigits: 2 });
      tamponWeek += "</td>";
      */
    }

    
    if (jour == 1) style_td = 'border-top:1px solid black'; // Le lundi

    tamponWeek += '<td style="font-family: fixed; width: 30px; background:'+couleur+';text-align:center;border-right:1px solid;font-size:2vh;'+style_td+'">';
    if (jour == 4) tamponWeek += 'S'+lastWeekNumber.toLocaleString(undefined, { minimumIntegerDigits: 2 });
    tamponWeek += '&nbsp;</td>';

    tamponWeek += '<td style="font-family: fixed;font-size:2vh; width: 20px;background:'+bgcolor+';font-weight:bold;'+style_td+'">'+jours_semaine[jour]+'</td>';

    if (jour_libelle != '' ) {
      tamponWeek += '<td style="font-family: fixed;font-size:2vh;width:80px;background:'+bgcolor+';color:red;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;border-right:1px solid black;'+style_td+'"><small>'+ jour_libelle +'</small></td>';
    } else {
      tamponWeek += '<td style="font-family: fixed;font-size:2vh;width: 80px;background:'+bgcolor+';font-weight:bold;border-right:1px solid;'+style_td+'">';
      tamponWeek +=
        ladate.getDate().toLocaleString(undefined, { minimumIntegerDigits: 2 }) +
        " / " +
        (ladate.getMonth() + 1).toLocaleString(undefined, { minimumIntegerDigits: 2 });
      tamponWeek += "</td>";
    }

    entetes.forEach((entete) => {
      let index = entetes.indexOf(entete);
      let aligne = "center";
      let colonne = colonnes[index].substring(1);
      let colonne_bw = colonnes_bw[index];
      let colonne_am = colonnes_am[index];
      let colonne_md = colonnes_md[index];
      let colonne_pm = colonnes_pm[index];
      let colonne_aw = colonnes_aw[index];

      // if (colonne_bw != '' || colonne_am != '' || colonne_md != '' || colonne_pm != '' || colonne_aw != '') {
        //tamponWeekFlag = true;
        if (colonne != '') {
          let tempo = colonne.replace('</span>','');
          let valeurs = tempo.split('/');
          valeurs.forEach(valeur => {
            if (!colonne_am.includes(valeur)) colonne_am += '/'+valeur+'</span>';
            if (!colonne_pm.includes(valeur)) colonne_pm += '/'+valeur+'</span>';
            // if (!colonne_aw.includes(valeur)) colonne_aw += '/'+valeur+'</span>';
          })
        }

        colonne_bw = colonne_bw.substring(1);
        colonne_am = colonne_am.substring(1);
        colonne_md = colonne_md.substring(1);
        colonne_pm = colonne_pm.substring(1);
        colonne_aw = colonne_aw.substring(1);
  
        style_tr  = 'overflow: hidden;white-space: nowrap;text-overflow:ellipsis';
        style_tr += ';border-color:black;border-width:1px';
        style_tr += ';padding-left: 5px; padding-right: 5px';
        style_tr += ';background:' + bgcolor;
        
        tamponWeek += '<td style="width:40px;font-size:2vh;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;' + style_td + ';opacity:0.5" align="' + aligne + '"><center>' + colonne_bw + "</center></td>";
        tamponWeek += '<td colspan="4" style="width:80px;font-size:2vh;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;' + style_tr+';'+style_td + '"' + aligne + '"><center>' + colonne_am + "</center></td>";
        tamponWeek += '<td style="width:40px;font-size:2vh;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;' + style_td + ';opacity:0.5" align="' + aligne + '"><center>' + colonne_md + "</center></td>";
        tamponWeek += '<td colspan="4" style="width:80px;font-size:2vh;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;' + style_tr+';'+style_td + ';" align="' + aligne + '"><center>' + colonne_pm + "</center></td>";
        tamponWeek += '<td style="width:40px;font-size:2vh;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;' + style_td + ';opacity:0.5;border-right: 1px solid" align="' + aligne + '"><center>' + colonne_aw + "</center></td>";

      /*} else {
        //if (colonne != '') tamponWeekFlag = true;
        tamponWeek += '<td colspan="5" style="background:' + bgcolor + ';min-width: 60px;padding-left: 5px; padding-right: 5px" align="' + aligne + '"><center>' + colonne + "</center></td>";
      }
      */
    });

    tamponWeek += "</tr>";

    // Pour ne pas boucler indéfiniment
    if (++lebreak > 400) break;

    /*
    if (select_date_debut == 1) {
      // Planning glissant
      // Stop au dimanche suivant anniversaire
      if (intJourCourant > intValToDay + 10000) if (jour == 0) break;
    }
    */

    ladate.setDate(ladate.getDate() + 1);
  }

  contenu += tamponWeek;

  contenu += " <tfoot><tr>" + header +"</tr></tfoot>";
  contenu += "</table>";

  element.innerHTML = contenu;
}


modal_hooks['calendrier'] = function(parametres){
  let jour_courant='00000000';
  let paramSplit = parametres.split(':');

  paramSplit.forEach(element => {
    let elemSplit=element.split('=');
    if (elemSplit[0]==='jour') jourInfo(elemSplit[1].substring(0,8));
  });
};

function testDateItem(item, jour_courant)
{
  let retour = false;
  let jour_debut = item["debut"].substring(0,8);
  let jour_fin = item["fin"].substring(0,8);

  // Les TODO sont des jalons
  if (item['type']=='TODO') jour_debut = jour_fin;

  // Se limiter aux items réellement entièrement plannifiés
  if ((jour_debut != '00000000') && (jour_fin != (1+parseInt(todayStringDate.substring(0,4))+'1231'))) {
    // L'item débute ou finit le jour courant
    if (jour_debut == jour_courant) retour = true;
    if (jour_fin == jour_courant) retour = true;
  
    // Le jour courant est entièrement contenu dans l'item
    if (jour_debut < jour_courant && jour_fin > jour_courant) retour = true;
  } 

  return retour;
}

function jourInfo(jour_courant) {
      let modal_header='Détail <b>'+formatLocaleDateFromStringDate(jour_courant)+'</b>';
      let modal_body='TODO inconnu !';
      let modal_footer='';

      let start = 7;   // Mettre un contexte ...
      let finish = 14; // Mettre un contexte ...

      let horaires = [];

      for(i=0;i<finish;i++){
        horaires[(i*2)] = '';
        horaires[(i*2)+1] = '';
      }
  
      items.forEach(element => {
        let resultat = getItemFromElement(element);

        let debut = resultat["debut"];
        let fin = resultat["fin"];
        let jour_debut;
        let jour_fin;
        let heure_debut;
        let heure_fin;

        if (isDebugItem(resultat)){
          myLog('item ICI');
        }

        // L'item concerne-t-il bien la date courante ?
        if (!testDateItem(resultat, jour_courant)) return true;

        heure_fin=fin.substring(8,12);
        if (heure_fin =='0000') fin=fin.substring(0,8)+'2000';

        // Les TODO sont des jalons
        if (resultat.type=='TODO') debut = fin;
       
        jour_debut = debut.substring(0,8);
        jour_fin = fin.substring(0,8);
        heure_debut = parseInt(debut.substring(8,12));
        heure_fin = parseInt(fin.substring(8,12));

        // L'item commence avant le jour courant
        if (jour_debut < jour_courant) heure_debut = '0900';

        // L'item termine après le jour courant
        if (jour_fin > jour_courant) heure_fin = '1800';

        // Recalibrer les heures de debut et de fin
        if (heure_debut=='0000') heure_debut='0900';
        if (heure_fin=='0000') heure_fin='2000';

        for(i=0;i<finish;i++) {
          let cur_debut, cur_fin;
          let flag;
          
          cur_debut = parseInt((start+i)+'00');
          cur_fin = parseInt((start+i)+'30');
          flag = false;
          if ((heure_debut <= cur_debut)&&(heure_fin >= cur_fin)) flag = true;
          if ((heure_debut >= cur_debut)&&(heure_fin <= cur_fin)) flag = true;
          if ((heure_debut == heure_fin)&&(heure_fin == cur_fin)) flag = false;
          // Cas particulier de la pause de midi
          if (cur_debut == '1300')
            if ((heure_debut<'1230')&&(heure_fin>'1330')) flag = false;         
          if (flag) horaires[(i*2)] += resultat.libelle+'<br>'; 

          cur_debut = parseInt((start+i)+'30');
          cur_fin = parseInt((start+i)+1+'00');
          flag = false;
          if ((heure_debut <= cur_debut)&&(heure_fin >= cur_fin)) flag = true;
          if ((heure_debut >= cur_debut)&&(heure_fin <= cur_fin)) flag = true;
          if ((heure_debut == heure_fin)&&(heure_fin == cur_fin)) flag = false;
          // Cas particulier de la pause de midi
          if (cur_debut == '1230')
            if ((heure_debut<'1230')&&(heure_fin>'1330')) flag = false;
          if (flag) horaires[(i*2)+1] += resultat.libelle+'<br>'; 
        }
      });

      modal_body  = '<table class="modal_table">';
      for(i=0;i<finish;i++) {
        let debut;
        let fin;
        let style_tr;
        debut = stringDatePadDigits((i+start),2)+':00';
        fin = stringDatePadDigits((i+start),2)+':30';
        style_tr=' class="tr1"';
        if (debut < '09:00') style_tr=' class="tr2"';
        if (fin > '18:00') style_tr=' class="tr2"';
        if (debut == '13:00') style_tr=' class="tr2"';
        modal_body += '<tr'+style_tr+'>';
        modal_body += '<td style="width:40px">'+debut+' - '+fin+'</td>';
        modal_body += '<td>'+horaires[i*2]+'</td></tr>';
        modal_body += '</tr>';

        debut = stringDatePadDigits((i+start),2)+':30';
        fin = stringDatePadDigits((i+start)+1,2)+':00';
        style_tr=' class="tr1"';
        if (debut < '09:00') style_tr=' class="tr2"';
        if (fin > '18:00') style_tr=' class="tr2"';
        if (debut == '12:30') style_tr=' class="tr2"';
        modal_body += '<tr'+style_tr+'>';
        modal_body += '<td style="width:40px">'+debut+' - '+fin+'</td>';
        modal_body += '<td>'+horaires[(i*2)+1]+'</td></tr>';
        modal_body += '</tr>';
      }
      modal_body += '</table>';

      modalSetHeader(modal_header);
      modalSetBody(modal_body);
      modalSetFooter(modal_footer);   
}
