MOD Avancement sur les conversations (pas fini)
[euphorik.git] / js / pageMinichat.js
index 3093807..223f6c9 100755 (executable)
@@ -205,10 +205,9 @@ PageMinichat.prototype.envoyerMessage = function(pseudo, message)
          data : this.util.xmlVersAction(this.getXMLMessage(pseudo, message, repondA)),\r
          dataType : "xml",\r
          success : function(data, textStatus)\r
-         {\r
-            // TODO : traiter les erreurs\r
-            //alert(data)\r
-            jQuery("form input.message").val("")\r
+         {
+            if(jQuery("statut", data.documentElement).text() == "ok")\r
+               jQuery("form input.message").val("")\r
          }\r
       }\r
    )
@@ -307,99 +306,37 @@ Message.prototype.afficherConversation = function(messages)
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
 /**
-  * Représente l'ensemble des messages affichés.
+  * Représente une conversation.
   */
-function Messages(client, formateur, util)
+function Conversation()
 {
-   this.client = client
-   this.formateur = formateur
-   this.util = util
-
-   this.nbMessageMax = conf.nbMessageAffiche // Le nombre de message affiché par page
-   this.idDernierMesssage = null // l'id du dernier message connu
-   this.page = 1 // par défaut on se trouve sur la première page
-   
    this.messages = new Array()
    this.messagesParId = new Object()
    
-   // l'objet XMLHttpRequest représentant la connexion d'attente
-   this.attenteCourante = null
-   
-   var messageOver = null // element
-}
+   this.idDernierMesssage = null // la racine de la conversation (string), null = conversation principale
 
-/**
-  * Crée un document XML contenant le message demandant un rafraichissement.
-  */
-Messages.prototype.getXMLrafraichirMessages = function()
-{
-   var XMLDocument = this.util.creerDocumentXMLAction()
-   XMLDocument.documentElement.setAttribute("name", "refreshMessages")
-   \r
-   //alert(this.util.serializer.serializeToString(XMLDocument))\r
-   
-   if (this.client.identifie())
-   {
-      var nodeCookie= XMLDocument.createElement("cookie")
-      nodeCookie.appendChild(XMLDocument.createTextNode(this.client.cookie))
-      XMLDocument.documentElement.appendChild(nodeCookie)
-   }
-   
-   if (this.idDernierMesssage != null)
-   {
-      var nodeDernierMessageId = XMLDocument.createElement("dernierMessageId")
-      nodeDernierMessageId.appendChild(XMLDocument.createTextNode(this.idDernierMesssage))
-      XMLDocument.documentElement.appendChild(nodeDernierMessageId)
-   }
-   
-   var nodeNombreMessage = XMLDocument.createElement("nombreMessage")
-   nodeNombreMessage.appendChild(XMLDocument.createTextNode(this.nbMessageMax))
-   XMLDocument.documentElement.appendChild(nodeNombreMessage)
-   
-   var nodePage = XMLDocument.createElement("page")
-   nodePage.appendChild(XMLDocument.createTextNode(this.page))
-   XMLDocument.documentElement.appendChild(nodePage)
-   
-   return XMLDocument;
+   this.page = 1 // par défaut on se trouve sur la première page
 }
 
-/**
-  * Création d'un nouveau message.
-  * Les message sont données dans l'ordre de leur id.
-  * Met directement à jour l'affichage.
-  * @param element un element xml représentant le message
-  * @param autoFlush si oui alors le message est directement ajouté à la vue
-  */
-Messages.prototype.ajouterMessage = function(element, autoFlush)
+Conversation.prototype.ajouterMessage = function(message)
 {
-   if (autoFlush == undefined) autoFlush = true // valeur par défaut
-
-   // pas d'utilisation de jquery pour des raisons de performance
-   this.idDernierMesssage = element.getAttribute("id")
-   
-   var message = new Message(
-      this.idDernierMesssage,      \r
-      jQuery("date", element).text(),\r
-      jQuery("pseudo", element).text(),\r
-      jQuery("contenu", element).text()
-   )   \r
-   
-   message.appartientAuClient = jQuery("proprietaire", element).text() == "true"
-   message.clientARepondu = jQuery("repondu", element).text() == "true"
-   message.estUneReponse = jQuery("reponse", element).text() == "true"  
-   message.systeme = jQuery("systeme", element).text() == "true" 
-   message.setRepondA(jQuery("repondA", element))
-   
    this.messages.push(message)
    this.messagesParId[message.id] = message
    if (this.messages.length > this.nbMessageMax)
       delete this.messagesParId[this.messages.shift().id]
+}
 
