+ * Une conversation, au niveau XHTML, est formé de deux partie, le titre et les messages.
+ * Le titre comprend la navigation par page, un bouton pour la fermer, un bouton pour la plier, un bouton
+ * pour créer un lien ainsi que le premier message.
+ * @param conversations l'ensemble des conversations
+ * @param num le numéro de la conversation
+ */
+function Conversation(conversations, num)
+{
+ this.conversations = conversations
+ this.num = num // peut changer au cours de la vie de la conversation, n'est pas un id !
+ this.id = Math.floor(Math.random() * 1000000).toString(36)
+
+ this.util = this.conversations.util
+ this.formateur = this.conversations.formateur
+ this.client = this.conversations.client
+
+ this.idDernierMessageAffiche = 0
+ this.racine = undefined
+
+ this.messages = []
+ this.messagesParId = {}
+
+ this.nbMessageMax = euphorik.conf.nbMessageAffiche // Le nombre de message affiché par page
+
+ 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"><</span><span class="numPage">1</span><span class="prev">></span>' +
+ '</div>' +
+ (reverse ? "" : messageRacineXHTML) +
+ '</div>' +
+ (reverse ? "" : messagesXHTML) +
+ '</td>'
+
+ $("#conversations tr").append(XHTML)
+
+ 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", $("#" + this.getId() + " .lien"))
+ this.util.infoBulle("Fermer la conversation", $("#" + this.getId() + " .fermer"))
+ }
+}
+
+/**
+ * @racine un message représentant la racine de la conversation, vaut undefined pour la conversation générale
+ */
+Conversation.prototype.setRacine = function(racineElement)
+{
+ this.racine = new Message(this.client, this.formateur, racineElement)
+}
+
+/**
+ * Met à jour la racine, décide de l'afficher ou non.
+ * On l'affiche uniquement si le message racine n'est pas déjà affiché sur la liste des messages.
+ */
+Conversation.prototype.majRacine = function()
+{
+ if (this.racine == undefined)
+ return
+
+ if (!(this.racine.id in this.messagesParId))
+ {
+ this.messagesParId[this.racine.id] = this.racine
+ var element = $(this.racine.XHTML(true, this.getId()))
+ this.attacherEventsSurMessage(element)
+ $("#" + this.getId() + " .titre .messageRacine").html(element)
+ }
+}
+
+Conversation.prototype.enleverMiseEnEvidence = function()
+{
+ $("#" + this.getId() + " .message").removeClass("cache")
+}
+
+Conversation.prototype.colorerEntetes = function()
+{
+ var messagesReponse = ""
+ var messagesRepondu = ""
+ var messagesProprietaire = ""
+ for (var i = 0; i < this.messages.length; i++)
+ {
+ if (this.messages[i].appartientAuClient)
+ messagesProprietaire += "#" + this.messages[i].getId(this.getId()) + ","
+ else if (this.messages[i].clientARepondu)
+ messagesRepondu += "#" + this.messages[i].getId(this.getId()) + ","
+ else if (this.messages[i].estUneReponse)
+ messagesReponse += "#" + this.messages[i].getId(this.getId()) + ","
+ }
+ $(messagesReponse).addClass("reponse")
+ $(messagesRepondu).addClass("repondu")
+ $(messagesProprietaire).addClass("proprietaire")
+}
+
+Conversation.prototype.decolorerEntetes = function()
+{
+ $("#" + this.getId() + " .messages .message")
+ .removeClass("reponse")
+ .removeClass("repondu")
+ .removeClass("proprietaire")
+}
+
+/**
+ * Défini la page courante et s'il l'on se trouve sur la dernière page.
+ * @pageCourante la page courante
+ * @dernierePage true si c'est la dernière page sinon false
+ */
+Conversation.prototype.setPage = function(pageCourante, dernierePage)
+{
+ $("#" + this.getId() + " .numPage").text(pageCourante)
+ $("#" + this.getId() + " .next").css("display", pageCourante == 1 ? "none" : "inline")
+ $("#" + this.getId() + " .prev").css("display", dernierePage ? "none" : "inline")
+}
+
+/**
+ * Evenement déclanché lors de l'insertion du lien de la conversation dans le message courant.
+ */
+Conversation.prototype.eventLien = function(fun)
+{
+ var thisConversation = this
+
+ $("#" + this.getId() + " .titre .lien").click(
+ function()
+ {
+ fun(thisConversation.num)
+ }
+ )
+}
+
+/**
+ * Evenement déclanché lors de la fermeture de la conversation.