MOD avancement dans la Grande Restructuration : découpe en sous-fichiers
[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 function Reponse(id, pseudo, login)
20 {
21 this.id = id
22 this.pseudo = pseudo
23 this.login = login
24
25 if (this.pseudo == undefined)
26 this.pseudo = ""
27
28 if (this.login == undefined)
29 this.login = ""
30 }
31
32
33 /**
34 * Représente un message.
35 */
36 function Message(client, formateur, element)
37 {
38 this.client = client
39 this.formateur = formateur
40
41 this.id = element["id"]
42 this.auteurId = element["user_id"]
43 this.racineId = element["root"]
44 this.date = element["date"]
45 this.pseudo = element["nick"]
46 this.login = element["login"]
47 this.contenu = element["content"]
48
49 this.appartientAuClient = element["owner"]
50 this.clientARepondu = element["answered"]
51 this.estUneReponse = element["is_a_reply"]
52 this.systeme = element["system"] // est-ce un message 'système' ?
53 this.setRepondA(element["answer_to"]) // un ensemble de reponse (voir Reponse) indexé par l'id du message de la reponses
54 this.ekMaster = element["ek_master"]
55 this.degreeOstentatoire = element["ostentatious_master"]
56 }
57
58 /**
59 * @param pre est un prefix permettant de créer un Id différent pour deux mêmes messages.
60 * Cela est utile pour afficher plusieurs mêmes messages au sein d'un document XHTML.
61 * voir également la fonction 'XHTML()'.
62 */
63 Message.prototype.getId = function(pre)
64 {
65 if (pre == undefined)
66 pre = ""
67 return pre + "mess" + this.id.toString(36)
68 }
69
70 /**
71 *
72 */
73 Message.prototype.setRepondA = function(repondAJSON)
74 {
75 var thisMessage = this
76 this.repondA = {}
77
78 for(var i = 0; i < repondAJSON.length; i++)
79 {
80 thisMessage.repondA[repondAJSON[i]["id"]] = new Reponse(
81 repondAJSON[i]["id"],
82 repondAJSON[i]["nick"],
83 repondAJSON[i]["login"]
84 )
85 }
86 }
87
88 /**
89 * Renvoie les messages faisant partie d'une conversation.
90 * @param messages l'ensemble des messages de la conversation
91 * @return les id des messages qui ont été mis en evidence sous la forme
92 * d'un hash (object) {id => 0 | 1 | 2 | 3}. 1 : proprietaire, 2 : reponse directe, 3 : message repondu
93 */
94 Message.prototype.getConversation = function(messages)
95 {
96 var thisMessage = this
97
98 // les messages faisant partie de la conversation
99 var messagesEnEvidence = {}
100
101 messagesEnEvidence[this.id] = 1
102
103 // recherche les réponses (O(n))
104 for (var i = 0; i < messages.messages.length; i++)
105 if (messages.messages[i].repondA.hasOwnProperty(this.id))
106 messagesEnEvidence[messages.messages[i].id] = 2
107
108 // parcours en
109 var f = function(tabIds, premierNiveau)
110 {
111 for(var id in tabIds)
112 {
113 // si le message (id) a déjà été traité
114 if (messagesEnEvidence[id] != undefined && !premierNiveau)
115 continue
116
117 var message = messages.messagesParId[id]
118 if (message != undefined)
119 {
120 messagesEnEvidence[id] = premierNiveau ? 3 : (message.auteurId == thisMessage.auteurId ? 1 : 0)
121 f (message.repondA, false)
122 }
123 }
124 }
125 f(this.repondA, true)
126
127 return messagesEnEvidence
128 }
129
130 /**
131 * Renvoie le message sous la forme de code XHTML (string) prêt à être inséré dans un document.
132 * Aucun callback n'est affecté.
133 */
134 Message.prototype.XHTML = function(messagePair, pre)
135 {
136 if (messagePair == undefined)
137 messagePair = true
138 if (pre == undefined)
139 pre = ""
140
141 // construit l'identifiant de la personne
142 var identifiant =
143 this.client.nickFormat == "nick" || this.login == "" ? this.formateur.traitementComplet(this.pseudo) :
144 (this.client.nickFormat == "login" ? this.formateur.traitementComplet(this.login) :
145 this.formateur.traitementComplet(this.pseudo) + "<span class=\"login\">(" + this.formateur.traitementComplet(this.login) +")</span>" )
146
147 var XHTMLrepondA = ""
148 var debut = true
149 for (var id in this.repondA)
150 {
151 if (!debut) XHTMLrepondA += ", "
152 XHTMLrepondA += this.formateur.traitementComplet(this.repondA[id].pseudo)
153 debut = false
154 }
155 if (XHTMLrepondA != "")
156 XHTMLrepondA = "<span class=\"repondA\">" + XHTMLrepondA + "</span><span class=\"delimitationRepondA\"></span>"
157
158 return "<div id=\"" + this.getId(pre) + "\" class=\"" + (messagePair ? "messagePair" : "messageImpair") + " message" +
159 (this.appartientAuClient ? " proprietaire" : "") +
160 (this.clientARepondu ? " repondu" : "") +
161 (this.estUneReponse ? " reponse" : "") +
162 (this.systeme ? " systeme" : "") +
163 (this.ekMaster ? " ekMaster" + this.degreeOstentatoire : "") +
164 "\">" +
165 "<div class=\"outilsMess\"><div class=\"extraire\"></div><div class=\"extraireCompletement\"></div></div><span class=\"entete\">" +
166 "<span class=\"dateComplete\">[<span class=\"date\">" + this.date + "</span>]</span>" +
167 "<span class=\"pseudo\"><span class=\"id\" style=\"display: none\">" + this.auteurId + "</span class=\"ident\">" + identifiant + "</span></span><span class=\"delimitationEntete\"></span>" +
168 XHTMLrepondA +
169 "<span class=\"contenu\">" + this.formateur.traitementComplet(this.contenu, this.pseudo) + "</span>" +
170 "</div>"
171 }
172