FIX plein de bugs introduits avec la Grand Restructuration
[euphorik.git] / js / pageMinichat / message.js
1 // coding: utf-8
2 // Copyright 2008 Grégory Burri
3 //
4 // This file is part of Euphorik.
5 //
6 // Euphorik is free software: you can redistribute it and/or modify
7 // it under the terms of the GNU General Public License as published by
8 // the Free Software Foundation, either version 3 of the License, or
9 // (at your option) any later version.
10 //
11 // Euphorik is distributed in the hope that it will be useful,
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 // but WITHOUT ANY WARRANTY; without even the implied warranty of
14 // GNU General Public License for more details.
15 //
16 // You should have received a copy of the GNU General Public License
17 // along with Euphorik. If not, see <http://www.gnu.org/licenses/>.
18
19 euphorik.Reponse = function(id, pseudo, login) {
20 this.id = id;
21 this.pseudo = pseudo;
22 this.login = login;
23 this.pseudo = pseudo || "";
24 this.login = login || "";
25 };
26
27 /**
28 * Représente un message.
29 */
30 euphorik.Message = function(client, formateur, element) {
31 this.client = client;
32 this.formateur = formateur;
33
34 this.id = element.id;
35 this.auteurId = element.user_id;
36 this.racineId = element.root;
37 this.date = element.date;
38 this.pseudo = element.nick;
39 this.login = element.login;
40 this.contenu = element.content;
41
42 this.appartientAuClient = element.owner;
43 this.clientARepondu = element.answered;
44 this.estUneReponse = element.is_a_reply;
45 this.systeme = element.system; // est-ce un message 'système' ?
46 this.setRepondA(element.answer_to); // un ensemble de reponse (voir Reponse) indexé par l'id du message de la reponses
47 this.ekMaster = element.ek_master;
48 this.degreeOstentatoire = element.ostentatious_master;
49 };
50
51 /**
52 * @param pre est un prefix permettant de créer un Id différent pour deux mêmes messages.
53 * Cela est utile pour afficher plusieurs mêmes messages au sein d'un document XHTML.
54 * voir également la fonction 'XHTML()'.
55 */
56 euphorik.Message.prototype.getId = function(pre) {
57 pre = pre || "";
58 return pre + "mess" + this.id.toString(36);
59 };
60
61 euphorik.Message.prototype.setRepondA = function(repondAJSON) {
62 var thisMessage = this;
63 this.repondA = {};
64
65 repondAJSON.each(function(i, reponse) {
66 thisMessage.repondA[reponse.id] = new euphorik.Reponse(reponse.id, reponse.nick, reponse.login);
67 });
68 };
69
70 /**
71 * Renvoie les messages faisant partie d'une conversation.
72 * @param messages l'ensemble des messages de la conversation
73 * @return les id des messages qui ont été mis en evidence sous la forme
74 * d'un hash (object) {id => 0 | 1 | 2 | 3}. 1 : proprietaire, 2 : reponse directe, 3 : message repondu
75 */
76 euphorik.Message.prototype.getConversation = function(messages) {
77 var thisMessage = this;
78
79 // les messages faisant partie de la conversation
80 var messagesEnEvidence = {};
81
82 messagesEnEvidence[this.id] = 1;
83
84 // recherche les réponses (O(n))
85 messages.messages.each(function(i, mess) {
86 if (mess.repondA.hasOwnProperty(thisMessage.id)) {
87 messagesEnEvidence[mess.id] = 2;
88 }
89 });
90
91 // parcours en largeur
92 var f = function(tabIds, premierNiveau) {
93 objectEach(tabIds, function(id) {
94 // si le message (id) a déjà été traité
95 if (messagesEnEvidence[id] || premierNiveau) {
96 var message = messages.messagesParId[id];
97 if (!message) {
98 messagesEnEvidence[id] = premierNiveau ? 3 : (message.auteurId === thisMessage.auteurId ? 1 : 0);
99 f (message.repondA, false);
100 }
101 }
102 });
103 };
104 f(this.repondA, true);
105
106 return messagesEnEvidence;
107 };
108
109 /**
110 * Renvoie le message sous la forme de code XHTML (string) prêt à être inséré dans un document.
111 * Aucun callback n'est affecté.
112 */
113 euphorik.Message.prototype.XHTML = function(messagePair, pre) {
114 messagePair = messagePair || true;
115 pre = pre || "";
116
117 thisMessage = this;
118
119 // construit l'identifiant de la personne
120 var identifiant =
121 this.client.nickFormat === "nick" || this.login === "" ? this.formateur.traitementComplet(this.pseudo) :
122 (this.client.nickFormat === "login" ? this.formateur.traitementComplet(this.login) :
123 this.formateur.traitementComplet(this.pseudo) + "<span class=\"login\">(" + this.formateur.traitementComplet(this.login) +")</span>" );
124
125 var XHTMLrepondA = "";
126 var debut = true;
127 objectEach(this.repondA, function(id, rep) {
128 if (!debut) {
129 XHTMLrepondA += ", ";
130 }
131 XHTMLrepondA += thisMessage.formateur.traitementComplet(rep.pseudo);
132 debut = false;
133 });
134 if (XHTMLrepondA) {
135 XHTMLrepondA = "<span class=\"repondA\">" + XHTMLrepondA + "</span><span class=\"delimitationRepondA\"></span>";
136 }
137
138 return "<div id=\"" + this.getId(pre) + "\" class=\"" + (messagePair ? "messagePair" : "messageImpair") + " message" +
139 (this.appartientAuClient ? " proprietaire" : "") +
140 (this.clientARepondu ? " repondu" : "") +
141 (this.estUneReponse ? " reponse" : "") +
142 (this.systeme ? " systeme" : "") +
143 (this.ekMaster ? " ekMaster" + this.degreeOstentatoire : "") +
144 "\">" +
145 "<div class=\"outilsMess\"><div class=\"extraire\"></div><div class=\"extraireCompletement\"></div></div><span class=\"entete\">" +
146 "<span class=\"dateComplete\">[<span class=\"date\">" + this.date + "</span>]</span>" +
147 "<span class=\"pseudo\"><span class=\"id\" style=\"display: none\">" + this.auteurId + "</span class=\"ident\">" + identifiant + "</span></span><span class=\"delimitationEntete\"></span>" +
148 XHTMLrepondA +
149 "<span class=\"contenu\">" + this.formateur.traitementComplet(this.contenu, this.pseudo) + "</span>" +
150 "</div>";
151 };