MOD début de la Grande Restructuration JavaScript (pas fini)
[euphorik.git] / js / pageMinichat.js
index 574dedd..da534ed 100755 (executable)
@@ -35,19 +35,30 @@ function PageMinichat(client, formateur, util)
 PageMinichat.prototype.contenu = function()
 {
    // le fait que tout soit collé est fait exprès, permet d'éviter d'avoir des espaces supplémentaires entre les spans'
-   return '\
-<div id="trollCourant">Troll de la semaine : <span class="troll"></span></div>\
-<form method="post" action="" id ="posterMessage">\
+   var formulaireXHTML = '<form method="post" action="" id ="posterMessage">\
 <p>\
 <input class="captcha" name="captcha" type="text" size="8" maxlength="8"></input>\
-<input class="pseudo" name="pseudo" type="text" maxlength="50" value="' + encodeURI(conf.nickDefaut) + '"></input>\
+<input class="pseudo" name="pseudo" type="text" maxlength="50" value="' + encodeURI(euphorik.conf.nickDefaut) + '"></input>\
 <span id="repondA"><span class="nb">0</span><span class="messages"></span></span>\
 <input class="message" name="message" type="text" maxlength="500" value=""></input>\
 <button class="smiles"></button>\
 <button class="return"></button>\
 </p>\
-</form>\
-<div id="conversations"></div>'
+</form>'
+   var trollXHTML = '<div id="trollCourant">Troll de la semaine : <span class="troll"></span></div>'
+   //var titreXHTML = '<tr id="titres"></tr>'
+   //var messagesXHTML = '<tr id="messages"></tr>'
+   var conversationXHTML = '<table id="conversations"><tr></tr></table>'
+    
+   if (this.client.chatOrder == "reverse")
+      return trollXHTML + formulaireXHTML + conversationXHTML
+   else
+      return trollXHTML + conversationXHTML + formulaireXHTML
+}
+
+PageMinichat.prototype.classes = function()
+{
+   return this.client.chatOrder == "reverse" ? "orderReverse" : "orderChrono"
 }
 
 PageMinichat.prototype.charger = function()
@@ -68,6 +79,7 @@ PageMinichat.prototype.charger = function()
    {    
       this.util.outilsBan = $(
          '<span id="outilsBan">' +
+         '<span class="spacer"></span>' +
          '<form action=""><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" />' +
@@ -76,18 +88,25 @@ PageMinichat.prototype.charger = function()
       )
       
       this.util.infoBulle("Slap", $("#slap", this.util.outilsBan))
-      this.util.infoBulle("Kick (" + conf.tempsKick + "min)", $("#kick", this.util.outilsBan))
-      this.util.infoBulle("Ban (" + conf.tempsBan / 24 / 60 + " jours)", $("#ban", this.util.outilsBan))
+      this.util.infoBulle("Kick (" + euphorik.conf.tempsKick + "min)", $("#kick", this.util.outilsBan))
+      this.util.infoBulle("Ban (" + euphorik.conf.tempsBan / 24 / 60 + " jours)", $("#ban", this.util.outilsBan))
       this.util.infoBulle("La raison", $("input", this.util.outilsBan))
    }
    
    this.util.infoBulle("Ouvrir la conversation liée au troll de la semaine", $("#trollCourant .troll")) 
    
-    this.util.infoBulle("Cliquer sur les messages pour les enlevers de la liste",
+   this.util.infoBulle("Cliquer sur les messages pour les enlevers de la liste",
       $("form#posterMessage #repondA").hover(
          function() { thisPage.util.afficherBoite($(".messages", this), $(this), positionTypeX.centre, positionTypeY.bas) },
          function() { $(".messages", this).hide() }
-      )
+      ).click(
+         function(e)
+         {
+            if ($(e.target).is(".nb"))
+               thisPage.conversations.enleverMessagesRepond()             
+         }     
+      ),
+      euphorik.Util.positionBulleType.droite
    )
 
    // <smiles>
