2 // Copyright 2008 Grégory Burri
4 // This file is part of Euphorik.
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.
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.
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/>.
19 function PageMinichat(client
, formateur
, util
)
24 this.formateur
= formateur
27 // permet d'éviter d'envoyer plusieurs messages simultanément en pressant
28 // rapidement sur "enter" par exemple
29 this.envoieMessageEnCours
= false
31 this.regexMessageTagMatch
= /\{.*?\}>/g
32 this.regexMessageTagReplace
= /^(.*?\{.*?\}>)*/
35 PageMinichat
.prototype.contenu = function()
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">\
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>\
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>'
53 if (this.client
.chatOrder
== "reverse")
54 return trollXHTML
+ formulaireXHTML
+ conversationXHTML
56 return trollXHTML
+ conversationXHTML
+ formulaireXHTML
59 PageMinichat
.prototype.classes = function()
61 return this.client
.chatOrder
== "reverse" ? "orderReverse" : "orderChrono"
64 PageMinichat
.prototype.charger = function()
68 $("form input.pseudo").val(this.client
.pseudo
)
70 // cet appel ne doit pas être fait avant l'appel à 'charger'
71 this.conversations
= new Conversations(this.client
, this.formateur
, this.util
)
73 this.conversations
.rafraichirMessages(true)
75 this.util
.setCaretToEnd($("form input.message")[0])
77 // les outils de bannissement (uniquement pour les ekMaster)
78 if (this.client
.ekMaster
)
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" />' +
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
))
96 this.util
.infoBulle("Ouvrir la conversation liée au troll de la semaine", $("#trollCourant .troll"))
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() }
105 if ($(e
.target
).is(".nb"))
106 thisPage
.conversations
.enleverMessagesRepond()
109 euphorik
.Util
.positionBulleType
.droite
113 $("body").append('<div id="smiles"></div>')
114 // affichage des smiles
115 $("#smiles").append(this.formateur
.getSmilesHTML()).children().each(
118 var opacityBase
= $(this).css("opacity")
122 thisPage
.util
.replaceSelection($("form#posterMessage input.message")[0], thisPage
.formateur
.smiles
[$(this).attr("class")][0].source
.replace(/\\/g
, ""))
125 function() { $(this).animate({opacity: 1}, 200) },
126 function() { $(this).animate({opacity: opacityBase
}, 200) }
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
) },
149 if ($("form input.captcha").val() != "") return
151 thisPage
.envoyerMessage(
152 $("form input.pseudo").val(),
153 $("form input.message").val()
156 $("form input.message").focus()
162 if (e
.which
== 13) // return
167 $("form button.return").click(nouveauMessage
)
169 // interdiction de submiter le formulaire
170 $("form").submit(function(){ return false})
172 $("input.pseudo").click(
175 var input
= $("input.pseudo")[0]
176 if (input
.value
== euphorik
.conf
.pseudoDefaut
)
182 PageMinichat
.prototype.decharger = function()
184 this.conversations
.pageEvent
.stopAttenteCourante()
186 $("body #smiles").remove()
189 PageMinichat
.prototype.getJSONMessage = function(pseudo
, message
)
192 for (var id
in this.conversations
.messagesRepond
)
193 repondA
.push(parseInt(id
)) // FIXME : une propriété ne peut pas être de type int ?
196 "header" : { "action" : "put_message", "version" : euphorik
.conf
.versionProtocole
},
197 "cookie" : this.client
.cookie
,
200 "answer_to" : repondA
204 PageMinichat
.prototype.envoyerMessage = function(pseudo
, message
)
206 var thisPageMinichat
= this
208 // (un pseudo vide est autorisé)
209 pseudo
= this.formateur
.filtrerInputPseudo(pseudo
)
211 if (pseudo
== euphorik
.conf
.nickDefaut
)
213 this.util
.messageDialogue("Le pseudo ne peut pas être " + euphorik
.conf
.nickDefaut
)
217 message
= message
.trim()
220 this.util
.messageDialogue("Le message est vide")
224 if (!this.client
.authentifie())
225 if (!this.client
.enregistrement())
227 this.util
.messageDialogue("login impossible")
231 this.client
.pseudo
= pseudo
233 // évite le double post
234 if (this.envoieMessageEnCours
)
236 this.util
.messageDialogue("Message en cours d'envoie...")
239 this.envoieMessageEnCours
= true
245 data : this.util
.jsonVersAction(this.getJSONMessage(pseudo
, message
)),
247 beforeSend : function(xmlHttpRequest
)
249 // TODO : ça marche ça ??
250 xmlHttpRequest
.setRequestHeader("X-Requested-With", "")
252 success : function(data
, textStatus
)
254 if(data
["reply"] == "ok")
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
)
259 for (var j
= 0; j
< thisPageMinichat
.conversations
.conversations
.length
; j
++)
261 var mess
= thisPageMinichat
.conversations
.conversations
[j
].messagesParId
[messId
]
262 if (mess
!= undefined)
263 mess
.clientARepondu
= true
265 // TODO : ca sert à qque chose ?
266 //$("#conversations div#" + thisPageMinichat.conversations.messagesRepond[messId].getId()).addClass("repondu")
269 $("form input.message").val("")
270 thisPageMinichat
.conversations
.enleverMessagesRepond()
272 else if (data
["reply"] == "error")
274 thisPageMinichat
.util
.messageDialogue(data
["error_message"])
276 thisPageMinichat
.envoieMessageEnCours
= false
280 thisPageMinichat
.envoieMessageEnCours
= false