X-Git-Url: http://git.euphorik.ch/?a=blobdiff_plain;f=js%2Feuphorik.js;h=8487f776b7a483a387839202d146d193ce2c9a63;hb=0531ee46484ef22f402191cc4dc84ca07f155fe4;hp=433c0bca25454745bab0b483d4bc4eaef60c038d;hpb=6feaef2a51f7226c41d69f9e86f605718b78aa02;p=euphorik.git diff --git a/js/euphorik.js b/js/euphorik.js index 433c0bc..8487f77 100755 --- a/js/euphorik.js +++ b/js/euphorik.js @@ -1,6 +1,8 @@ // coding: utf-8 -/** +/** + * Contient la base javascript pour le site euphorik.ch. + * Chaque page possède son propre fichier js nommé "page.js". * Auteur : GBurri * Date : 6.11.2007 */ @@ -10,7 +12,7 @@ * Normalement 'const' à la place de 'var' mais non supporté par IE7. */ var conf = { - nbMessageAffiche : 80, // (par page) + nbMessageAffiche : 10, // (par page) pseudoDefaut : "", tempsAffichageMessageDialogue : 4000, // en ms smiles : { @@ -38,15 +40,17 @@ var conf = { String.prototype.trim = function() { - return this.replace(/^\s+|\s+$/g,""); + return this.replace(/^\s+|\s+$/g, ""); } + String.prototype.ltrim = function() { - return this.replace(/^\s+/,""); + return this.replace(/^\s+/, ""); } + String.prototype.rtrim = function() { - return this.replace(/\s+$/,""); + return this.replace(/\s+$/, ""); } String.prototype.dump = function() @@ -60,8 +64,11 @@ String.prototype.dump = function() } /////////////////////////////////////////////////////////////////////////////////////////////////// - -function Util(serializer) + +/** + * Cette classe regroupe des fonctions utilitaires (helpers). + */ +function Util() { if(typeof XMLSerializer != "undefined") this.serializer = new XMLSerializer() @@ -73,7 +80,10 @@ function Util(serializer) /** * 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é. */ Util.prototype.messageDialogue = function(message, type, boutons) { @@ -102,11 +112,9 @@ Util.prototype.messageDialogue = function(message, type, boutons) } var messageType = {informatif: 0, question: 1, erreur: 2} -/* obsolète -Util.prototype.log = function(str) -{ -}*/ - +/** + * Transforme un document XML en string. + */ Util.prototype.serializeXML = function(documentXML) { if (this.serializer) @@ -119,7 +127,11 @@ Util.prototype.creerDocumentXMLAction = function() { if (document.implementation && document.implementation.createDocument) { - return document.implementation.createDocument("", "action", null) + // var doc = document.implementation.createDocument("", "action", null) + var parser = new DOMParser(); + var doc = parser.parseFromString("\n", "text/xml") + //alert(this.serializeXML(doc)) + return doc } else if (window.ActiveXObject) { @@ -134,32 +146,9 @@ Util.prototype.creerDocumentXMLAction = function() Util.prototype.xmlVersAction = function(xml) { - return {action: this.to_utf8(this.serializeXML(xml /*, "UTF-8"*/))} + //return {action: this.to_utf8(this.serializeXML(xml /*, "UTF-8"*/))} + return {action: this.serializeXML(xml)} } - -// voir : http://homepage3.nifty.com/aokura/jscript/utf8.html -// et : http://www1.tip.nl/~t876506/utf8tbl.html -Util.prototype.to_utf8 = function(s) -{ - if (!s) return "" - - var c, d = "" - for (var i = 0; i < s.length; i++) - { - c = s.charCodeAt(i); - if (c <= 0x7f) { - d += s.charAt(i); - } else if (c >= 0x80 && c <= 0x7ff) { - d += String.fromCharCode(((c >> 6) & 0x1f) | 0xc0); - d += String.fromCharCode((c & 0x3f) | 0x80); - } else { - d += String.fromCharCode((c >> 12) | 0xe0); - d += String.fromCharCode(((c >> 6) & 0x3f) | 0x80); - d += String.fromCharCode((c & 0x3f) | 0x80); - } - } - return d; -} Util.prototype.md5 = function(chaine) { @@ -421,7 +410,14 @@ Client.prototype.resetDonneesPersonnelles = function() this.login = "" this.password = "" this.email = "" - this.css = jQuery("link#cssPrincipale").attr("href") + this.css = jQuery("link#cssPrincipale").attr("href") + + this.pagePrincipale = 1 + + // les conversations, une conversation est un objet possédant les attributs suivants : + // - racine (entier) + // - page (entier) + this.conversations = new Array() } Client.prototype.setCss = function(css) @@ -432,14 +428,57 @@ Client.prototype.setCss = function(css) this.css = css jQuery("link#cssPrincipale").attr("href", this.css) this.majMenu() - - /* enregistement automatique.. - if (!this.identifie()) - if (!this.enregistrement()) - return - */ + if (this.identifie()) this.flush() +} + +Client.prototype.pageSuivante = function(numConv) +{ + if (numConv < 0) + this.pagePrincipale += 1 + else + this.conversations[numConv].page += 1 + this.flush(false) +} + +Client.prototype.pagePrecedente = function(numConv) +{ + if (numConv < 0) + this.pagePrincipale -= 1 + else + this.conversations[numConv].page -= 1 + this.flush(false) +} + +/** + * Ajoute une conversation à la vue de l'utilisateur. + * Le profile de l'utilisateur est directement sauvegardé sur le serveur. + * @param racines la racine de la conversation + * @return true si la conversation a été créée sinon false (par exemple si la conv existe déjà) + */ +Client.prototype.ajouterConversation = function(racine) +{ + // vérification s'il elle n'existe pas déjà + for (var i = 0; i < this.conversations.length; i++) + if (this.conversations[i].racine == racine) + return false + + this.conversations.push({racine : racine, page : 1}) + this.flush(false) + return true +} + +Client.prototype.supprimerConversation = function(num) +{ + if (num < 0 || num >= this.conversations.length) return + + // 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.pop() + + this.flush(false) } Client.prototype.getXMLlogin = function(login, password) @@ -541,6 +580,25 @@ Client.prototype.getXMLProfile = function() nodeCSS.appendChild(XMLDocument.createTextNode(this.css)) XMLDocument.documentElement.appendChild(nodeCSS) + var nodePagePrincipale = XMLDocument.createElement("pagePrincipale") + nodePagePrincipale.appendChild(XMLDocument.createTextNode(this.pagePrincipale)) + XMLDocument.documentElement.appendChild(nodePagePrincipale) + + // mémorise les conversations affichées + for (var i = 0; i < this.conversations.length; i++) + { + var nodeConv = XMLDocument.createElement("conversation") + XMLDocument.documentElement.appendChild(nodeConv) + + var nodeRacine = XMLDocument.createElement("racine") + nodeRacine.appendChild(XMLDocument.createTextNode(this.conversations[i].racine)) + nodeConv.appendChild(nodeRacine) + + var nodePage = XMLDocument.createElement("page") + nodePage.appendChild(XMLDocument.createTextNode(this.conversations[i].page)) + nodeConv.appendChild(nodePage) + } + return XMLDocument } @@ -659,6 +717,7 @@ Client.prototype.enregistrement = function(login, password) Client.prototype.connexion = function(action) { + //action.action.dump() thisClient = this jQuery.ajax( { @@ -670,6 +729,7 @@ Client.prototype.connexion = function(action) success: function(data) { + //thisClient.util.serializer.serializeToString(data).dump() thisClient.chargerDonnees(data) } } @@ -686,6 +746,8 @@ Client.prototype.deconnexion = function() Client.prototype.chargerDonnees = function(data) { + var thisClient = this + this.setStatut(jQuery("statut", data.documentElement).text()) if (this.identifie()) @@ -697,26 +759,43 @@ Client.prototype.chargerDonnees = function(data) this.pseudo = jQuery("pseudo", data.documentElement).text() this.email = jQuery("email", data.documentElement).text() this.css = jQuery("css", data.documentElement).text() + + // la page de la conversation principale + var tmp = jQuery("pagePrincipale", data.documentElement) + this.pagePrincipale = tmp.length < 1 ? 1 : tmp.text() + // met à jour la css if (this.css != "") { jQuery("link#cssPrincipale").attr("href", this.css) this.majMenu() } + // les conversations + this.conversations = new Array() + jQuery("conversation", data.documentElement).each( + function(i) + { + thisClient.conversations.push( { racine : jQuery("racine", this).text(), page : jQuery("page", this).text() } ) + } + ) } this.dernierMessageErreur = jQuery("information", data.documentElement).text() } /** * Met à jour les données personne sur serveur. + * @param async de manière asynchrone ? défaut = true */ -Client.prototype.flush = function() +Client.prototype.flush = function(async) { + if (async == undefined) + async = true + thisClient = this - //thisClient.util.log(this.util.xmlVersAction(this.getXMLProfile()).action) + //thisClient.util.log(this.util.xmlVersAction(this.getXMLProfile()).action) jQuery.ajax( { - async: true, + async: async, type: "POST", url: "request", dataType: "xml", @@ -765,8 +844,13 @@ jQuery.noConflict() // le main jQuery(document).ready( function() - { - + { + /* FIXME : ce code pose problème sur konqueror, voir : http://www.kde-forum.org/thread.php?threadid=17993 + var p = new DOMParser(); + var doc = p.parseFromString("\n", "text/xml") + var s = new XMLSerializer() + alert(s.serializeToString(doc)) */ + var util = new Util() var client = new Client(util) var pages = new Pages()