+ 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 = []
+ this.messagesParId = {}
+ this.idDernierMessageAffiche = 0
+ $("#" + this.getId() + " .messages .message").remove()
+}
+
+Conversation.prototype.idMessageFromString = function(idString)
+{
+ return parseInt(idString.substr(4 + this.getId().length), 36)
+}
+
+/**
+ * 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.
+ */
+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:" + (reverse ? "first" : "last")).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, 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) })
+ if (reverse)
+ DOM.prependTo("#" + this.getId() + " .messages")
+ else
+ DOM.appendTo("#" + this.getId() + " .messages")
+
+ // enlève les messages exedentaires
+ var nbMessagesAffiche = $("#" + this.getId() + " .messages .message").size()
+ if (nbMessagesAffiche > this.nbMessageMax)
+ {
+ 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
+
+ // met à jour la racine de la conversation
+ this.majRacine()
+}
+
+Conversation.prototype.attacherEventsSurMessage = function(element)
+{
+ // l'id du message
+ var idMess = this.idMessageFromString($(element).attr("id"))
+
+ this.util.infoBulle("Extraction de la conversation à partir de ce message", $(".extraire", element))
+ this.util.infoBulle("Extraction de la conversation complète", $(".extraireCompletement", element))
+
+ var thisConversation = this
+ $(".lienConv", element).click(
+ function(event)
+ {
+ // FIXME : ya pas mieux ?
+ var racine = $(event.target).text()
+ thisConversation.conversations.ouvrirConversation(parseInt(idString.substring(1, racine.length - 1), 36))
+ return false
+ }
+ )
+
+ $(element).click(
+ function(event)
+ {
+ if ($(event.target).is("a") || $(event.target).parents("#outilsBan").length > 0) return
+
+ // extraction d'une conversation
+ if ($(event.target).is(".extraire"))
+ {
+ thisConversation.conversations.ouvrirConversation(idMess)
+ return
+ }
+
+ if ($(event.target).is(".extraireCompletement"))
+ {
+ thisConversation.conversations.ouvrirConversation(thisConversation.messagesParId[idMess].racineId)
+ return
+ }
+
+ // met ou enlève la mise en evidence du message
+ thisConversation.conversations.toggleMessageRepond(thisConversation.messagesParId[idMess])
+
+ // donne le focus à la ligne de saisie
+ $("form input.message").focus()
+ }
+ )
+
+ // mise en évidence de la conversation
+ $(".entete", element).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", element).show()
+ else
+ $(".dateComplete", idMess).hide()
+
+ $("a[@rel*=lightbox]", idMess).lightBox()
+
+ // les outils de bannissement (uniquement pour les ekMaster)
+ if (thisConversation.client.ekMaster)
+ $(".pseudo", idMess).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()
+ {
+ thisConversation.client.slap(userId, $("#outilsBan input").val())
+ $("#outilsBan input").val("")
+ $("#outilsBan").hide()
+ }
+ )
+ $("#kick", thisConversation.util.outilsBan).click(
+ function()
+ {
+ thisConversation.client.kick(userId, $("#outilsBan input").val())
+ $("#outilsBan input").val("")
+ $("#outilsBan").hide()
+ }
+ )
+ $("#ban", thisConversation.util.outilsBan).click(
+ function()
+ {
+ thisConversation.client.ban(userId, $("#outilsBan input").val())
+ $("#outilsBan input").val("")
+ $("#outilsBan").hide()
+ }
+ )
+ },
+ function()
+ {
+ $("#outilsBan", this).hide()
+ }
+ )
+}
+
+/**
+ * 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 thisConversation = this
+
+ var message = this.messagesParId[id]
+ if (message == undefined) return
+
+ var mess = message.getConversation(this)
+
+ // FIXME : cet appel est très lent
+ $("#" + this.getId() + " .messages .message").each(
+ function()
+ {
+ var jq = $(this)
+ var statut = mess[thisConversation.idMessageFromString(jq.attr("id"))]
+ 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()
+{
+ $("#" + this.getId()).remove()