/**
  La classe Todolist va nous permettre de manipuler les tâches et des les 
  faire persister dans la mémoire du navigateur via window.localStorage.
  @param string identifiant 
    L'identifiant unique de la todoList
  @param function cb_mise_a_jour 
    Fonction de callback qui sera appelée à chaque mise à jour de la todoList.
*/
var TodoList = function(identifiant, cb_mise_a_jour) { 

  // Cet identifiant sera sa clé dans le tableau du localStorage
  this.identifiant = identifiant;

  // On récupère les données qui existaient déjà, 
  // ou on utilise les données par défaut.
  this.donnees = $.evalJSON(window.localStorage.getItem(this.identifiant)) || {
    taches : [ 
      {
        'libelle': "Libellé de la première tâche",
        'effectue': false
      },
      {
        'libelle': "Libellé de la deuxième tâche",
        'effectue': false
      },
      {
        'libelle': "Libellé de la troisième tâche ... Elle est finie",
        'effectue': true
      }
    ]
  };

  // L'utilisateur devrait implémenter la méthode de callback pour 
  // rafraîchir son interface à chaque modification de la todolist.
  this.cb_mise_a_jour = cb_mise_a_jour || function() {
    throw 'Vous devriez implémenter la méthode cb_mise_a_jour(instance)';
  }
  
  // On exécute une première fois la méthode pour initialiser l'interface.
  this.cb_mise_a_jour(this);
}


/**
  Retourner toutes les tâches
*/
TodoList.prototype.lister_taches = function() {
  return this.donnees.taches;
}


/**
  Ajouter une nouvelle tâche
  @param string libelle_tache Libellé de la tâche a ajouter. 
*/
TodoList.prototype.ajout_tache = function(libelle_tache) {
  this.donnees.taches.push({
    'libelle': libelle_tache,
    'effectue': false
  });
  this.sauvegarder();
}


/**
  Modifier une tâche
  @param int numero Numéro de la tâche à modifier.
  @param object infos_nouvelle_tache La tâche après mise à jour
*/
TodoList.prototype.modification_tache = function(numero, infos_nouvelle_tache) {
  jQuery.extend(this.donnees.taches[numero], infos_nouvelle_tache);
  this.sauvegarder();
}


/**
  Supprimer une tâche
  @param int numero Numéro de la tâche à supprimer.
*/
TodoList.prototype.suppression_tache = function(numero) {
  this.donnees.taches.splice(numero, 1);
  this.sauvegarder();
}


/**
  Faire persister la TodoList dans le localStorage
*/
TodoList.prototype.sauvegarder = function() {
  window.localStorage.setItem(this.identifiant, $.toJSON(this.donnees));
  this.cb_mise_a_jour(this);
}

