itemFields['TODO'] = ['libelle','parent','client','intervenant','fin'];

function todoListLigne(item, style)
{
  let retour = '';
  let client = getNonNullTextValeur(item.client);
  let intervenant = getTrigrammeCollaborateur(item.intervenant);
  let texte = getNonNullTextValeur(item.libelle);
  let date = item.fin;
  let classe = 'class="js-open-modal-trigger" data-modal-info="type='+item.type+':id='+item.idlignes+'"';
  let maintenant = formatDatetoStringDateTime(new Date);
  let localStyle=style;

  if (item.status == 3) localStyle = 'text-decoration: line-through';

  // Si l'item n'est pas un jalon
  // Si son début est dans le futur
  // On affiche le début
  if (item.type != 'TODO')
    if (item.debut > maintenant)
      date = item.debut;

  // Ce qui est prévu pour aujourd'hui ou demain
  // On affiche l'heure
  if ((date.substring(0,8) == todayStringDate.substring(0,8))||(date.substring(0,8) == tomorrowStringDate.substring(0,8))) {
    date = formatTimeFromStringDate(date)
  } else {
    date = formatLocaleDateFromStringDate(date);
  }

  if (intervenant != '') 
    if (intervenant != client)
      texte = ' ['+intervenant+'] '+texte;
  if (client != '') texte = '['+client+'] '+texte;
  if (item.type == 'TODO') 
    texte = '[&diams;] '+texte;
  else
    texte = '[&curren;] '+texte;

  retour += '   <tr '+classe+' style="'+localStyle+'">';
  retour += '    <td style="max-width:150px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;padding-left:15px">'+texte+'</td>';
  retour += '    <td style="width:100px;text-align:center">'+date+'</td>';
  retour += '   </tr>';

  return retour;
}

function todoListSection(section, style)
{
  let retour = '';
  retour += '   <tr style="'+style+'">';
  retour += '    <td colspan="3" style="max-width:150px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;padding-left:5px">'+section+'</td>';
  retour += '   </tr>';
  return retour;
}

function getNonNullTextValeur(valeur){
  let val = valeur;
  if ((val===null)||(val===undefined)) val = '';
  return val;
}

function getNonNullDateValeur(valeur){
  if (valeur === null) return '';
  if (valeur == 0) return '';
  return valeur;
}

function getInputLabel(nom, valeur, placeholder) {
  return '<input style="width:99%;border:none" type="text" name="'+nom+'" id="item_'+nom+'" value="'+getNonNullTextValeur(valeur)+'" placeholder="'+getNonNullTextValeur(placeholder)+'"></input>';
}

function todoTermine(idlignes) {
  myError('Fonction Obsolète : '+arguments.callee.name);
  return itemTermine(idlignes,'TODO');
}

function todoSave(idlignes) {
  let bodyJSON = JSON.stringify(getCurrentTODO(idlignes));
  return itemAPI(idlignes, bodyJSON, itemInfo);
}

function getCurrentTODO(idlignes)
{
  let result = new Object();

  if (idlignes > 1) {
    result['idlignes'] = idlignes;
  } else {
    result['type']=getContexteValeur('type_courant');
  }

  itemFields['TODO'].forEach(attribut => {
    result[attribut] = documentGetElementById('item_'+attribut);
  });
   
  if (result['parent']=='') result['parent']=1;
  if (result['client']=='') result['client']=getTrigrammeCollaborateur(result['intervenant']);
  if (result['libelle']=='') result['libelle']='xxxxxxxxxxxx';
  if (result['intervevant']=='') result['intervenant']=getContexteValeur('intervenant');;
  if (result['fin']=='') result['fin']=0;
  if (result['status']=='') result['status']=0;

  return result;
}

