Quellcode durchsuchen

Finalisation du nettoyage des script de gestion de tags js.

Sevajol Bastien vor 11 Jahren
Ursprung
Commit
fd024ed212

+ 35 - 36
src/Muzich/CoreBundle/Resources/views/Tag/tagsPrompt.html.twig Datei anzeigen

@@ -16,47 +16,46 @@
16 16
     value=""
17 17
     placeholder="{{ 'tags.inputtext.help'|trans({}, 'userui') }}"
18 18
   />
19
+  <img id="tag_prompt_loader_{{ form_name }}" class="tag_loader" style="display: none;"
20
+    src="{{ asset('/bundles/muzichcore/img/ajax-loader.gif') }}" alt="loading"/>
19 21
    
20
-   <input class="tags_prompt_list" name="tags" value="" /> 
21
-   <input class="tag_prompt_selected_ids" id="tags_selected_tag_{{ form_name }}" type="hidden" value="" />
22
-   
23
-   <div id="search_tag_{{ form_name }}" class="search_tag_list" style="display: none;">
24
-     <span class="info"></span>
25
-     <div class="tag_loader_div">
26
-       <img id="tag_loader_{{ form_name }}" class="tag_loader" style="display: none;" src="{{ asset('/bundles/muzichcore/img/ajax-loader.gif') }}" alt="loading"/>
27
-     </div>
28
-     <ul class="search_tag_list"></ul>
29
-     <a class="more button" href="#" style="display: none;">
30
-       {{ 'tags.search.display_more'|trans({}, 'userui') }}
31
-     </a>
32
-   </div>
22
+  <div id="search_tag_{{ form_name }}" class="search_tag_list" style="display: none;">
23
+    <span class="info"></span>
24
+    <div class="tag_loader_div">
25
+      <img id="tag_loader_{{ form_name }}" class="tag_loader" style="display: none;"
26
+        src="{{ asset('/bundles/muzichcore/img/ajax-loader.gif') }}" alt="loading"/>
27
+    </div>
28
+    <ul class="search_tag_list"></ul>
29
+    <a class="more button" href="#" style="display: none;">
30
+      {{ 'tags.search.display_more'|trans({}, 'userui') }}
31
+    </a>
32
+  </div>
33
+  
34
+  <ul class="tagbox"></ul>
35
+  
33 36
 </div>
34 37
 
35 38
 <script language="javascript" type="text/javascript">
36
-  
37
-  var taginit = new Array();
38
-  {% if search_tags is defined %}
39
-    {% for tid, tname in search_tags %}
40
-      taginit[{{ loop.index0 }}] = {"id":"{{ tid }}", "name":"{{ tname }}"};
41
-    {% endfor %}
42
-  {% endif %}
43
-  
44
-  var options = new Array();
45
-  options.form_name  = "{{ form_name }}";
46
-  options.tag_init   = taginit;
47
-  
48
-  // tags_prompt_list_
49
-  $("div#tags_prompt_{{ form_name }} input.tags_prompt_list").tagBox(options);
50
-  
51
-  // text help en cas de rafraichissement de la page (nav. comme firefox 
52
-  // garde la valeur de l'input)
53 39
   $(document).ready(function(){
54
-    $('div#tags_prompt_{{ form_name }} ul.tagbox li.input input[type="text"]')
55
-      .attr('placeholder', "{{ 'tags.inputtext.help'|trans({}, 'userui') }}");
56
-  });
57
-  
58
-  // On détruit la variable taginit
59
-  delete taginit;
60 40
     
41
+    $('form[name="{{ form_name }}"] input.tag_prompt').val('');
61 42
     
43
+    window.{{ form_name }}_tag_prompt_connector = new TagPromptConnector(
44
+      $('form[name="{{ form_name }}"] input.tag_prompt'),
45
+      $('form[name="{{ form_name }}"] input.tagBox_tags_ids'),
46
+      $('form[name="{{ form_name }}"] div.search_tag_list'),
47
+      $('form[name="{{ form_name }}"] ul.tagbox'),
48
+      $('#tag_prompt_loader_{{ form_name }}')
49
+    );
50
+    
51
+    var {{ form_name }}_taginit = new Array();
52
+    {% if search_tags is defined %}
53
+      {% for tid, tname in search_tags %}
54
+        {{ form_name }}_taginit[{{ loop.index0 }}] = {"id":"{{ tid }}", "name":"{{ tname }}"};
55
+      {% endfor %}
56
+    {% endif %}
57
+    
58
+    window.{{ form_name }}_tag_prompt_connector.initializeTags({{ form_name }}_taginit);
59
+  
60
+  });
62 61
 </script>

+ 0 - 1
src/Muzich/HomeBundle/Resources/views/Show/showGroup.html.twig Datei anzeigen

@@ -75,7 +75,6 @@
75 75
 
76 76
         {% include "MuzichCoreBundle:Element:form.add.html.twig" with { 'form': add_form, 'form_name': add_form_name } %}
77 77
 
78
-        <input type="submit" class="button" >
79 78
       </form>
80 79
       
81 80
     </div>

+ 389 - 402
web/bundles/muzichcore/js/muzich.js Datei anzeigen

@@ -230,8 +230,8 @@ function explode (delimiter, string, limit) {
230 230
 function remove_tags(form_name)
231 231
 {
232 232
   //tagsAddeds[form_name] = new Array();
233
-  $('form[name="'+form_name+'"] ul.tagbox li.tag').remove();
234
-  $('form[name="'+form_name+'"] input.tagBox_tags_ids').val('');
233
+  //$('form[name="'+form_name+'"] ul.tagbox li.tag').remove();
234
+  //$('form[name="'+form_name+'"] input.tagBox_tags_ids').val('');
235 235
   
236 236
 }
237 237
 
@@ -280,9 +280,11 @@ $(document).ready(function(){
280 280
     $('img.elements_more_loader').show();
281 281
     $('ul.elements').html('');
282 282
     // On initialise la liste de tags déjà ajouté
283
-    tagsAddeds['search'] = new Array;
283
+    window.search_tag_prompt_connector.initializeTags([]);
284
+    $('div.no_elements').hide();
285
+    //tagsAddeds['search'] = new Array;
284 286
     var form = $('form[name="search"]');
285
-    remove_tags(form.attr('name'));
287
+    //remove_tags(form.attr('name'));
286 288
     form.submit();
287 289
   });
288 290
   
@@ -291,8 +293,6 @@ $(document).ready(function(){
291 293
     
292 294
     $('img.elements_more_loader').show();
293 295
     $('ul.elements').html('');
294
-    // On initialise la liste de tags déjà ajouté
295
-    tagsAddeds['search'] = new Array;
296 296
     
297 297
     var form = $(this).parents('form[name="search"]');
298 298
     
@@ -302,22 +302,15 @@ $(document).ready(function(){
302 302
         $(location).attr('href', url_index);
303 303
       }
304 304
       
305
-      remove_tags(form.attr('name'));
306
-//      if (tags.length)
307
-//      {
308
-        var inputTag = $("div#tags_prompt_"+form.attr('name')+" input.form-default-value-processed");
305
+        var tags = [];
309 306
         for (i in response.tags)
310 307
         {
311
-          $('input#tags_selected_tag_'+form.attr('name')).val(i);
312
-          inputTag.val(response.tags[i]);
313
-                                        
314
-          // Et on execute l'évènement selectTag de l'input
315
-          inputTag.trigger("selectTag");
308
+          var tag = new Tag(i, response.tags[i]);
309
+          tags.push(tag);
316 310
         }
317 311
         
312
+        window.search_tag_prompt_connector.initializeTags(tags);
318 313
         form.submit();
319
-      //}
320
-      
321 314
     });
322 315
   });
