MOD avancement dans la Grande Restructuration
[euphorik.git] / js / pageMinichat / pageMinichat.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 PageMinichat(client, formateur, util)
20 {
21 this.nom = "minichat"
22
23 this.client = client
24 this.formateur = formateur
25 this.util = util
26
27 // permet d'éviter d'envoyer plusieurs messages simultanément en pressant
28 // rapidement sur "enter" par exemple
29 this.envoieMessageEnCours = false
30
31 this.regexMessageTagMatch = /\{.*?\}>/g
32 this.regexMessageTagReplace = /^(.*?\{.*?\}>)*/
33 }
34
35 PageMinichat.prototype.contenu = function()
36 {
37 // le fait que tout soit collé est fait exprès, permet d'éviter d'avoir des espaces supplémentaires entre les spans'
38 var formulaireXHTML = '<form method="post" action="" id ="posterMessage">\
39 <p>\
40 <input class="captcha" name="captcha" type="text" size="8" maxlength="8"></input>\
41 <input class="pseudo" name="pseudo" type="text" maxlength="50" value="' + encodeURI(euphorik.conf.nickDefaut) + '"></input>\
42 <span id="repondA"><span class="nb">0</span><span class="messages"></span></span>\
43 <input class="message" name="message" type="text" maxlength="500" value=""></input>\
44 <button class="smiles"></button>\
45 <button class="return"></button>\
46 </p>\
47 </form>'
48 var trollXHTML = '<div id="trollCourant">Troll de la semaine : <span class="troll"></span></div>'
49 //var titreXHTML = '<tr id="titres"></tr>'
50 //var messagesXHTML = '<tr id="messages"></tr>'
51 var conversationXHTML = '<table id="conversations"><tr></tr></table>'
52
53 if (this.client.chatOrder === "reverse")
54 return trollXHTML + formulaireXHTML + conversationXHTML
55 else
56 return trollXHTML + conversationXHTML + formulaireXHTML
57 }
58
59 PageMinichat.prototype.classes = function()
60 {
61 return this.client.chatOrder === "reverse" ? "orderReverse" : "orderChrono"
62 }
63
64 PageMinichat.prototype.charger = function()
65 {
66 thisPage = this
67
68 $("form input.pseudo").val(this.client.pseudo)
69
70 // cet appel ne doit pas être fait avant l'appel à 'charger'
71 this.conversations = new Conversations(this.client, this.formateur, this.util)
72
73 this.conversations.rafraichirMessages(true)
74
75 this.util.setCaretToEnd($("form input.message")[0])
76
77 // les outils de bannissement (uniquement pour les ekMaster)
78 if (this.client.ekMaster)
79 {
80 this.util.outilsBan = $(
81 '<span id="outilsBan">' +
82 '<span class="spacer"></span>' +
83 '<form action=""><p><input id="raison" name="raison" type="text" size="10" maxlength="200"></input></p></form>' +
84 '<img id="ban" src="img/ban.gif" alt="Ban de 3 jours" />' +
85 '<img id="kick" src="img/kick.gif" alt="Ban de 15min" />' +
86 '<img id="slap" src="img/slap.gif" alt="Avertissement" />' +
87 '</span>'
88 )
89
90 this.util.infoBulle("Slap", $("#slap", this.util.outilsBan))
91 this.util.infoBulle("Kick (" + euphorik.conf.tempsKick + "min)", $("#kick", this.util.outilsBan))
92 this.util.infoBulle("Ban (" + euphorik.conf.tempsBan / 24 / 60 + " jours)", $("#ban", this.util.outilsBan))
93 this.util.infoBulle("La raison", $("input", this.util.outilsBan))
94 }
95
96 this.util.infoBulle("Ouvrir la conversation liée au troll de la semaine", $("#trollCourant .troll"))
97
98 this.util.infoBulle("Cliquer sur les messages pour les enlevers de la liste",
99 $("form#posterMessage #repondA").hover(
100 function() { thisPage.util.afficherBoite($(".messages", this), $(this), positionTypeX.centre, positionTypeY.bas) },
101 function() { $(".messages", this).hide() }
102 ).click(
103 function(e)
104 {
105 if ($(e.target).is(".nb"))
106 thisPage.conversations.enleverMessagesRepond()
107 }
108 ),
109 euphorik.Util.positionBulleType.droite
110 )
111
112 // <smiles>
113 $("body").append('<div id="smiles"></div>')
114 // affichage des smiles
115 $("#smiles").append(this.formateur.getSmilesHTML()).children().each(
116 function(i)
117 {
118 var opacityBase = $(this).css("opacity")
119 $(this).click(
120 function()
121 {
122 thisPage.util.replaceSelection($("form#posterMessage input.message")[0], thisPage.formateur.smiles[$(this).attr("class")][0].source.replace(/\\/g, ""))
123 }
124 ).hover(
125 function() { $(this).animate({opacity: 1}, 200) },
126 function() { $(this).animate({opacity: opacityBase}, 200) }
127 )
128 }
129 )
130 $("form button.smiles").hover(
131 // affichage de la boite présentant les smiles
132 function(e){ thisPage.util.afficherBoite($("#smiles"), $(e.target), positionTypeX.centre, positionTypeY.basRecouvrement) },
133 function(){}
134 )
135 $("#smiles").hover(
136 function(){},
137 function()
138 {
139 $("#smiles").hide()
140 }
141 )
142 // </smiles>
143
144 // événements
145 var nouveauMessage =
146 function()
147 {
148 // captcha anti bot
149 if ($("form input.captcha").val() != "") return
150
151 thisPage.envoyerMessage(
152 $("form input.pseudo").val(),
153 $("form input.message").val()
154 )
155
156 $("form input.message").focus()
157 }
158
159 $("form").keypress(
160 function(e)
161 {
162 if (e.which === 13) // return
163 nouveauMessage()
164 }
165 )
166
167 $("form button.return").click(nouveauMessage)
168
169 // interdiction de submiter le formulaire
170 $("form").submit(function(){ return false})
171
172 $("input.pseudo").click(
173 function()
174 {
175 var input = $("input.pseudo")[0]
176 if (input.value === euphorik.conf.pseudoDefaut)
177 input.value = ""
178 }
179 )
180 }
181
182 PageMinichat.prototype.decharger = function()
183 {
184 this.conversations.pageEvent.stopAttenteCourante()
185
186 $("body #smiles").remove()
187 }
188
189 PageMinichat.prototype.getJSONMessage = function(pseudo, message)
190 {
191 var repondA = []
192 for (var id in this.conversations.messagesRepond)
193 repondA.push(parseInt(id)) // FIXME : une propriété ne peut pas être de type int ?
194
195 return {
196 "header" : { "action" : "put_message", "version" : euphorik.conf.versionProtocole },
197 "cookie" : this.client.cookie,
198 "nick" : pseudo,
199 "content" : message,
200 "answer_to" : repondA
201 }
202 }
203
204 PageMinichat.prototype.envoyerMessage = function(pseudo, message)
205 {
206 var thisPageMinichat = this
207
208 // (un pseudo vide est autorisé)
209 pseudo = this.formateur.filtrerInputPseudo(pseudo)
210
211 if (pseudo === euphorik.conf.nickDefaut)
212 {
213 this.util.messageDialogue("Le pseudo ne peut pas être " + euphorik.conf.nickDefaut)
214 return
215 }
216
217 message = message.trim()
218 if (!message)
219 {
220 this.util.messageDialogue("Le message est vide")
221 return
222 }
223
224 if (!this.client.authentifie())
225 if (!this.client.enregistrement())
226 {
227 this.util.messageDialogue("login impossible")
228 return
229 }
230
231 this.client.pseudo = pseudo
232
233 // évite le double post
234 if (this.envoieMessageEnCours)
235 {
236 this.util.messageDialogue("Message en cours d'envoie...")
237 return
238 }
239 this.envoieMessageEnCours = true
240
241 jQuery.ajax(
242 {
243 url : "request",
244 type: "POST",
245 data : this.util.jsonVersAction(this.getJSONMessage(pseudo, message)),
246 dataType : "json",
247 beforeSend : function(xmlHttpRequest)
248 {
249 // TODO : ça marche ça ??
250 xmlHttpRequest.setRequestHeader("X-Requested-With", "")
251 },
252 success : function(data, textStatus)
253 {
254 if(data["reply"] === "ok")
255 {
256 // met à jour la classe des messages auquel repond celui ci (c'est un peu de la triche) TODO : ya mieux ?
257 for (var messId in thisPageMinichat.conversations.messagesRepond)
258 {
259 for (var j = 0; j < thisPageMinichat.conversations.conversations.length; j++)
260 {
261 var mess = thisPageMinichat.conversations.conversations[j].messagesParId[messId]
262 if (mess != undefined)
263 mess.clientARepondu = true
264 }
265 // TODO : ca sert à qque chose ?
266 //$("#conversations div#" + thisPageMinichat.conversations.messagesRepond[messId].getId()).addClass("repondu")
267 }
268
269 $("form input.message").val("")
270 thisPageMinichat.conversations.enleverMessagesRepond()
271 }
272 else if (data["reply"] === "error")
273 {
274 thisPageMinichat.util.messageDialogue(data["error_message"])
275 }
276 thisPageMinichat.envoieMessageEnCours = false
277 },
278 error : function()
279 {
280 thisPageMinichat.envoieMessageEnCours = false
281 }
282 }
283 )
284 }