MOD avancement dans la Grande Restructuration : découpe en sous-fichiers
[euphorik.git] / js / pageMinichat / message.js
diff --git a/js/pageMinichat/message.js b/js/pageMinichat/message.js
new file mode 100644 (file)
index 0000000..f7a1110
--- /dev/null
@@ -0,0 +1,172 @@
+// coding: utf-8\r
+// Copyright 2008 Grégory Burri\r
+//\r
+// This file is part of Euphorik.\r
+//\r
+// Euphorik is free software: you can redistribute it and/or modify\r
+// it under the terms of the GNU General Public License as published by\r
+// the Free Software Foundation, either version 3 of the License, or\r
+// (at your option) any later version.\r
+//\r
+// Euphorik is distributed in the hope that it will be useful,\r
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+// but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+// GNU General Public License for more details.\r
+//\r
+// You should have received a copy of the GNU General Public License\r
+// along with Euphorik.  If not, see <http://www.gnu.org/licenses/>.\r
\r
+function Reponse(id, pseudo, login)\r
+{\r
+   this.id = id\r
+   this.pseudo = pseudo\r
+   this.login = login\r
+   \r
+   if (this.pseudo == undefined)\r
+      this.pseudo = ""\r
+   \r
+   if (this.login == undefined)\r
+      this.login = ""\r
+}\r
+\r
+\r
+/**\r
+  * Représente un message.\r
+  */\r
+function Message(client, formateur, element)\r
+{\r
+   this.client = client\r
+   this.formateur = formateur\r
+   \r
+   this.id = element["id"]\r
+   this.auteurId = element["user_id"]\r
+   this.racineId = element["root"]\r
+   this.date = element["date"]\r
+   this.pseudo = element["nick"]\r
+   this.login = element["login"]\r
+   this.contenu = element["content"]\r
+   \r
+   this.appartientAuClient = element["owner"]\r
+   this.clientARepondu = element["answered"]\r
+   this.estUneReponse = element["is_a_reply"]\r
+   this.systeme = element["system"] // est-ce un message 'système' ?\r
+   this.setRepondA(element["answer_to"]) // un ensemble de reponse (voir Reponse) indexé par l'id du message de la reponses\r
+   this.ekMaster = element["ek_master"]\r
+   this.degreeOstentatoire = element["ostentatious_master"]\r
+}\r
+\r
+/**\r
+  * @param pre est un prefix permettant de créer un Id différent pour deux mêmes messages.\r
+  *   Cela est utile pour afficher plusieurs mêmes messages au sein d'un document XHTML.\r
+  *   voir également la fonction 'XHTML()'.\r
+  */\r
+Message.prototype.getId = function(pre)\r
+{\r
+   if (pre == undefined)\r
+      pre = ""\r
+   return pre + "mess" + this.id.toString(36)\r
+}\r
+\r
+/**\r
+  *\r
+  */\r
+Message.prototype.setRepondA = function(repondAJSON)\r
+{\r
+   var thisMessage = this\r
+   this.repondA = {}\r
+   \r
+   for(var i = 0; i < repondAJSON.length; i++)\r
+   {\r
+      thisMessage.repondA[repondAJSON[i]["id"]] = new Reponse(\r
+         repondAJSON[i]["id"],\r
+         repondAJSON[i]["nick"],\r
+         repondAJSON[i]["login"]\r
+      )\r
+   }\r
+}\r
+\r
+/**\r
+  * Renvoie les messages faisant partie d'une conversation.\r
+  * @param messages l'ensemble des messages de la conversation\r
+  * @return les id des messages qui ont été mis en evidence sous la forme\r
+  *   d'un hash (object) {id => 0 | 1 | 2 | 3}. 1 : proprietaire, 2 : reponse directe, 3 : message repondu\r
+  */\r
+Message.prototype.getConversation = function(messages)\r
+{\r
+   var thisMessage = this\r
+\r
+   // les messages faisant partie de la conversation\r
+   var messagesEnEvidence = {}\r
+   \r
+   messagesEnEvidence[this.id] = 1\r
+   \r
+   // recherche les réponses (O(n))\r
+   for (var i = 0; i < messages.messages.length; i++)\r
+      if (messages.messages[i].repondA.hasOwnProperty(this.id))\r
+         messagesEnEvidence[messages.messages[i].id] = 2\r
+   \r
+   // parcours en \r
+   var f = function(tabIds, premierNiveau)\r
+   {\r
+      for(var id in tabIds)\r
+      {\r
+         // si le message (id) a déjà été traité\r
+         if (messagesEnEvidence[id] != undefined && !premierNiveau)\r
+            continue\r
+           \r
+         var message = messages.messagesParId[id]\r
+         if (message != undefined)\r
+         {         \r
+            messagesEnEvidence[id] = premierNiveau ? 3 : (message.auteurId == thisMessage.auteurId ? 1 : 0)\r
+            f (message.repondA, false)\r
+         }\r
+      }\r
+   }\r
+   f(this.repondA, true)\r
+   \r
+   return messagesEnEvidence\r
+}\r
+\r
+/**\r
+  * Renvoie le message sous la forme de code XHTML (string) prêt à être inséré dans un document.\r
+  * Aucun callback n'est affecté.\r
+  */\r
+Message.prototype.XHTML = function(messagePair, pre)\r
+{\r
+   if (messagePair == undefined)\r
+      messagePair = true\r
+   if (pre == undefined)\r
+      pre = ""\r
+      \r
+   // construit l'identifiant de la personne\r
+   var identifiant = \r
+      this.client.nickFormat == "nick" || this.login == "" ? this.formateur.traitementComplet(this.pseudo) : \r
+      (this.client.nickFormat == "login" ? this.formateur.traitementComplet(this.login) : \r
+      this.formateur.traitementComplet(this.pseudo) + "<span class=\"login\">(" + this.formateur.traitementComplet(this.login) +")</span>" )\r
+\r
+   var XHTMLrepondA = ""\r
+   var debut = true\r
+   for (var id in this.repondA)\r
+   {\r
+      if (!debut) XHTMLrepondA += ", "\r
+      XHTMLrepondA += this.formateur.traitementComplet(this.repondA[id].pseudo)\r
+      debut = false\r
+   }\r
+   if (XHTMLrepondA != "")\r
+      XHTMLrepondA = "<span class=\"repondA\">" + XHTMLrepondA + "</span><span class=\"delimitationRepondA\"></span>"\r
+   \r
+   return "<div id=\"" + this.getId(pre) + "\" class=\"" + (messagePair ? "messagePair" : "messageImpair") + " message" +\r
+         (this.appartientAuClient ? " proprietaire" : "")  +\r
+         (this.clientARepondu ? " repondu" : "") +\r
+         (this.estUneReponse ? " reponse" : "") +\r
+         (this.systeme ? " systeme" : "") +\r
+         (this.ekMaster ? " ekMaster" + this.degreeOstentatoire : "") +\r
+      "\">" +\r
+         "<div class=\"outilsMess\"><div class=\"extraire\"></div><div class=\"extraireCompletement\"></div></div><span class=\"entete\">" +\r
+         "<span class=\"dateComplete\">[<span class=\"date\">" + this.date + "</span>]</span>" +\r
+         "<span class=\"pseudo\"><span class=\"id\" style=\"display: none\">" + this.auteurId + "</span class=\"ident\">" + identifiant + "</span></span><span class=\"delimitationEntete\"></span>" +\r
+         XHTMLrepondA +\r
+         "<span class=\"contenu\">" + this.formateur.traitementComplet(this.contenu, this.pseudo) + "</span>" +\r
+      "</div>"\r
+}\r
+\r