ADD gestion du fragment de url, voir #2
authorGreg Burri <greg.burri@gmail.com>
Tue, 29 Jul 2008 20:54:33 +0000 (20:54 +0000)
committerGreg Burri <greg.burri@gmail.com>
Tue, 29 Jul 2008 20:54:33 +0000 (20:54 +0000)
index.yaws
js/conf.js
js/euphorik.js
js/fragment.js [new file with mode: 0644]
js/pageAbout.js
js/pageMinichat/conversation.js
js/pageMinichat/conversations.js
js/pageMinichat/pageMinichat.js
js/pageStatique.js [new file with mode: 0644]
js/pages.js
modules/erl/euphorik_common.erl

index 1f76dfd..35180ba 100755 (executable)
    <script type="text/javascript" src="js/jquery.lightbox.js" prod="delete"></script>
    <script type="text/javascript" src="js/md5.js" prod="delete"></script>
    <script type="text/javascript" src="js/json2.js" prod="delete"></script>
-   <script type="text/javascript" src="js/comet.js" prod="delete"></script>
+
    <script type="text/javascript" src="js/betterjs.js" prod="delete"></script>
+   <script type="text/javascript" src="js/comet.js" prod="delete"></script>
+   <script type="text/javascript" src="js/fragment.js" prod="delete"></script>
 
-   <script type="text/javascript" src="js/euphorik.js" ></script>
+   <script type="text/javascript" src="js/euphorik.js"></script>
 
    <script type="text/javascript" src="js/conf.js" prod="delete"></script>
    <script type="text/javascript" src="js/util.js" prod="delete"></script>
@@ -39,6 +41,7 @@
    <script type="text/javascript" src="js/pages.js" prod="delete"></script>
    <script type="text/javascript" src="js/client.js" prod="delete"></script>
 
+   <script type="text/javascript" src="js/pageStatique.js" prod="delete"></script>
    <script type="text/javascript" src="js/pageMinichat/pageMinichat.js" prod="delete"></script>
    <script type="text/javascript" src="js/pageMinichat/conversation.js" prod="delete"></script>
    <script type="text/javascript" src="js/pageMinichat/conversations.js" prod="delete"></script>
