+ delete this.messagesParId[this.messages.shift().id]
+}
+
+/**
+ * FIXME : méthode très lourde. ne serait-ce pas mieux de virer d'un coup l'élément conversation et d'en remettre un vide ?
+ */
+Conversation.prototype.viderMessages = function()
+{
+ this.messages = new Array()
+ this.idDernierMessageAffiche = 0
+ $("#conversations #" + this.getId() + " .message").remove()
+}
+
+/**
+ * Après l'ajout d'un ou plusieurs message cette méthode est appelée afin
+ * d'afficher les messages non-affichés.
+ * FIXME : méthode super lourde, à optimiser.
+ * @param funClickExtract fonction (fun(numMess)) appelée lors du clic sur un bouton "extraire"
+ * @param funClickMessage fonction (fun(numMess)) appelée lors du clic sur un message
+ */
+Conversation.prototype.flush = function(funClickOuvrirConv, funClickMessage)
+{
+ var thisConversation = this
+
+ // est-ce que le prochain message est pair ? (permet d'alterner le style des messages)
+ var messagePair = (this.idDernierMessageAffiche == 0 ? true :
+ ($("#conversations #" + this.getId() + " div:first").attr("class").search("messagePair") == -1)
+ )
+
+ // construction de l'XHTML des messages
+ var XHTML = ""
+ for (var i = 0; i < this.messages.length; i++)
+ if (this.messages[i].id > this.idDernierMessageAffiche)
+ {
+ XHTML += this.messages[i].XHTML(messagePair)
+ messagePair = !messagePair
+ }
+
+ var DOM = $(XHTML)
+ DOM.each(
+ function()
+ {
+ $(".lienConv", this).click(
+ function(event)
+ {
+ // FIXME : ya pas mieux ?
+ var racine = $(event.target).text()
+ funClickOuvrirConv(parseInt(racine.substring(1, racine.length - 1), 36))
+ return false
+ }
+ )
+
+ thisConversation.util.infoBulle("Extraction de la conversation à partir de ce message", $(".extraire", this))
+ thisConversation.util.infoBulle("Extraction de la conversation complète", $(".extraireCompletement", this))
+
+ // l'id du message
+ var idMess = parseInt($(this).attr("id").substr(4), 36)
+
+ $(this).click(
+ function(event)
+ {
+ if ($(event.target).is("a") || $(event.target).parents("#outilsBan").length > 0) return
+
+ // extraction d'une conversation
+ if ($(event.target).is(".extraire"))
+ {
+ funClickOuvrirConv(idMess)
+ return
+ }
+
+ if ($(event.target).is(".extraireCompletement"))
+ {
+ funClickOuvrirConv(thisConversation.messagesParId[idMess].racineId)
+ return
+ }
+
+ funClickMessage(thisConversation.messagesParId[idMess])
+ }
+ )
+
+ // mise en évidence de la conversation
+ $(".entete", this).hover(
+ function()
+ {
+ thisConversation.decolorerEntetes()
+ thisConversation.afficherConversation(idMess)
+ },
+ // quand on sort de l'entête du message la mise en évidence est enlevée
+ function()
+ {
+ thisConversation.enleverMiseEnEvidence()
+ thisConversation.decolorerEntetes()
+ thisConversation.colorerEntetes()
+ }
+ )
+
+ if (thisConversation.client.viewTimes)
+ $(".dateComplete", this).show()
+ else
+ $(".dateComplete", this).hide()
+
+ $("a[@rel*=lightbox]", this).lightBox()
+
+ // les outils de bannissement (uniquement pour les ekMaster)
+ if (thisConversation.client.ekMaster)
+ $(".pseudo", this).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()
+ $("img", thisConversation.util.outilsBan).unbind("click")
+ $("#slap", thisConversation.util.outilsBan).click(
+ function(e)
+ {
+ thisConversation.client.slap(userId, $("#outilsBan input").val())
+ $("#outilsBan input").val("")
+ $("#outilsBan").hide()
+ }
+ )
+ $("#kick", thisConversation.util.outilsBan).click(
+ function(e)
+ {
+ thisConversation.client.kick(userId, $("#outilsBan input").val())
+ $("#outilsBan input").val("")
+ $("#outilsBan").hide()
+ }
+ )
+ $("#ban", thisConversation.util.outilsBan).click(
+ function(e)
+ {
+ thisConversation.client.ban(userId, $("#outilsBan input").val())
+ $("#outilsBan input").val("")
+ $("#outilsBan").hide()
+ }
+ )
+ },
+ function(e)
+ {
+ $("#outilsBan", this).hide()
+ }
+ )
+ }
+ )
+ DOM.prependTo("#conversations #" + this.getId())
+
+ // enlève les messages exedentaires
+ var nbMessagesAffiche = $("#conversations #" + this.getId() + " .message").size()
+ if (nbMessagesAffiche > this.nbMessageMax)
+ $("#conversations #" + this.getId() + " .message").slice(this.nbMessageMax, nbMessagesAffiche).remove()
+
+ if (this.messages.length > 0)
+ this.idDernierMessageAffiche = this.messages[this.messages.length-1].id
+}
+
+/**
+ * Etablit une liste des messages à mettre en evidence et des messages à cacher.
+ * Puis applique un plan diabolique.
+ * @param id l'id du message
+ */
+Conversation.prototype.afficherConversation = function(id)
+{
+ var message = this.messagesParId[id]
+ if (message == undefined) return
+
+ var mess = message.getConversation(this)
+
+ // FIXME : cet appel est très lent
+ $("#conversations #" + this.getId() + " .message").each(
+ function()
+ {
+ var jq = $(this)
+ var statut = mess[parseInt(jq.attr("id").substr(4), 36)]
+ if (statut == undefined)
+ jq.addClass("cache")
+ else
+ {
+ jq.removeClass("cache")
+ switch (statut)
+ {
+ // "repondu" et "reponse" sont prioritaitres à "proprietaire"
+ // contrairement à la vue normale (sans mise en évidence d'une conversation)
+ case 3 :
+ jq.addClass("repondu")
+ break;
+ case 2 :
+ jq.addClass("reponse")
+ break;
+ case 1 :
+ jq.addClass("proprietaire")
+ break;
+ }
+ }
+ }
+ )
+}
+
+/**
+ * Supprime une conversation.
+ */
+Conversation.prototype.supprimer = function()
+{
+ $("#conversations #" + this.getId()).remove()