/**
  TodoList - Plugin pour jQuery
  Utilisation : $(selecteur_div).todoList();
*/
(function($){
  $.fn.todoList = function(options) {
    
    // On peut utiliser plusieurs TodoLists sur la page
    return this.each(function() {

      // Définition des éléments de l'interface
      var liste_taches = $('<ul></ul>');
      var champ_texte = $('<input type="text" />');
      var bouton_ajout = $('<input type="button" value="Ajouter" />');
      $(this).append(liste_taches, champ_texte, bouton_ajout);
      $(this).attr('class','todolist');
      
      // Action permettant d'ajouter une nouvelle tâche à accomplir
      var ajout_tache = function() {
        var contenu_texte = $(champ_texte).val();
        if(contenu_texte != '') {
          // On crée une nouvelle entrée dans le tableau des tâches.
          TDL.ajout_tache(contenu_texte);
        }
      }
      
      // Ajout de l'écouteur du bouton.
      $(bouton_ajout).click(ajout_tache);
      // Ajout de l'écouteur du champ textuel
      $(champ_texte).keyup(function(e) {
        if(e.keyCode == 13) ajout_tache();
      });
      
      
      // Implémentation de la méthode de callback de la TodoList
      var cb_mise_a_jour = function(TDL) {
        // On vide la liste des tâches et le champ texte
        $(liste_taches).html('');
        $(champ_texte).val('');
        
        // Pour chaque tâche ...
        $.each(TDL.lister_taches(), function(i,tache) {
        
          // On génère un identifiant pour chaque tâche
          tache.identifiant = TDL.identifiant + '_tache_' + i;
          
          // On ajoute la tâche à la liste        
          $(liste_taches).append(
            $('<li></li>')
              .attr('class',(tache.effectue)?'tache_effectuee':'')
              .append(
                $('<input type="checkbox" />')
                  .attr('id', tache.identifiant)
                  .attr('checked', tache.effectue)
                  .click(function() {
                    // Un clic sur la checkbox permet de changer le statut
                    // de la tâche visée.
                    TDL.modification_tache(i, {
                      'effectue': $(this).attr('checked')
                    });
                  })
                ,
                
                $('<label></label>')
                  .attr('for', tache.identifiant)
                  .html(tache.libelle)
                ,
                
                ' '
                ,
                
                // On ajoute la possibilité de supprimer la tâche
                $('<a></a>')
                  .attr('href', 'javascript:void(0)')
                  .attr('title', 'Cliquez pour supprimer la tâche')
                  .click(function() {
                    $(this).parent().fadeOut(function() {
                      TDL.suppression_tache(i);
                    });
                  })
                  .html('x')
              )
          );
        });
      };
      
      
      
      // Instanciation de l'objet TodoList
      try {
        var TDL = new TodoList('todolist_'+$(this).attr('id'), cb_mise_a_jour);
      } 
      catch(e) {
        // En cas d'erreur on avertit l'utilisateur.
        alert("Une erreur s'est produite, il est probable que votre navigateur"+
          " ne supporte pas encore la propriété window.localStorage \n\n" +
          "Message retourné : \n" + e);
      }
      
      
    });
  };
})(jQuery);