index 0010d2d..f69d281 100644 (file)
@@ -22,7 +22,7 @@
 euphorik.conf = {\r
    versionProtocole : 3, // version du protcole\r
    nickDefaut : "<nick>",\r
-   nbMessageAffiche : 40, // (par page)\r
+   nbMessageAffiche : 10, // (par page)\r
    pseudoDefaut : "<nick>",\r
    tempsAffichageMessageDialogue : 4000, // en ms\r
    tempsKick : 15, // en minute\r
index 14528a2..5dff115 100755 (executable)
@@ -22,10 +22,11 @@ var euphorik = {}
 // le main
 $(document).ready(
    function() { 
+      var fragment = new Fragment();
       var formateur = new euphorik.Formateur();
       var util = new euphorik.Util(formateur); 
       var client = new euphorik.Client(util);
-      var pages = new euphorik.Pages();
+      var pages = new euphorik.Pages(fragment);
       
       // connexion vers le serveur (utilise un cookie qui traine)
       client.connexionCookie();
@@ -56,15 +57,13 @@ $(document).ready(
       // TODO : simplifier et pouvoir créer des liens par exemple : <span class="lien" href="conditions">Conditions d'utilisation</span>
       $("#footer .conditions").click(function(){ pages.afficherPage("conditions_utilisation"); });
 
-      pages.ajouterPage(new euphorik.PageMinichat(client, formateur, util));
+      pages.ajouterPage(new euphorik.PageMinichat(client, formateur, util), true);
       pages.ajouterPage(new euphorik.PageAdmin(client, formateur, util));
       pages.ajouterPage(new euphorik.PageProfile(client, formateur, util));
       pages.ajouterPage(new euphorik.PageRegister(client, formateur, util));
       pages.ajouterPage(new euphorik.PageAbout(client, formateur, util));
       pages.ajouterPage("conditions_utilisation");
       
-      pages.afficherPage("minichat");
-      
-      window.location.hash = "pouet=2;truc=4;conv=[1,2,3]"
+      pages.afficherPage();
    }
 )
diff --git a/js/fragment.js b/js/fragment.js
new file mode 100644 (file)
index 0000000..835c05e
--- /dev/null
@@ -0,0 +1,69 @@
+// coding: utf-8
+// Copyright 2008 Grégory Burri
+//
+// This file is part of Euphorik.
+//
+// Euphorik is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Euphorik is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Euphorik.  If not, see <http://www.gnu.org/licenses/>.
+
+/**
+  *
+  */
+Fragment = function() {
+   var thisFragment = this;
+   this.fragments = {};
+   if (!window.location.hash) {
+       return;
+   }
+   try {
+       var fragmentsStr = window.location.hash.slice(1).split(";");
+       fragmentsStr.each(function(i, tuple) {
+          tuple = tuple.split("=");
+          thisFragment.fragments[tuple[0]] = JSON.parse(tuple[1]);
+       });
+   } catch(error) {
+      ;; console.log(error);
+   }
+};
+
+Fragment.prototype.setVal = function(name, val) {
+   this.fragments[name] = val;
+}
+
+Fragment.prototype.getVal = function(name) {
+   return this.fragments[name];
+}
+
+Fragment.prototype.delVal = function(name) {
+   delete this.fragments[name];
+}
+
+Fragment.prototype.eraseAllVal = function() {
+   this.fragments = [];
+}
+
+Fragment.prototype.each = function(fun) {
+    objectEach(this.fragments, function(name, val) {
+       fun(name, val);
+    });
+}
+
+Fragment.prototype.write = function() {
+   var fragmentsStr = "";
+   var first = true;
+   objectEach(this.fragments, function(name, val) {
+      fragmentsStr += (first ? "" : ";") + name + "=" + JSON.stringify(val);
+      first = false;
+   });
+   window.location.hash = fragmentsStr;
+}
index 362f857..d51557c 100644 (file)
 // GNU General Public License for more details.\r
 //\r
 // You should have received a copy of the GNU General Public License\r
-// along with Euphorik.  If not, see <http://www.gnu.org/licenses/>.
-
-euphorik.PageAbout = function(client, formateur, util) {
-   this.nom = "about";
-   
-   this.client = client;
-   this.formateur = formateur;
-   this.util = util;
-};
-
-euphorik.PageAbout.prototype.contenu = function() {
-   var contenu = "";
-   $.ajax({async: false, url: "pages/about.html", success : function(page) { contenu += page; }});
-   
-   var email = this.util.rot13("znvygb:tert.oheev@tznvy.pbz");
-   return contenu.replace("{EMAIL}", "<a href=\"" + email+ "\">" + email + "</a>").replace("{EMAIL_LIEN}", email);
-};
-
-euphorik.PageAbout.prototype.charger = function() {
-};
+// along with Euphorik.  If not, see <http://www.gnu.org/licenses/>.\r
+\r
+euphorik.PageAbout = function(client, formateur, util) {\r
+   this.nom = "about";\r
+   \r
+   this.client = client;\r
+   this.formateur = formateur;\r
+   this.util = util;\r
+};\r
+\r
+euphorik.PageAbout.prototype.contenu = function() {\r
+   var contenu = "";\r
+   $.ajax({async: false, url: "pages/about.html", success : function(page) { contenu += page; }});\r
+   \r
+   var email = this.util.rot13("znvygb:tert.oheev@tznvy.pbz");\r
+   return contenu.replace("{EMAIL}", "<a href=\"" + email+ "\">" + email + "</a>").replace("{EMAIL_LIEN}", email);\r
+};\r
+\r
+euphorik.PageAbout.prototype.charger = function() {\r
+};\r
index 238976b..6481014 100644 (file)
@@ -73,13 +73,6 @@ euphorik.Conversation = function(conversations, num) {
    }\r
 };\r
 \r
-/**\r
-  * @racine un message représentant la racine de la conversation, vaut undefined pour la conversation générale\r
-  */\r
-euphorik.Conversation.prototype.setRacine = function(racineElement) {\r
-   this.racine = new euphorik.Message(this.client, this.formateur, racineElement);\r
-};\r
-\r
 /**\r
   * Met à jour la racine, décide de l'afficher ou non.\r
   * On l'affiche uniquement si le message racine n'est pas déjà affiché sur la liste des messages.\r
index b0eea99..ada8a24 100644 (file)
 /**\r
   * Représente l'ensemble des conversations affichés.\r
   */\r
-euphorik.Conversations = function(client, formateur, util) {\r
+euphorik.Conversations = function(client, formateur, util, fragment) {\r
    this.client = client;\r
    this.formateur = formateur;\r
    this.util = util;\r
+   this.fragment = fragment;\r
    \r
    // un ensemble des messages (id) auquel l'utilisateur répond (vider après l'envoie du message courant)\r
    this.messagesRepond = {};\r
@@ -56,6 +57,18 @@ euphorik.Conversations.prototype.toggleMessageRepond = function(mess) {
    this.ajouterMessageRepond(mess);\r
 };\r
 \r
+/**\r
+  * Met à jour le fragment de l'url renseignant sur les conversations ouvertes.\r
+  */\r
+euphorik.Conversations.prototype.mettreAJourFragment = function() {\r
+   conv = [];\r
+   for(var i = 1; i < this.conversations.length; i++) {\r
+       conv.push(this.conversations[i].racine.id)\r
+   }\r
+   this.fragment.setVal("conv", conv);\r
+   this.fragment.write();\r
+}\r
+\r
 /**\r
   * Enlève tous les messages auquel l'utilisateur souhaite répondre.\r
   */\r
@@ -207,10 +220,7 @@ euphorik.Conversations.prototype.ajouterMessages = function(elements, numConvers
    }\r
 \r
    for (var i = 0; i < elements.messages.length; i++) {\r
-      // si une nouvelle conversation a été créée alors on lui donne la racine\r
-      if (this.ajouterMessage(elements.messages[i], numConversation)) {\r
-         this.conversations[numConversation].setRacine(elements.first);\r
-      }\r
+      this.ajouterMessage(elements.messages[i], numConversation)\r
    }\r
          \r
    this.flush(numConversation);\r
@@ -247,6 +257,7 @@ euphorik.Conversations.prototype.ajouterMessage = function(element, numConversat
       nouvelleConversation = true;\r
       this.nouvelleConversation(\r
          numConversation,\r
+         message, // si une nouvelle conversation a été créée alors on lui donne la racine qui correspond au premier message\r
          function(num) { // fermeture de la conversation\r
             thisConversations.supprimerConversation(num);\r
          },\r
@@ -263,12 +274,17 @@ euphorik.Conversations.prototype.ajouterMessage = function(element, numConversat
    return nouvelleConversation;\r
 };\r
 \r
-euphorik.Conversations.prototype.nouvelleConversation = function(num, funFermer, funLien)\r
+euphorik.Conversations.prototype.nouvelleConversation = function(num, racine, funFermer, funLien)\r
 {\r
    var thisMessages = this;\r
 \r
    this.conversations[num] = new euphorik.Conversation(this, num);\r
    \r
+   if (racine) {\r
+      this.conversations[num].racine = racine;\r
+      this.mettreAJourFragment();\r
+   }\r
+   \r
    if (funFermer) {\r
       this.conversations[num].eventFermer(funFermer);\r
    }\r
@@ -316,6 +332,7 @@ euphorik.Conversations.prototype.supprimerConversation = function(num) {
    this.client.supprimerConversation(num - 1);\r
       \r
    this.rafraichirMessages(true);\r
+   this.mettreAJourFragment();\r
 };\r
 \r
 /**\r
index 2f53eb0..792f64a 100755 (executable)
@@ -68,9 +68,11 @@ euphorik.PageMinichat.prototype.charger = function() {
    $("#posterMessage input.pseudo").val(this.client.pseudo);
    
    // cet appel ne doit pas être fait avant l'appel à 'charger'
-   this.conversations = new euphorik.Conversations(this.client, this.formateur, this.util);
+   this.conversations = new euphorik.Conversations(this.client, this.formateur, this.util, this.fragment);   
    
-   this.conversations.rafraichirMessages(true);
+   this.chargerConversationsFragment();
+    
+   this.conversations.rafraichirMessages(true);   
    
    this.util.setCaretToEnd($("form#posterMessage input.message")[0]);
 
@@ -194,12 +196,31 @@ euphorik.PageMinichat.prototype.charger = function() {
    );
 };
 
+euphorik.PageMinichat.prototype.chargerConversationsFragment = function() {
+   var thisPageMinichat = this; 
+   
+   // attention : "conv" doit être un tableau d'entier
+   try {
+      var conv = this.fragment.getVal("conv");
+      if (conv) {
+         conv.each(function(i, racine) {
+            thisPageMinichat.client.ajouterConversation(racine)
+         });
+      }
+   } catch(e) {
+      ;; console.log(e)
+   }
+}
+  
 euphorik.PageMinichat.prototype.decharger = function() {
    this.conversations.comet.stopAttenteCourante();
    
    $("body #smiles").remove();
+   
+    this.fragment.delVal("conv")
 };
 
+
 euphorik.PageMinichat.prototype.getJSONMessage = function(pseudo, message) {
    var repondA = [];
    objectEach(this.conversations.messagesRepond, function(id) {
diff --git a/js/pageStatique.js b/js/pageStatique.js
new file mode 100644 (file)
index 0000000..f5a4c2c
--- /dev/null
@@ -0,0 +1,33 @@
+// coding: utf-8
+// Copyright 2008 Grégory Burri
+//
+// This file is part of Euphorik.
+//
+// Euphorik is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Euphorik is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Euphorik.  If not, see <http://www.gnu.org/licenses/>.
+
+/**
+  * Correspond à une page html statique se nommant "<nom>.html" et se trouvant dans "/pages/".
+  */
+euphorik.PageStatique = function(nom) {
+   this.nom = nom;
+};
+
+euphorik.PageStatique.prototype.contenu = function() {
+   var contenu = "";
+   $.ajax({async: false, url: "pages/" + this.nom + ".html", success : function(page) { contenu += page; }});
+   return contenu;
+};
+
+euphorik.PageStatique.prototype.charger = function() {
+};
index cd1ade6..df515e6 100644 (file)
 /**\r
   * Gestion des pages.\r
   */\r
-euphorik.Pages = function() {\r
+euphorik.Pages = function(fragment) {\r
+   this.fragment = fragment;\r
    this.pageCourante = undefined;\r
+   this.pageDefaut = undefined;\r
    this.pages = {};\r
 };\r
 \r
 /**\r
   * Accepte soit un objet soit un string.\r
   * un string correspond au nom de la page, par exemple : "page" -> "page.html"\r
+  * @defaut si vrai alors la page est la page par défaut\r
   */\r
-euphorik.Pages.prototype.ajouterPage = function(page) {\r
+euphorik.Pages.prototype.ajouterPage = function(page, defaut) {\r
    if (typeof page === "string") {\r
-      this.pages[page] = page;\r
-   } else {\r
-      page.pages = this; // la magie des langages dynamiques : le foutoire\r
-      this.pages[page.nom] = page;\r
+      page = new euphorik.PageStatique(page);\r
+   }\r
+      \r
+   page.pages = this; // la magie des langages dynamiques : le foutoire\r
+   page.fragment = this.fragment;\r
+   \r
+   this.pages[page.nom] = page;   \r
+       \r
+   if (defaut) {\r
+      this.pageDefaut = page;\r
    }\r
 };\r
 \r
 euphorik.Pages.prototype.afficherPage = function(nomPage, forcerChargement) {\r
    forcerChargement = forcerChargement || false;\r
-\r
+   \r
+    // si le nom de la page n'est pas donné on le prend du fragment\r
+    if (!nomPage) {\r
+      nomPage = this.fragment.getVal("page");\r
+    }\r
+    \r
    var page = this.pages[nomPage];\r
+   if (!page) {\r
+      page = this.pageDefaut;\r
+   }\r
+\r
    if (!page || (!forcerChargement && page === this.pageCourante)) {\r
       return;\r
    }\r
@@ -53,16 +71,11 @@ euphorik.Pages.prototype.afficherPage = function(nomPage, forcerChargement) {
    }\r
   \r
    $("#menu li").removeClass("courante");\r
-   $("#menu li." + nomPage).addClass("courante");\r
+   $("#menu li." + page.nom).addClass("courante");\r
       \r
    this.pageCourante = page;\r
-   var contenu = "";\r
-   if (typeof page === "string") {\r
-      $.ajax({async: false, url: "pages/" + page + ".html", success : function(page) { contenu += page; }});\r
-   } else {\r
-      contenu += this.pageCourante.contenu();\r
-   }\r
-   \r
+   var contenu = this.pageCourante.contenu();\r
+  \r
    $("#page").html(contenu).removeClass().addClass(\r
       this.pageCourante.nom +\r
       (this.pageCourante.classes ? " " + this.pageCourante.classes() : "") // l'objet peut fournire des classes css supplémentaires sous la forme d'un string\r
@@ -71,4 +84,7 @@ euphorik.Pages.prototype.afficherPage = function(nomPage, forcerChargement) {
    if (this.pageCourante.charger) {\r
       this.pageCourante.charger();\r
    }\r
+   \r
+   this.fragment.setVal("page", this.pageCourante.nom);\r
+   this.fragment.write();\r
 };\r
index ff251d7..3806df3 100644 (file)
 % 
 % Module avec plein de bordel utile à l'intérieur.
 % @author G.Burri
-\r
+
 
 -module(euphorik_common).
--export([\r
-   serialize_ip/1,\r
-   unserialize_ip/1,\r
-   ceiling/1\r
-]).\r
-\r
-\r
-% Arrondi un float à l'entier supérieur.\r
-% Bizarre, cette fonction n'existe pas dans la stdlib.\r
-% Pas utilisé mais bon ca me fait de la peine de l'enlever.\r
-ceiling(X) ->\r
-   T = trunc(X),\r
-   case (X - T) of\r
-      Neg when Neg < 0 -> T;\r
-      Pos when Pos > 0 -> T + 1;\r
-      _ -> T\r
-   end.\r
-   \r
-\r
-% Retourne la difference entre deux timestamp (erlang:now()) en miliseconde\r
-delta_date_ms(D1, D2) ->\r
-   1000000000 * abs(element(1, D1) - element(1, D2)) + 1000 * abs(element(2, D1) - element(2, D2)) + trunc(abs(element(3, D1) - element(3, D2)) / 1000).\r
-\r
-\r
-% Retourne la différence entre deux timestamp (erlang:now) en minutes\r
-delta_date_minute(D1, D2) ->\r
-   trunc(delta_date_ms(D1, D2) / 1000 / 60).\r
+-export([
+   ceiling/1,
+   delta_date_ms/2,
+   delta_date_minute/2,
+   serialize_ip/1,
+   unserialize_ip/1
+]).
+
+
+% Arrondi un float à l'entier supérieur.
+% Bizarre, cette fonction n'existe pas dans la stdlib.
+% Pas utilisé mais bon ca me fait de la peine de l'enlever.
+ceiling(X) ->
+   T = trunc(X),
+   case (X - T) of
+      Neg when Neg < 0 -> T;
+      Pos when Pos > 0 -> T + 1;
+      _ -> T
+   end.
+   
+
+% Retourne la difference entre deux timestamp (erlang:now()) en miliseconde
+delta_date_ms(D1, D2) ->
+   1000000000 * abs(element(1, D1) - element(1, D2)) + 1000 * abs(element(2, D1) - element(2, D2)) + trunc(abs(element(3, D1) - element(3, D2)) / 1000).
+
+
+% Retourne la différence entre deux timestamp (erlang:now) en minutes
+delta_date_minute(D1, D2) ->
+   trunc(delta_date_ms(D1, D2) / 1000 / 60).
    
 
 serialize_ip(undefined) ->