ADD un objet permettant l'attente des événements. Utilisé pour la page 'chat' et...
[euphorik.git] / js / pageMinichat.js
index 94f6e7c..ed0321c 100755 (executable)
@@ -31,47 +31,52 @@ PageMinichat.prototype.charger = function()
 {   
    thisPage = this
 
-   jQuery("form input.pseudo").val(this.client.pseudo)
+   $("form input.pseudo").val(this.client.pseudo)
    
    // cet appel ne doit pas être fait avant l'appel à 'charger'
    this.messages = new Messages(this.client, this.formateur, this.util)
    
    this.messages.rafraichirMessages(true)
    \r
-   this.util.setCaretToEnd(jQuery("form input.message")[0])
+   this.util.setCaretToEnd($("form input.message")[0])
 
    // les outils de bannissement (uniquement pour les ekMaster)
    if (this.client.ekMaster)
    {    
-      jQuery("body").append(
-         "<div id=\"outilsBan\"><img id=\"ban\" alt=\"Ban de 3 jours\" src=\"img/ban.gif\" /><img id=\"kick\" alt=\"Ban de 15min\" src=\"img/kick.gif\" /><img id=\"slap\" alt=\"Avertissement\" src=\"img/slap.gif\" /></div>"
+      $("body").append(
+         '<div id="outilsBan">' +
+         '<form><p><input id="raison" name="raison" type="text" size="10" maxlength="200"></input></p></form>' +
+         '<img id="ban" src="img/ban.gif" alt="Ban de 3 jours" />' +
+         '<img id="kick" src="img/kick.gif" alt="Ban de 15min" />' +
+         '<img id="slap" src="img/slap.gif" alt="Avertissement" />' +
+         '</div>'
       )
-      jQuery("#outilsBan").hover(
+      $("#outilsBan").hover(
          function(){},
          function()
          {
-            jQuery("#outilsBan").hide()
+            $("#outilsBan").hide()
          }
       )
    }
 
    // <smiles>
-   jQuery("body").append("<div id=\"smiles\"></div>")
+   $("body").append("<div id=\"smiles\"></div>")
    // affichage des smiles
-   jQuery("#smiles").append(this.formateur.getSmilesHTML()).children().each(
+   $("#smiles").append(this.formateur.getSmilesHTML()).children().each(
       function(i)
       {
-         var opacityBase = jQuery(this).css("opacity")
-         jQuery(this).click(
+         var opacityBase = $(this).css("opacity")
+         $(this).click(
             function(event)
             {
-               thisPage.util.replaceSelection(jQuery("form input.message")[0], thisPage.formateur.smiles[jQuery(this).attr("class")][0].source.replace(/\\/g, ""))
+               thisPage.util.replaceSelection($("form input.message")[0], thisPage.formateur.smiles[$(this).attr("class")][0].source.replace(/\\/g, ""))
             }
          )
          .hover(
             function()
             {
-               jQuery(this).animate(
+               $(this).animate(
                   {
                      opacity: 1
                   }, 200
@@ -79,7 +84,7 @@ PageMinichat.prototype.charger = function()
             },
             function()
             {
-               jQuery(this).animate(
+               $(this).animate(
                   {
                      opacity: opacityBase
                   }, 200
@@ -88,19 +93,19 @@ PageMinichat.prototype.charger = function()
          )
       }
    )
-   jQuery("form button.smiles").hover(
+   $("form button.smiles").hover(
       function(e)
       {
-         var offset = jQuery(e.target).offset()
-         jQuery("#smiles").css("top", offset.top).css("left", offset.left).show()
+         var offset = $(e.target).offset()
+         $("#smiles").css("top", offset.top).css("left", offset.left).show()
       },
       function(e){}
    )
-   jQuery("#smiles").hover(
+   $("#smiles").hover(
       function(){},
       function(e)
       {
-         jQuery("#smiles").hide()
+         $("#smiles").hide()
       }
    )
    // </smiles>
@@ -110,17 +115,17 @@ PageMinichat.prototype.charger = function()
       function()
       {  
          // captcha anti bot
-         if (jQuery("form input.captcha").val() != "") return
+         if ($("form input.captcha").val() != "") return
       
          thisPage.envoyerMessage(
-            jQuery("form input.pseudo").val(), 
-            jQuery("form input.message").val()
+            $("form input.pseudo").val(), 
+            $("form input.message").val()
          )
             
-         jQuery("form input.message")[0].focus()
+         $("form input.message")[0].focus()
       }
       
-   jQuery("form").keypress(
+   $("form").keypress(
       function(e)
       {
          if (e.which == 13) // return
@@ -128,15 +133,15 @@ PageMinichat.prototype.charger = function()
       }
    )
    
-   jQuery("form button.return").click(nouveauMessage)
+   $("form button.return").click(nouveauMessage)
    
    // interdiction de submiter le formulaire
-   jQuery("form").submit(function(){ return false})
+   $("form").submit(function(){ return false})
    
-   jQuery("input.pseudo").click(
+   $("input.pseudo").click(
       function()
       {
-         var input = jQuery("input.pseudo")[0]
+         var input = $("input.pseudo")[0]
          if (input.value == conf.pseudoDefaut)
             input.value = ""
       }
@@ -145,11 +150,10 @@ PageMinichat.prototype.charger = function()
 
 PageMinichat.prototype.decharger = function()
 {
-   //alert(this.attenteCourante)
-   this.messages.stopAttenteCourante()
+   this.messages.pageEvent.stopAttenteCourante()
    
-   jQuery("body #smiles").remove()
-   jQuery("body #outilsBan").remove()
+   $("body #smiles").remove()
+   $("body #outilsBan").remove()
 }
 
 PageMinichat.prototype.getJSONMessage = function(pseudo, message, repondA)
@@ -213,12 +217,12 @@ PageMinichat.prototype.envoyerMessage = function(pseudo, message)
          
             if(data["reply"] == "ok")
             {  \r
-               jQuery("form input.message").val("")
+               $("form input.message").val("")
                         
                // met à jour la classe des messages auquel repond celui ci (c'est un peu de la triche)
                for (var i = 0; i < repondA.length; i++)
                {
-                  jQuery("#conversations div#" + repondA[i]).addClass("repondu")
+                  $("#conversations div#" + repondA[i]).addClass("repondu")
                   /* Ca sert à rien, TODO : tester/virer
                   for (var c = 0; c < thisPageMinichat.messages.conversations.length; c++)
                      for (var m = 0; m < thisPageMinichat.messages.conversations[c].messages.length; m++)
@@ -354,7 +358,7 @@ function Conversation(num, util, formateur, client)
    
    this.nbMessageMax = conf.nbMessageAffiche // Le nombre de message affiché par page
 
-   jQuery("#conversations").append(
+   $("#conversations").append(
       '<div id="' + this.getId() + '" class="conversation">\
       <div class="titre">' +
          (num == 0 ? '' : '<div class="fermer">x</div><div class="lien">c</div>') +
@@ -364,11 +368,11 @@ function Conversation(num, util, formateur, client)
    )
    
    // enlève la mise en évidence pour la conversation
-   jQuery("#conversations #" + this.getId()).hover(
+   $("#conversations #" + this.getId()).hover(
       function(){},
       function(event)
       {
-         jQuery("#conversations .message").removeClass("cache")
+         $("#conversations .message").removeClass("cache")
          thisConversation.messageOver = null
       }
    )
@@ -381,9 +385,9 @@ function Conversation(num, util, formateur, client)
   */
 Conversation.prototype.setPage = function(pageCourante, dernierePage)
 {
-   jQuery("#conversations #" + this.getId() + " .numPage").text(pageCourante)
-   jQuery("#conversations #" + this.getId() + " .next").css("display", pageCourante == 1 ? "none" : "inline")
-   jQuery("#conversations #" + this.getId() + " .prev").css("display", dernierePage ? "none" : "inline")
+   $("#conversations #" + this.getId() + " .numPage").text(pageCourante)
+   $("#conversations #" + this.getId() + " .next").css("display", pageCourante == 1 ? "none" : "inline")
+   $("#conversations #" + this.getId() + " .prev").css("display", dernierePage ? "none" : "inline")
 }
 
 /**
@@ -393,7 +397,7 @@ Conversation.prototype.eventLien = function(fun)
 {
    var thisConversation = this
    
-   jQuery("#conversations #" + this.getId() + " .titre .lien").click(
+   $("#conversations #" + this.getId() + " .titre .lien").click(
       function()
       {
          fun(thisConversation.num)
@@ -408,7 +412,7 @@ Conversation.prototype.eventFermer = function(fun)
 {
    var thisConversation = this
    
-   jQuery("#conversations #" + this.getId() + " .titre .fermer").click(
+   $("#conversations #" + this.getId() + " .titre .fermer").click(
       function()
       {
          fun(thisConversation.num)
@@ -425,13 +429,13 @@ Conversation.prototype.setFunPage = function(funNext, funPrev, funReset)
 {
    var thisConversation = this
    
-   jQuery("#conversations #" + this.getId() + " .next").click(
+   $("#conversations #" + this.getId() + " .next").click(
       function() { funNext(thisConversation.num) }
    )
-   jQuery("#conversations #" + this.getId() + " .prev").click(
+   $("#conversations #" + this.getId() + " .prev").click(
       function() { funPrev(thisConversation.num) }
    )
-   jQuery("#conversations #" + this.getId() + " .numPage").click(
+   $("#conversations #" + this.getId() + " .numPage").click(
       function() { funReset(thisConversation.num) }
    )
 }
@@ -459,7 +463,7 @@ Conversation.prototype.viderMessages = function()
 {
    this.messages = new Array()
    this.idDernierMessageAffiche = 0
-   jQuery("#conversations #" + this.getId() + " .message").remove()
+   $("#conversations #" + this.getId() + " .message").remove()
 }
 
 /**
@@ -474,7 +478,7 @@ Conversation.prototype.flush = function(funClickOuvrirConv)
 
    // est-ce que le prochain message est pair ? (permet d'alterner le style des messages)
    var messagePair = (this.idDernierMessageAffiche == 0 ? true :
-      (jQuery("#conversations #" + this.getId() + " div:first").attr("class").search("messagePair") == -1)
+      ($("#conversations #" + this.getId() + " div:first").attr("class").search("messagePair") == -1)
    )
       
    // construction de l'XHTML des messages
@@ -513,80 +517,87 @@ Conversation.prototype.flush = function(funClickOuvrirConv)
          messagePair = !messagePair
       }
       
-   jQuery("#conversations #" + this.getId()).prepend(XHTML)
-   
-   // mise à jour des images (LightBox) après l'ajout de message
-   if (myLightbox != null)
-      myLightbox.updateImageList()
+   $("#conversations #" + this.getId()).prepend(XHTML)
    
    // enlève les messages exedentaires
-   var nbMessagesAffiche = jQuery("#conversations #" + this.getId() + " .message").size()
+   var nbMessagesAffiche = $("#conversations #" + this.getId() + " .message").size()
    
    if (nbMessagesAffiche > this.nbMessageMax)
-      jQuery("#conversations #" + this.getId() + " .message").slice(this.nbMessageMax, nbMessagesAffiche).empty()
+      $("#conversations #" + this.getId() + " .message").slice(this.nbMessageMax, nbMessagesAffiche).empty()
 
    // ajoute les événements liés à chaque nouveau message
-   jQuery("#conversations #" + this.getId() + " .message").filter(function(){return parseInt(jQuery(this).attr("id"), 36) > thisConversation.idDernierMessageAffiche}).each(
+   $("#conversations #" + this.getId() + " .message").filter(function(){return parseInt($(this).attr("id"), 36) > thisConversation.idDernierMessageAffiche}).each(
       function()
       {
-         jQuery(".lienConv", this).click(
+         $(".lienConv", this).click(
             function(event)
             {          
                // FIXME : ya pas mieux ?
-               var racine = jQuery(event.target).text()
+               var racine = $(event.target).text()
                funClickOuvrirConv(parseInt(racine.substring(1, racine.length - 1), 36))
                return false
             }
          )
          
+         $("a[@rel*=lightbox]", this).lightBox()
+         
          // les outils de bannissement (uniquement pour les ekMaster)
          if (thisConversation.client.ekMaster)
-            jQuery(".pseudo", this).hover(
+            $(".pseudo", this).hover(
                function(e)
                {     
-                  var userId =  parseInt(jQuery(this).attr("id").substr(4))
-                  var element = jQuery(e.target)
+                  var userId =  parseInt($(this).attr("id").substr(4))
+                  var element = $(e.target)
                   var h = element.height()
                   var offset = element.offset()
-                  var outils = jQuery("#outilsBan").css("top", offset.top - 2).css("left", offset.left - 2).height(h < 16 ? 16 : h).width(element.width() + 16 * 3 + 4).show()
-                  jQuery("img", outils).unbind()
-                  jQuery("#kick", outils).click(
+                  var outils = $("#outilsBan").css("top", offset.top - 2).css("left", offset.left - 2).height(h < 16 ? 16 : h).width(element.width() + 16 * 3 + 4 + 64).show()
+                  $("img", outils).unbind()
+                  $("#slap", outils).click(
                      function(e)
                      {
-                        thisConversation.client.kick(userId)
+                        thisConversation.client.slap(userId, $("#outilsBan input").val())
+                        $("#outilsBan input").val("")
                      }
                   )
-                  jQuery("#ban", outils).click(
+                  $("#kick", outils).click(
                      function(e)
                      {
-                        thisConversation.client.ban(userId)
+                        thisConversation.client.kick(userId, $("#outilsBan input").val())
+                        $("#outilsBan input").val("")
+                     }
+                  )
+                  $("#ban", outils).click(
+                     function(e)
+                     {
+                        thisConversation.client.ban(userId, $("#outilsBan input").val())
+                        $("#outilsBan input").val("")
                      }
                   )
                },
                function(){}
             )
          
-         jQuery(this).click(
+         $(this).click(
             function(event)
             {
-               if (jQuery(event.target).is("a")) return
+               if ($(event.target).is("a")) return
                
                // l'id du message
-               var idMess = jQuery(this).attr("id")
+               var idMess = $(this).attr("id")
                
                // extraction d'une conversation
-               if (jQuery(event.target).is(".extraire"))
+               if ($(event.target).is(".extraire"))
                {
                   funClickOuvrirConv(parseInt(idMess, 36))
                   return
                }
             
-               var valCourant = jQuery("input.message").val()
+               var valCourant = $("input.message").val()
                if (valCourant == undefined) valCourant = ""
-               var tag = jQuery(".pseudo", this).text()  + "{" + idMess + "}" + ">"
+               var tag = $(".pseudo", this).text()  + "{" + idMess + "}" + ">"
                if (valCourant.indexOf(tag, 0) == -1)
-                  jQuery("input.message").val(tag + " " + valCourant)
-               thisConversation.util.setCaretToEnd(jQuery("form input.message")[0])
+                  $("input.message").val(tag + " " + valCourant)
+               thisConversation.util.setCaretToEnd($("form input.message")[0])
             }
          )
          // Q : pourquoi pas un .hover ?
@@ -616,7 +627,7 @@ Conversation.prototype.flush = function(funClickOuvrirConv)
 Conversation.prototype.afficherConversation = function(element)
 {
    // cherche le message selectionné
-   var id = parseInt(jQuery(element).attr("id"), 36)
+   var id = parseInt($(element).attr("id"), 36)
    
    var message = this.messagesParId[id]
    if (message == undefined) return
@@ -624,10 +635,10 @@ Conversation.prototype.afficherConversation = function(element)
    mess = message.getConversation(this)
    
    // FIXME : cet appel est très lent
-   jQuery("#conversations #" + this.getId() + " .message").each(
+   $("#conversations #" + this.getId() + " .message").each(
       function()
       {
-         var jq = jQuery(this)
+         var jq = $(this)
          if (!mess.hasOwnProperty(parseInt(jq.attr("id"), 36)))
             jq.addClass("cache")
          else         
@@ -641,7 +652,7 @@ Conversation.prototype.afficherConversation = function(element)
   */
 Conversation.prototype.supprimer = function()
 {
-   jQuery("#conversations #" + this.getId()).remove()
+   $("#conversations #" + this.getId()).remove()
 }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -660,8 +671,7 @@ function Messages(client, formateur, util)
    this.conversations = new Array() // les conversations, la première représente la conversation principale
    this.nouvelleConversation(0)
    
-   // l'objet JSONHttpRequest représentant la connexion d'attente
-   this.attenteCourante = null
+   this.pageEvent = new PageEvent("chat", this.util)
 }
 
 /**
@@ -670,8 +680,6 @@ function Messages(client, formateur, util)
 Messages.prototype.getJSONrafraichirMessages = function()
 {
    var mess =  {
-      "action" : "wait_event",
-      "page" : "chat",
       "message_count" : conf.nbMessageAffiche,
       "main_page" : this.client.pagePrincipale,
       "conversations" : this.getJSONConversations()
@@ -680,9 +688,6 @@ Messages.prototype.getJSONrafraichirMessages = function()
    if (this.client.cookie != null) mess["cookie"] = this.client.cookie;
    mess["last_message_id"] = this.conversations[0].idDernierMessageAffiche
    
-   // obsolète
-   //if (this.idDernierMessage != null) mess["last_message_id"] = this.idDernierMessage
-   
    return mess
 }
 
@@ -760,7 +765,7 @@ Messages.prototype.ajouterMessage = function(element, numConversation)
          function(num) // insertion du lien vers la conversation
          {
                thisPage.util.replaceSelection(
-                  jQuery("form input.message")[0],
+                  $("form input.message")[0],
                   "{" + thisMessages.client.conversations[num-1].root.toString(36) + "}"
                )
          }
@@ -828,7 +833,7 @@ Messages.prototype.supprimerConversation = function(num)
   */
 Messages.prototype.ajusterLargeurConversations = function()
 {
-      jQuery("#conversations .conversation").css("width", 100 / this.conversations.length + "%")
+      $("#conversations .conversation").css("width", 100 / this.conversations.length + "%")
 }
 
 /**
@@ -865,22 +870,10 @@ Messages.prototype.ouvrirConversation = function(racine)
 
 Messages.prototype.viderMessages = function()
 {
-   // Obsolète
-   //this.idDernierMessage = null
-   
    for (var i = 0; i < this.conversations.length; i++)
       this.conversations[i].viderMessages()
 }
 
-/**
-  * Arrete l'attente courante s'il y en a une.
-  */
-Messages.prototype.stopAttenteCourante = function()
-{
-   if (this.attenteCourante != null)
-      this.attenteCourante.abort()   
-}
-
 /**
   * Met à jour les messages de manière continue.
   * (AJAX-Comet-style proof)
@@ -888,51 +881,34 @@ Messages.prototype.stopAttenteCourante = function()
   */
 Messages.prototype.rafraichirMessages = function(vider)
 {
-   var thisMessages = this // caisupair javacrypte
+   var thisMessages = this
    
    if (vider == undefined)
       vider = false
-      
-   this.stopAttenteCourante()
    
    if (vider)
       for (var i = 0; i < this.conversations.length; i++)
-         this.conversations[i].idDernierMessageAffiche = 0\r
-      
-   dumpObj(this.getJSONrafraichirMessages())
-   this.attenteCourante = jQuery.ajax({
-      type: "POST",
-      url: "request",
-      dataType: "json",
-      data: this.util.jsonVersAction(this.getJSONrafraichirMessages()),
-      success:
-         function(data)
-         {            \r
-            ;;; dumpObj(data)\r
+         this.conversations[i].idDernierMessageAffiche = 0
          
+   this.pageEvent.waitEvent(
+      function() { return thisMessages.getJSONrafraichirMessages() },
+      function(data)
+      {
             if (vider)
+            {
                thisMessages.viderMessages()
+               vider = false
+            }
             
             // ajoute les messages reçus à leur conversation respective
             for (var numConv = 0; numConv < data["conversations"].length; numConv++)
             {
-               // ya pas de nouveaux message -> on passe à la prochaine conversation FIXME : marche pas
-               //if (data["conversations"][numConv]["messages"].length == 0) continue
-               
                if (! thisMessages.ajouterMessages(data["conversations"][numConv], numConv))
                {
                   thisMessages.util.messageDialogue("La conversation {" + thisMessages.client.conversations[numConv -1].root.toString(36) + "} n'existe pas")
                   thisMessages.client.supprimerConversation(numConv - 1) 
                }
             }
-            
-            // rappel de la fonction dans 100 ms
-            setTimeout(function(){ thisMessages.rafraichirMessages() }, 100);
-         },
-      error:
-         function(XMLHttpRequest, textStatus, errorThrown)
-         {
-            setTimeout(function(){ thisMessages.rafraichirMessages() }, 1000);
-         }
-   })
+      }
+   )
 }