@@ -98,7 +117,7 @@ PageMinichat.prototype.charger = function()
       {
          var opacityBase = $(this).css("opacity")
          $(this).click(
-            function(event)
+            function()
             {
                thisPage.util.replaceSelection($("form#posterMessage input.message")[0], thisPage.formateur.smiles[$(this).attr("class")][0].source.replace(/\\/g, ""))
             }
@@ -154,7 +173,7 @@ PageMinichat.prototype.charger = function()
       function()
       {
          var input = $("input.pseudo")[0]
-         if (input.value == conf.pseudoDefaut)
+         if (input.value == euphorik.conf.pseudoDefaut)
             input.value = ""
       }
    )
@@ -174,7 +193,7 @@ PageMinichat.prototype.getJSONMessage = function(pseudo, message)
       repondA.push(parseInt(id)) // FIXME : une propriété ne peut pas être de type int ?
       
    return {
-      "header" : { "action" : "put_message", "version" : conf.versionProtocole },
+      "header" : { "action" : "put_message", "version" : euphorik.conf.versionProtocole },
       "cookie" : this.client.cookie,
       "nick" : pseudo,
       "content" : message,
@@ -189,9 +208,9 @@ PageMinichat.prototype.envoyerMessage = function(pseudo, message)
    // (un pseudo vide est autorisé)
    pseudo = this.formateur.filtrerInputPseudo(pseudo)
    
-   if (pseudo == conf.nickDefaut)
+   if (pseudo == euphorik.conf.nickDefaut)
    {
-      this.util.messageDialogue("Le pseudo ne peut pas être " + conf.nickDefaut)
+      this.util.messageDialogue("Le pseudo ne peut pas être " + euphorik.conf.nickDefaut)
       return
    }
    
@@ -243,7 +262,8 @@ PageMinichat.prototype.envoyerMessage = function(pseudo, message)
                      if (mess != undefined)
                         mess.clientARepondu = true
                   }
-                  $("#conversations div#" + thisPageMinichat.conversations.messagesRepond[messId].getId()).addClass("repondu")
+                  // TODO : ca sert à qque chose ?
+                  //$("#conversations div#" + thisPageMinichat.conversations.messagesRepond[messId].getId()).addClass("repondu")
                }
                
                $("form input.message").val("")
@@ -355,21 +375,24 @@ Message.prototype.getConversation = function(messages)
       if (messages.messages[i].repondA.hasOwnProperty(this.id))
          messagesEnEvidence[messages.messages[i].id] = 2
    
-   var premierNiveau = true
-   var f = function(tabIds)
+   // parcours en 
+   var f = function(tabIds, premierNiveau)
    {
       for(var id in tabIds)
       {
+         // si le message (id) a déjà été traité
+         if (messagesEnEvidence[id] != undefined && !premierNiveau)
+            continue
+           
          var message = messages.messagesParId[id]
          if (message != undefined)
          {         
             messagesEnEvidence[id] = premierNiveau ? 3 : (message.auteurId == thisMessage.auteurId ? 1 : 0)
-            premierNiveau = false
-            f (message.repondA)
+            f (message.repondA, false)
          }
       }
    }
-   f(this.repondA)
+   f(this.repondA, true)
    
    return messagesEnEvidence
 }
@@ -443,25 +466,33 @@ function Conversation(conversations, num)
    this.messages = []
    this.messagesParId = {}
    
-   this.nbMessageMax = conf.nbMessageAffiche // Le nombre de message affiché par page
+   this.nbMessageMax = euphorik.conf.nbMessageAffiche // Le nombre de message affiché par page
 
-   $("#conversations").append(
-      '<div id="' + this.getId() + '" class="conversation">' +
-      '<div class="messages"></div>' +
-      '<div class="titre">' +
-         '<div class="barre">' +
-             (num == 0 ? '' : '<div class="fermer"></div><div class="lien"></div><div class="reduire"></div>') +
-             '<span class="next">&lt;</span><span class="numPage">1</span><span class="prev">&gt;</span>' +
-             '</div>' +
+   var messagesXHTML = '<div class="messages"></div>'
+   var messageRacineXHTML = '<div class="messageRacine"></div>'
+   var reverse = this.client.chatOrder == "reverse"
+    
+   var XHTML = 
+      '<td class="conversation" id="' + this.getId() + '">' +
+         (reverse ? messagesXHTML : "") +
+         '<div class="titre">' +
+            (reverse ? messageRacineXHTML : "") +
+            '<div class="nav">' +
+               (num == 0 ? '' : '<div class="fermer"></div><div class="lien"></div><div class="reduire"></div>') +
+               '<span class="next">&lt;</span><span class="numPage">1</span><span class="prev">&gt;</span>' +
+            '</div>' +
+            (reverse ? "" : messageRacineXHTML) +
          '</div>' +
-      '</div>'
-   )
+         (reverse ? "" : messagesXHTML) +
+      '</td>'
+    
+   $("#conversations tr").append(XHTML)
    
-   this.util.infoBulle("Aller à la première page", $("#conversations #" + this.getId() + " .numPage"))
+   this.util.infoBulle("Aller à la première page", $("#" + this.getId() + " .numPage"), euphorik.Util.positionBulleType.haut)
    if (num != 0)
    {
-      this.util.infoBulle("Créer un lien vers la conversation", $("#conversations #" + this.getId() + " .lien"))
-      this.util.infoBulle("Fermer la conversation", $("#conversations #" + this.getId() + " .fermer"))   
+      this.util.infoBulle("Créer un lien vers la conversation", $("#" + this.getId() + " .lien"))
+      this.util.infoBulle("Fermer la conversation", $("#" + this.getId() + " .fermer"))   
    }
 }
 
