67ba7e6909dda11256ae113dc10d884a725a0d00
[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 // l'ensemble des id des messages qui reponde à ce message, exemple : {45:true, 32:true} (le 'true' ne sert à rien ^_^)
43 // mis à jour au fur à mesure que des messages sont ajoutés aux conversations
44 this.estReponduPar = {};
45
46 this.appartientAuClient = element.owner;
47 this.clientARepondu = element.answered;
48 this.estUneReponse = element.is_a_reply;
49 this.systeme = element.system; // est-ce un message 'système' ?
50 this.setRepondA(element.answer_to); // un ensemble de reponse (voir Reponse) indexé par l'id du message de la reponses
51 this.ekMaster = element.ek_master;
52 this.degreeOstentatoire = element.ostentatious_master;
53 };
54
55 /**
56 * @param pre est un prefix permettant de créer un Id différent pour deux mêmes messages.
57 * Cela est utile pour afficher plusieurs mêmes messages au sein d'un document XHTML.
58 * voir également la fonction 'XHTML()'.
59 */
60 euphorik.Message.prototype.getId = function(pre) {
61 pre = pre || "";
62 return pre + "mess" + this.id.toString(36);
63 };
64
65 euphorik.Message.prototype.setRepondA = function(repondAJSON) {
66 var thisMessage = this;
67 this.repondA = {};
68
69 repondAJSON.each(function(i, reponse) {
70 thisMessage.repondA[reponse.id] = new euphorik.Reponse(reponse.id, reponse.nick, reponse.login);
71 });
72 };
73
74 /**
75 * Renvoie les messages faisant partie d'une conversation.
76 * @param messages l'ensemble des messages de la conversation
77 * @return les id des messages qui ont été mis en evidence sous la forme
78 * d'un hash (object) {id => 0 | 1 | 2 | 3}. 1 : proprietaire, 2 : reponse directe, 3 : message repondu
79 */
80 euphorik.Message.prototype.getConversation = function(messages) {
81 var thisMessage = this;
82
83 // les messages faisant partie de la conversation
84 var messagesEnEvidence = {};
85 messagesEnEvidence[this.id] = 1;
86
87 // parcours en profondeur
88 var f = function(ids, premierNiveau, ensemble, evidence) {
89 objectEach(ids, function(id) {
90 if (!messagesEnEvidence[id] || premierNiveau) {
91 var message = messages.messagesParId[id];
92 if (message) {
93 messagesEnEvidence[id] = premierNiveau ? evidence : (message.auteurId === thisMessage.auteurId ? 1 : 0);
94 f(message[ensemble], false, ensemble, evidence);
95 }
96 }
97 });
98 };
99
100 // remonte le temps
101 f(this.estReponduPar, true, "estReponduPar", 2);
102
103 // descent le temps
104 f(this.repondA, true, "repondA", 3);
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 };