X-Git-Url: http://git.euphorik.ch/?a=blobdiff_plain;f=js%2FpageMinichat.js;h=c8a099a668c18bc955125516f2cdf6cf956f7422;hb=481af0a8064ab4bdf6a5c6eba6766dd5e2d6d768;hp=60c3a64ef1ddb03d061ad89a65c32ea6f8e025e2;hpb=5e6e8d4d1aecf4e7522592dc9876818851c99c9c;p=euphorik.git diff --git a/js/pageMinichat.js b/js/pageMinichat.js index 60c3a64..c8a099a 100755 --- a/js/pageMinichat.js +++ b/js/pageMinichat.js @@ -26,8 +26,7 @@ PageMinichat.prototype.contenu = function() \

\ \ -
\ -
' +
' } PageMinichat.prototype.charger = function() @@ -39,15 +38,6 @@ PageMinichat.prototype.charger = function() this.messages.rafraichirMessages(true) this.util.setCaretToEnd(jQuery("form input.message")[0]) - - jQuery("#messages").hover( - function(){}, - function(event) - { - jQuery("#messages .message").removeClass("cache") - thisPage.messages.messageOver = null - } - ) // affichage des smiles jQuery("#smiles").html(this.formateur.getSmilesHTML()).children().each( @@ -86,9 +76,7 @@ PageMinichat.prototype.charger = function() function() { // captcha anti bot - if (jQuery("form input.captcha").val() != "") return - - thisPage.messages.allerSurLaPage(1) + if (jQuery("form input.captcha").val() != "") return thisPage.envoyerMessage( jQuery("form input.pseudo").val(), @@ -166,7 +154,7 @@ PageMinichat.prototype.envoyerMessage = function(pseudo, message) // met à jour la classe des messages auquel repond celui ci (c'est un peu de la triche) for (var i = 0; i < repondA.length; i++) { - jQuery("#messages div#" + repondA[i]).addClass("repondu") + jQuery("#conversation div#" + repondA[i]).addClass("repondu") for (var m = 0; m < this.messages.messages.length; m++) this.messages.messages[m].clientARepondu = true } @@ -307,15 +295,44 @@ Message.prototype.afficherConversation = function(messages) /** * Représente une conversation. + * @param numConv le numéro (appelé id) de la conversation + * @param formateur outil permettant la mise en forme du texte des messages */ -function Conversation() +function Conversation(numConv, formateur) { + var thisConversation = this + + this.id = numConv + this.messageOver = null // le message sur lequel se trouve le curseur + this.formateur = formateur this.messages = new Array() this.messagesParId = new Object() this.idDernierMesssage = null // la racine de la conversation (string), null = conversation principale this.page = 1 // par défaut on se trouve sur la première page + + jQuery("#conversations").append( + "
" + ) + + // enlève la mise en évidence pour la conversation + jQuery(this.getId()).hover( + function(){}, + function(event) + { + jQuery("#conversations .message").removeClass("cache") + thisConversation.messageOver = null + } + ) +} + +/** + * Retourne l'id de la conversation sous la forme (par exemple) "#conv453" + */ +Conversation.prototype.getId = function() +{ + return "#" + this.id } Conversation.prototype.ajouterMessage = function(message) @@ -323,7 +340,112 @@ Conversation.prototype.ajouterMessage = function(message) this.messages.push(message) this.messagesParId[message.id] = message if (this.messages.length > this.nbMessageMax) - delete this.messagesParId[this.messages.shift().id] + delete this.messagesParId[this.messages.shift().id] +} + +Conversation.prototype.viderMessages = function() +{ + this.messages = new Array() + jQuery("#conversations " + this.getId()).empty() +} + +/** + * Après l'ajout d'un ou plusieurs message cette méthode est appelée afin + * d'afficher les messages non-affichés. + */ +Conversation.prototype.flush = function() +{ + var thisConversation = this + + var idDernierMessageAffiche = jQuery("#conversations " + this.getId() + " div:first").attr("id") + if (idDernierMessageAffiche == undefined) idDernierMessageAffiche = "0" + + var XHTML = "" + for (var i = this.messages.length - 1; i >= 0; i--) + if (parseInt(this.messages[i].id, 36) > parseInt(idDernierMessageAffiche, 36)) + { + var message = this.messages[i] + var XHTMLrepondA = "" + for (var id in message.repondA) + XHTMLrepondA += this.formateur.traitementComplet(message.repondA[id].pseudo) + "> " + XHTMLrepondA = "
" + XHTMLrepondA + "
" + + XHTML += + "
" + + "[
" + message.date + "
]" + + "
" + this.formateur.traitementComplet(message.pseudo) + "
:" + + XHTMLrepondA + + "
" + (message.systeme ? this.formateur.remplacerBalisesHTML(message.contenu) : this.formateur.traitementComplet(message.contenu, message.pseudo))+ "
" + + "
" + } + jQuery("#conversations " + this.getId()).prepend(XHTML) + + if (myLightbox != null) + myLightbox.updateImageList() + + var nbMessagesAffiche = jQuery("#conversations " + this.getId() + " .message").size() + if (nbMessagesAffiche > this.nbMessageMax) + jQuery("#conversations " + this.getId() + " .message").slice(this.nbMessageMax, nbMessagesAffiche).empty(); + + jQuery("#conversations " + this.getId() + " .message").filter(function(){return parseInt(jQuery(this).attr("id"), 36) > parseInt(idDernierMessageAffiche, 36)}).each( + function() + { + jQuery(this).click( + function(event) + { + if (jQuery(event.target).is("a")) return + + var valCourant = jQuery("input.message").val() + if (valCourant == undefined) valCourant = "" + var tag = jQuery(".pseudo", this).text() + "{" + jQuery(this).attr("id") + "}" + ">" + if (valCourant.indexOf(tag, 0) == -1) + jQuery("input.message").val(tag + " " + valCourant) + thisConversation.util.setCaretToEnd(jQuery("form input.message")[0]) + } + ) + // Q : pourquoi pas un .hover ? + // R : simplement pour éviter que lorsqu'un message arrive cela n'affecte la conversation actuellement mise en évidence (uniquement pour Firefox) + .mousemove( + function(e) + { + if (this !== thisConversation.messageOver) + { + thisConversation.afficherConversation(this) + thisConversation.messageOver = this + } + } + ) + } + ) +} + +/** + * Etablit une liste des messages à mettre en evidence et des messages à cacher. + * Puis applique un plan diabolique. + * @param element un message de la liste des messages + */ +Conversation.prototype.afficherConversation = function(element) +{ + // cherche le message selectionné + var id = jQuery(element).attr("id") + var message = this.messagesParId[id] + if (message == undefined) return + + mess = message.afficherConversation(this) + + // FIXME : cet appel est très lent + jQuery("#conversations " + this.getId() + " .message").each( + function() + { + var jq = jQuery(this) + if (!mess.hasOwnProperty(jq.attr("id"))) + jq.addClass("cache") + else + jq.removeClass("cache") + } + ) } /////////////////////////////////////////////////////////////////////////////////////////////////// @@ -338,14 +460,12 @@ function Messages(client, formateur, util) this.util = util this.conversations = new Array() // les conversations, la première représente la conversation principale - this.conversations[0] = new Conversation() + this.conversations[0] = new Conversation(0, this.formateur) this.idDernierMesssage = null // l'id du dernier message connu // l'objet XMLHttpRequest représentant la connexion d'attente this.attenteCourante = null - - var messageOver = null // element } /** @@ -377,7 +497,7 @@ Messages.prototype.getXMLrafraichirMessages = function() XMLDocument.documentElement.appendChild(nodeNombreMessage) var nodePage = XMLDocument.createElement("page") - nodePage.appendChild(XMLDocument.createTextNode(this.conversation[0].page)) + nodePage.appendChild(XMLDocument.createTextNode(this.conversations[0].page)) XMLDocument.documentElement.appendChild(nodePage) // les conversations @@ -398,18 +518,26 @@ Messages.prototype.getXMLrafraichirMessages = function() return XMLDocument; } +/** + * Ajoute un ensemble de messages puis les affiches. + * @param elements un tableau d'éléments représentant les messages, voir protocole.txt + * @param numConversation le numéro de la conversation auquel appartiennent les messages + */ +Messages.prototype.ajouterMessages = function(elements, numConversation) +{ + for (var i = 0; i < elements.length; i++) + this.ajouterMessage(elements[i], numConversation) + this.flush(numConversation) +} + /** * Création d'un nouveau message. * Les message sont données dans l'ordre de leur id. - * Met directement à jour l'affichage. * @param element un element xml représentant le message * @param numConversation le numéro de la conversation, 0 = principale - * @param autoFlush si oui alors le message est directement ajouté à la vue */ -Messages.prototype.ajouterMessage = function(element, numConversation, autoFlush) +Messages.prototype.ajouterMessage = function(element, numConversation) { - if (autoFlush == undefined) autoFlush = true // valeur par défaut - // pas d'utilisation de jquery pour des raisons de performance this.idDernierMesssage = element.getAttribute("id") @@ -427,118 +555,33 @@ Messages.prototype.ajouterMessage = function(element, numConversation, autoFlush message.setRepondA(jQuery("repondA", element)) if (this.conversations[numConversation] == null) - this.conversations[numConversation] = new Conversation() - + this.conversations[numConversation] = new Conversation(numConversation, this.formateur) this.conversations[numConversation].ajouterMessage(message) - - if (autoFlush) - this.flush() } - -// <<< TODO <<<<<<<<<<<<<<<<<<<<<<<<<<<<< - - -Messages.prototype.flush = function() +/** + * Demande à toutes les conversations de se flusher (afficher les messages non-affichés). + */ +Messages.prototype.flushAll = function() { - var thisMessages = this - - var idDernierMessageAffiche = jQuery("#messages div:first").attr("id") - if (idDernierMessageAffiche == undefined) idDernierMessageAffiche = "0" - - var XHTML = "" - for (var i = this.messages.length - 1; i >= 0; i--) - if (parseInt(this.messages[i].id, 36) > parseInt(idDernierMessageAffiche, 36)) - { - var message = this.messages[i] - var XHTMLrepondA = "" - for (var id in message.repondA) - XHTMLrepondA += this.formateur.traitementComplet(message.repondA[id].pseudo) + "> " - XHTMLrepondA = "
" + XHTMLrepondA + "
" - - XHTML += - "
" + - "[
" + message.date + "
]" + - "
" + this.formateur.traitementComplet(message.pseudo) + "
:" + - XHTMLrepondA + - "
" + (message.systeme ? this.formateur.remplacerBalisesHTML(message.contenu) : this.formateur.traitementComplet(message.contenu, message.pseudo))+ "
" + - "
" - } - jQuery("#messages").prepend(XHTML) - - if (myLightbox != null) - myLightbox.updateImageList() - - var nbMessagesAffiche = jQuery("#messages .message").size() - if (nbMessagesAffiche > this.nbMessageMax) - jQuery("#messages .message").slice(this.nbMessageMax, nbMessagesAffiche).empty(); - - jQuery("#messages .message").filter(function(){return parseInt(jQuery(this).attr("id"), 36) > parseInt(idDernierMessageAffiche, 36)}).each( - function() - { - jQuery(this).click( - function(event) - { - if (jQuery(event.target).is("a")) return - - var valCourant = jQuery("input.message").val() - if (valCourant == undefined) valCourant = "" - var tag = jQuery(".pseudo", this).text() + "{" + jQuery(this).attr("id") + "}" + ">" - if (valCourant.indexOf(tag, 0) == -1) - jQuery("input.message").val(tag + " " + valCourant) - thisMessages.util.setCaretToEnd(jQuery("form input.message")[0]) - } - ) - // Q : pourquoi pas un .hover ? - // R : simplement pour éviter que lorsqu'un message arrive cela n'affecte la conversation actuellement mise en évidence - .mousemove( - function(e) - { - if (this !== thisMessages.messageOver) - { - thisMessages.afficherConversation(this) - thisMessages.messageOver = this - } - } - ) - } - ) + for (var i = 0; i < this.conversations.length; i++) + this.flush(i) } /** - * Etablit une liste des messages à mettre en evidence et des messages à cacher. - * Puis applique un plan diabolique. - * @param element un message de la liste des messages + * Demande à une conversation de se flusher. */ -Messages.prototype.afficherConversation = function(element) +Messages.prototype.flush = function(numConv) { - // cherche le message selectionné - var id = jQuery(element).attr("id") - var message = this.messagesParId[id] - if (message == undefined) return - - mess = message.afficherConversation(this) - - // FIXME : cet appel est très lent - jQuery("#messages .message").each( - function() - { - var jq = jQuery(this) - if (!mess.hasOwnProperty(jq.attr("id"))) - jq.addClass("cache") - else - jq.removeClass("cache") - } - ) + this.conversations[numConv].flush() } Messages.prototype.viderMessages = function() { this.idDernierMesssage = null - this.messages = new Array() - jQuery("#messages").empty() + + for (var i = 0; i < this.conversations.length; i++) + this.conversations[i].viderMessages() } /** @@ -577,15 +620,30 @@ Messages.prototype.rafraichirMessages = function(vider) if (vider) thisMessages.viderMessages() - thisMessages.MAJPages(parseInt(jQuery("nbPage", data.documentElement).text())) + //thisMessages.MAJPages(parseInt(jQuery("nbPage", data.documentElement).text())) - reponse = jQuery("message", data.documentElement).each( + // ajoute les messages reçu à leur conversation respective + var numConv = 0 + jQuery("conversation", data.documentElement).each( function(i) { - thisMessages.ajouterMessage(this, false) + var messages = [] + jQuery("message", this).each( + function(j) + { + // thisMessages.ajouterMessage(this, numConv) + messages.push(this) + } + ) + thisMessages.ajouterMessages(messages, numConv) + numConv += 1 } ) - thisMessages.flush() + + // demande à toutes les conversations d'afficher les messages non-affichés + //thisMessages.flush() + + // rappel de la fonction dans 100 ms setTimeout(function(){ thisMessages.rafraichirMessages() }, 100); }, error: @@ -597,6 +655,7 @@ Messages.prototype.rafraichirMessages = function(vider) ) } +/* Osbolète Messages.prototype.MAJPages = function(nbPage) { //alert(nbPage) @@ -619,8 +678,9 @@ Messages.prototype.MAJPages = function(nbPage) } ) } -} +}*/ +/* Obsolète Messages.prototype.allerSurLaPage = function(page) { if (page == this.page) @@ -641,5 +701,5 @@ Messages.prototype.allerSurLaPage = function(page) ) this.rafraichirMessages(true) -} +}*/