+/**
+ * Supprime une conversation.
+ */
+Conversation.prototype.supprimer = function()
+{
+ jQuery("#conversations #" + this.getId()).remove()
+}
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+/**
+ * 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.nouvelleConversation(0)
+
+ this.idDernierMessage = null // l'id du dernier message connu
+
+ // l'objet XMLHttpRequest représentant la connexion d'attente
+ this.attenteCourante = null
+}
+
+/**
+ * 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")
+
+ if (this.client.identifie())
+ {
+ var nodeCookie= XMLDocument.createElement("cookie")
+ nodeCookie.appendChild(XMLDocument.createTextNode(this.client.cookie))
+ XMLDocument.documentElement.appendChild(nodeCookie)
+ }
+
+ if (this.idDernierMessage != null)
+ {
+ var nodeDernierMessageId = XMLDocument.createElement("dernierMessageId")
+ nodeDernierMessageId.appendChild(XMLDocument.createTextNode(this.idDernierMessage))
+ XMLDocument.documentElement.appendChild(nodeDernierMessageId)
+ }
+
+ var nodeNombreMessage = XMLDocument.createElement("nombreMessage")
+ nodeNombreMessage.appendChild(XMLDocument.createTextNode(conf.nbMessageAffiche))
+ XMLDocument.documentElement.appendChild(nodeNombreMessage)
+
+ return XMLDocument;
+}
+
+/**
+ * Ajoute un ensemble de messages puis les affiches.
+ * @param elements un tableau d'éléments représentant les messages, voir protocole.txt
+ * @param numConversation le numéro de la conversation auquel appartiennent les messages
+ */
+Messages.prototype.ajouterMessages = function(elements, numConversation)
+{
+ for (var i = 0; i < elements.length; i++)
+ this.ajouterMessage(elements[i], numConversation)
+ this.flush(numConversation)
+}
+
+/**
+ * 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)
+{
+ var thisMessages = this
+
+ // pas d'utilisation de jquery pour des raisons de performance
+ var id = element.getAttribute("id")
+ if (this.idDernierMessage == null || parseInt(id, 36) > parseInt(this.idDernierMessage, 36))
+ this.idDernierMessage = id
+
+ var message = new Message(
+ id, \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.nouvelleConversation(
+ numConversation,
+ function(num) // fermeture de la conversation
+ {
+ thisMessages.supprimerConversation(num)
+ }
+ )
+ }
+
+ this.conversations[numConversation].ajouterMessage(message)
+}
+
+Messages.prototype.nouvelleConversation = function(num, funFermer)
+{
+ var thisMessages = this
+
+ this.conversations[num] = new Conversation(num, this.util, this.formateur, funFermer)
+
+ this.conversations[num].setFunPage(
+ function(num) // page suivante
+ {
+ thisMessages.client.pageSuivante(num - 1)
+ thisMessages.rafraichirMessages(true)
+ },
+ function(num) // page précédente
+ {
+ thisMessages.client.pagePrecedente(num - 1)
+ thisMessages.rafraichirMessages(true)
+ },
+ function(num) // retour à la page une
+ {
+ if (thisMessages.client.goPremierePage(num - 1))
+ thisMessages.rafraichirMessages(true)
+ }
+ )
+
+ this.ajusterLargeurConversations()
+}
+
+/**
+ * Enlève une conversation.
+ */
+Messages.prototype.supprimerConversation = function(num)
+{
+ if (num <= 0 || num >= this.conversations.length) return // la numéro 0 ne peut être supprimé
+ this.conversations[num].supprimer()
+
+ // décalage TODO : supprimer le dernier élément
+ for (var i = num; i < this.conversations.length - 1; i++)
+ {
+ this.conversations[i] = this.conversations[i+1]
+ this.conversations[i].num -= 1
+ }
+ this.conversations.pop()
+ this.ajusterLargeurConversations()
+
+ this.client.supprimerConversation(num-1)
+
+ this.rafraichirMessages(true)
+}
+
+/**
+ * Ajuste la largeur des conversations en fonction de leur nombre. modifie l'attribut CSS 'width'.
+ */
+Messages.prototype.ajusterLargeurConversations = function()
+{
+ jQuery("#conversations .conversation").css("width", 100 / this.conversations.length + "%")
+}
+
+/**
+ * Demande à toutes les conversations de se flusher (afficher les messages non-affichés).
+ */
+Messages.prototype.flushAll = function()
+{
+ for (var i = 0; i < this.conversations.length; i++)
+ this.flush(i)
+}
+
+/**
+ * Demande à une conversation de se flusher.
+ */
+Messages.prototype.flush = function(numConv)
+{
+ var thisMessages = this
+
+ this.conversations[numConv].flush
+ (
+ // fonction appelée lors de la demande d'extraction d'une conversation
+ function(idMess)
+ {
+ if (thisMessages.client.ajouterConversation(idMess))
+ thisMessages.rafraichirMessages(true)
+ }
+ )
+}
+