@@ -487,7 +518,7 @@ Conversation.prototype.majRacine = function()
       this.messagesParId[this.racine.id] = this.racine
       var element = $(this.racine.XHTML(true, this.getId()))
       this.attacherEventsSurMessage(element)
-      $("#" + this.getId() + " .titre").prepend(element)
+      $("#" + this.getId() + " .titre .messageRacine").html(element)
    }
 }
 
@@ -517,7 +548,7 @@ Conversation.prototype.colorerEntetes = function()
 
 Conversation.prototype.decolorerEntetes = function()
 {
-   $("#" + this.getId() + " .message")
+   $("#" + this.getId() + " .messages .message")
       .removeClass("reponse")
       .removeClass("repondu")
       .removeClass("proprietaire")   
@@ -530,9 +561,9 @@ Conversation.prototype.decolorerEntetes = function()
   */
 Conversation.prototype.setPage = function(pageCourante, dernierePage)
 {
-   $("#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")
+   $("#" + this.getId() + " .numPage").text(pageCourante)
+   $("#" + this.getId() + " .next").css("display", pageCourante == 1 ? "none" : "inline")
+   $("#" + this.getId() + " .prev").css("display", dernierePage ? "none" : "inline")
 }
 
 /**
@@ -542,7 +573,7 @@ Conversation.prototype.eventLien = function(fun)
 {
    var thisConversation = this
    
-   $("#conversations #" + this.getId() + " .titre .lien").click(
+   $("#" + this.getId() + " .titre .lien").click(
       function()
       {
          fun(thisConversation.num)
@@ -557,7 +588,7 @@ Conversation.prototype.eventFermer = function(fun)
 {
    var thisConversation = this
    
-   $("#conversations #" + this.getId() + " .titre .fermer").click(
+   $("#" + this.getId() + " .titre .fermer").click(
       function()
       {
          fun(thisConversation.num)
@@ -574,13 +605,13 @@ Conversation.prototype.setFunPage = function(funNext, funPrev, funReset)
 {
    var thisConversation = this
    
-   $("#conversations #" + this.getId() + " .next").click(
+   $("#" + this.getId() + " .next").click(
       function() { funNext(thisConversation.num) }
    )
-   $("#conversations #" + this.getId() + " .prev").click(
+   $("#" + this.getId() + " .prev").click(
       function() { funPrev(thisConversation.num) }
    )
-   $("#conversations #" + this.getId() + " .numPage").click(
+   $("#" + this.getId() + " .numPage").click(
       function() { funReset(thisConversation.num) }
    )
 }
@@ -609,7 +640,10 @@ Conversation.prototype.viderMessages = function()
    this.messages = []
    this.messagesParId = {}
    this.idDernierMessageAffiche = 0
-   $("#conversations #" + this.getId() + " .message").remove()
+   $("#" + this.getId() + " .messages .message").remove()
+   
+   // enlève également la racine
+   $("#" + this.getId() + " .titre .messageRacine").empty()
 }
 
 Conversation.prototype.idMessageFromString = function(idString)
@@ -625,10 +659,11 @@ Conversation.prototype.idMessageFromString = function(idString)
 Conversation.prototype.flush = function()
 {
    var thisConversation = this
+   var reverse = this.client.chatOrder == "reverse"
 
    // est-ce que le prochain message est pair ? (permet d'alterner le style des messages)
    var messagePair = (this.idDernierMessageAffiche == 0 ? true :
-      ($("#" + this.getId() + " .messages div:first").attr("class").search("messagePair") == -1)
+      ($("#" + this.getId() + " .messages div:" + (reverse ? "first" : "last")).attr("class").search("messagePair") == -1)
    )
       
    // construction de l'XHTML des messages
@@ -639,17 +674,25 @@ Conversation.prototype.flush = function()
          XHTML += this.messages[i].XHTML(messagePair, this.getId())
          messagePair = !messagePair
       }
-   
+      
    var DOM = $(XHTML)
-    
+       
    // pour chaque nouveau message au niveau du document on crée ses événements
    DOM.each(function() { thisConversation.attacherEventsSurMessage(this) })
-   DOM.prependTo("#" + this.getId() + " .messages")
+   if (reverse)
+      DOM.prependTo("#" + this.getId() + " .messages")
+   else
+      DOM.appendTo("#" + this.getId() + " .messages")
    
    // enlève les messages exedentaires
-   var nbMessagesAffiche = $("#" + this.getId() + " .message").size()   
+   var nbMessagesAffiche = $("#" + this.getId() + " .messages .message").size()   
    if (nbMessagesAffiche > this.nbMessageMax)
-      $("#conversations #" + this.getId() + " .messages .message").slice(this.nbMessageMax, nbMessagesAffiche).remove()
+   {
+      if (reverse)
+         $("#" + this.getId() + " .messages .message").slice(this.nbMessageMax, nbMessagesAffiche).remove()
+      else
+         $("#" + this.getId() + " .messages .message").slice(0, nbMessagesAffiche - this.nbMessageMax).remove()
+   }
    
    if (this.messages.length > 0)
       this.idDernierMessageAffiche = this.messages[this.messages.length-1].id
@@ -675,7 +718,7 @@ Conversation.prototype.attacherEventsSurMessage = function(element)
          thisConversation.conversations.ouvrirConversation(parseInt(idString.substring(1, racine.length - 1), 36))
          return false
       }
-   )  
+   )
        
    $(element).click(
       function(event)
@@ -722,20 +765,21 @@ Conversation.prototype.attacherEventsSurMessage = function(element)
  if (thisConversation.client.viewTimes)
     $(".dateComplete", element).show()
  else
-    $(".dateComplete", idMess).hide()
+    $(".dateComplete", element).hide()
 
- $("a[@rel*=lightbox]", idMess).lightBox()
+ $("a[@rel*=lightbox]", element).lightBox()
 
  // les outils de bannissement (uniquement pour les ekMaster)
  if (thisConversation.client.ekMaster)
-    $(".pseudo", idMess).hover(
+    $(".pseudo", element).hover(
        function(e)
        {     
           var userId = parseInt($(".id", this).text())
-          var element = $(this)
-          var h = element.height()
-          var offset = element.offset()
-          thisConversation.util.outilsBan.css("top", offset.top - 2).css("left", offset.left - 2).height(h < 16 ? 16 : h).width(element.width() + 16 * 3 + 4 + 64).prependTo(this).show()
+          var pseudo = $(this)
+          var h = pseudo.outerHeight()
+          var offset = pseudo.offset()
+          // TODO : calculer automatiquement la largeur plutôt que d'inscrire des valeurs en brut'
+          thisConversation.util.outilsBan.css("top", offset.top - 2).css("left", offset.left - 2).height(h < 16 ? 16 : h).width(pseudo.outerWidth() + 16 * 3 + 12 + 64).prependTo(this).show()
           $("img", thisConversation.util.outilsBan).unbind("click")
           $("#slap", thisConversation.util.outilsBan).click(
              function()
@@ -784,7 +828,7 @@ Conversation.prototype.afficherConversation = function(id)
    var mess = message.getConversation(this)
    
    // FIXME : cet appel est très lent
-   $("#conversations #" + this.getId() + " .message").each(
+   $("#" + this.getId() + " .messages .message").each(
       function()
       {
          var jq = $(this)
@@ -818,7 +862,7 @@ Conversation.prototype.afficherConversation = function(id)
   */
 Conversation.prototype.supprimer = function()
 {
-   $("#conversations #" + this.getId()).remove()
+   $("#" + this.getId()).remove()
 }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -874,7 +918,7 @@ Conversations.prototype.enleverMessagesRepond = function()
     
    // on réinitialise pour être sur que tout est bien enlevé
    this.messagesRepond = {}
-   $("#conversations div.message").removeClass("repondEnEvidence")
+   $("#conversations .message").removeClass("repondEnEvidence")
    $("form#posterMessage #repondA .messages").empty()
 }
 
@@ -975,7 +1019,7 @@ Conversations.prototype.afficherMessagesRepondConversations = function()
 Conversations.prototype.getJSONrafraichirMessages = function()
 {
    var mess =  {
-      "message_count" : conf.nbMessageAffiche,
+      "message_count" : euphorik.conf.nbMessageAffiche,
       "main_page" : this.client.pagePrincipale,
       "conversations" : this.getJSONConversations(),
       "troll_id" : this.trollIdCourant
@@ -1133,11 +1177,13 @@ Conversations.prototype.supprimerConversation = function(num)
   */
 Conversations.prototype.ajusterLargeurConversations = function()
 {
+   // TODO : trouver mieux !
    var largeurPourcent = (100 / this.conversations.length)   
+   // obsolète !?
    // le "- 0.01" evite que IE se chie dessus lamentablement et affiche les conversations les unes au dessus des autres
-   if($.browser["msie"])
-      largeurPourcent -= 0.05
-   $("#conversations .conversation").css("width", largeurPourcent + "%")
+   //if($.browser["msie"])
+   //    largeurPourcent -= 0.05
+   $("#conversations td").css("width", largeurPourcent + "%")
 }
 
 /**