X-Git-Url: http://git.euphorik.ch/?a=blobdiff_plain;f=js%2Feuphorik.js;h=86982db0694d9a8b83b59f6ce399d88485880496;hb=4a510de0c99d080cdd3ecc837307ac8ee3509e87;hp=929a35ce4855514f8d436392a9326e370041f4e6;hpb=1200ee837aedee95d9aad6730acde8e19d60bebe;p=euphorik.git diff --git a/js/euphorik.js b/js/euphorik.js index 929a35c..86982db 100755 --- a/js/euphorik.js +++ b/js/euphorik.js @@ -13,7 +13,7 @@ * Normalement 'const' à la place de 'var' mais non supporté par IE7. */ var conf = { - nbMessageAffiche : 10, // (par page) + nbMessageAffiche : 40, // (par page) pseudoDefaut : "", tempsAffichageMessageDialogue : 4000, // en ms smiles : { @@ -65,26 +65,37 @@ String.prototype.rtrim = function() /////////////////////////////////////////////////////////////////////////////////////////////////// /** - * Cette classe regroupe des fonctions utilitaires (helpers). + * Cette classe regroupe des fonctions utilitaires (helpers). + * @formateur est permet de formater les messages affichés à l'aide de messageDialogue (facultatif) */ -function Util() +function Util(formateur) { $("#info .fermer").click(function(){ $("#info").slideUp(50) }) + + this.formateur = formateur } +var messageType = {informatif: 0, question: 1, erreur: 2} + /** * Affiche une boite de dialogue avec un message à l'intérieur. * @param message le message (string) * @param type voir 'messageType'. par défaut messageType.informatif * @param les boutons sous la forme d'un objet ou les clefs sont les labels des boutons * et les valeurs les fonctions executées lorsqu'un bouton est activé. + * @param formate faut-il formaté le message ? true par défaut */ -Util.prototype.messageDialogue = function(message, type, boutons) +Util.prototype.messageDialogue = function(message, type, boutons, formate) { + var thisUtil = this + if (type == undefined) type = messageType.informatif + + if (formate == undefined) + formate = true if (this.timeoutMessageDialogue != undefined) clearTimeout(this.timeoutMessageDialogue) @@ -92,7 +103,7 @@ Util.prototype.messageDialogue = function(message, type, boutons) var fermer = function(){$("#info").slideUp(100)} fermer() - $("#info .message").html(message) + $("#info .message").html(thisUtil.formateur == undefined || !formate ? message : thisUtil.formateur.traitementComplet(message)) switch(type) { case messageType.informatif : $("#info #icone").attr("class", "information"); break @@ -105,9 +116,7 @@ Util.prototype.messageDialogue = function(message, type, boutons) $("#info").slideDown(200) this.timeoutMessageDialogue = setTimeout(fermer, conf.tempsAffichageMessageDialogue) -} - -var messageType = {informatif: 0, question: 1, erreur: 2} +} /** * Utilisé pour l'envoie de donnée avec la méthode ajax de jQuery. @@ -238,8 +247,8 @@ Pages.prototype.afficherPage = function(nomPage, forcerChargement) if (this.pageCourante != null && this.pageCourante.decharger) this.pageCourante.decharger() - $("#menu div").removeClass("courante") - $("#menu div." + nomPage).addClass("courante") + $("#menu li").removeClass("courante") + $("#menu li." + nomPage).addClass("courante") this.pageCourante = page $("#page").html(this.pageCourante.contenu()).removeClass().addClass(this.pageCourante.nom) @@ -250,6 +259,11 @@ Pages.prototype.afficherPage = function(nomPage, forcerChargement) /////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Classe permettant de formater du texte par exemple pour la substitution des liens dans les + * message par "[url]". + * TODO : améliorer l'efficacité des méthods notamment lié au smiles. + */ function Formateur() { this.smiles = conf.smiles @@ -277,14 +291,19 @@ Formateur.prototype.getSmilesHTML = function() var XHTML = "" for (var sNom in this.smiles) { - XHTML += "" + XHTML += "\""" } return XHTML } +/** + * Formatage complet d'un texte. + * @M le message + * @pseudo facultatif, permet de contruire le label des images sous la forme : " : " + */ Formateur.prototype.traitementComplet = function(M, pseudo) { - return this.traiterLiensConv(this.traiterSmiles(this.traiterURL(this.remplacerBalisesHTML(M), pseudo))) + return this.traiterLiensConv(this.traiterSmiles(this.traiterURL(this.traiterWikiSyntaxe(this.remplacerBalisesHTML(M)), pseudo))) } /** @@ -306,7 +325,7 @@ Formateur.prototype.traiterLiensConv = function(M) /** * FIXME : Cette méthode est attrocement lourde ! A optimiser. - * moyenne su échantillon : 234ms + * moyenne sur échantillon : 234ms */ Formateur.prototype.traiterSmiles = function(M) { @@ -314,22 +333,19 @@ Formateur.prototype.traiterSmiles = function(M) { ss = this.smiles[sNom] for (var i = 0; i < ss.length; i++) - M = M.replace(ss[i], "") + M = M.replace(ss[i], "\""") } return M } Formateur.prototype.remplacerBalisesHTML = function(M) { - return M.replace(//g, ">") + return M.replace(//g, ">").replace(/"/g, """) } Formateur.prototype.traiterURL = function(M, pseudo) { thisFormateur = this - - if (pseudo == undefined) - pseudo = "" var traitementUrl = function(url) { @@ -337,10 +353,31 @@ Formateur.prototype.traiterURL = function(M, pseudo) if (!thisFormateur.regexTestProtocoleExiste.test(url)) url = "http://" + url var extension = thisFormateur.getShort(url) - return "[" + extension[0] + "]" + return "[" + extension[0] + "]" } return M.replace(this.regexUrl, traitementUrl) } + +/** + * Formatage en utilisant un sous-ensemble des règles de mediwiki. + * par exemple ''italic'' devient italic + */ +Formateur.prototype.traiterWikiSyntaxe = function(M) +{ + return M.replace( + /'''(.*?)'''/g, + function(texte, capture) + { + return "" + capture + "" + } + ).replace( + /''(.*?)''/g, + function(texte, capture) + { + return "" + capture + "" + } + ) +} /** * Renvoie une version courte de l'url. @@ -350,8 +387,8 @@ Formateur.prototype.getShort = function(url) { var estUneImage = false var versionShort = null - var rechercheImg = this.regexImg.exec(url) - //alert(url) + var rechercheImg = this.regexImg.exec(url) + if (rechercheImg != null) { versionShort = rechercheImg[1].toLowerCase() @@ -382,7 +419,7 @@ Formateur.prototype.traiterPourFenetreLightBox = function(M, urlCourante) thisFormateur = this var traitementUrl = function(url) { - return "[" + thisFormateur.getShort(url)[0] + (urlCourante == url ? ": image courante" : "") + "]" + return "[" + thisFormateur.getShort(url)[0] + (urlCourante == url ? "*" : "") + "]" } return this.remplacerBalisesHTML(M).replace(this.regexUrl, traitementUrl) @@ -411,20 +448,19 @@ function Client(util) // données personnels this.resetDonneesPersonnelles() - this.setStatut(statutType.deconnected) - - // le dernier message d'erreur recut du serveur (par exemple une connexion foireuse : "login impossible") - this.dernierMessageErreur = "" + this.setStatut(statutType.deconnected) } Client.prototype.resetDonneesPersonnelles = function() -{ +{ + this.id = 0 this.pseudo = conf.pseudoDefaut this.login = "" this.password = "" this.email = "" this.css = $("link#cssPrincipale").attr("href") this.nickFormat = "nick" + this.cookie = undefined this.pagePrincipale = 1 this.ekMaster = false @@ -599,7 +635,6 @@ Client.prototype.authentifie = function() Client.prototype.setStatut = function(statut) { - //alert(statut) // conversation en "enum" si en "string" if (typeof(statut) == "string") { @@ -609,7 +644,7 @@ Client.prototype.setStatut = function(statut) (statut == "auth_not_registered" ? statutType.auth_not_registered : statutType.deconnected) } - if (statut == this.statut) return + if (statut == this.statut) return this.statut = statut this.majMenu() @@ -640,8 +675,11 @@ Client.prototype.enregistrement = function(login, password) this.login = login this.password = password if(this.flush()) + { this.setStatut(statutType.auth_registered) - return true + return true + } + return false } else { @@ -664,7 +702,10 @@ Client.prototype.connexion = function(messageJson) function(data) { ;;; dumpObj(data) - thisClient.chargerDonnees(data) + if (data["reply"] == "error") + thisClient.util.messageDialogue(data["error_message"]) + else + thisClient.chargerDonnees(data) } } ) @@ -673,10 +714,10 @@ Client.prototype.connexion = function(messageJson) Client.prototype.deconnexion = function() { - this.flush() - this.delCookie() - this.setStatut(statutType.deconnected) // deconnexion + this.flush(true) + this.delCookie() this.resetDonneesPersonnelles() + this.setStatut(statutType.deconnected) // deconnexion } Client.prototype.chargerDonnees = function(data) @@ -691,7 +732,8 @@ Client.prototype.chargerDonnees = function(data) { this.cookie = data["cookie"] this.setCookie() - + + this.id = data["id"] this.login = data["login"] this.pseudo = data["nick"] this.email = data["email"] @@ -704,7 +746,6 @@ Client.prototype.chargerDonnees = function(data) // les conversations this.conversations = data["conversations"] } - this.dernierMessageErreur = data["error_message"] } /** @@ -715,12 +756,14 @@ Client.prototype.chargerDonnees = function(data) Client.prototype.flush = function(async) { if (async == undefined) - async = true + async = false if (!this.authentifie()) return false - thisClient = this + var thisClient = this + var ok = true + ;;; dumpObj(this.getJSONProfile()) jQuery.ajax( { @@ -732,21 +775,26 @@ Client.prototype.flush = function(async) success: function(data) { - //thisClient.util.log(thisClient.util.serializer.serializeToString(data)) + ;;; dumpObj(data) + if (data["reply"] == "error") + { + thisClient.util.messageDialogue(data["error_message"]) + ok = false + } } } ) - // TODO : retourner false si un problème est survenu lors de l'update du profile - return true + + return ok } Client.prototype.majMenu = function() { // TODO : à virer : ne plus changer de style de display ... spa beau .. ou trouver une autre méthode - var displayType = this.css == "css/3/euphorik.css" ? "block" : "inline" //this.client + // var displayType = this.css == "css/3/euphorik.css" ? "block" : "inline" //this.client + displayType = "block" - alert(this.ekMaster) - $("#menu .admin").css("display", this.ekMaster ? "inline" : "none") + $("#menu .admin").css("display", this.ekMaster ? displayType : "none") // met à jour le menu if (this.statut == statutType.auth_registered) @@ -769,7 +817,6 @@ Client.prototype.majMenu = function() } } - Client.prototype.slap = function(userId, raison) { var thisClient = this @@ -794,7 +841,6 @@ Client.prototype.slap = function(userId, raison) }) } - Client.prototype.ban = function(userId, raison, minutes) { var thisClient = this @@ -831,6 +877,77 @@ Client.prototype.kick = function(userId, raison) /////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * classe permettant de gérer les événements (push serveur). + * @page la page + */ +function PageEvent(page, util) +{ + this.page = page + this.util = util + + // l'objet JSONHttpRequest représentant la connexion d'attente + this.attenteCourante = null +} + +/** + * Arrête l'attente courante s'il y en a une. + */ +PageEvent.prototype.stopAttenteCourante = function() +{ + if (this.attenteCourante != null) + this.attenteCourante.abort() +} + +/** + * Attend un événement lié à la page. + * @funSend une fonction renvoyant les données json à envoyer + * @funReceive une fonction qui accepte un paramètre correspondant au données reçues + */ +PageEvent.prototype.waitEvent = function(funSend, funReceive) +{ + var thisPageEvent = this + + this.stopAttenteCourante() + + // on doit conserver l'ordre des valeurs de l'objet JSON (le serveur les veux dans l'ordre définit dans le protocole) + // TODO : ya pas mieux ? + var dataToSend = + { + "action" : "wait_event", + "page" : this.page + } + var poulpe = funSend() + for (v in poulpe) + dataToSend[v] = poulpe[v] + + ;;; dumpObj(dataToSend) + this.attenteCourante = jQuery.ajax({ + type: "POST", + url: "request", + dataType: "json", + data: this.util.jsonVersAction(dataToSend), + success: + function(data) + { + ;;; dumpObj(data) + + funReceive(data) + + // rappel de la fonction dans 100 ms + setTimeout(function(){ thisPageEvent.waitEvent(funSend, funReceive) }, 100); + }, + error: + function(XMLHttpRequest, textStatus, errorThrown) + { + setTimeout(function(){ thisPageEvent.waitEvent(funSend, funReceive) }, 1000); + } + }) + +} + +/////////////////////////////////////////////////////////////////////////////////////////////////// + function initialiserListeStyles(client) { $("#menuCss").change( @@ -848,18 +965,19 @@ function initialiserListeStyles(client) $(document).ready( function() { - var util = new Util() + var formateur = new Formateur() + var util = new Util(formateur) var client = new Client(util) - var pages = new Pages() - var formateur = new Formateur() + var pages = new Pages() // connexion vers le serveur (utilise un cookie qui traine) client.connexionCookie() initialiserListeStyles(client) - // TODO : pourquoi $(document).unload ne fonctionne pas ? - $(window).unload(function(){client.flush(false)}) + // FIXME : ne fonctionne pas sous opera + // voir : http://dev.jquery.com/ticket/2892#preview + $(window).unload(function(){client.flush()}) $("#menu .minichat").click(function(){ pages.afficherPage("minichat") }) $("#menu .admin").click(function(){ pages.afficherPage("admin") }) @@ -885,4 +1003,4 @@ $(document).ready( pages.ajouterPage(new PageAbout(client, formateur, util)) pages.afficherPage("minichat") } -) \ No newline at end of file +)