<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>
<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>
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
// 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();
// 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();
}
)
--- /dev/null
+// 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;
+}
// 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
}\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
/**\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
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
}\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
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
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
this.client.supprimerConversation(num - 1);\r
\r
this.rafraichirMessages(true);\r
+ this.mettreAJourFragment();\r
};\r
\r
/**\r
$("#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]);
);
};
+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) {
--- /dev/null
+// 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() {
+};
/**\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
}\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
if (this.pageCourante.charger) {\r
this.pageCourante.charger();\r
}\r
+ \r
+ this.fragment.setVal("page", this.pageCourante.nom);\r
+ this.fragment.write();\r
};\r
%
% 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) ->