X-Git-Url: http://git.euphorik.ch/index.cgi?a=blobdiff_plain;ds=sidebyside;f=js%2FpageMinichat.js;h=67354cf9db839efb955f090e6e2630882176c647;hb=b4fa5488abceb2979d4753af0003b3265f433fda;hp=ec745f357f424e84b2a9617b68cf4a5a967bb1cd;hpb=994f68e1f8a7a43b55d6bd6214b2a0066671ba74;p=euphorik.git
diff --git a/js/pageMinichat.js b/js/pageMinichat.js
index ec745f3..67354cf 100755
--- a/js/pageMinichat.js
+++ b/js/pageMinichat.js
@@ -40,6 +40,7 @@ PageMinichat.prototype.contenu = function()
\
\
\
+
\
\
\
\
@@ -82,7 +83,7 @@ PageMinichat.prototype.charger = function()
this.util.infoBulle("Ouvrir la conversation liée au troll de la semaine", $("#trollCourant .troll"))
//
- $("body").append("")
+ $("body").append('')
// affichage des smiles
$("#smiles").append(this.formateur.getSmilesHTML()).children().each(
function(i)
@@ -100,20 +101,13 @@ PageMinichat.prototype.charger = function()
}
)
$("form button.smiles").hover(
- function(e)
- {
- var position = $(e.target).offset()
- // le décalage pour ne pas dépasser à droite (10 correspond à la marge pour éviter de coller le bord)
- var decalage = $("body").width() - $("#smiles").width() - position.left - 10
- decalage = decalage > 0 ? 0 : decalage
-
- $("#smiles").css("top", position.top).css("left", position.left + decalage).show()
- },
- function(e){}
+ // affichage de la boite présentant les smiles
+ function(e){ thisPage.util.afficherBoite($("#smiles"), $(e.target), positionTypeX.centre, positionTypeY.basRecouvrement) },
+ function(){}
)
$("#smiles").hover(
function(){},
- function(e)
+ function()
{
$("#smiles").hide()
}
@@ -165,8 +159,12 @@ PageMinichat.prototype.decharger = function()
$("body #smiles").remove()
}
-PageMinichat.prototype.getJSONMessage = function(pseudo, message, repondA)
+PageMinichat.prototype.getJSONMessage = function(pseudo, message)
{
+ var repondA = []
+ for (var id in this.messages.messagesRepond)
+ repondA.push(parseInt(id)) // FIXME : une propriété ne peut pas être de type int ?
+
return {
"action" : "put_message",
"cookie" : this.client.cookie,
@@ -182,16 +180,6 @@ PageMinichat.prototype.envoyerMessage = function(pseudo, message)
// (un pseudo vide est autorisé)
pseudo = this.formateur.filtrerInputPseudo(pseudo)
-
- // extraction des id des messages (en base 36 évidemment) auquels le user répond
- var repondA = []
- var tags = message.match(this.regexMessageTagMatch)
- if (tags != null)
- {
- for(var i = 0; i < tags.length; i++)
- repondA.push(parseInt(/\{(.*?)\}>/.exec(tags[i])[1], 36))
- message = message.replace(this.regexMessageTagReplace, "")
- }
if (pseudo == conf.nickDefaut)
{
@@ -223,12 +211,12 @@ PageMinichat.prototype.envoyerMessage = function(pseudo, message)
}
this.envoieMessageEnCours = true
- ;; dumpObj(this.getJSONMessage(pseudo, message, repondA))
+ ;; dumpObj(this.getJSONMessage(pseudo, message))
jQuery.ajax(
{
url : "request",
type: "POST",
- data : this.util.jsonVersAction(this.getJSONMessage(pseudo, message, repondA)),
+ data : this.util.jsonVersAction(this.getJSONMessage(pseudo, message)),
dataType : "json",
beforeSend : function(xmlHttpRequest)
{
@@ -242,6 +230,7 @@ PageMinichat.prototype.envoyerMessage = function(pseudo, message)
if(data["reply"] == "ok")
{
$("form input.message").val("")
+ thisPageMinichat.messages.enleverMessagesRepond()
// met à jour la classe des messages auquel repond celui ci (c'est un peu de la triche) TODO : ya mieux ?
for (var i = 0; i < repondA.length; i++)
@@ -293,10 +282,13 @@ function Reponse(id, pseudo, login)
* @param pseudo
* @param contenu
*/
-function Message(id, auteurId, date, pseudo, login, contenu)
+function Message(client, formateur, id, auteurId, racineId, date, pseudo, login, contenu)
{
+ this.client = client
+ this.formateur = formateur
this.id = id
this.auteurId = auteurId
+ this.racineId = racineId
this.date = date
this.pseudo = pseudo
this.login = login
@@ -312,6 +304,11 @@ function Message(id, auteurId, date, pseudo, login, contenu)
this.repondA = {} // un ensemble de reponse (voir Reponse) indexé par l'id du message de la reponses
}
+Message.prototype.getId = function()
+{
+ return "mess" + this.id.toString(36)
+}
+
/**
*
*/
@@ -369,6 +366,43 @@ Message.prototype.getConversation = function(messages)
return messagesEnEvidence
}
+Message.prototype.XHTML = function(messagePair)
+{
+ if (messagePair == undefined)
+ messagePair = true
+
+ // construit l'identifiant de la personne
+ var identifiant =
+ this.client.nickFormat == "nick" || this.login == "" ? this.formateur.traitementComplet(this.pseudo) :
+ (this.client.nickFormat == "login" ? this.formateur.traitementComplet(message.login) :
+ this.formateur.traitementComplet(this.pseudo) + "(" + this.formateur.traitementComplet(message.login) +")" )
+
+ var XHTMLrepondA = ""
+ var debut = true
+ for (var id in this.repondA)
+ {
+ if (!debut) XHTMLrepondA += ", "
+ XHTMLrepondA += this.formateur.traitementComplet(this.repondA[id].pseudo)
+ debut = false
+ }
+ if (XHTMLrepondA != "")
+ XHTMLrepondA = "" + XHTMLrepondA + ""
+
+ return "" +
+ "
" +
+ "[" + this.date + "]" +
+ "" + this.auteurId + "" + identifiant + "" +
+ XHTMLrepondA +
+ "
" + this.formateur.traitementComplet(this.contenu, this.pseudo) + "" +
+ "
"
+}
+
///////////////////////////////////////////////////////////////////////////////////////////////////
/**
@@ -377,9 +411,7 @@ Message.prototype.getConversation = function(messages)
* @param formateur outil permettant la mise en forme du texte des messages
*/
function Conversation(num, util, formateur, client)
-{
- var thisConversation = this
-
+{
this.num = num // peut changer au cours de la vie de la conversation
this.id = Math.floor(Math.random() * 1000000).toString(36)
this.util = util
@@ -409,9 +441,6 @@ function Conversation(num, util, formateur, client)
}
}
-/**
- *
- */
Conversation.prototype.enleverMiseEnEvidence = function()
{
$("#conversations .message").removeClass("cache")
@@ -425,11 +454,11 @@ Conversation.prototype.colorerEntetes = function()
for (var i = 0; i < this.messages.length; i++)
{
if (this.messages[i].appartientAuClient)
- messagesProprietaire += "#mess" + this.messages[i].id.toString(36) + ","
+ messagesProprietaire += "#" + this.messages[i].getId() + ","
else if (this.messages[i].estUneReponse)
- messagesReponse += "#mess" + this.messages[i].id.toString(36) + ","
+ messagesReponse += "#" + this.messages[i].getId() + ","
else if (this.messages[i].clientARepondu)
- messagesRepondu += "#mess" + this.messages[i].id.toString(36) + ","
+ messagesRepondu += "#" + this.messages[i].getId() + ","
}
$(messagesReponse).addClass("reponse")
$(messagesRepondu).addClass("repondu")
@@ -536,9 +565,10 @@ Conversation.prototype.viderMessages = function()
* Après l'ajout d'un ou plusieurs message cette méthode est appelée afin
* d'afficher les messages non-affichés.
* FIXME : méthode super lourde, à optimiser.
- * @param funClickExtract fonction (fun(numMess)) appellée lors du clic sur un bouton "extraire"
+ * @param funClickExtract fonction (fun(numMess)) appelée lors du clic sur un bouton "extraire"
+ * @param funClickMessage fonction (fun(numMess)) appelée lors du clic sur un message
*/
-Conversation.prototype.flush = function(funClickOuvrirConv)
+Conversation.prototype.flush = function(funClickOuvrirConv, funClickMessage)
{
var thisConversation = this
@@ -551,42 +581,8 @@ Conversation.prototype.flush = function(funClickOuvrirConv)
var XHTML = ""
for (var i = 0; i < this.messages.length; i++)
if (this.messages[i].id > this.idDernierMessageAffiche)
- {
- var message = this.messages[i]
-
- // construit l'identifiant de la personne
- var identifiant =
- this.client.nickFormat == "nick" || message.login == "" ? this.formateur.traitementComplet(message.pseudo) :
- (this.client.nickFormat == "login" ? this.formateur.traitementComplet(message.login) :
- this.formateur.traitementComplet(message.pseudo) + "(" + this.formateur.traitementComplet(message.login) +")" )
-
- var XHTMLrepondA = ""
- var debut = true
- for (var id in message.repondA)
- {
- if (!debut) XHTMLrepondA += ", "
- ;; dumpObj(message.repondA.count)
- XHTMLrepondA += this.formateur.traitementComplet(message.repondA[id].pseudo)
- debut = false
- }
- if (XHTMLrepondA != "")
- XHTMLrepondA = "" + XHTMLrepondA + ""
-
- XHTML +=
- "" +
- "
" +
- "[" + message.date + "]" +
- "" + message.auteurId + "" + identifiant + "" +
- XHTMLrepondA +
- "
" + this.formateur.traitementComplet(message.contenu, message.pseudo) + "" +
- "
"
-
+ {
+ XHTML += this.messages[i].XHTML(messagePair)
messagePair = !messagePair
}
@@ -608,8 +604,7 @@ Conversation.prototype.flush = function(funClickOuvrirConv)
thisConversation.util.infoBulle("Extraction de la conversation complète", $(".extraireCompletement", this))
// l'id du message
- var idMess36 = $(this).attr("id").substr(4)
- var idMess = parseInt(idMess36, 36)
+ var idMess = parseInt($(this).attr("id").substr(4), 36)
$(this).click(
function(event)
@@ -622,13 +617,14 @@ Conversation.prototype.flush = function(funClickOuvrirConv)
funClickOuvrirConv(idMess)
return
}
-
- var valCourant = $("input.message").val()
- if (valCourant == undefined) valCourant = ""
- var tag = $(".pseudo span.ident", this).text() + "{" + idMess36 + "}" + ">"
- if (valCourant.indexOf(tag, 0) == -1)
- $("input.message").val(tag + " " + valCourant)
- thisConversation.util.setCaretToEnd($("form input.message")[0])
+
+ if ($(event.target).is(".extraireCompletement"))
+ {
+ funClickOuvrirConv(thisConversation.messagesParId[idMess].racineId)
+ return
+ }
+
+ funClickMessage(thisConversation.messagesParId[idMess])
}
)
@@ -695,7 +691,7 @@ Conversation.prototype.flush = function(funClickOuvrirConv)
{
$("#outilsBan", this).hide()
}
- )
+ )
}
)
DOM.prependTo("#conversations #" + this.getId())
@@ -719,7 +715,7 @@ Conversation.prototype.afficherConversation = function(id)
var message = this.messagesParId[id]
if (message == undefined) return
- mess = message.getConversation(this)
+ var mess = message.getConversation(this)
// FIXME : cet appel est très lent
$("#conversations #" + this.getId() + " .message").each(
@@ -733,14 +729,14 @@ Conversation.prototype.afficherConversation = function(id)
{
jq.removeClass("cache")
switch (statut)
- {
- // "repondu" et "reponse" sont prioritaitres à "proprietaire"
- // contrairement à la vue normale (sans mise en évidence d'une conversation)
- case 3 :
- jq.addClass("repondu")
- break;
- case 2 :
- jq.addClass("reponse")
+ {
+ // "repondu" et "reponse" sont prioritaitres à "proprietaire"
+ // contrairement à la vue normale (sans mise en évidence d'une conversation)
+ case 3 :
+ jq.addClass("repondu")
+ break;
+ case 2 :
+ jq.addClass("reponse")
break;
case 1 :
jq.addClass("proprietaire")
@@ -763,15 +759,17 @@ Conversation.prototype.supprimer = function()
/**
* Représente l'ensemble des messages affichés.
+ * TODO : renommer cette "classe" en 'Conversations'
*/
function Messages(client, formateur, util)
{
- var thisMessages = this
-
this.client = client
this.formateur = formateur
this.util = util
+ // un ensemble des messages (id) auquel l'utilisateur répond (vider après l'envoie du message courant)
+ this.messagesRepond = {}
+
this.conversations = new Array() // les conversations, la première représente la conversation principale
this.nouvelleConversation(0)
@@ -781,6 +779,62 @@ function Messages(client, formateur, util)
this.pageEvent = new PageEvent("chat", this.util)
}
+/**
+ * Permet de définir un message comme étant ou n'étant plus un message auquel l'utilisateur
+ * répond.
+ */
+Messages.prototype.toggleMessageRepond = function(mess)
+{
+ // est-ce que l'on répond déjà à ce message ? si oui alors on l'enlève de la liste
+ if (mess.id in this.messagesRepond)
+ {
+ $("#" + mess.getId()).removeClass("repondEnEvidence")
+ delete this.messagesRepond[mess.id]
+ return
+ }
+
+ // est-ce que le message fait partie de la même conversation que les autres messages ?
+ // TODO : solution plus élégante pour prendre un mess parmis messagesRepond !?
+ var mess2
+ for(mess2 in this.messagesRepond){ break; }
+ mess2 = this.messagesRepond[mess2]
+
+ if (mess2 != undefined && mess2.racineId != mess.racineId)
+ {
+ this.util.messageDialogue("Impossible de répondre à deux messages ne faisant pas partie de la même conversation")
+ return
+ }
+
+ this.messagesRepond[mess.id] = mess
+ $("#" + mess.getId()).addClass("repondEnEvidence")
+}
+
+/**
+ * Enlève tous les messages auquel l'utilisateur souhaite répond.
+ */
+Messages.prototype.enleverMessagesRepond = function()
+{
+ this.messagesRepond = {}
+ $(".message").removeClass("repondEnEvidence")
+}
+
+
+/**
+ * Définit un message comme n'y répondant plus.
+ */
+/*Messages.prototype.enleverMessageRepond = function(id)
+{
+
+}*/
+
+/**
+ * Définit un message comme y répondant.
+ */
+/*Messages.prototype.ajouterMessageRepond = function(id)
+{
+
+}*/
+
/**
* Crée un message JSON contenant le message demandant un rafraichissement.
*/
@@ -854,8 +908,11 @@ Messages.prototype.ajouterMessage = function(element, numConversation)
var id = element["id"]
var message = new Message(
+ this.client,
+ this.formateur,
id,
element["user_id"],
+ element["root"],
element["date"],
element["nick"],
element["login"],
@@ -973,9 +1030,15 @@ Messages.prototype.flush = function(numConv)
var thisMessages = this
this.conversations[numConv].flush(
- function(racine) // appelé lorsqu'un utilisateur click sur un lien vers une conversation
+ function(racine) // appelé lors d'un clic sur un lien vers une conversation
{
thisMessages.ouvrirConversation(racine)
+ },
+ // 'Mess' correspond à un objet de type 'Message'
+ function(Mess) // appelé lors d'un clic sur un message
+ {
+ // met ou enlève la mise en evidence du message
+ thisMessages.toggleMessageRepond(Mess)
}
)
}