datagrid_hooks['todos'] = function(){
  let datagrid = document.querySelector('#datagrid');
  let synthesis = document.querySelector('#synthesis_body');

  let thisWeek = parseInt(stringdateGetWeekOfYear(todayStringDate));
  let thisMonth = parseInt(todayStringDate.substring(0,6));
  let thisYear = parseInt(todayStringDate.substring(0,4));

  let client = getContexteValeur('client');
  let termine = getContexteValeur('termine');

  let nextWeek = thisWeek + 1;
  let nextMonth = thisMonth + 1;
  let nextYear = thisYear + 1;

  let contenu='';
  let synthese1='';
  let synthese2='';
  let nb_lignes=0;
  let lignes_vides=0;

  let liste_retard='';
  let liste_today='';
  let liste_tomorrow='';
  let liste_thisWeek='';
  let liste_nextWeek='';
  let liste_thisMonth='';
  let liste_nextMonth='';
  let liste_thisYear='';
  let liste_nextYear='';
  let liste_noplanning = '';

  let liste_before='';
  let liste_finished='';
  let liste_encours='';
  let liste_todo='';

  let tableau_before=[];
  let tableau_finished=[];
  let tableau_encours=[];
  let tableau_todo=[];

  let tableau_retard=[];
  let tableau_today=[];
  let tableau_tomorrow=[];
  let tableau_thisWeek=[];
  let tableau_nextWeek=[];
  let tableau_thisMonth=[];
  let tableau_nextMonth=[];
  let tableau_thisYear=[];
  let tableau_nextYear=[];
  let tableau_noplanning=[];
  let stats = 0;

  // Gérer les fins d'année
  if (nextWeek > parseInt(stringdateGetWeek(thisYear+'12310000'))) nextWeek = parseInt(nextYear+'01');
  if (nextMonth > parseInt(thisYear+'12')) nextMonth = parseInt(nextYear+'01');

  sortItemsByDate();

  contenu += '<table>';
  contenu += ' <thead>';
  contenu += "   <tr>";
  contenu += '    <th colspan="2" onchange="updateValue(event)"><input id="newitem_input" type="text" placeholder="Nouvel item" style="width: 98%;outline: none"></th>';
  contenu += "   </tr>";
  contenu += '   <tr>';
  contenu += '    <th style="padding-left:5px"><span onclick="openFiltrePopup(\'libelle\')">Libellé</span></th>';
  contenu += '    <th style="width:100px;text-align:center"><span onclick="openFiltrePopup(\'fin\')">Échéance</span></th>';
  contenu += '   </tr>';
  contenu += '  </thead>';

  contenu += ' <tbody>';

  liste = '';
  items.forEach(element => {
    let item = getItemFromElement(element);
  
    let itemWeek = parseInt(stringdateGetWeekOfYear(item.fin.substring(0,8)));
    let itemMonth = parseInt(item.fin.substring(0,6));
    let itemYear = parseInt(item.fin.substring(0,4));

    // On n'affiche pas la racine
    if (item['idlignes']==1) return true;
    // On n'affiche que ce qui est marqué comme visible
    if (!item['visible']) return true;
    // On n'affiche que les feuilles
    if (item.childs.length>0) return true;

    if (item.status == 1) return true;
    if (item.status == 2) return true;
    if (termine=='non')
      if (item['status']==3) return true;

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

    // Ce qui est non planifié
    if ((item.fin.substring(0,8) == '00000000')&&(item.status == 0)) {
      tableau_noplanning.push(todoListLigne(item,'color:var(--nuance-sombre-06)'));
      return true;
    }

    // Ce qui était pour avant cette année 
    if (item.fin.substring(0,8) < thisYear+'0101')
      tableau_before.push(todoListLigne(item,''));

    // Ce qui est terminé 
    if (item.status == 3)
      tableau_finished.push(todoListLigne(item,''));
    else
      tableau_todo.push(todoListLigne(item,''));

    // Ce qui est en retard
    if ((item.status == 0)&&(item.fin < todayStringDate)) {
      tableau_retard.push(todoListLigne(item,''));
      return true;
    }

    // Ce qui est prévu pour aujourd'hui
    if (((item.status == 0)||(item.status == 3))&&(item.fin.substr(0,8) == todayStringDate.substr(0,8))) {
      tableau_today.push(todoListLigne(item,'font-weight:bold'));
      return true;
    }
 
    // Ce qui est prévu pour demain
    if (((item.status == 0)||(item.status == 3))&&(item.fin.substr(0,8) == tomorrowStringDate.substr(0,8))) {
      tableau_tomorrow.push(todoListLigne(item,'font-weight:bold'));
      return true;
    }

    // Ce qui est prévu cette semaine
    if (item.fin.substring(0,8) > thisYear+'0101')
      if (itemWeek == thisWeek) {
        tableau_thisWeek.push(todoListLigne(item,'font-weight:bold'));
        return true;
      }
 
    if (item.status != 0) return true;

    // Les tâches qui ont commencé et qui ne sont pas finies
    if (item.debut.substr(0,8) < todayStringDate.substr(0,8))
      if (item.fin.substr(0,8) > todayStringDate.substr(0,8)) {
        if (item.type != 'TODO') tableau_encours.push(todoListLigne(item,'font-weight:bold'));
        return true;
      }

    // Ce qui est prévu la semaine prochaine
    if (itemWeek == nextWeek) {
      tableau_nextWeek.push(todoListLigne(item,'color:var(--nuance-sombre-09)'));
      return true;
    }

    // Ce qui est prévu ce mois-ci
    if (itemMonth == thisMonth) {
      tableau_thisMonth.push(todoListLigne(item,'color:var(--nuance-sombre-09)'));
      return true;
    }

    // Ce qui est prévu le mois prochain
    if (itemMonth == nextMonth) {
      tableau_nextMonth.push(todoListLigne(item,'color:var(--nuance-sombre-09)'));
      return true;
    }

    // Ce qui est prévu cette année
    if (itemYear == thisYear) {
      tableau_thisYear.push(todoListLigne(item,'color:var(--nuance-sombre-09)'));
      return true;
    }

    // Ce qui est prévu l'année prochaine
    if (itemYear == nextYear) {
      tableau_nextYear.push(todoListLigne(item,'color:var(--nuance-sombre-06)'));
      return true;
    }

    return true;
  });

  if (tableau_before.length!=0){
    if (synthese1=='') synthese1+='<div class="statrow">';
    synthese1+='<div class="statbox2">Avant<br>'+tableau_before.length+'</div>';
  }

  if (tableau_today.length!=0){
    liste_today += tableau_today.join('');
    nb_lignes += tableau_today.length;
  }
  stats=tableau_today.length;
  if (synthese1=='') synthese1+='<div class="statrow">';
  synthese1+='<div class="statbox1">Aujourd\'hui<br>'+stats+'</div>';
  
  if (tableau_tomorrow.length!=0){
    liste_tomorrow += tableau_tomorrow.join('');
    nb_lignes += tableau_tomorrow.length;
  }
  stats+=tableau_tomorrow.length;
  if (synthese1=='') synthese1+='<div class="statrow">';
  synthese1+='<div class="statbox1">Demain<br>'+tableau_tomorrow.length+'</div>';

  if (tableau_thisWeek.length!=0){
    liste_thisWeek += tableau_thisWeek.join('');
    nb_lignes += tableau_thisWeek.length;
  }
  stats+=tableau_thisWeek.length;
  if (synthese1=='') synthese1+='<div class="statrow">';
  synthese1+='<div class="statbox1">Cette semaine<br>'+stats+'</div>';

  if (tableau_nextWeek.length!=0){
    liste_nextWeek += tableau_nextWeek.join('');
    nb_lignes += tableau_nextWeek.length;
  }
  stats+=tableau_nextWeek.length;

  if (tableau_thisMonth.length!=0){
    liste_thisMonth += tableau_thisMonth.join('');
    nb_lignes += tableau_thisMonth.length;
  }
  stats+=tableau_thisMonth.length;
  if (synthese1=='') synthese1+='<div class="statrow">';
  synthese1+='<div class="statbox2">Ce mois-ci<br>'+stats+'</div>';

  if (tableau_nextMonth.length!=0){
    liste_nextMonth += tableau_nextMonth.join('');
    nb_lignes += tableau_nextMonth.length;
    if (synthese1=='') synthese1+='<div class="statrow">';
    synthese1+='<div class="statbox2">Mois Prochain<br>'+tableau_nextMonth.length+'</div>';
  }
  stats+=tableau_nextMonth.length;

  if (tableau_thisYear.length!=0){
    liste_thisYear += tableau_thisYear.join('');
    nb_lignes += tableau_thisYear.length;
  }
  stats+=tableau_thisYear.length;
  if (synthese1=='') synthese1+='<div class="statrow">';
  synthese1+='<div class="statbox2">Cette année<br>'+stats+'</div>';

  if (tableau_nextYear.length!=0){
    liste_nextYear += tableau_nextYear.join('');
    nb_lignes += tableau_nextYear.length;
    if (synthese1=='') synthese1+='<div class="statrow">';
    synthese1+='<div class="statbox2">Après<br>'+tableau_nextYear.length+'</div>';
  }

  if (tableau_finished.length != 0){
    liste_finished += tableau_retard.join('');
    if (synthese2=='') synthese2+='<div class="statrow" style="margin-top: 5px">';
    synthese2+='<div class="statbox1">Terminé<br>'+tableau_finished.length+'</div>';
  }
  
  if (tableau_retard.length != 0){
    liste_retard += tableau_retard.join('');
    nb_lignes += tableau_retard.length;
    if (synthese2=='') synthese2+='<div class="statrow" style="margin-top: 5px">';
    synthese2+='<div class="statbox1">En retard<br>'+tableau_retard.length+'</div>';
  }

  if (tableau_encours.length != 0){
    liste_encours += tableau_encours.join('');
    if (synthese2=='') synthese2+='<div class="statrow" style="margin-top: 5px">';
    synthese2+='<div class="statbox1">En cours<br>'+tableau_encours.length+'</div>';
  }

  if (tableau_todo.length != 0){
    liste_todo += tableau_todo.join('');
    if (synthese2=='') synthese2+='<div class="statrow" style="margin-top: 5px">';
    synthese2+='<div class="statbox1">A faire<br>'+tableau_todo.length+'</div>';
  }

  if (tableau_noplanning.length !=0) {
    liste_noplanning += tableau_noplanning.join('');
    nb_lignes += tableau_noplanning.length;
    if (synthese2=='') synthese2+='<div class="statrow" style="margin-top: 5px">';
    synthese2+='<div class="statbox2">Non-Planifiés<br>'+tableau_noplanning.length+'</div>';
  }

  if (synthese1!='') synthese1+='</div>';
  if (synthese2!='') synthese2+='</div>';

  lignes_vides = nb_lignes;

  if (liste_retard != '')
  {
    contenu += todoListSection('En retard', '');
    contenu += liste_retard;
    lignes_vides += 1;
  }

  if (liste_encours != '')
  {
    contenu += todoListSection('En cours', 'font-weight:bold');
    contenu += liste_encours;
    lignes_vides += 1;
  }

  if (liste_today != '')
  {
    contenu += todoListSection('Aujourd\'hui', 'font-weight:bold');
    contenu += liste_today;
    lignes_vides += 1;
  }

  if (liste_tomorrow != '')
  {
    contenu += todoListSection('Demain', 'font-weight:bold');
    contenu += liste_tomorrow;
    lignes_vides += 1;
  }

  if (liste_thisWeek != '')
  {
    contenu += todoListSection('Cette semaine', 'font-weight:bold');
    contenu += liste_thisWeek;
    lignes_vides += 1;
  }

  if (liste_nextWeek != '')
  {
    contenu += todoListSection('La semaine prochaine', 'color:var(--nuance-sombre-09)');
    contenu += liste_nextWeek;
    lignes_vides += 1;
  }

  if (liste_thisMonth != '')
  {
    contenu += todoListSection('Ce mois-ci', 'color:var(--nuance-sombre-09)');  
    contenu += liste_thisMonth;
    lignes_vides += 1;
  }

  if (liste_nextMonth != '')
  {
    contenu += todoListSection('Le mois prochain', 'color:var(--nuance-sombre-09)');  
    contenu += liste_nextMonth;
    lignes_vides += 1;
  }

  if (liste_thisYear != '')
  {
    contenu += todoListSection('Cette année', 'color:var(--nuance-sombre-09)'); 
    contenu += liste_thisYear;
    lignes_vides += 1;
  }

  if (liste_nextYear != '')
  {
    contenu += todoListSection('L\'année prochaine', 'color:var(--nuance-sombre-06)'); 
    contenu += liste_nextYear;
    lignes_vides += 1;
  }

  if (liste_noplanning != '')
  {
    // On ne place un titre de section que s'il existe des tâches planifiées ...
    if (nb_lignes != lignes_vides)
      contenu += todoListSection('Non planifié', 'color:var(--nuance-sombre-06)'); 
    contenu += liste_noplanning;
    lignes_vides += 1;
  }

  while(lignes_vides < 30)
  {
    contenu += '   <tr>';
    contenu += '    <td colspan="3">&nbsp;</td>';
    contenu += '   </tr>';  
    lignes_vides += 1;
  }

  contenu += '  </tbody>';

  contenu += ' <tfoot>';
  contenu += '   <tr>';
  contenu += '    <th colspan="3">'+setLevelPadding(2)+''+(nb_lignes-1)+' tâches</th>';
  contenu += '   </tr>';
  contenu += '  </foot>';
  contenu += '</table>';

  synthesis.innerHTML = synthese1+synthese2;
  datagrid.innerHTML = contenu;

  // Ne marche pas , ça enlève le stick du header du tableau ...
  // document.getElementById('newitem_input').focus({preventScroll: true});
}

