X-Git-Url: http://git.euphorik.ch/?a=blobdiff_plain;f=js%2FpageMinichat.js;h=aeda772ebd4f64d2bc8da3f0673e445de61b641e;hb=f55ef9d6bc7352e2dffe18ded028a5a2e0cc3936;hp=f6b73c0040c5e95dee421842c1fe4bb36496bd72;hpb=c39e55c505a27e30209fcfb6d837d6ec8a82b990;p=euphorik.git diff --git a/js/pageMinichat.js b/js/pageMinichat.js index f6b73c0..aeda772 100755 --- a/js/pageMinichat.js +++ b/js/pageMinichat.js @@ -14,14 +14,13 @@ function PageMinichat(client, formateur, util) PageMinichat.prototype.contenu = function() { -// \ return '\ -
\
\

\ \ \ \ + \ \

\
\ @@ -41,8 +40,25 @@ PageMinichat.prototype.charger = function() this.util.setCaretToEnd(jQuery("form input.message")[0]) + // les outils de bannissement (uniquement pour les ekMaster) + if (this.client.ekMaster) + { + jQuery("body").append( + "
\"Ban\"Ban\"Avertissement\"
" + ) + jQuery("#outilsBan").hover( + function(){}, + function() + { + jQuery("#outilsBan").hide() + } + ) + } + + // + jQuery("body").append("
") // affichage des smiles - jQuery("#smiles").html(this.formateur.getSmilesHTML()).children().each( + jQuery("#smiles").append(this.formateur.getSmilesHTML()).children().each( function(i) { var opacityBase = jQuery(this).css("opacity") @@ -72,12 +88,28 @@ PageMinichat.prototype.charger = function() ) } ) + jQuery("form button.smiles").hover( + function(e) + { + var offset = jQuery(e.target).offset() + jQuery("#smiles").css("top", offset.top).css("left", offset.left).show() + }, + function(e){} + ) + jQuery("#smiles").hover( + function(){}, + function(e) + { + jQuery("#smiles").hide() + } + ) + //
- /// événements - jQuery("form button.return").click( + // événements + var nouveauMessage = function() - { - // captcha anti bot + { + // captcha anti bot if (jQuery("form input.captcha").val() != "") return thisPage.envoyerMessage( @@ -87,9 +119,19 @@ PageMinichat.prototype.charger = function() jQuery("form input.message")[0].focus() } + + jQuery("form").keypress( + function(e) + { + if (e.which == 13) // return + nouveauMessage() + } ) + + jQuery("form button.return").click(nouveauMessage) + // interdiction de submiter le formulaire - jQuery("form").submit(function(){return false}) + jQuery("form").submit(function(){ return false}) jQuery("input.pseudo").click( function() @@ -105,38 +147,20 @@ PageMinichat.prototype.decharger = function() { //alert(this.attenteCourante) this.messages.stopAttenteCourante() + + jQuery("body #smiles").remove() + jQuery("body #outilsBan").remove() } -PageMinichat.prototype.getXMLMessage = function(pseudo, message, repondA) +PageMinichat.prototype.getJSONMessage = function(pseudo, message, repondA) { - var XMLDocument = this.util.creerDocumentXMLAction() - XMLDocument.documentElement.setAttribute("name", "message") - - var nodeCookie = XMLDocument.createElement("cookie") - nodeCookie.appendChild(XMLDocument.createTextNode(this.client.cookie)) - XMLDocument.documentElement.appendChild(nodeCookie) - - var nodePseudo = XMLDocument.createElement("pseudo") - nodePseudo.appendChild(XMLDocument.createTextNode(pseudo)) - XMLDocument.documentElement.appendChild(nodePseudo) - - var nodeContenu = XMLDocument.createElement("contenu") - nodeContenu.appendChild(XMLDocument.createTextNode(message)) - XMLDocument.documentElement.appendChild(nodeContenu) - - if (repondA.length > 0) - { - var nodeReponses = XMLDocument.createElement("reponses") - XMLDocument.documentElement.appendChild(nodeReponses) - for (var i = 0; i < repondA.length; i++) - { - var nodeReponse = XMLDocument.createElement("reponse") - nodeReponse.setAttribute("id", repondA[i]) - nodeReponses.appendChild(nodeReponse) - } + return { + "action" : "put_message", + "cookie" : this.client.cookie, + "nick" : pseudo, + "content" : message, + "answer_to" : repondA } - - return XMLDocument } PageMinichat.prototype.envoyerMessage = function(pseudo, message) @@ -152,7 +176,7 @@ PageMinichat.prototype.envoyerMessage = function(pseudo, message) if (tags != null) { for(var i = 0; i < tags.length; i++) - repondA.push(/\{(.*?)\}>/.exec(tags[i])[1]) + repondA.push(parseInt(/\{(.*?)\}>/.exec(tags[i])[1], 36)) message = message.replace(this.regexMessageTagReplace, "") } @@ -163,23 +187,32 @@ PageMinichat.prototype.envoyerMessage = function(pseudo, message) return } - if (!this.client.identifie()) + if (!this.client.authentifie()) if (!this.client.enregistrement()) { this.util.messageDialogue("login impossible") return - } - + } + + this.client.pseudo = pseudo + + ;;; dumpObj(this.getJSONMessage(pseudo, message, repondA)) jQuery.ajax( { url : "request", type: "POST", - data : this.util.xmlVersAction(this.getXMLMessage(pseudo, message, repondA)), - dataType : "xml", + data : this.util.jsonVersAction(this.getJSONMessage(pseudo, message, repondA)), + dataType : "json", + beforeSend : function(xmlHttpRequest) + { + xmlHttpRequest.setRequestHeader("X-Requested-With", "") + }, success : function(data, textStatus) { - if(jQuery("statut", data.documentElement).text() == "ok") - { + ;;; dumpObj(data) + + if(data["reply"] == "ok") + { jQuery("form input.message").val("") // met à jour la classe des messages auquel repond celui ci (c'est un peu de la triche) @@ -192,7 +225,11 @@ PageMinichat.prototype.envoyerMessage = function(pseudo, message) thisPageMinichat.messages.conversations[c].messages[m].clientARepondu = true */ } - } + } + else if (data["reply"] == "error") + { + thisPageMinichat.util.messageDialogue(data["error_message"]) + } } } ) @@ -222,16 +259,19 @@ function Reponse(id, pseudo, login) * @param pseudo * @param contenu */ -function Message(id, date, pseudo, contenu) +function Message(id, auteurId, date, pseudo, login, contenu) { this.id = id + this.auteurId = auteurId this.date = date this.pseudo = pseudo + this.login = login this.contenu = contenu this.appartientAuClient = false this.clientARepondu = false this.estUneReponse = false + this.ekMaster = false this.systeme = false // est-ce un message 'système' ? @@ -241,19 +281,19 @@ function Message(id, date, pseudo, contenu) /** * */ -Message.prototype.setRepondA = function(element) +Message.prototype.setRepondA = function(repondAJSON) { - this.repondA = {} - var thisMessage = this - - jQuery("id", element).each ( - function() - { - var reponse = new Reponse(jQuery(this).attr("id"), jQuery(this).attr("pseudo"), jQuery(this).attr("login")) - thisMessage.repondA[reponse.id] = reponse - } - ) + this.repondA = {} + + for(var i = 0; i < repondAJSON.length; i++) + { + thisMessage.repondA[repondAJSON[i]["id"]] = new Reponse( + repondAJSON[i]["id"], + repondAJSON[i]["nick"], + repondAJSON[i]["login"] + ) + } } /** @@ -297,15 +337,18 @@ Message.prototype.getConversation = function(messages) * @param numConv le numéro (appelé id) de la conversation * @param formateur outil permettant la mise en forme du texte des messages */ -function Conversation(num, util, formateur) +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.random()*100000000000000000 + this.id = Math.random() * 100000000000000000 this.messageOver = null // le message sur lequel se trouve le curseur this.util = util this.formateur = formateur + this.client = client + this.idDernierMessageAffiche = 0 + this.messages = new Array() this.messagesParId = new Object() @@ -332,11 +375,11 @@ function Conversation(num, util, formateur) } /** - * Défini les fonctions (callback) appelées lorsque l'on change de page. + * Défini la page courante et s'il l'on se trouve sur la dernière page. * @pageCourante la page courante * @dernierePage true si c'est la dernière page sinon false */ -Conversation.prototype.eventsPage = function(pageCourante, dernierePage) +Conversation.prototype.setPage = function(pageCourante, dernierePage) { jQuery("#conversations #" + this.getId() + " .numPage").text(pageCourante) jQuery("#conversations #" + this.getId() + " .next").css("display", pageCourante == 1 ? "none" : "inline") @@ -409,61 +452,77 @@ Conversation.prototype.ajouterMessage = function(message) delete this.messagesParId[this.messages.shift().id] } +/** + * FIXME : méthode très lourde. ne serait-ce pas mieux de virer d'un coup l'élément conversation et d'en remettre un vide ? + */ Conversation.prototype.viderMessages = function() { this.messages = new Array() + this.idDernierMessageAffiche = 0 jQuery("#conversations #" + this.getId() + " .message").remove() } /** * 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" */ -Conversation.prototype.flush = function(funClickExtract, funClickLienConv) +Conversation.prototype.flush = function(funClickOuvrirConv) { var thisConversation = this - var idDernierMessageAffiche = jQuery("#conversations #" + this.getId() + " div:first").attr("id") - if (idDernierMessageAffiche == undefined) idDernierMessageAffiche = "0" + // est-ce que le prochain message est pair ? (permet d'alterner le style des messages) + var messagePair = (this.idDernierMessageAffiche == 0 ? true : + (jQuery("#conversations #" + this.getId() + " div:first").attr("class").search("messagePair") == -1) + ) // construction de l'XHTML des messages var XHTML = "" for (var i = this.messages.length - 1; i >= 0; i--) - if (parseInt(this.messages[i].id, 36) > parseInt(idDernierMessageAffiche, 36)) - { + if (this.messages[i].id > this.idDernierMessageAffiche) + { var message = this.messages[i] + + // construit l'identifiant de la personne + var identifiant = + this.client.nickFormat == "nick" ? 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 = "" for (var id in message.repondA) XHTMLrepondA += this.formateur.traitementComplet(message.repondA[id].pseudo) + "> " XHTMLrepondA = "" + XHTMLrepondA + "" XHTML += - "
" + "
>
" + "[" + message.date + "]" + - "" + this.formateur.traitementComplet(message.pseudo) + ":" + + "" + identifiant + ":" + XHTMLrepondA + "" + (message.systeme ? this.formateur.remplacerBalisesHTML(message.contenu) : this.formateur.traitementComplet(message.contenu, message.pseudo)) + "" + "
" + + messagePair = !messagePair } jQuery("#conversations #" + this.getId()).prepend(XHTML) - // mise à jour des images (LightBox) après l'ajout de message - if (myLightbox != null) - myLightbox.updateImageList() - // enlève les messages exedentaires var nbMessagesAffiche = jQuery("#conversations #" + this.getId() + " .message").size() if (nbMessagesAffiche > this.nbMessageMax) jQuery("#conversations #" + this.getId() + " .message").slice(this.nbMessageMax, nbMessagesAffiche).empty() - // Ajoute les événements liés à chaque message - jQuery("#conversations #" + this.getId() + " .message").filter(function(){return parseInt(jQuery(this).attr("id"), 36) > parseInt(idDernierMessageAffiche, 36)}).each( + // ajoute les événements liés à chaque nouveau message + jQuery("#conversations #" + this.getId() + " .message").filter(function(){return parseInt(jQuery(this).attr("id"), 36) > thisConversation.idDernierMessageAffiche}).each( function() { jQuery(".lienConv", this).click( @@ -471,23 +530,52 @@ Conversation.prototype.flush = function(funClickExtract, funClickLienConv) { // FIXME : ya pas mieux ? var racine = jQuery(event.target).text() - funClickLienConv(racine.substring(1, racine.length - 1)) + funClickOuvrirConv(parseInt(racine.substring(1, racine.length - 1), 36)) return false } ) + $("a[@rel*=lightbox]").lightBox() + + // les outils de bannissement (uniquement pour les ekMaster) + if (thisConversation.client.ekMaster) + jQuery(".pseudo", this).hover( + function(e) + { + var userId = parseInt(jQuery(this).attr("id").substr(4)) + var element = jQuery(e.target) + var h = element.height() + var offset = element.offset() + var outils = jQuery("#outilsBan").css("top", offset.top - 2).css("left", offset.left - 2).height(h < 16 ? 16 : h).width(element.width() + 16 * 3 + 4).show() + jQuery("img", outils).unbind() + jQuery("#kick", outils).click( + function(e) + { + thisConversation.client.kick(userId) + } + ) + jQuery("#ban", outils).click( + function(e) + { + thisConversation.client.ban(userId) + } + ) + }, + function(){} + ) + jQuery(this).click( function(event) { if (jQuery(event.target).is("a")) return // l'id du message - idMess = jQuery(this).attr("id") + var idMess = jQuery(this).attr("id") // extraction d'une conversation if (jQuery(event.target).is(".extraire")) { - funClickExtract(idMess) + funClickOuvrirConv(parseInt(idMess, 36)) return } @@ -513,6 +601,9 @@ Conversation.prototype.flush = function(funClickExtract, funClickLienConv) ) } ) + + if (this.messages.length > 0) + this.idDernierMessageAffiche = this.messages[this.messages.length-1].id } /** @@ -523,7 +614,8 @@ Conversation.prototype.flush = function(funClickExtract, funClickLienConv) Conversation.prototype.afficherConversation = function(element) { // cherche le message selectionné - var id = jQuery(element).attr("id") + var id = parseInt(jQuery(element).attr("id"), 36) + var message = this.messagesParId[id] if (message == undefined) return @@ -534,7 +626,7 @@ Conversation.prototype.afficherConversation = function(element) function() { var jq = jQuery(this) - if (!mess.hasOwnProperty(jq.attr("id"))) + if (!mess.hasOwnProperty(parseInt(jq.attr("id"), 36))) jq.addClass("cache") else jq.removeClass("cache") @@ -565,58 +657,71 @@ function Messages(client, formateur, util) this.conversations = new Array() // les conversations, la première représente la conversation principale this.nouvelleConversation(0) - - this.idDernierMessage = null // l'id du dernier message connu - // l'objet XMLHttpRequest représentant la connexion d'attente + // l'objet JSONHttpRequest représentant la connexion d'attente this.attenteCourante = null } /** - * Crée un document XML contenant le message demandant un rafraichissement. + * Crée un message JSON contenant le message demandant un rafraichissement. */ -Messages.prototype.getXMLrafraichirMessages = function() -{ - var XMLDocument = this.util.creerDocumentXMLAction() - XMLDocument.documentElement.setAttribute("name", "refreshMessages") - - if (this.client.identifie()) - { - var nodeCookie= XMLDocument.createElement("cookie") - nodeCookie.appendChild(XMLDocument.createTextNode(this.client.cookie)) - XMLDocument.documentElement.appendChild(nodeCookie) +Messages.prototype.getJSONrafraichirMessages = function() +{ + var mess = { + "action" : "wait_event", + "page" : "chat", + "message_count" : conf.nbMessageAffiche, + "main_page" : this.client.pagePrincipale, + "conversations" : this.getJSONConversations() } - if (this.idDernierMessage != null) - { - var nodeDernierMessageId = XMLDocument.createElement("dernierMessageId") - nodeDernierMessageId.appendChild(XMLDocument.createTextNode(this.idDernierMessage)) - XMLDocument.documentElement.appendChild(nodeDernierMessageId) - } + if (this.client.cookie != null) mess["cookie"] = this.client.cookie; + mess["last_message_id"] = this.conversations[0].idDernierMessageAffiche - var nodeNombreMessage = XMLDocument.createElement("nombreMessage") - nodeNombreMessage.appendChild(XMLDocument.createTextNode(conf.nbMessageAffiche)) - XMLDocument.documentElement.appendChild(nodeNombreMessage) + // obsolète + //if (this.idDernierMessage != null) mess["last_message_id"] = this.idDernierMessage - return XMLDocument; + return mess +} + +Messages.prototype.getJSONConversations = function() +{ + var clientConv = this.client.getJSONConversations() + for (var i = 1; i < this.conversations.length; i++) + { + clientConv[i-1]["last_message_id"] = this.conversations[i].idDernierMessageAffiche + } + return clientConv } /** * Ajoute un ensemble de messages puis les affiches. - * @param elements un tableau d'éléments représentant les messages, voir protocole.txt + * @param elements un tableau d'éléments JSON représentant les messages, voir protocole.txt * @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 */ Messages.prototype.ajouterMessages = function(elements, numConversation) { - for (var i = 0; i < elements.length; i++) - this.ajouterMessage(elements[i], numConversation) + if (elements["messages"].length == 0 && typeof(this.conversations[numConversation]) == "undefined") + return false + + for (var i = 0; i < elements["messages"].length; i++) + this.ajouterMessage(elements["messages"][i], 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"] + ) + + return true } /** * Création d'un nouveau message. * Les message sont données dans l'ordre de leur id. - * @param element un element xml représentant le message + * @param element un element JSON représentant le message * @param numConversation le numéro de la conversation, 0 = principale */ Messages.prototype.ajouterMessage = function(element, numConversation) @@ -624,22 +729,23 @@ Messages.prototype.ajouterMessage = function(element, numConversation) var thisMessages = this // pas d'utilisation de jquery pour des raisons de performance - var id = element.getAttribute("id") - if (this.idDernierMessage == null || parseInt(id, 36) > parseInt(this.idDernierMessage, 36)) - this.idDernierMessage = id + var id = element["id"] var message = new Message( - id, - jQuery("date", element).text(), - jQuery("pseudo", element).text(), - jQuery("contenu", element).text() + id, + element["user_id"], + element["date"], + element["nick"], + element["login"], + element["content"] ) - message.appartientAuClient = jQuery("proprietaire", element).text() == "true" - message.clientARepondu = jQuery("repondu", element).text() == "true" - message.estUneReponse = jQuery("reponse", element).text() == "true" - message.systeme = jQuery("systeme", element).text() == "true" - message.setRepondA(jQuery("repondA", element)) + message.appartientAuClient = element["owner"] + message.clientARepondu = element["answered"] + message.estUneReponse = element["is_a_reply"] + message.systeme = element["system"] + message.setRepondA(element["answer_to"]) + message.ekMaster = element["ek_master"] if (this.conversations[numConversation] == null) { @@ -653,7 +759,7 @@ Messages.prototype.ajouterMessage = function(element, numConversation) { thisPage.util.replaceSelection( jQuery("form input.message")[0], - "{" + thisMessages.client.conversations[num-1].racine + "}" + "{" + thisMessages.client.conversations[num-1].root.toString(36) + "}" ) } ) @@ -666,7 +772,7 @@ Messages.prototype.nouvelleConversation = function(num, funFermer, funLien) { var thisMessages = this - this.conversations[num] = new Conversation(num, this.util, this.formateur) + this.conversations[num] = new Conversation(num, this.util, this.formateur, this.client) if (funFermer != undefined) this.conversations[num].eventFermer(funFermer) if (funLien != undefined) @@ -738,25 +844,27 @@ Messages.prototype.flushAll = function() Messages.prototype.flush = function(numConv) { var thisMessages = this - + this.conversations[numConv].flush( - // fonction appelée lors de la demande d'extraction d'une conversation - function(idMess) - { - if (thisMessages.client.ajouterConversation(idMess)) - thisMessages.rafraichirMessages(true) - }, function(racine) // appelé lorsqu'un utilisateur click sur un lien vers une conversation { - if (thisMessages.client.ajouterConversation(racine)) - thisMessages.rafraichirMessages(true) + thisMessages.ouvrirConversation(racine) } ) } +Messages.prototype.ouvrirConversation = function(racine) +{ + if (this.client.ajouterConversation(racine)) + this.rafraichirMessages(true) + else + this.util.messageDialogue("Cette conversation est déjà ouverte") +} + Messages.prototype.viderMessages = function() { - this.idDernierMessage = null + // Obsolète + //this.idDernierMessage = null for (var i = 0; i < this.conversations.length; i++) this.conversations[i].viderMessages() @@ -786,54 +894,43 @@ Messages.prototype.rafraichirMessages = function(vider) this.stopAttenteCourante() if (vider) - this.idDernierMessage = null + for (var i = 0; i < this.conversations.length; i++) + this.conversations[i].idDernierMessageAffiche = 0 - ;;; this.util.xmlVersAction(this.getXMLrafraichirMessages()).action.dump("Client") + dumpObj(this.getJSONrafraichirMessages()) this.attenteCourante = jQuery.ajax({ - type: "POST", - url: "request", - dataType: "xml", - data: this.util.xmlVersAction(this.getXMLrafraichirMessages()), - success: - function(data) - { - ;;; thisMessages.util.serializer.serializeToString(data).dump("Serveur") + type: "POST", + url: "request", + dataType: "json", + data: this.util.jsonVersAction(this.getJSONrafraichirMessages()), + success: + function(data) + { + ;;; dumpObj(data) + + if (vider) + thisMessages.viderMessages() - if (vider) - thisMessages.viderMessages() - - // ajoute les messages reçu à leur conversation respective - var numConv = 0 - jQuery("conversation", data.documentElement).each( - function(i) - { - var messages = [] - jQuery("message", this).each( - function(j) - { - // thisMessages.ajouterMessage(this, numConv) - messages.push(this) - } - ) - - thisMessages.ajouterMessages(messages, numConv) - - thisMessages.conversations[numConv].eventsPage( - numConv == 0 ? thisMessages.client.pagePrincipale : thisMessages.client.conversations[numConv - 1].page, - jQuery("autresPages", this).text() != "true" - ) - numConv += 1 - } - ) - - // rappel de la fonction dans 100 ms - setTimeout(function(){ thisMessages.rafraichirMessages() }, 100); - }, - error: - function(XMLHttpRequest, textStatus, errorThrown) + // ajoute les messages reçus à leur conversation respective + for (var numConv = 0; numConv < data["conversations"].length; numConv++) { - setTimeout(function(){ thisMessages.rafraichirMessages() }, 1000); + // ya pas de nouveaux message -> on passe à la prochaine conversation FIXME : marche pas + //if (data["conversations"][numConv]["messages"].length == 0) continue + + 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) + } } - } - ) + + // rappel de la fonction dans 100 ms + setTimeout(function(){ thisMessages.rafraichirMessages() }, 100); + }, + error: + function(XMLHttpRequest, textStatus, errorThrown) + { + setTimeout(function(){ thisMessages.rafraichirMessages() }, 1000); + } + }) }