From: Greg Burri Date: Thu, 24 Jul 2008 12:08:18 +0000 (+0000) Subject: MOD avancement dans la Grande Restructuration X-Git-Tag: 1.1.0~55 X-Git-Url: http://git.euphorik.ch/index.cgi?a=commitdiff_plain;h=6dd1bccff42c25fd646f2538cafa1cb19e45f88c;p=euphorik.git MOD avancement dans la Grande Restructuration --- diff --git a/js/euphorik.js b/js/euphorik.js index 34888c3..1d6f3e8 100755 --- a/js/euphorik.js +++ b/js/euphorik.js @@ -77,6 +77,16 @@ var objectEach = function(o, f) { } } }; + +var objectMemberCount = function(o) { + var nb = 0; + for (var k in o) { + if (o.hasOwnProperty(k)) { + nb += 1; + } + } + return nb; +}; Array.prototype.each = function(f) { for (var i = 0; i < this.length; i++) { diff --git a/js/pageMinichat/conversation.js b/js/pageMinichat/conversation.js index c3082b8..77ee3a2 100644 --- a/js/pageMinichat/conversation.js +++ b/js/pageMinichat/conversation.js @@ -16,7 +16,8 @@ // You should have received a copy of the GNU General Public License // along with Euphorik. If not, see . - + /*jslint laxbreak:true */ + /** * Représente une conversation. * Une conversation, au niveau XHTML, est formé de deux partie, le titre et les messages. diff --git a/js/pageMinichat/conversations.js b/js/pageMinichat/conversations.js index 0c0f3d0..2b78fc5 100644 --- a/js/pageMinichat/conversations.js +++ b/js/pageMinichat/conversations.js @@ -16,186 +16,183 @@ // You should have received a copy of the GNU General Public License // along with Euphorik. If not, see . +/*jslint laxbreak:true */ + /** * Représente l'ensemble des conversations affichés. */ -function Conversations(client, formateur, util) -{ - this.client = client - this.formateur = formateur - this.util = util +euphorik.Conversations = function(client, formateur, util) { + 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.messagesRepond = {}; - this.conversations = new Array() // les conversations, la première représente la conversation principale + this.conversations = []; // les conversations, la première représente la conversation principale - this.nouvelleConversation(0) + this.nouvelleConversation(0); - this.trollIdCourant = 0 + this.trollIdCourant = 0; - this.pageEvent = new euphorik.PageEvent("chat", this.util) -} + this.pageEvent = new euphorik.PageEvent("chat", this.util); +}; // les messages insérés dans le document XHTML on leur id prefixé par cette valeur // cela permet de les distinguer des "vrais" messages -Conversations.prototype.prefixIdMessage = "rep" +euphorik.Conversations.prototype.prefixIdMessage = "rep"; /** * Permet de définir un message comme étant ou n'étant plus un message auquel l'utilisateur * répond. */ -Conversations.prototype.toggleMessageRepond = function(mess) -{ +euphorik.Conversations.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) - { - this.enleverMessageRepond(mess) - return + if (mess.id in this.messagesRepond) { + this.enleverMessageRepond(mess); + return; } - this.ajouterMessageRepond(mess) -} + this.ajouterMessageRepond(mess); +}; /** * Enlève tous les messages auquel l'utilisateur souhaite répond. */ -Conversations.prototype.enleverMessagesRepond = function() -{ - for (var messId in this.messagesRepond) - this.enleverMessageRepond(this.messagesRepond[messId]) +euphorik.Conversations.prototype.enleverMessagesRepond = function() { + var thisConversations = this; + + objectEach(function(messId, mess) { + thisConversations.enleverMessageRepond(mess); + }); // on réinitialise pour être sur que tout est bien enlevé - this.messagesRepond = {} - $("#conversations .message").removeClass("repondEnEvidence") - $("form#posterMessage #repondA .messages").empty() -} + this.messagesRepond = {}; + $("#conversations .message").removeClass("repondEnEvidence"); + $("form#posterMessage #repondA .messages").empty(); +}; /** * Définit un message comme n'y répondant plus. */ -Conversations.prototype.enleverMessageRepond = function(mess) -{ - $(this.exprIdsPotentiels(mess)).removeClass("repondEnEvidence") - $("#" + mess.getId(this.prefixIdMessage)).remove() - delete this.messagesRepond[mess.id] - this.rafraichireNombreMessagesRepond() -} +euphorik.Conversations.prototype.enleverMessageRepond = function(mess) { + $(this.exprIdsPotentiels(mess)).removeClass("repondEnEvidence"); + $("#" + mess.getId(this.prefixIdMessage)).remove(); + delete this.messagesRepond[mess.id]; + this.rafraichireNombreMessagesRepond(); +}; /** * Définit un message comme y répondant. */ -Conversations.prototype.ajouterMessageRepond = function(mess) -{ - var thisMessages = this +euphorik.Conversations.prototype.ajouterMessageRepond = function(mess) { + var thisMessages = this; // 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] + var mess2; + for (mess2 in this.messagesRepond) { + if (this.messagesRepond.hasOwnProperty(mess2)) { + 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 + if (!mess2 && mess2.racineId !== mess.racineId) { + this.util.messageDialogue("Impossible de répondre à deux messages ne faisant pas partie de la même conversation"); + return; } - $("form#posterMessage #repondA .messages").append(mess.XHTML(undefined, this.prefixIdMessage)) - this.messagesRepond[mess.id] = mess + $("form#posterMessage #repondA .messages").append(mess.XHTML(undefined, this.prefixIdMessage)); + this.messagesRepond[mess.id] = mess; // ajout la classe 'repondEnEvidence' au message. comme il peut se trouver potentiellement dans // chaque conversation on construit tous les id potentiels - $(mess.getId(this.prefixIdMessage) + ", " + this.exprIdsPotentiels(mess)).addClass("repondEnEvidence") + $(mess.getId(this.prefixIdMessage) + ", " + this.exprIdsPotentiels(mess)).addClass("repondEnEvidence"); $("#" + mess.getId(this.prefixIdMessage)).click( - function() - { - $(this).fadeOut("normal", function(){ - thisMessages.enleverMessageRepond(mess) - $("form#posterMessage #repondA .messages").hide() - }) + function() { + $(this).fadeOut("normal", function() { + thisMessages.enleverMessageRepond(mess); + $("form#posterMessage #repondA .messages").hide(); + }); } - ) - this.rafraichireNombreMessagesRepond() -} + ); + this.rafraichireNombreMessagesRepond(); +}; /** * Construit tous les id potentiels d'un message, renvoie par exemple : * "conv9b28mess1h, conv9b2amess1h, conv9b32mess1h" */ -Conversations.prototype.exprIdsPotentiels = function(mess) -{ - var exprMess = "" - for(var i = 0; i < this.conversations.length; i++) - { - exprMess += (mess != "" ? ", " : "") + "#" + mess.getId(this.conversations[i].getId()) - } - return exprMess -} +euphorik.Conversations.prototype.exprIdsPotentiels = function(mess) { + var exprMess = ""; + this.conversations.each(function(i, conv) { + exprMess += (mess !== "" ? ", " : "") + "#" + mess.getId(conv.getId()); + }); + return exprMess; +}; /** * Met à jour le nombre qui indique à l'utilisateur à combien de messages il répond. */ -Conversations.prototype.rafraichireNombreMessagesRepond = function() -{ +euphorik.Conversations.prototype.rafraichireNombreMessagesRepond = function() { // TODO : ya pas mieux pour trouver le nombre d'objet ? - var nb = 0 - for (var m in this.messagesRepond) - nb += 1 - $("#posterMessage #repondA .nb").text(nb) + var nb = objectMemberCount(this.messagesRepond); - var boite = $("#posterMessage #repondA") - if (nb > 0) boite.show() - else boite.hide() -} + $("#posterMessage #repondA .nb").text(nb); + + var boite = $("#posterMessage #repondA"); + if (nb > 0) { + boite.show(); + } else { + boite.hide(); + } +}; /** * Affiche les messages auquel l'utilisateur souhaite répondre au sein des messages des conversations. * Utilisé lorsqu'une conversation est extraite. */ -Conversations.prototype.afficherMessagesRepondConversations = function() -{ - var expr = "" - for(var messId in this.messagesRepond) - expr += "#" + this.messagesRepond[messId].getId() + "," - $(expr).addClass("repondEnEvidence") -} +euphorik.Conversations.prototype.afficherMessagesRepondConversations = function() { + var expr = ""; + objectEach(function(messId, mess) { + expr += "#" + mess.getId() + ","; + }); + $(expr).addClass("repondEnEvidence"); +}; /** * Crée un message JSON contenant le message demandant un rafraichissement. */ -Conversations.prototype.getJSONrafraichirMessages = function() -{ +euphorik.Conversations.prototype.getJSONrafraichirMessages = function() { var mess = { "message_count" : euphorik.conf.nbMessageAffiche, "main_page" : this.client.pagePrincipale, "conversations" : this.getJSONConversations(), "troll_id" : this.trollIdCourant - } + }; - if (this.client.cookie != null) mess["cookie"] = this.client.cookie - mess["last_message_id"] = this.conversations[0].idDernierMessageAffiche + if (this.client.cookie) { + mess.cookie = this.client.cookie; + } + mess.last_message_id = this.conversations[0].idDernierMessageAffiche; - return mess -} + return mess; +}; -Conversations.prototype.getJSONConversations = function() -{ - var clientConv = [] +euphorik.Conversations.prototype.getJSONConversations = function() { + var clientConv = []; - for (var i = 0; i < this.client.conversations.length; i++) - { - clientConv.push( - { - root : this.client.conversations[i].root, - page : this.client.conversations[i].page, - last_message_id : this.conversations[i + 1] == undefined ? 0 : this.conversations[i + 1].idDernierMessageAffiche - } - ) - } - return clientConv -} + this.client.conversations.each(function(i, conv) { + clientConv.push({ + root : conv.root, + page : conv.page, + last_message_id : this.conversations[i + 1] ? this.conversations[i + 1].idDernierMessageAffiche : 0 + }); + }); + return clientConv; +}; /** * Ajoute un ensemble de messages puis les affiches. @@ -203,26 +200,28 @@ Conversations.prototype.getJSONConversations = function() * @param numConversation le numéro de la conversation auquel appartiennent les messages * @return true si les messages on été ajoutés, false si la conversation n'existe pas et qu'il n'y a pas de message */ -Conversations.prototype.ajouterMessages = function(elements, numConversation) -{ - if (elements["messages"].length == 0) - return this.conversations[numConversation] != undefined +euphorik.Conversations.prototype.ajouterMessages = function(elements, numConversation) { + if (!elements.messages.length) { + return this.conversations[numConversation] !== undefined; + } - for (var i = 0; i < elements["messages"].length; i++) + for (var i = 0; i < elements.messages.length; i++) { // si une nouvelle conversation a été créée alors on lui donne la racine - if(this.ajouterMessage(elements["messages"][i], numConversation)) - this.conversations[numConversation].setRacine(elements["first"]) + if (this.ajouterMessage(elements.messages[i], numConversation)) { + this.conversations[numConversation].setRacine(elements.first); + } + } - this.flush(numConversation) + this.flush(numConversation); // renseigne la conversation sur la page courante et si c'est la dernière this.conversations[numConversation].setPage( - numConversation == 0 ? this.client.pagePrincipale : this.client.conversations[numConversation - 1].page, - elements["last_page"] - ) + numConversation === 0 ? this.client.pagePrincipale : this.client.conversations[numConversation - 1].page, + elements.last_page + ); - return true -} + return true; +}; /** * Création d'un nouveau message. @@ -231,191 +230,188 @@ Conversations.prototype.ajouterMessages = function(elements, numConversation) * @param numConversation le numéro de la conversation, 0 = principale * @return true si une nouvelle conversation a été créée sinon false */ -Conversations.prototype.ajouterMessage = function(element, numConversation) -{ - var thisMessages = this +euphorik.Conversations.prototype.ajouterMessage = function(element, numConversation) { + var thisMessages = this; // pas d'utilisation de jquery pour des raisons de performance - var message = new Message( - this.client, - this.formateur, - element - ) + var message = + new euphorik.Message( + this.client, + this.formateur, + element + ); - var nouvelleConversation = false + var nouvelleConversation = false; - if (this.conversations[numConversation] == null) - { - nouvelleConversation = true + if (!this.conversations[numConversation]) { + nouvelleConversation = true; this.nouvelleConversation( numConversation, - function(num) // fermeture de la conversation - { - thisMessages.supprimerConversation(num) + function(num) { // fermeture de la conversation + thisMessages.supprimerConversation(num); }, - function(num) // insertion du lien vers la conversation - { - thisPage.util.replaceSelection( - $("form#posterMessage input.message")[0], - "{" + thisMessages.client.conversations[num-1].root.toString(36) + "}" - ) + function(num) { // insertion du lien vers la conversation + thisPage.util.replaceSelection( + $("form#posterMessage input.message")[0], + "{" + thisMessages.client.conversations[num-1].root.toString(36) + "}" + ); } - ) + ); } - this.conversations[numConversation].ajouterMessage(message) - return nouvelleConversation -} + this.conversations[numConversation].ajouterMessage(message); + return nouvelleConversation; +}; -Conversations.prototype.nouvelleConversation = function(num, funFermer, funLien) +euphorik.Conversations.prototype.nouvelleConversation = function(num, funFermer, funLien) { - var thisMessages = this + var thisMessages = this; - this.conversations[num] = new Conversation(this, num) + this.conversations[num] = new euphorik.Conversation(this, num); + + if (funFermer) { + this.conversations[num].eventFermer(funFermer); + } - if (funFermer != undefined) - this.conversations[num].eventFermer(funFermer) - if (funLien != undefined) - this.conversations[num].eventLien(funLien) + if (funLien) { + this.conversations[num].eventLien(funLien); + } this.conversations[num].setFunPage( - function(num) // page suivante - { - thisMessages.client.pageSuivante(num - 1) - thisMessages.rafraichirMessages(true) + function(num) { // page suivante + thisMessages.client.pageSuivante(num - 1); + thisMessages.rafraichirMessages(true); }, - function(num) // page précédente - { - thisMessages.client.pagePrecedente(num - 1) - thisMessages.rafraichirMessages(true) + function(num) { // page précédente + thisMessages.client.pagePrecedente(num - 1); + thisMessages.rafraichirMessages(true); }, - function(num) // retour à la page une - { - if (thisMessages.client.goPremierePage(num - 1)) - thisMessages.rafraichirMessages(true) + function(num) { // retour à la page une + if (thisMessages.client.goPremierePage(num - 1)) { + thisMessages.rafraichirMessages(true); + } } - ) + ); - this.ajusterLargeurConversations() -} + this.ajusterLargeurConversations(); +}; /** * Enlève une conversation. */ -Conversations.prototype.supprimerConversation = function(num) -{ - if (num <= 0 || num >= this.conversations.length) return // la numéro 0 ne peut être supprimé - this.conversations[num].supprimer() +euphorik.Conversations.prototype.supprimerConversation = function(num) { + if (num <= 0 || num >= this.conversations.length) { + return; // la numéro 0 ne peut être supprimé + } + this.conversations[num].supprimer(); // décalage TODO : supprimer le dernier élément - for (var i = num; i < this.conversations.length - 1; i++) - { - this.conversations[i] = this.conversations[i+1] - this.conversations[i].num -= 1 + for (var i = num; i < this.conversations.length - 1; i++) { + this.conversations[i] = this.conversations[i+1]; + this.conversations[i].num -= 1; } - this.conversations.pop() - this.ajusterLargeurConversations() + this.conversations.pop(); + this.ajusterLargeurConversations(); - this.client.supprimerConversation(num-1) + this.client.supprimerConversation(num - 1); - this.rafraichirMessages(true) -} + this.rafraichirMessages(true); +}; /** * Ajuste la largeur des conversations en fonction de leur nombre. modifie l'attribut CSS 'width'. */ -Conversations.prototype.ajusterLargeurConversations = function() -{ +euphorik.Conversations.prototype.ajusterLargeurConversations = function() { // TODO : trouver mieux ! - var largeurPourcent = (100 / this.conversations.length) + var largeurPourcent = (100 / this.conversations.length); // obsolète !? // le "- 0.01" evite que IE se chie dessus lamentablement et affiche les conversations les unes au dessus des autres //if($.browser["msie"]) // largeurPourcent -= 0.05 - $("#conversations td").css("width", largeurPourcent + "%") -} + + $("#conversations td").css("width", largeurPourcent + "%"); +}; /** * Demande à toutes les conversations de se flusher (afficher les messages non-affichés). */ -Conversations.prototype.flushAll = function() -{ - for (var i = 0; i < this.conversations.length; i++) - this.flush(i) -} +euphorik.Conversations.prototype.flushAll = function() { + for (var i = 0; i < this.conversations.length; i++) { + this.flush(i); + } +}; /** * Demande à une conversation de se flusher. */ -Conversations.prototype.flush = function(numConv) -{ - this.conversations[numConv].flush() -} +euphorik.Conversations.prototype.flush = function(numConv) { + this.conversations[numConv].flush(); +}; -Conversations.prototype.ouvrirConversation = function(racine) -{ - if (this.client.ajouterConversation(racine)) - this.rafraichirMessages(true) - else - this.util.messageDialogue("Cette conversation est déjà ouverte") -} +euphorik.Conversations.prototype.ouvrirConversation = function(racine) { + if (this.client.ajouterConversation(racine)) { + this.rafraichirMessages(true); + } else { + this.util.messageDialogue("Cette conversation est déjà ouverte"); + } +}; -Conversations.prototype.viderMessages = function() -{ - for (var i = 0; i < this.conversations.length; i++) - this.conversations[i].viderMessages() -} +euphorik.Conversations.prototype.viderMessages = function() { + this.conversations.each(function(i, conv) { + conv.viderMessages(); + }); +}; /** * Met à jour les messages de manière continue. * (AJAX-Comet-style proof) * @param vider vide tous les messages avant d'afficher les nouveaux */ -Conversations.prototype.rafraichirMessages = function(vider) -{ - var thisMessages = this +euphorik.Conversations.prototype.rafraichirMessages = function(vider) { + var thisMessages = this; - if (vider == undefined) - vider = false + vider = vider || false; - if (vider) - for (var i = 0; i < this.conversations.length; i++) - this.conversations[i].idDernierMessageAffiche = 0 + if (vider) { + this.conversations.each(function(i, conv) { + conv.idDernierMessageAffiche = 0; + }); + } this.pageEvent.waitEvent( - function() { return thisMessages.getJSONrafraichirMessages() }, + function() { return thisMessages.getJSONrafraichirMessages(); }, { "new_troll" : - function(data) - { - thisMessages.trollIdCourant = data["troll_id"] - $("#trollCourant .troll").html(thisMessages.formateur.traitementComplet(data["content"])).unbind("click").click( - function() - { - thisMessages.ouvrirConversation(data["message_id"]) + function(data) { + thisMessages.trollIdCourant = data.troll_id; + $("#trollCourant .troll").html(thisMessages.formateur.traitementComplet(data.content)).unbind("click").click( + function() { + thisMessages.ouvrirConversation(data.message_id); } - ) + ); - $("#trollCourant .troll a[@rel*=lightbox]").lightBox() + $("#trollCourant .troll a[@rel*=lightbox]").lightBox(); }, - "new_messages" : - function(data) - { - if (vider) - thisMessages.viderMessages() + "new_messages" : + function(data) { + if (vider) { + thisMessages.viderMessages(); + } + // ajoute les messages reçus à leur conversation respective - for (var numConv = 0; numConv < data["conversations"].length; numConv++) - { - if (!thisMessages.ajouterMessages(data["conversations"][numConv], numConv)) - { - thisMessages.util.messageDialogue("La conversation {" + thisMessages.client.conversations[numConv -1].root.toString(36) + "} n'existe pas") - thisMessages.client.supprimerConversation(numConv - 1) + data.conversations.each(function(numConv, conv) { + if (!thisMessages.ajouterMessages(conv, numConv)) { + thisMessages.util.messageDialogue("La conversation {" + thisMessages.client.conversations[numConv - 1].root.toString(36) + "} n'existe pas"); + thisMessages.client.supprimerConversation(numConv - 1); } + }); + + if (vider) { + thisMessages.afficherMessagesRepondConversations(); } - if (vider) - thisMessages.afficherMessagesRepondConversations() - vider = false + + vider = false; } } - ) -} + ); +};