item_save_hooks['TODO'] = todoSave;

items_edit_hooks['TODO_OLD'] = function (id, libelle) {
      let modal_header='Todo n°<b>'+id+'</b>';
      let modal_body='TODO inconnu !';
      let modal_footer='<div align="right" width="100%" style="padding-top:2vh"><button onclick="todoSave('+id+')">Enregistrer</button></div>';

      let local_values = [];

      local_values['parent']=getContexteValeur('parent');
      local_values['type']=getContexteValeur('type_courant');
      local_values['intervenant']=getContexteValeur('intervenant');
      local_values['client']=getTrigrammeCollaborateur(local_values['intervenant']);
      local_values['libelle']=libelle;
  
      items.filter(item => item.idlignes == id).forEach(resultat => {
        local_values['type']=resultat['type'];
        itemFields[local_values['type']].forEach(attribut => {
          local_values[attribut]=resultat[attribut];
        });
      });

      modal_body  = '<table class="modal_table"><form id="formulaire_lignes">';
      itemFields[local_values['type']].forEach(attribut => {
        modal_body += '<tr><td>'+attribut+'</td><td>'+getInputLabel(attribut,local_values[attribut])+'</td></tr>';
      });
      modal_body += '</form></table>';

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

      if (!modalDialog.open) modalDialog.showModal();
}