-   if (autoFlush)
-      this.flush()   
+Conversation.prototype.viderMessages = function()
+{
+   this.messages = new Array()
+   jQuery("#messages").empty()
 }
 
-Messages.prototype.flush = function()
+/**
+  * Après l'ajout d'un ou plusieurs message cette méthode est appelée afin
+  * d'afficher les messages non-affichés.
+  */
+Conversation.prototype.flush = function()
 {
    var thisMessages = this
 
@@ -426,8 +363,8 @@ Messages.prototype.flush = function()
                "<div class=\"contenu\">" + (message.systeme ? this.formateur.remplacerBalisesHTML(message.contenu) : this.formateur.traitementComplet(message.contenu, message.pseudo))+ "</div>" +
             "</div>"
       }
-   jQuery("#messages").prepend(XHTML)\r
-   \r
+   jQuery("#messages").prepend(XHTML)
+   
    if (myLightbox != null)
       myLightbox.updateImageList()
    
@@ -440,8 +377,8 @@ Messages.prototype.flush = function()
       {
          jQuery(this).click(
             function(event)
-            {\r
-               if (jQuery(event.target).is("a")) return\r
+            {
+               if (jQuery(event.target).is("a")) return
             
                var valCourant = jQuery("input.message").val()
                if (valCourant == undefined) valCourant = ""
@@ -467,6 +404,116 @@ Messages.prototype.flush = function()
    )
 }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+/**
+  * Représente l'ensemble des messages affichés.
+  */
+function Messages(client, formateur, util)
+{
+   this.client = client
+   this.formateur = formateur
+   this.util = util
+   
+   this.conversations = new Array() // les conversations, la première représente la conversation principale
+   this.conversations[0] = new Conversation()
+
+   this.idDernierMesssage = null // l'id du dernier message connu
+   
+   // l'objet XMLHttpRequest représentant la connexion d'attente
+   this.attenteCourante = null
+   
+   var messageOver = null // element
+}
+
+/**
+  * Crée un document XML contenant le message demandant un rafraichissement.
+  */
+Messages.prototype.getXMLrafraichirMessages = function()
+{
+   var XMLDocument = this.util.creerDocumentXMLAction()
+   XMLDocument.documentElement.setAttribute("name", "refreshMessages")
+   \r
+   //alert(this.util.serializer.serializeToString(XMLDocument))\r
+   
+   if (this.client.identifie())
+   {
+      var nodeCookie= XMLDocument.createElement("cookie")
+      nodeCookie.appendChild(XMLDocument.createTextNode(this.client.cookie))
+      XMLDocument.documentElement.appendChild(nodeCookie)
+   }
+   
+   if (this.idDernierMesssage != null)
+   {
+      var nodeDernierMessageId = XMLDocument.createElement("dernierMessageId")
+      nodeDernierMessageId.appendChild(XMLDocument.createTextNode(this.idDernierMesssage))
+      XMLDocument.documentElement.appendChild(nodeDernierMessageId)
+   }
+   
+   var nodeNombreMessage = XMLDocument.createElement("nombreMessage")
+   nodeNombreMessage.appendChild(XMLDocument.createTextNode(conf.nbMessageAffiche))
+   XMLDocument.documentElement.appendChild(nodeNombreMessage)
+   
+   var nodePage = XMLDocument.createElement("page")
+   nodePage.appendChild(XMLDocument.createTextNode(this.conversation[0].page))
+   XMLDocument.documentElement.appendChild(nodePage)
+   
+   // les conversations
+   for (var i = 1; i < this.conversations.length; i++)
+   {
+      var nodeConversation = XMLDocument.createElement("conversation")
+      XMLDocument.documentElement.appendChild(nodeConversation)
+      
+      var nodeRacine = XMLDocument.createElement("racine")
+      nodeRacine.appendChild(XMLDocument.createTextNode(this.conversation.racine))
+      nodeConversation.appendChild(nodeRacine)
+      
+      var nodePageConv = XMLDocument.createElement("page")
+      nodePageConv.appendChild(XMLDocument.createTextNode(this.conversation.page))
+      nodeConversation.appendChild(nodePageConv)
+   }
+   
+   return XMLDocument;
+}
+
+/**
+  * Création d'un nouveau message.
+  * Les message sont données dans l'ordre de leur id.
+  * @param element un element xml représentant le message
+  * @param numConversation le numéro de la conversation, 0 = principale
+  */
+Messages.prototype.ajouterMessage = function(element, numConversation)
+{
+   // pas d'utilisation de jquery pour des raisons de performance
+   this.idDernierMesssage = element.getAttribute("id")
+   
+   var message = new Message(
+      this.idDernierMesssage,      \r
+      jQuery("date", element).text(),\r
+      jQuery("pseudo", element).text(),\r
+      jQuery("contenu", element).text()
+   )   \r
+   
+   message.appartientAuClient = jQuery("proprietaire", element).text() == "true"
+   message.clientARepondu = jQuery("repondu", element).text() == "true"
+   message.estUneReponse = jQuery("reponse", element).text() == "true"  
+   message.systeme = jQuery("systeme", element).text() == "true" 
+   message.setRepondA(jQuery("repondA", element))
+   
+   if (this.conversations[numConversation] == null)
+      this.conversations[numConversation] = new Conversation()
+   this.conversations[numConversation].ajouterMessage(message)
+}
+
+/**
+  * Demande à toutes les conversations de se flusher (afficher les messages non-affichés).
+  */
+Messages.prototype.flush = function()
+{
+   for (var i = 0; i < this.conversations.length; i++)
+      this.conversations[i].flush().
+}
+
 /**
   * Etablit une liste des messages à mettre en evidence et des messages à cacher.
   * Puis applique un plan diabolique.
@@ -497,8 +544,9 @@ Messages.prototype.afficherConversation = function(element)
 Messages.prototype.viderMessages = function()
 {
    this.idDernierMesssage = null
-   this.messages = new Array()
-   jQuery("#messages").empty()
+   
+   for (var i = 0; i < this.conversations.length; i++)
+      this.conversations[i].viderMessages()
 }
 
 /**
@@ -523,6 +571,7 @@ Messages.prototype.rafraichirMessages = function(vider)
    var thisMessages = this // caisupair javacrypte\r
       
    //this.util.log(this.util.serializer.serializeToString(this.getXMLrafraichirMessages()))   
+   //alert(this.util.xmlVersAction(this.getXMLrafraichirMessages()).action)
    this.attenteCourante = jQuery.ajax({
          type: "POST",
          url: "request",
@@ -536,15 +585,25 @@ Messages.prototype.rafraichirMessages = function(vider)
                if (vider)
                   thisMessages.viderMessages()
                
-               thisMessages.MAJPages(parseInt(jQuery("nbPage", data.documentElement).text()))
+               //thisMessages.MAJPages(parseInt(jQuery("nbPage", data.documentElement).text()))
                
-               reponse = jQuery("message", data.documentElement).each(
+               // ajoute chaque message reçu à sa conversation respective
+               jQuery("conversation", data.documentElement).each(
                   function(i)
                   {
-                     thisMessages.ajouterMessage(this, false) 
+                     jQuery("message", this).each(
+                        function(j)
+                        {
+                           thisMessages.ajouterMessage(this, numConv) 
+                        }
+                     )
                   }
                )
-               thisMessages.flush()               
+               
+               // demande à toutes les conversations d'afficher les messages non-affichés
+               thisMessages.flush()
+               
+               // rappel de la fonction dans 100 ms
                setTimeout(function(){ thisMessages.rafraichirMessages() }, 100);
             },
          error:
@@ -556,6 +615,7 @@ Messages.prototype.rafraichirMessages = function(vider)
    )
 }
 
+/* Osbolète
 Messages.prototype.MAJPages = function(nbPage)
 {
    //alert(nbPage)
@@ -578,8 +638,9 @@ Messages.prototype.MAJPages = function(nbPage)
          }
       )
    }
-}
+}*/
 
+/* Obsolète
 Messages.prototype.allerSurLaPage = function(page)
 {            
    if (page == this.page)
@@ -600,5 +661,5 @@ Messages.prototype.allerSurLaPage = function(page)
    )
 
    this.rafraichirMessages(true)
-}
+}*/