51d84b9cf8898e387790cb6b27cc6a641bbd0753
[euphorik.git] / js / chat / 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, nick, login) {
20 this.id = id;
21 this.nick = nick || "";
22 this.login = login || "";
23 };
24
25 /**
26 * Représente un message.
27 */
28 euphorik.Message = function(client, formater, element) {
29 this.client = client;
30 this.formater = formater;
31
32 this.id = element.id;
33 this.auteurId = element.user_id;
34 this.racineId = element.root;
35 this.date = element.date;
36 this.nick = element.nick;
37 this.login = element.login;
38 this.contenu = element.content;
39
40 // l'ensemble des id des messages qui reponde à ce message, exemple : {45:true, 32:true} (le 'true' ne sert à rien ^_^)
41 // mis à jour au fur à mesure que des messages sont ajoutés aux conversations
42 this.estReponduPar = {};
43
44 this.appartientAuClient = element.owner;
45 this.clientARepondu = element.answered;
46 this.estUneReponse = element.is_a_reply;
47 this.systeme = element.system; // est-ce un message 'système' ?
48 this.setRepondA(element.answer_to); // un ensemble de reponse (voir Reponse) indexé par l'id du message de la reponses
49 this.ekMaster = element.ek_master;
50 this.degreeOstentatoire = element.ostentatious_master;
51 };
52
53 /**
54 * @param pre est un prefix permettant de créer un Id différent pour deux mêmes messages.
55 * Cela est utile pour afficher plusieurs mêmes messages au sein d'un document XHTML.
56 * voir également la fonction 'XHTML()'.
57 */
58 euphorik.Message.prototype.getId = function(pre) {
59 pre = pre || "";
60 return pre + "mess" + this.id.toString(36);
61 };
62
63 euphorik.Message.prototype.setRepondA = function(repondAJSON) {
64 var thisMessage = this;
65 this.repondA = {};
66
67 repondAJSON.each(function(i, reponse) {
68 thisMessage.repondA[reponse.id] = new euphorik.Reponse(reponse.id, reponse.nick, reponse.login);
69 });
70 };
71
72 /**
73 * Renvoie les messages faisant partie d'une conversation.
74 * @param messages l'ensemble des messages de la conversation
75 * @return les id des messages qui ont été mis en evidence sous la forme
76 * d'un hash (object) {id => 0 | 1 | 2 | 3}. 1 : proprietaire, 2 : reponse directe, 3 : message repondu
77 */
78 euphorik.Message.prototype.getConversation = function(messages) {
79 var thisMessage = this;
80
81 // les messages faisant partie de la conversation
82 var messagesEnEvidence = {};
83 messagesEnEvidence[this.id] = 1;
84
85 // parcours en profondeur
86 var f = function(ids, premierNiveau, ensemble, evidence) {
87 objectEach(ids, function(id) {
88 if (!messagesEnEvidence[id] || premierNiveau) {
89 var message = messages.messagesParId[id];
90 if (message) {
91 messagesEnEvidence[id] = premierNiveau ? evidence : (message.auteurId === thisMessage.auteurId ? 1 : 0);
92 f(message[ensemble], false, ensemble, evidence);
93 }
94 }
95 });
96 };
97
98 // remonte le temps
99 f(this.estReponduPar, true, "estReponduPar", 2);
100
101 // descent le temps
102 f(this.repondA, true, "repondA", 3);
103
104 return messagesEnEvidence;
105 };
106
107 /**
108 * Renvoie le message sous la forme de code XHTML (string) prêt à être inséré dans un document.
109 * Aucun callback n'est affecté.
110 */
111 euphorik.Message.prototype.XHTML = function(messagePair, pre) {
112 if (messagePair === undefined) {
113 messagePair = true;
114 }
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.formater.completeProcessing(this.nick) :
122 (this.client.nickFormat === "login" ? this.formater.completeProcessing(this.login) :
123 this.formater.completeProcessing(this.nick) + "<span class=\"login\">(" + this.formater.completeProcessing(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.formater.completeProcessing(rep.nick);
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 "<span class=\"entete\">" +
146 "<span class=\"dateComplete\">[<span class=\"date\">" + this.date + "</span>]</span>" +
147 "<span class=\"nick\"><span class=\"id\" style=\"display: none\">" + this.auteurId + "</span><span class=\"ident\">" + identifiant + "</span></span>" +
148 "</span>" +
149 "<span class=\"delimitationEntete\"></span>" +
150 XHTMLrepondA +
151 "<span class=\"contenu\">" + this.formater.completeProcessing(this.contenu, this.nick) + "</span>" +
152 "</div>";
153 };