323 316
   
@@ -326,9 +319,6 @@ $(document).ready(function(){
326 319
     // Si il y a une liste de tags (comme sur la page favoris, profil)
327 320
     var id;
328 321
     
329
-    // On initialise la liste de tags déjà ajouté
330
-    tagsAddeds['search'] = new Array;
331
-    
332 322
     if ($('ul#favorite_tags').length)
333 323
     {
334 324
       id = str_replace('element_tag_', '', $(this).attr('id'));
@@ -340,13 +330,13 @@ $(document).ready(function(){
340 330
     {
341 331
       $('img.elements_more_loader').show();
342 332
       $('ul.elements').html('');
333
+      
343 334
       var form = $('form[name="search"]');
344 335
       id = str_replace('element_tag_', '', $(this).attr('id'));
345
-      remove_tags('search');
346
-      var inputTag = $("div#tags_prompt_search input.form-default-value-processed");
347
-      $('input#tags_selected_tag_search').val(id);
348
-      inputTag.val($(this).html());
349
-      inputTag.trigger("selectTag");
336
+      var tag = new Tag(id, $(this).text());
337
+      
338
+      window.search_tag_prompt_connector.initializeTags([tag]);
339
+      
350 340
       form.submit();
351 341
     }
352 342
   });
@@ -724,378 +714,378 @@ $(document).ready(function(){
724 714
   });
725 715
  
726 716
   ////////////////// TAG PROMPT ///////////////
727
- 
728
-  var ajax_query_timestamp = null;
729
- 
730
-  // Les deux clicks ci-dessous permettent de faire disparaitre
731
-  // la div de tags lorsque l'on clique ailleurs
732
-  $('html').click(function() {
733
-    if ($("div.search_tag_list").is(':visible'))
734
-    {
735
-      $("div.search_tag_list").hide();
736
-    }
737
-  });
738
-
739
-  $("div.search_tag_list, div.search_tag_list a.more").live('click', function(event){
740
-    event.stopPropagation();
741
-    $("div.search_tag_list").show();
742
-  });
743
-
744
-  function autocomplete_tag(input, form_name)
745
-  {
746
-    // Il doit y avoir au moin un caractère
747
-    if (input.val().length > 0) 
748
-    {
749
-
750
-      // on met en variable l'input
751
-      var inputTag = input;
752
-      
753
-      // On récupére la div de tags
754
-      var divtags = $("#search_tag_"+form_name);
755
-
756
-      // Si la fenêtre de tags est caché
757
-      if (!divtags.is(':visible'))
758
-      {
759
-        // On la replace
760
-        var position = input.position();
761
-        divtags.css('left', Math.round(position.left) + 5);
762
-        divtags.css('top', Math.round(position.top) + 28);
763
-        // Et on l'affiche
764
-        divtags.show();
765
-      }
766
-      // On affiche le loader
767
-      $('#tag_loader_'+form_name).show();
768
-      // On cache la liste de tags
769
-      var search_tag_list = divtags.find('ul.search_tag_list');
770
-      // On supprime les anciens li
771
-      search_tag_list.find('li').remove();
772
-      search_tag_list.hide();
773
-      // Et on affiche une info
774
-      var span_info = divtags.find('span.info');
775
-      span_info.show();
776
-      // TODO: multilingue !
777
-      span_info.text(str_replace('%string_search%', input.val(), string_search_tag_title));
778
-
779
-      // C'est en fonction du nb de resultats qu'il sera affiché
780
-      divtags.find('a.more').hide();
781
-
782
-      // On récupère le timestamp pour reconnaitre la dernière requête effectué
783
-      ajax_query_timestamp = new Date().getTime();
784
-      
785
-      // Récupération des tags correspondants
786
-      $.ajax({
787
-        type: 'POST',
788
-        url: url_search_tag+'/'+ajax_query_timestamp,
789
-        dataType: 'json',
790
-        data: {'string_search':input.val()},
791
-        success: function(data) {
792
-        if (data.status == 'mustbeconnected')
793
-        {
794
-          $(location).attr('href', url_index);
795
-        }
796
-        
797
-        // Ce contrôle permet de ne pas continuer si une requete
798
-        // ajax a été faite depuis.
799
-        if (data.timestamp == ajax_query_timestamp)
800
-        {
801
-          var status = data.status;
802
-          var tags   = data.data;
803
-
804
-          // Si on spécifie une erreur
805
-          if (status == 'error')
806
-          {
807
-            // On l'affiche a l'utilisateur
808
-            span_info.text(data.error);
809
-          }
810
-          // Si c'est un succés
811
-          else if (status == 'success')
812
-          {
813
-            if (tags.length > 0)
814
-            {
815
-              var more = false;
816
-              // Pour chaque tags retournés
817
-              for (i in tags)
818
-              {
819
-                var tag_name = tags[i]['name'];
820
-                var tag_id = tags[i]['id'];
821
-                var t_string = tag_name
822
-                // On construit un li
823
-                
824
-                var r_string = $.trim(input.val());
825
-                var re = new RegExp(r_string, "i");
826
-                t_string = t_string.replace(re,"<strong>" + r_string + "</strong>");
827
-                
828
-                                
829
-                var li_tag = 
830
-                  $('<li>').append(
831
-                    $('<a>').attr('id','searched_tag_'+tag_id)
832
-                      .attr('href', '#')
833
-                    // qui réagit quand on clique dessus
834
-                    .click(function(e){
835
-                      
836
-                      var id = str_replace('searched_tag_', '', $(this).attr('id'));
837
-                      var name = $('span#tag_prompt_tag_'+id+'_name').html();
838
-                                            
839
-                      $('input#tags_selected_tag_'+form_name).val(id);
840
-                      inputTag.val(name);
841
-                      // Et on execute l'évènement selectTag de l'input
842
-                      inputTag.trigger("selectTag");
843
-                      // On cache la liste puisque le choix vient d'être fait
844
-                      divtags.hide();
845
-                      // On vide le champs de saisie du tag
846
-                      $('input.form-default-value-processed').val('');
847
-                      return false;
848
-                    })
849
-                    .append(t_string)
850
-                ).append($('<span style="display: none;" id="tag_prompt_tag_'+tag_id+'_name">'+tag_name+'</span>'));
851
-
852
-                // Si on depasse les 30 tags
853
-                if (i > 30)
854
-                {
855
-                  more = true;
856
-                  // On le cache
857
-                  li_tag.hide();
858
-                }
859
-
860
-                // On ajout ce li a la liste
861
-                search_tag_list.append(li_tag);
862
-              } 
863
-
864
-              if (more)
865
-              {
866
-                divtags.find('a.more').show();
867
-              }
868
-              
869
-              span_info.show();
870
-              span_info.text(data.message);
871
-              // Et on affiche la liste
872
-              search_tag_list.show();
873
-            }
874
-            else
875
-            {
876
-              span_info.show();
877
-              span_info.text(data.message);
878
-              search_tag_list.show();
879
-              
880
-              // Dans ce cas ou aucun tag n'a été trouvé, la proposition 
881
-              // d'ajout s'affichecf en dessous
882
-              
883
-              //span_info.text("Aucun tag de trouvé pour \""+inputTag.val()+"\"");
884
-            }
885
-            
886
-            // Si le tag ne semble pas connu en base
887
-            if (!data.same_found)
888
-            {
889
-              li_tag = 
890
-                $('<li>').addClass('new').append(
891
-                  $('<a>').attr('href','#new#'+$.trim(input.val()))
892
-                  // qui réagit quand on clique dessus
893
-                  .click({
894
-                    inputTag: inputTag,
895
-                    form_name: form_name,
896
-                    divtags: divtags
897
-                  }, event_click_new_tag_proposition)
898
-                  .append($.trim(input.val()))
899
-              );
900
-              search_tag_list.append(li_tag);
901
-            }
902
-            
903
-          }
904
-
905
-          // On cache le loader
906
-          $('#tag_loader_'+form_name).hide();
907
-        }
908
-      }
909
-      });
910
-      
911
-      
912
-      //$.getJSON(url_search_tag+'/'+input.val()+'/'+ajax_query_timestamp, );
913
-      
914
-    }
915
-  }
916
-  
917
-  function event_click_new_tag_proposition(event)
918
-  {
919
-    form_add_open_dialog_for_new_tag($(event.target), event.data.inputTag, event.data.form_name, event.data.divtags);
920
-  }
921
- 
922
-  function form_add_open_dialog_for_new_tag(link_add_tag, inputTag, form_name, divtags)
923
-  {       
924
-    
925
-    
926
-    // Effet fade-in du fond opaque
927
-    $('body').append($('<div>').attr('id', 'fade')); 
928
-    //Apparition du fond - .css({'filter' : 'alpha(opacity=80)'}) pour corriger les bogues de IE
929
-    $('#fade').css({'filter' : 'alpha(opacity=80)'}).fadeIn();
930
-    
931
-    // En premier lieux on fait apparaître la fenêtre de confirmation
932
-    var popup = $('<div>')
933
-    .attr('id', 'add_tag')
934
-    .addClass('popin_block')
935
-    .css('width', '400px')
936
-      //.append($('<h2>').append(string_tag_add_title))
937
-    .append($('<form>')
938
-      .attr('action', url_add_tag)
939
-      .attr('method', 'post')
940
-      .attr('name', 'add_tag')
941
-      .ajaxForm(function(response) {
942
-        /*
943
-        *
944
-        */
945
-
946
-        if (response.status == 'mustbeconnected')
947
-        {
948
-          $(location).attr('href', url_index);
949
-        }
950
-
951
-        if (response.status == 'success')
952
-        {
953
-          var tag_id   = response.tag_id;
954
-          var tag_name = response.tag_name;
955
-
956
-          $('input#tags_selected_tag_'+form_name).val(tag_id);
957
-          inputTag.val(tag_name);
958
-          // Et on execute l'évènement selectTag de l'input
959
-          inputTag.trigger("selectTag");
960
-          // On cache la liste puisque le choix vient d'être fait
961
-          divtags.hide();
962
-
963
-          link_add_tag.parents('div.search_tag_list').find('img.tag_loader').hide();
964
-
965
-          $('#fade').fadeOut(400, function(){$('#fade').remove();});
966
-          $('#add_tag').remove();
967
-        }
968
-
969
-        if (response.status == 'error')
970
-        {
971
-          $('form[name="add_tag"]').find('ul.error_list').remove();
972
-          var ul_errors = $('<ul>').addClass('error_list');
973
-
974
-          for (i in response.errors)
975
-          {
976
-            ul_errors.append($('<li>').append(response.errors[i]));
977
-          }
978
-
979
-          $('form[name="add_tag"]').prepend(ul_errors);
980
-        }
981
-
982
-        return false;
983
-      })
984
-
985
-      .append($('<div>').addClass('tag')
986
-        .append($('<ul>')
987
-          .append($('<li>').addClass('button')
988
-            .append(link_add_tag.text()))))
989
-      .append($('<p>').append(string_tag_add_text))
990
-      .append($('<p>').append(string_tag_add_argument))
991
-      .append($('<textarea>').attr('name', 'argument'))
992
-      .append($('<div>').addClass('inputs')
993
-        .append($('<input>')
994
-          .attr('type', 'button')
995
-          .attr('value', string_tag_add_inputs_cancel)
996
-          .addClass('button')
997
-          .click(function(){
998
-            $('#fade').fadeOut(1000, function(){$('#fade').remove();});
999
-            $('#add_tag').remove();
1000
-
1001
-            return false;
1002
-          })
1003
-        )
1004
-        .append($('<input>')
1005
-          .attr('type', 'submit')
1006
-          .attr('value', string_tag_add_inputs_submit)
1007
-          .addClass('button')
1008
-          .click(function(){
1009
-
1010
-            link_add_tag.parents('div.search_tag_list').find('img.tag_loader').show();
1011
-
1012
-          })
1013
-        )
1014
-        .append($('<input>').attr('type', 'hidden').attr('name', 'tag_name').val(link_add_tag.text()))
1015
-      ))
1016
-    ;
1017
-
1018
-    // Il faut ajouter le popup au dom avant de le positionner en css
1019
-    // Sinon la valeur height n'est pas encore calculable
1020
-    $('body').prepend(popup);
1021
-
1022
-    //Récupération du margin, qui permettra de centrer la fenêtre - on ajuste de 80px en conformité avec le CSS
1023
-    var popMargTop = (popup.height() + 50) / 2;
1024
-    var popMargLeft = (popup.width() + 50) / 2;
1025
-
1026
-    //On affecte le margin
1027
-    $(popup).css({
1028
-      'margin-top' : -popMargTop,
1029
-      'margin-left' : -popMargLeft
1030
-    });
1031
-
1032
-    return false;
1033
-  }
1034
- 
1035
-  var last_keypress = 0;
1036
-  
1037
-  function check_timelaps_and_search(input, form_name, time_id, timed, info)
1038
-  {
1039
-    if (!timed)
1040
-    {
1041
-      // C'est une nouvelle touche (pas redirigé) on lui donne un id
1042
-      // et on met a jour l'id de la dernière pressé
1043
-      last_keypress = new Date().getTime(); 
1044
-      var this_time_id = last_keypress;
1045
-    }
1046
-    else
1047
-    {
1048
-      // Si elle a été redirigé, on met son id dans cette variable
1049
-      var this_time_id = time_id;
1050
-    }
1051
-    
1052
-    // C'est une touche redirigé dans le temps qui a été suivit d'une autre touche
1053
-    if (time_id != last_keypress && timed)
1054
-    {
1055
-      // elle disparait
1056
-    }
1057
-    else
1058
-    {
1059
-      //
1060
-      if ((new Date().getTime() - last_keypress) < 600 || timed == false)
1061
-      {
1062
-        // Si elle vient d'être tapé (timed == false) elle doit attendre (au cas ou une autre touche soit tapé)
1063
-        // Si c'est une redirigé qui n'a pas été remplacé par une nouvelle lettre
1064
-        // elle doit attendre au cas ou soit pressé.
1065
-        setTimeout(function(){check_timelaps_and_search(input, form_name, this_time_id, true, info)}, 700);
1066
-      }
1067
-      else
1068
-      {
1069
-        // il n'y a plus a attendre, on envoie la demande de tag.
1070
-        autocomplete_tag(input, form_name);
1071
-      }
1072
-    }
1073
-  }
1074
-  
1075
-  // Autocompletion de tags
1076
-  $("div.tags_prompt ul.tagbox li.input input").live('keypress', function(e){
1077
-    
1078
-    var form_name = $(this).parents('form').attr('name');
1079
-    var code = (e.keyCode ? e.keyCode : e.which);
1080
-
1081
-    if ((e.which !== 0 && e.charCode !== 0) || (code == 8 || code == 46))
1082
-    {
1083
-      check_timelaps_and_search($(this), form_name, new Date().getTime(), false, $(this).val());
1084
-    }
1085
-     
1086
-  });
1087
-  
1088
-  // Un click sur ce lien affiche tout les tags cachés de la liste
1089
-  $('div.search_tag_list a.more').live('click', function(){
1090
-    jQuery.each( $(this).parent('div').find('ul.search_tag_list li') , function(){
1091
-      $(this).show();
1092
-    });
1093
-    $(this).hide();
1094
-    return false;
1095
-  });
1096
-  
1097
-  $('ul.tagbox li.input input[type="text"]').formDefaults();
1098
- 
717
+  //
718
+  //var ajax_query_timestamp = null;
719
+  //
720
+  //// Les deux clicks ci-dessous permettent de faire disparaitre
721
+  //// la div de tags lorsque l'on clique ailleurs
722
+  //$('html').click(function() {
723
+  //  if ($("div.search_tag_list").is(':visible'))
724
+  //  {
725
+  //    $("div.search_tag_list").hide();
726
+  //  }
727
+  //});
728
+  //
729
+  //$("div.search_tag_list, div.search_tag_list a.more").live('click', function(event){
730
+  //  event.stopPropagation();
731
+  //  $("div.search_tag_list").show();
732
+  //});
733
+  //
734
+  //function autocomplete_tag(input, form_name)
735
+  //{
736
+  //  // Il doit y avoir au moin un caractère
737
+  //  if (input.val().length > 0) 
738
+  //  {
739
+  //
740
+  //    // on met en variable l'input
741
+  //    var inputTag = input;
742
+  //    
743
+  //    // On récupére la div de tags
744
+  //    var divtags = $("#search_tag_"+form_name);
745
+  //
746
+  //    // Si la fenêtre de tags est caché
747
+  //    if (!divtags.is(':visible'))
748
+  //    {
749
+  //      // On la replace
750
+  //      var position = input.position();
751
+  //      divtags.css('left', Math.round(position.left) + 5);
752
+  //      divtags.css('top', Math.round(position.top) + 28);
753
+  //      // Et on l'affiche
754
+  //      divtags.show();
755
+  //    }
756
+  //    // On affiche le loader
757
+  //    $('#tag_loader_'+form_name).show();
758
+  //    // On cache la liste de tags
759
+  //    var search_tag_list = divtags.find('ul.search_tag_list');
760
+  //    // On supprime les anciens li
761
+  //    search_tag_list.find('li').remove();
762
+  //    search_tag_list.hide();
763
+  //    // Et on affiche une info
764
+  //    var span_info = divtags.find('span.info');
765
+  //    span_info.show();
766
+  //    // TODO: multilingue !
767
+  //    span_info.text(str_replace('%string_search%', input.val(), string_search_tag_title));
768
+  //
769
+  //    // C'est en fonction du nb de resultats qu'il sera affiché
770
+  //    divtags.find('a.more').hide();
771
+  //
772
+  //    // On récupère le timestamp pour reconnaitre la dernière requête effectué
773
+  //    ajax_query_timestamp = new Date().getTime();
774
+  //    
775
+  //    // Récupération des tags correspondants
776
+  //    $.ajax({
777
+  //      type: 'POST',
778
+  //      url: url_search_tag+'/'+ajax_query_timestamp,
779
+  //      dataType: 'json',
780
+  //      data: {'string_search':input.val()},
781
+  //      success: function(data) {
782
+  //      if (data.status == 'mustbeconnected')
783
+  //      {
784
+  //        $(location).attr('href', url_index);
785
+  //      }
786
+  //      
787
+  //      // Ce contrôle permet de ne pas continuer si une requete
788
+  //      // ajax a été faite depuis.
789
+  //      if (data.timestamp == ajax_query_timestamp)
790
+  //      {
791
+  //        var status = data.status;
792
+  //        var tags   = data.data;
793
+  //
794
+  //        // Si on spécifie une erreur
795
+  //        if (status == 'error')
796
+  //        {
797
+  //          // On l'affiche a l'utilisateur
798
+  //          span_info.text(data.error);
799
+  //        }
800
+  //        // Si c'est un succés
801
+  //        else if (status == 'success')
802
+  //        {
803
+  //          if (tags.length > 0)
804
+  //          {
805
+  //            var more = false;
806
+  //            // Pour chaque tags retournés
807
+  //            for (i in tags)
808
+  //            {
809
+  //              var tag_name = tags[i]['name'];
810
+  //              var tag_id = tags[i]['id'];
811
+  //              var t_string = tag_name
812
+  //              // On construit un li
813
+  //              
814
+  //              var r_string = $.trim(input.val());
815
+  //              var re = new RegExp(r_string, "i");
816
+  //              t_string = t_string.replace(re,"<strong>" + r_string + "</strong>");
817
+  //              
818
+  //                              
819
+  //              var li_tag = 
820
+  //                $('<li>').append(
821
+  //                  $('<a>').attr('id','searched_tag_'+tag_id)
822
+  //                    .attr('href', '#')
823
+  //                  // qui réagit quand on clique dessus
824
+  //                  .click(function(e){
825
+  //                    
826
+  //                    var id = str_replace('searched_tag_', '', $(this).attr('id'));
827
+  //                    var name = $('span#tag_prompt_tag_'+id+'_name').html();
828
+  //                                          
829
+  //                    $('input#tags_selected_tag_'+form_name).val(id);
830
+  //                    inputTag.val(name);
831
+  //                    // Et on execute l'évènement selectTag de l'input
832
+  //                    inputTag.trigger("selectTag");
833
+  //                    // On cache la liste puisque le choix vient d'être fait
834
+  //                    divtags.hide();
835
+  //                    // On vide le champs de saisie du tag
836
+  //                    $('input.form-default-value-processed').val('');
837
+  //                    return false;
838
+  //                  })
839
+  //                  .append(t_string)
840
+  //              ).append($('<span style="display: none;" id="tag_prompt_tag_'+tag_id+'_name">'+tag_name+'</span>'));
841
+  //
842
+  //              // Si on depasse les 30 tags
843
+  //              if (i > 30)
844
+  //              {
845
+  //                more = true;
846
+  //                // On le cache
847
+  //                li_tag.hide();
848
+  //              }
849
+  //
850
+  //              // On ajout ce li a la liste
851
+  //              search_tag_list.append(li_tag);
852
+  //            } 
853
+  //
854
+  //            if (more)
855
+  //            {
856
+  //              divtags.find('a.more').show();
857
+  //            }
858
+  //            
859
+  //            span_info.show();
860
+  //            span_info.text(data.message);
861
+  //            // Et on affiche la liste
862
+  //            search_tag_list.show();
863
+  //          }
864
+  //          else
865
+  //          {
866
+  //            span_info.show();
867
+  //            span_info.text(data.message);
868
+  //            search_tag_list.show();
869
+  //            
870
+  //            // Dans ce cas ou aucun tag n'a été trouvé, la proposition 
871
+  //            // d'ajout s'affichecf en dessous
872
+  //            
873
+  //            //span_info.text("Aucun tag de trouvé pour \""+inputTag.val()+"\"");
874
+  //          }
875
+  //          
876
+  //          // Si le tag ne semble pas connu en base
877
+  //          if (!data.same_found)
878
+  //          {
879
+  //            li_tag = 
880
+  //              $('<li>').addClass('new').append(
881
+  //                $('<a>').attr('href','#new#'+$.trim(input.val()))
882
+  //                // qui réagit quand on clique dessus
883
+  //                .click({
884
+  //                  inputTag: inputTag,
885
+  //                  form_name: form_name,
886
+  //                  divtags: divtags
887
+  //                }, event_click_new_tag_proposition)
888
+  //                .append($.trim(input.val()))
889
+  //            );
890
+  //            search_tag_list.append(li_tag);
891
+  //          }
892
+  //          
893
+  //        }
894
+  //
895
+  //        // On cache le loader
896
+  //        $('#tag_loader_'+form_name).hide();
897
+  //      }
898
+  //    }
899
+  //    });
900
+  //    
901
+  //    
902
+  //    //$.getJSON(url_search_tag+'/'+input.val()+'/'+ajax_query_timestamp, );
903
+  //    
904
+  //  }
905
+  //}
906
+  //
907
+  //function event_click_new_tag_proposition(event)
908
+  //{
909
+  //  form_add_open_dialog_for_new_tag($(event.target), event.data.inputTag, event.data.form_name, event.data.divtags);
910
+  //}
911
+  //
912
+  //function form_add_open_dialog_for_new_tag(link_add_tag, inputTag, form_name, divtags)
913
+  //{       
914
+  //  
915
+  //  
916
+  //  // Effet fade-in du fond opaque
917
+  //  $('body').append($('<div>').attr('id', 'fade')); 
918
+  //  //Apparition du fond - .css({'filter' : 'alpha(opacity=80)'}) pour corriger les bogues de IE
919
+  //  $('#fade').css({'filter' : 'alpha(opacity=80)'}).fadeIn();
920
+  //  
921
+  //  // En premier lieux on fait apparaître la fenêtre de confirmation
922
+  //  var popup = $('<div>')
923
+  //  .attr('id', 'add_tag')
924
+  //  .addClass('popin_block')
925
+  //  .css('width', '400px')
926
+  //    //.append($('<h2>').append(string_tag_add_title))
927
+  //  .append($('<form>')
928
+  //    .attr('action', url_add_tag)
929
+  //    .attr('method', 'post')
930
+  //    .attr('name', 'add_tag')
931
+  //    .ajaxForm(function(response) {
932
+  //      /*
933
+  //      *
934
+  //      */
935
+  //
936
+  //      if (response.status == 'mustbeconnected')
937
+  //      {
938
+  //        $(location).attr('href', url_index);
939
+  //      }
940
+  //
941
+  //      if (response.status == 'success')
942
+  //      {
943
+  //        var tag_id   = response.tag_id;
944
+  //        var tag_name = response.tag_name;
945
+  //
946
+  //        $('input#tags_selected_tag_'+form_name).val(tag_id);
947
+  //        inputTag.val(tag_name);
948
+  //        // Et on execute l'évènement selectTag de l'input
949
+  //        inputTag.trigger("selectTag");
950
+  //        // On cache la liste puisque le choix vient d'être fait
951
+  //        divtags.hide();
952
+  //
953
+  //        link_add_tag.parents('div.search_tag_list').find('img.tag_loader').hide();
954
+  //
955
+  //        $('#fade').fadeOut(400, function(){$('#fade').remove();});
956
+  //        $('#add_tag').remove();
957
+  //      }
958
+  //
959
+  //      if (response.status == 'error')
960
+  //      {
961
+  //        $('form[name="add_tag"]').find('ul.error_list').remove();
962
+  //        var ul_errors = $('<ul>').addClass('error_list');
963
+  //
964
+  //        for (i in response.errors)
965
+  //        {
966
+  //          ul_errors.append($('<li>').append(response.errors[i]));
967
+  //        }
968
+  //
969
+  //        $('form[name="add_tag"]').prepend(ul_errors);
970
+  //      }
971
+  //
972
+  //      return false;
973
+  //    })
974
+  //
975
+  //    .append($('<div>').addClass('tag')
976
+  //      .append($('<ul>')
977
+  //        .append($('<li>').addClass('button')
978
+  //          .append(link_add_tag.text()))))
979
+  //    .append($('<p>').append(string_tag_add_text))
980
+  //    .append($('<p>').append(string_tag_add_argument))
981
+  //    .append($('<textarea>').attr('name', 'argument'))
982
+  //    .append($('<div>').addClass('inputs')
983
+  //      .append($('<input>')
984
+  //        .attr('type', 'button')
985
+  //        .attr('value', string_tag_add_inputs_cancel)
986
+  //        .addClass('button')
987
+  //        .click(function(){
988
+  //          $('#fade').fadeOut(1000, function(){$('#fade').remove();});
989
+  //          $('#add_tag').remove();
990
+  //
991
+  //          return false;
992
+  //        })
993
+  //      )
994
+  //      .append($('<input>')
995
+  //        .attr('type', 'submit')
996
+  //        .attr('value', string_tag_add_inputs_submit)
997
+  //        .addClass('button')
998
+  //        .click(function(){
999
+  //
1000
+  //          link_add_tag.parents('div.search_tag_list').find('img.tag_loader').show();
1001
+  //
1002
+  //        })
1003
+  //      )
1004
+  //      .append($('<input>').attr('type', 'hidden').attr('name', 'tag_name').val(link_add_tag.text()))
1005
+  //    ))
1006
+  //  ;
1007
+  //
1008
+  //  // Il faut ajouter le popup au dom avant de le positionner en css
1009
+  //  // Sinon la valeur height n'est pas encore calculable
1010
+  //  $('body').prepend(popup);
1011
+  //
1012
+  //  //Récupération du margin, qui permettra de centrer la fenêtre - on ajuste de 80px en conformité avec le CSS
1013
+  //  var popMargTop = (popup.height() + 50) / 2;
1014
+  //  var popMargLeft = (popup.width() + 50) / 2;
1015
+  //
1016
+  //  //On affecte le margin
1017
+  //  $(popup).css({
1018
+  //    'margin-top' : -popMargTop,
1019
+  //    'margin-left' : -popMargLeft
1020
+  //  });
1021
+  //
1022
+  //  return false;
1023
+  //}
1024
+  //
1025
+  //var last_keypress = 0;
1026
+  //
1027
+  //function check_timelaps_and_search(input, form_name, time_id, timed, info)
1028
+  //{
1029
+  //  if (!timed)
1030
+  //  {
1031
+  //    // C'est une nouvelle touche (pas redirigé) on lui donne un id
1032
+  //    // et on met a jour l'id de la dernière pressé
1033
+  //    last_keypress = new Date().getTime(); 
1034
+  //    var this_time_id = last_keypress;
1035
+  //  }
1036
+  //  else
1037
+  //  {
1038
+  //    // Si elle a été redirigé, on met son id dans cette variable
1039
+  //    var this_time_id = time_id;
1040
+  //  }
1041
+  //  
1042
+  //  // C'est une touche redirigé dans le temps qui a été suivit d'une autre touche
1043
+  //  if (time_id != last_keypress && timed)
1044
+  //  {
1045
+  //    // elle disparait
1046
+  //  }
1047
+  //  else
1048
+  //  {
1049
+  //    //
1050
+  //    if ((new Date().getTime() - last_keypress) < 600 || timed == false)
1051
+  //    {
1052
+  //      // Si elle vient d'être tapé (timed == false) elle doit attendre (au cas ou une autre touche soit tapé)
1053
+  //      // Si c'est une redirigé qui n'a pas été remplacé par une nouvelle lettre
1054
+  //      // elle doit attendre au cas ou soit pressé.
1055
+  //      setTimeout(function(){check_timelaps_and_search(input, form_name, this_time_id, true, info)}, 700);
1056
+  //    }
1057
+  //    else
1058
+  //    {
1059
+  //      // il n'y a plus a attendre, on envoie la demande de tag.
1060
+  //      autocomplete_tag(input, form_name);
1061
+  //    }
1062
+  //  }
1063
+  //}
1064
+  //
1065
+  //// Autocompletion de tags
1066
+  //$("div.tags_prompt ul.tagbox li.input input").live('keypress', function(e){
1067
+  //  
1068
+  //  var form_name = $(this).parents('form').attr('name');
1069
+  //  var code = (e.keyCode ? e.keyCode : e.which);
1070
+  //
1071
+  //  if ((e.which !== 0 && e.charCode !== 0) || (code == 8 || code == 46))
1072
+  //  {
1073
+  //    check_timelaps_and_search($(this), form_name, new Date().getTime(), false, $(this).val());
1074
+  //  }
1075
+  //   
1076
+  //});
1077
+  //
1078
+  //// Un click sur ce lien affiche tout les tags cachés de la liste
1079
+  //$('div.search_tag_list a.more').live('click', function(){
1080
+  //  jQuery.each( $(this).parent('div').find('ul.search_tag_list li') , function(){
1081
+  //    $(this).show();
1082
+  //  });
1083
+  //  $(this).hide();
1084
+  //  return false;
1085
+  //});
1086
+  //
1087
+  //$('ul.tagbox li.input input[type="text"]').formDefaults();
1088
+  //
1099 1089
   ////////////////// FIN TAG PROMPT ///////////////
1100 1090
  
1101 1091
   // Suppression d'un element
@@ -1367,15 +1357,12 @@ $(document).ready(function(){
1367 1357
     
1368 1358
     var form_name = "add";
1369 1359
     var tag_id = str_replace('#', '', $(this).attr('href'));
1370
-    var input_tag = $("div.tags_prompt ul.tagbox li.input input");
1371 1360
     
1372 1361
     // Si on connait le tag id (pas un nouveau tag donc)
1373 1362
     if (tag_id)
1374 1363
     {
1375
-      $('input#tags_selected_tag_'+form_name).val(tag_id);
1376
-      input_tag.val($(this).text());
1377
-      // Et on execute l'évènement selectTag de l'input
1378
-      input_tag.trigger("selectTag");
1364
+      var tag = new Tag(tag_id, $(this).text());
1365
+      window.add_tag_prompt_connector.addTagToTagPrompt(tag);
1379 1366
     }
1380 1367
     else
1381 1368
     {

+ 389 - 36
web/js/lib/TagPrompt.js Datei anzeigen

@@ -1,13 +1,16 @@
1
-function TagPrompt()
1
+function TagPrompt(select_tag_callback, tag_prompt_connector)
2 2
 {
3 3
   
4 4
   /* @var tags_selected array of Tag */
5
-  var tags_selected = new Array();
5
+  var tags_selected = [];
6 6
   /* @var tags_proposed array of Tag */
7
-  var tags_proposed = new Array();
7
+  var tags_proposed = [];
8
+  var _select_tag_callback = select_tag_callback;
9
+  var _tag_prompt_connector = tag_prompt_connector;
8 10
   
9 11
   this.getProposedTagsForString = function(search_string, callback_success, callback_error)
10 12
   {
13
+    tags_proposed = [];
11 14
     JQueryJson(url_search_tag, {'string_search': search_string}, function(response){
12 15
       if (response.status == 'error')
13 16
       {
@@ -19,38 +22,241 @@ function TagPrompt()
19 22
         {
20 23
           var tag = new Tag(
21 24
             response.data[i].id,
22
-            response.data[i].name,
23
-            true
25
+            response.data[i].name
24 26
           );
25 27
           tags_proposed.push(tag);
26 28
         }
27
-        callback_success(tags_proposed, search_string);
29
+        callback_success(tags_proposed, search_string, response.message, response.same_found);
28 30
       }
29 31
     });
30 32
   }
31 33
   
32
-  this.selectProposedTag = function (tag_id)
34
+  this.selectProposedTag = function (tag_id, tag_name)
33 35
   {
34
-    // Selection d'un tag dans la liste de propositions
36
+    if (!tag_id)
37
+    {
38
+      openTagSubmission(tag_name);
39
+    }
40
+    else
41
+    {
42
+      addTagToSelectedTags(findTagInProposedList(tag_id));
43
+      _select_tag_callback(tags_selected);
44
+    }
35 45
   }
36 46
   
37
-  this.openTagSubmission = function (tag_string)
47
+  var openTagSubmission = function (tag_name)
38 48
   {
39
-    // Ouverture du dialogue pour proposer un nouveau tag
49
+    // TODO : Cette partie du code n'est pas encore refactorisé
50
+    
51
+    // Effet fade-in du fond opaque
52
+    $('body').append($('<div>').attr('id', 'fade')); 
53
+    //Apparition du fond - .css({'filter' : 'alpha(opacity=80)'}) pour corriger les bogues de IE
54
+    $('#fade').css({'filter' : 'alpha(opacity=80)'}).fadeIn();
55
+    
56
+    // En premier lieux on fait apparaître la fenêtre de confirmation
57
+    var popup = $('<div>')
58
+    .attr('id', 'add_tag')
59
+    .addClass('popin_block')
60
+    .css('width', '400px')
61
+      //.append($('<h2>').append(string_tag_add_title))
62
+    .append($('<form>')
63
+      .attr('action', url_add_tag)
64
+      .attr('method', 'post')
65
+      .attr('name', 'add_tag')
66
+      .ajaxForm(function(response) {
67
+        /*
68
+        *
69
+        */
70
+  
71
+        if (response.status == 'mustbeconnected')
72
+        {
73
+          $(location).attr('href', url_index);
74
+        }
75
+  
76
+        if (response.status == 'success')
77
+        {
78
+          var tag = new Tag(response.tag_id, response.tag_name);
79
+          addTagToProposedTags(tag);
80
+          addTagToSelectedTags(tag);
81
+          _tag_prompt_connector.updateOutput(tags_selected);
82
+  
83
+          $('#fade').fadeOut(400, function(){$('#fade').remove();});
84
+          $('#add_tag').remove();
85
+        }
86
+  
87
+        if (response.status == 'error')
88
+        {
89
+          $('form[name="add_tag"]').find('ul.error_list').remove();
90
+          var ul_errors = $('<ul>').addClass('error_list');
91
+  
92
+          for (i in response.errors)
93
+          {
94
+            ul_errors.append($('<li>').append(response.errors[i]));
95
+          }
96
+  
97
+          $('form[name="add_tag"]').prepend(ul_errors);
98
+        }
99
+  
100
+        return false;
101
+      })
102
+  
103
+      .append($('<div>').addClass('tag')
104
+        .append($('<ul>')
105
+          .append($('<li>').addClass('button')
106
+            .append(tag_name))))
107
+      .append($('<p>').append(string_tag_add_text))
108
+      .append($('<p>').append(string_tag_add_argument))
109
+      .append($('<textarea>').attr('name', 'argument'))
110
+      .append($('<div>').addClass('inputs')
111
+        .append($('<input>')
112
+          .attr('type', 'button')
113
+          .attr('value', string_tag_add_inputs_cancel)
114
+          .addClass('button')
115
+          .click(function(){
116
+            $('#fade').fadeOut(1000, function(){$('#fade').remove();});
117
+            $('#add_tag').remove();
118
+  
119
+            return false;
120
+          })
121
+        )
122
+        .append($('<input>')
123
+          .attr('type', 'submit')
124
+          .attr('value', string_tag_add_inputs_submit)
125
+          .addClass('button')
126
+          .click(function(){
127
+  
128
+            // TODO: loader gif
129
+  
130
+          })
131
+        )
132
+        .append($('<input>').attr('type', 'hidden').attr('name', 'tag_name').val(tag_name))
133
+      ))
134
+    ;
135
+  
136
+    // Il faut ajouter le popup au dom avant de le positionner en css
137
+    // Sinon la valeur height n'est pas encore calculable
138
+    $('body').prepend(popup);
139
+  
140
+    //Récupération du margin, qui permettra de centrer la fenêtre - on ajuste de 80px en conformité avec le CSS
141
+    var popMargTop = (popup.height() + 50) / 2;
142
+    var popMargLeft = (popup.width() + 50) / 2;
143
+  
144
+    //On affecte le margin
145
+    $(popup).css({
146
+      'margin-top' : -popMargTop,
147
+      'margin-left' : -popMargLeft
148
+    });
149
+  
150
+    return false;
40 151
   }
41 152
   
42
-  this.submitTag = function (tag_string, tag_arguments)
153
+  var addTagToSelectedTags = function(tag)
43 154
   {
44
-    // Propotion d'un tag
155
+    var found = false;
156
+    for (i in tags_selected)
157
+    {
158
+      if (tags_selected[i].id == tag.id)
159
+      {
160
+        found = true;
161
+      }
162
+    }
163
+    if (!found)
164
+    {
165
+      tags_selected.push(tag);
166
+    }
45 167
   }
168
+  
169
+  var addTagToProposedTags = function(tag)
170
+  {
171
+    var found = false;
172
+    for (i in tags_proposed)
173
+    {
174
+      if (tags_proposed[i].id == tag.id)
175
+      {
176
+        found = true;
177
+      }
178
+    }
179
+    if (!found)
180
+    {
181
+      tags_proposed.push(tag);
182
+    }
183
+  }
184
+  
185
+  this.addTag = function(tag)
186
+  {
187
+    addTagToSelectedTags(tag);
188
+    addTagToProposedTags(tag);
189
+  }
190
+  
191
+  var findTagInProposedList = function(tag_id)
192
+  {
193
+    for (i in tags_proposed)
194
+    {
195
+      if (tags_proposed[i].id == tag_id)
196
+      {
197
+        return tags_proposed[i];
198
+      }
199
+    }
200
+    throw new Error("Unable to find the tag !")
201
+  }
202
+  
203
+  this.removeSelectedTag = function(tag_id)
204
+  {
205
+    var new_tags_selected = [];
206
+    for (i in tags_selected)
207
+    {
208
+      if (tags_selected[i].id != tag_id)
209
+      {
210
+        new_tags_selected.push(tags_selected[i]);
211
+      }
212
+    }
213
+    tags_selected = new_tags_selected;
214
+  }
215
+  
216
+  this.getSelectedTags = function()
217
+  {
218
+    return tags_selected;
219
+  }
220
+  
221
+  this.setSelectedTags = function(tags)
222
+  {
223
+    tags_selected = tags;
224
+  }
225
+  
46 226
 }
47 227
 
48
-function TagPromptConnector(input, output, proposition_list)
228
+function TagPromptConnector(input, output, proposition_list, tag_box, prompt_loader)
49 229
 {
50 230
   var _input = input;
51 231
   var _output = output;
52
-  var _tag_prompt = new TagPrompt();
53
-  var _tag_proposition_list = new TagPromptPropositionList(proposition_list);
232
+  var _tag_box_manager = new TagBoxManager(tag_box, this);
233
+  var _prompt_loader = prompt_loader;
234
+  
235
+  this.updateOutput = function(tags)
236
+  {
237
+    _output.val(array2json(tagsToArrayIds(tags)));
238
+    _tag_proposition_list.hide();
239
+    _tag_box_manager.update(tags);
240
+    cleanInput();
241
+  }
242
+  
243
+  var _tag_prompt = new TagPrompt(this.updateOutput, this);
244
+  var _tag_proposition_list = new TagPromptPropositionList(proposition_list, _tag_prompt.selectProposedTag, this);
245
+  
246
+  var cleanInput = function()
247
+  {
248
+    _input.val('');
249
+  }
250
+  
251
+  var showPromptLoader = function()
252
+  {
253
+    _prompt_loader.show();
254
+  }
255
+  
256
+  this.hidePromptLoader = function()
257
+  {
258
+    _prompt_loader.hide();
259
+  }
54 260
   
55 261
   var launchSearchTagsIdLastKeystroke = function(search_string)
56 262
   {
@@ -63,7 +269,7 @@ function TagPromptConnector(input, output, proposition_list)
63 269
   var displayTagsProposedSearchTags = function()
64 270
   {
65 271
     var string_search = _input.val();
66
-    tags = _tag_prompt.getProposedTagsForString(
272
+    _tag_prompt.getProposedTagsForString(
67 273
       string_search,
68 274
       _tag_proposition_list.displayTagsPropositions,
69 275
       _tag_proposition_list.displayError
@@ -71,14 +277,92 @@ function TagPromptConnector(input, output, proposition_list)
71 277
   }
72 278
   
73 279
   $(_input).bind('keyup', function() {
74
-    setTimeout(launchSearchTagsIdLastKeystroke, 1000, [_input.val()]);
280
+    if ($(this).val().length > 0)
281
+    {
282
+      showPromptLoader();
283
+      setTimeout(launchSearchTagsIdLastKeystroke, 1000, [_input.val()]);
284
+    }
75 285
   });
286
+  
287
+  var tagsToArrayIds = function(tags)
288
+  {
289
+    var tags_ids = [];
290
+    for (i in tags)
291
+    {
292
+      tags_ids.push(tags[i].id);
293
+    }
294
+    return tags_ids;
295
+  }
296
+  
297
+  this.removeSelectedTag = function(tag_id)
298
+  {
299
+    _tag_prompt.removeSelectedTag(tag_id);
300
+    this.updateOutput(_tag_prompt.getSelectedTags());
301
+  }
302
+  
303
+  this.initializeTags = function(tags)
304
+  {
305
+    _tag_prompt.setSelectedTags(tags);
306
+    this.updateOutput(_tag_prompt.getSelectedTags());
307
+  }
308
+  
309
+  this.addTagToTagPrompt = function(tag)
310
+  {
311
+    _tag_prompt.addTag(tag);
312
+    this.updateOutput(_tag_prompt.getSelectedTags());
313
+  }
314
+  
315
+}
316
+
317
+function TagBoxManager(tag_box, tag_prompt_connector)
318
+{
319
+  var _tag_prompt_connector = tag_prompt_connector;
320
+  var _tag_box = tag_box;
321
+  
322
+  this.update = function(tags)
323
+  {
324
+    _tag_box.find('li').remove();
325
+    for (i in tags)
326
+    {
327
+      _tag_box.append(getTagLine(tags[i]));
328
+    }
329
+  }
330
+  
331
+  var getTagLine = function (tag)
332
+  {
333
+    var line = $('<li>');
334
+    line.addClass('tag');
335
+    line.text(tag.name);
336
+    line.append(getCloseLink(tag));
337
+    
338
+    return line;
339
+  }
340
+  
341
+  var getCloseLink = function(tag)
342
+  {
343
+    var close_link = $('<a>');
344
+    close_link.addClass('close');
345
+    close_link.attr('href', '#');
346
+    close_link.data('tag_id', tag.id);
347
+    close_link.data('tag_name', tag.name);
348
+    close_link.text('close');
349
+    close_link.bind('click', function(){
350
+      _tag_prompt_connector.removeSelectedTag($(this).data('tag_id'));
351
+      return false;
352
+    });
353
+    
354
+    return close_link;
355
+  }
356
+  
76 357
 }
77 358
 
78
-function TagPromptPropositionList(proposition_list, string_search)
359
+function TagPromptPropositionList(proposition_list, click_tag_callback, tag_prompt_connector)
79 360
 {
80 361
   var _proposition_list = proposition_list;
81 362
   var _list;
363
+  var _limit_display_tags = 30;
364
+  var _click_tag_callback = click_tag_callback;
365
+  var _tag_prompt_connector = tag_prompt_connector;
82 366
   
83 367
   this.displayError = function(error_string)
84 368
   {
@@ -87,19 +371,23 @@ function TagPromptPropositionList(proposition_list, string_search)
87 371
     span_info.text(error_string);
88 372
   }
89 373
   
90
-  this.displayTagsPropositions = function(tags, string_search)
374
+  this.displayTagsPropositions = function(tags, search_string, message, same_found)
91 375
   {
92 376
     initializeList();
93
-    displayMessage(str_replace('%string_search%', string_search, string_search_tag_title));
377
+    displayMessage(message);
94 378
     for (i in tags)
95 379
     {
96
-      addTagToList(tags[i]);
97
-      // Bouton afficher tout les tags, tag hiddent quoi
380
+      addTagToList(tags[i], search_string);
381
+    }
382
+    if (!same_found)
383
+    {
384
+      addTagPropositionToList(new Tag(null, search_string));
98 385
     }
99 386
   }
100 387
   
101 388
   var initializeList = function()
102 389
   {
390
+    _tag_prompt_connector.hidePromptLoader();
103 391
     $(_proposition_list).show();
104 392
     _list = _proposition_list.find('ul.search_tag_list');
105 393
     _list.find('li').remove();
@@ -112,33 +400,85 @@ function TagPromptPropositionList(proposition_list, string_search)
112 400
     span_info.text(message);
113 401
   }
114 402
   
115
-  var addTagToList = function(tag)
403
+  var addTagToList = function(tag, search_string)
404
+  {
405
+    var line = '';
406
+    if (_list.find('li').length > _limit_display_tags)
407
+    {
408
+      line = getListLine(tag, true);
409
+      _proposition_list.find('a.more').show();
410
+    }
411
+    else
412
+    {
413
+      line = getListLine(tag, false);
414
+    }
415
+    
416
+    line = strongifySearchedLetters(line, search_string);
417
+    _list.append(line);
418
+  }
419
+  
420
+  var getListLine = function(tag, hide)
421
+  {
422
+    if (hide)
423
+    {
424
+      var line = $('<li style="display: none;">');
425
+    }
426
+    else
427
+    {
428
+      var line = $('<li>');
429
+    }
430
+    
431
+    return line.append(getTagLink(tag));
432
+  }
433
+  
434
+  var getTagLink = function(tag)
435
+  {
436
+    link = $('<a>');
437
+    link.attr('href', '#');
438
+    link.data('tag_id', tag.id);
439
+    link.data('tag_name', tag.name);
440
+    link.text(tag.name);
441
+    link.bind('click', function(){
442
+      _click_tag_callback($(this).data('tag_id'), $(this).data('tag_name'));
443
+      return false;
444
+    });
445
+    return link;
446
+  }
447
+  
448
+  var strongifySearchedLetters = function(line, search_string)
449
+  {
450
+    var name = line.find('a').text();
451
+    line.find('a').html(name.replace(new RegExp(search_string, "i"), "<strong>" + search_string + "</strong>"));
452
+    return line;
453
+  }
454
+  
455
+  var addTagPropositionToList = function(tag)
116 456
   {
117
-    _list.append(getListLine(tag));
457
+    var line = getListLine(tag);
458
+    line.addClass('new');
459
+    _list.append(line);
118 460
   }
119 461
   
120
-  var getListLine = function(tag)
462
+  this.hide = function()
121 463
   {
122
-    return '<li>'+tag.name+'</li>';
464
+    _proposition_list.hide();
123 465
   }
124 466
   
125 467
 }
126 468
 
127
-function Tag(id, name, knew)
469
+function Tag(id, name)
128 470
 {
129 471
   /* @var _id int */
130 472
   this.id = id;
131 473
   /* @var _name string */
132 474
   this.name = name;
133
-  /* @var _knew boolean */
134
-  this.knew = knew;
135 475
 }
136 476
 
137 477
 Tag.prototype =
138 478
 {
139 479
   isKnew: function()
140 480
   {
141
-    if (this.knew)
481
+    if (this.id)
142 482
     {
143 483
       return true;
144 484
     }
@@ -147,11 +487,24 @@ Tag.prototype =
147 487
 }
148 488
 
149 489
 $(document).ready(function(){
150
-  $('input.tag_prompt').each(function(){
151
-    new TagPromptConnector(
152
-      $(this),
153
-      $(this).parents('form').find('input.tag_prompt_selected_ids'),
154
-      $(this).parents('form').find('div.search_tag_list')
155
-   );
490
+  // Ce code permet la fermeture de la propositions de tags lors d'un click sur la page
491
+  $('html').click(function() {
492
+    if ($("div.search_tag_list").is(':visible'))
493
+    {
494
+      $("div.search_tag_list").hide();
495
+    }
156 496
   });
497
+  $("div.search_tag_list, div.search_tag_list a.more").live('click', function(event){
498
+    event.stopPropagation();
499
+    $("div.search_tag_list").show();
500
+  });
501
+  
502
+  $('div.search_tag_list a.more').live('click', function(){
503
+    $(this).parents('div.search_tag_list ').find('ul.search_tag_list li').show();
504
+    $(this).hide();
505
+    return false;
506
+  });
507
+  
157 508
 });
509
+
510
+// loaders