#page.minichat form#posterMessage {
background-color: #e19671;
padding-left: 10px;
+}
+
+#page.minichat.orderReverse form#posterMessage {
padding-bottom: 10px;
}
+
+#page.minichat.orderChrono form#posterMessage {
+ padding-top: 10px;
+}
+
#page.minichat form#posterMessage p {
margin: 0px;
padding: 0px;
/* voir pour l'astuce css "float left" des conversations : http://www.quirksmode.org/css/clearing.html */
#page.minichat #conversations {
overflow: hidden;
- width: 100%
-}
-#page.minichat #conversations .conversation {
- border-width: 0px;
- border-style: solid;
- border-color: white;
- float: left;
width: 100%;
+ border-spacing: 0px;
+ background-color:#E19671;
}
-#page.minichat #conversations .titre {
+#page.minichat.orderChrono #conversations td
+{
+ vertical-align: bottom
+}
+#page.minichat.orderReverse #conversations td
+{
+ vertical-align: top
+}
+#page.minichat.orderChrono #conversations .titre {
+ border-bottom: 1px dashed white
+}
+#page.minichat.orderReverse #conversations .titre {
border-top: 1px dashed white
}
-#page.minichat #conversations .titre .barre {
+#page.minichat #conversations .titre .nav {
text-align: center;
padding-right: 8px;
background-color: #e19671;
color: #ffffff;
}
-#page.minichat #conversations .titre .extraire,
-#page.minichat #conversations .titre .extraireCompletement {
- display: none
-}
-
-#page.minichat #conversations .titre .barre .reduire {
+#page.minichat #conversations .titre .nav .reduire {
margin-top: 1px;
margin-left: 5px;
float: right;
background-image: url(../../img/css1/reduire_conv.png);
cursor: pointer;
}
-#page.minichat #conversations .titre .barre .reduire:hover {
+#page.minichat #conversations .titre .nav .reduire:hover {
background-image: url(../../img/css1/reduire_conv_hover.png);
}
-#page.minichat #conversations .titre .barre .fermer {
+#page.minichat #conversations .titre .nav .fermer {
margin-top: 1px;
margin-left: 5px;
float: right;
background-image: url(../../img/css1/fermer_conv.png);
cursor: pointer;
}
-#page.minichat #conversations .titre .barre .fermer:hover {
+#page.minichat #conversations .titre .nav .fermer:hover {
background-image: url(../../img/css1/fermer_conv_hover.png);
}
-#page.minichat #conversations .titre .barre .lien {
+#page.minichat #conversations .titre .nav .lien {
margin-top: 1px;
margin-left: 5px;
float: right;
background-image: url(../../img/css1/copier_conv.png);
cursor: pointer;
}
-#page.minichat #conversations .titre .barre .lien:hover {
+#page.minichat #conversations .titre .nav .lien:hover {
background-image: url(../../img/css1/copier_conv_hover.png);
}
-#page.minichat #conversations .titre .barre .next,
-#page.minichat #conversations .titre .barre .prev {
+#page.minichat #conversations .titre .nav .next,
+#page.minichat #conversations .titre .nav .prev {
display: none;
}
-#page.minichat #conversations .titre .barre .next,
-#page.minichat #conversations .titre .barre .prev,
-#page.minichat #conversations .titre .barre .numPage {
+#page.minichat #conversations .titre .nav .next,
+#page.minichat #conversations .titre .nav .prev,
+#page.minichat #conversations .titre .nav .numPage {
background-color: #841919;
cursor: pointer;
padding-right: 5px;
padding-left: 5px;
}
-#page.minichat #conversations .titre .barre .next:hover,
-#page.minichat #conversations .titre .barre .prev:hover,
-#page.minichat #conversations .titre .barre .numPage:hover {
+#page.minichat #conversations .titre .nav .next:hover,
+#page.minichat #conversations .titre .nav .prev:hover,
+#page.minichat #conversations .titre .nav .numPage:hover {
background-color: #cb2626
}
== TODO ==
=== v1.1 ===
-* étudier la solution SVG et le calcul de pourcentage pour la largeur des fenêtres\r
+* étudier la solution SVG et le calcul de pourcentage pour la largeur des fenêtres
* le calcul des largeurs devra surement être fait en pixel et actualisé lorsque le conteneur change de taille
* Gestion de l'historique au niveau du navigateur (pouvoir revenir aux pages précédentes). Utiliser un plugin jQuery si possible. Voir du coté des ancres (fragment d'url) : #ancre.
* http://www.euphorik.ch/#page=chat
* un bouton "fermer"
* Possibilité de fermer temporairement une conversation (la réduire sous la forme d'un onglet)
* etre averti lorsqu'un nouveau message arrive dans une conversation réduite
- * lien vers une conversation : http://www.euphorik.ch/#conv=45
* Mettre un icon (genre sablier ou truc qui tourne à la apple) lorsque le chat se charge (également lors d'un changement de page par exemple)
* L'icon apparait tout en haut (absolute)
* Simuler un réseau lent
-* supprimer le cookie si le client n'arrive pas à s'authentifier avec (réponse négative du serveur)
* Mise à jour automatique de la version dans le about en fonction du tag/branche courant (lors de la mise en production) ?
+ * Remplacé par un fichier VERSION et un script dans /tools
* Tests de monter en charge coté serveur, analyse de la complexité (regarder du coté des TODO dans le code). Utiliser eventuellement Tsung
-* Profiling pour améliorer les performances (client et serveur)\r
+* Profiling pour améliorer les performances (client et serveur)
* Ne plus attacher chaque evenement sur chaque message mais de manière générale à l'ensemble des messages
* traitementComplet() de euphorik.js est très très lent à executer
-* Pouvoir récupérer son mdp (ou en générer unhttp://www.euphorik.ch/ autre) via son email. Marquer dans le profile que l'email sert à cela et n'est pas visible pas les autres personnes
-* (Pouvoir inverser le chat) tester la faisabilité\r
-* Réaliser un système de preproduction, étapes de preprod :\r
- * Renommer euphorik_bd_update en euphorik_bd_admin et ajouter deux fonctions pour faire un backup et reprendre depuis ce backup\r
- * Déplacer également les fonctions d'admin de euphorik_bd vers euphorik_bd_admin tel que "print_users" par exemple\r
- * 1) Réalisation d'un backup de la BD dans BD/backups/preprod.bckup\r
- * 2) Copie parfaite de l'environnement de prod vers /var/euphorik_preprod/ (sauf les mutables : BD)\r
- * 3) Copie d'un yaws_conf_preprod\r
- * 4) Lancer yaws (attention : port différent dans yaws_conf_preprod !)\r
- * 5) Restoration des données preprod.bckup\r
- * 5) Lancer le processus de mise en prod pour la preprod\r
+* Pouvoir récupérer son mdp (ou en générer un http://www.euphorik.ch/ autre) via son email. Marquer dans le profile que l'email sert à cela et n'est pas visible pas les autres personnes
+ * L'utilisateur peut sur la page de login inscrire un email
+ * un id est généré et envoyé par email avec une adresse de type http://www.euphorik.ch?emailid=<id>
+ * un tuple {<id> <id_user> <date>} est inséré dans la table 'recup_id'
+ * Lorsque l'utilisateur se rend sur l'adresse l'id et la date sont vérifiés, si tout est ok le cookie "cookie" est définit pour l'utilisateur. L'utilisateur est alors loggé.
+* (Pouvoir inverser le chat) tester la faisabilité
+* Réaliser un système de preproduction, étapes de preprod :
+ * Renommer euphorik_bd_update en euphorik_bd_admin et ajouter deux fonctions pour faire un backup et reprendre depuis ce backup
+ * Déplacer également les fonctions d'admin de euphorik_bd vers euphorik_bd_admin tel que "print_users" par exemple
+ * 1) Réalisation d'un backup de la BD dans BD/backups/preprod.bckup
+ * 2) Copie parfaite de l'environnement de prod vers /var/euphorik_preprod/ (sauf les mutables : BD)
+ * 3) Copie d'un yaws_conf_preprod
+ * 4) Lancer yaws (attention : port différent dans yaws_conf_preprod !)
+ * 5) Restoration des données preprod.bckup
+ * 5) Lancer le processus de mise en prod pour la preprod
* 6) Tester si tout va bien
=== v1.2 ===
* option dans le profile pour ouvrir les liens dans un nouveau tab
* gestion des timezone (fuseaux horaire) :
* L'utilisateur peut simplement définir une timezone dans son profil, les dates sont alors affichées en fonction de sa zone (en option)
* Transfert des messages JSON (AJAX) en https et le noter dans la faq (même la mafia chinoise ne peut pas sniffer les messages). En fait il suffit (sauf erreur) de sécuriser euphorik : https://www.euphorik.ch
- * voir : http://cert.startcom.org/ pour un certif gratuit ou du coté de cacert.org (linuxfr.org l'utilise)\r
+ * voir : http://cert.startcom.org/ pour un certif gratuit ou du coté de cacert.org (linuxfr.org l'utilise)
* Mega stabilisation du code pour la cloture de la version 1 ! .. et en route pour la version 2 !
=== v2.0 ===
* Création des channels, un file de discussion ainsi qu'un troll de la semaine par channel (est ce que les channels enfants possèdent aussi un troll de la semaine??)
- * Un channel possède un nom, une langue, une description et une série de mots clefs (tags)\r
- * Un channel peut être l'enfant d'un autre channel (et ceci de manière récursive).\r
- * lorsque l'on se trouve sur un parent on voit récursivement les messages de tous les enfants\r
+ * Un channel possède un nom, une langue, une description et une série de mots clefs (tags)
+ * Un channel peut être l'enfant d'un autre channel (et ceci de manière récursive).
+ * lorsque l'on se trouve sur un parent on voit récursivement les messages de tous les enfants
* S'il l'on répond à un message d'un channel enfant le message fait alors "partie" de ce channel enfant
* Une page ressence tous les channels, il est possible de faire des recherches de channel par mot clef de la même manière que pour les conversations
* N'importe qui peut créer un channel
* Les messages auquels ont répond sont mis en évidence
* lors de la mise à jour des messages la liste est interrogé pour savoir s'il faut le mettre en évidence
[ok] Avoir une option dans le profile pour montrer son rang (ekMaster) de manière ostantatoire, discret ou caché
+[ok] Pouvoir inverser le chat
+[ok] supprimer le cookie si le client n'arrive pas à s'authentifier avec (réponse négative du serveur)
=== Bugs ===
1 : Critique
* La balise <hide> pour mettre des spoilers
[2] Une option dans le profile pour se délogger automatiquement lorsque l'on quitte le site
[3] Gestion de l'historique (calendrier)
-[3] Afficher une page concernant la grammaire, ya un topic sur HFR\r
-[3] Compatibilité avec wmcoinoin\r
+[3] Afficher une page concernant la grammaire, ya un topic sur HFR
+[3] Compatibilité avec wmcoinoin
* http://moules.org/les_normes/le_backend (utilisé la DTD et non le schéma qui n'est pas correct)
* http://pycoincoin.free.fr/wikini/wakka.php?wiki=PagePrincipale
+[3] Recharger automatiquement la page lorsque les numéros de la version du protocole ne sont plus égaux (kiki)
[3] Idée de bernie :
* Pouvoir STFUER des personnes, lorsqu'elle envoie un message un autre truc à la con est écrit à la place
* la phrase à la con est prise parmis une liste éditable depuis le panneau d'admin
"login" : "paul49",
"email" : "paul@pierre.com",
"css" : "css/3/euphorik.css",
+ "chat_order" : "chrono" | "reverse",
"nick_format" : "nick" | "login" | "nick_login",
"view_times" : true | false,
"view_tooltips" : true | false,
"nick" : "Paul",
"email" : "paul@pierre.com",
"css" : "css/3/euphorik.css",
+ "chat_order" : "chrono" | "reverse",
"nick_format" : "nick" | "login" | "nick_login",
"view_times" : true | false,
"view_tooltips" : true | false,
var conf = {
versionProtocole : 3, // version du protcole
nickDefaut : "<nick>",
- nbMessageAffiche : 60, // (par page)
+ nbMessageAffiche : 40, // (par page)
pseudoDefaut : "<nick>",
tempsAffichageMessageDialogue : 4000, // en ms
tempsKick : 15, // en minute
if (typeof page == "string")
$.ajax({async: false, url: "pages/" + page + ".html", success : function(page) { contenu += page }})
else
+ {
contenu += this.pageCourante.contenu()
- $("#page").html(contenu).removeClass().addClass(this.pageCourante.nom)
+ }
+ $("#page").html(contenu).removeClass().addClass(this.pageCourante.nom +
+ (this.pageCourante.classes != undefined ? " " + this.pageCourante.classes() : "") // l'objet peut fournire des classes css supplémentaires sous la forme d'un string
+ )
if (this.pageCourante.charger)
this.pageCourante.charger()
{
for (var sNom in this.smiles)
{
- ss = this.smiles[sNom]
+ var ss = this.smiles[sNom]
for (var i = 0; i < ss.length; i++)
M = M.replace(ss[i], "<img src=\"img/smileys/" + sNom + ".gif\" alt =\"" + sNom + "\" />")
}
Formateur.prototype.traiterURL = function(M, pseudo)
{
- thisFormateur = this
+ var thisFormateur = this
var traitementUrl = function(url)
{
this.password = ""
this.email = ""
this.css = $("link#cssPrincipale").attr("href")
+ this.chatOrder = "reverse"
this.nickFormat = "nick"
this.viewTimes = true
this.viewTooltips = true
"nick" : this.pseudo,
"email" : this.email,
"css" : this.css,
+ "chat_order" : this.chatOrder,
"nick_format" : this.nickFormat,
"view_times" : this.viewTimes,
"view_tooltips" : this.viewTooltips,
}
}
+/**
+ * Connexion. Réalisé de manière synchrone.
+ */
Client.prototype.connexion = function(messageJson)
{
- thisClient = this
+ var thisClient = this
jQuery.ajax(
{
async: false,
this.pseudo = data["nick"]
this.email = data["email"]
this.setCss(data["css"])
+ this.chatOrder = data["chat_order"]
this.nickFormat = data["nick_format"]
this.viewTimes = data["view_times"]
this.viewTooltips = data["view_tooltips"]
var thisClient = this
var ok = true
-
jQuery.ajax(
{
async: async,
"page" : this.page
}
var poulpe = funSend()
- for (v in poulpe)
+ for (var v in poulpe)
dataToSend[v] = poulpe[v]
this.attenteCourante = jQuery.ajax({
PageMinichat.prototype.contenu = function()
{
// le fait que tout soit collé est fait exprès, permet d'éviter d'avoir des espaces supplémentaires entre les spans'
- return '\
-<div id="trollCourant">Troll de la semaine : <span class="troll"></span></div>\
-<form method="post" action="" id ="posterMessage">\
+ var formulaireXHTML = '<form method="post" action="" id ="posterMessage">\
<p>\
<input class="captcha" name="captcha" type="text" size="8" maxlength="8"></input>\
<input class="pseudo" name="pseudo" type="text" maxlength="50" value="' + encodeURI(conf.nickDefaut) + '"></input>\
<button class="smiles"></button>\
<button class="return"></button>\
</p>\
-</form>\
-<div id="conversations"></div>'
+</form>'
+ var trollXHTML = '<div id="trollCourant">Troll de la semaine : <span class="troll"></span></div>'
+ //var titreXHTML = '<tr id="titres"></tr>'
+ //var messagesXHTML = '<tr id="messages"></tr>'
+ var conversationXHTML = '<table id="conversations"><tr></tr></table>'
+
+ if (this.client.chatOrder == "reverse")
+ return trollXHTML + formulaireXHTML + conversationXHTML
+ else
+ return trollXHTML + conversationXHTML + formulaireXHTML
+}
+
+PageMinichat.prototype.classes = function()
+{
+ return this.client.chatOrder == "reverse" ? "orderReverse" : "orderChrono"
}
PageMinichat.prototype.charger = function()
if (mess != undefined)
mess.clientARepondu = true
}
- $("#conversations div#" + thisPageMinichat.conversations.messagesRepond[messId].getId()).addClass("repondu")
+ // TODO : ca sert à qque chose ?
+ //$("#conversations div#" + thisPageMinichat.conversations.messagesRepond[messId].getId()).addClass("repondu")
}
$("form input.message").val("")
this.nbMessageMax = conf.nbMessageAffiche // Le nombre de message affiché par page
- $("#conversations").append(
- '<div id="' + this.getId() + '" class="conversation">' +
- '<div class="messages"></div>' +
- '<div class="titre">' +
- '<div class="barre">' +
- (num == 0 ? '' : '<div class="fermer"></div><div class="lien"></div><div class="reduire"></div>') +
- '<span class="next"><</span><span class="numPage">1</span><span class="prev">></span>' +
- '</div>' +
+ var messagesXHTML = '<div class="messages"></div>'
+ var messageRacineXHTML = '<div class="messageRacine"></div>'
+ var reverse = this.client.chatOrder == "reverse"
+
+ var XHTML =
+ '<td class="conversation" id="' + this.getId() + '">' +
+ (reverse ? messagesXHTML : "") +
+ '<div class="titre">' +
+ (reverse ? messageRacineXHTML : "") +
+ '<div class="nav">' +
+ (num == 0 ? '' : '<div class="fermer"></div><div class="lien"></div><div class="reduire"></div>') +
+ '<span class="next"><</span><span class="numPage">1</span><span class="prev">></span>' +
+ '</div>' +
+ (reverse ? "" : messageRacineXHTML) +
'</div>' +
- '</div>'
- )
+ (reverse ? "" : messagesXHTML) +
+ '</td>'
+
+ $("#conversations tr").append(XHTML)
- this.util.infoBulle("Aller à la première page", $("#conversations #" + this.getId() + " .numPage"))
+ this.util.infoBulle("Aller à la première page", $("#" + this.getId() + " .numPage"))
if (num != 0)
{
- this.util.infoBulle("Créer un lien vers la conversation", $("#conversations #" + this.getId() + " .lien"))
- this.util.infoBulle("Fermer la conversation", $("#conversations #" + this.getId() + " .fermer"))
+ this.util.infoBulle("Créer un lien vers la conversation", $("#" + this.getId() + " .lien"))
+ this.util.infoBulle("Fermer la conversation", $("#" + this.getId() + " .fermer"))
}
}
this.messagesParId[this.racine.id] = this.racine
var element = $(this.racine.XHTML(true, this.getId()))
this.attacherEventsSurMessage(element)
- $("#" + this.getId() + " .titre").prepend(element)
+ $("#" + this.getId() + " .titre .messageRacine").append(element)
}
}
for (var i = 0; i < this.messages.length; i++)
{
if (this.messages[i].appartientAuClient)
- messagesProprietaire += ".messages #" + this.messages[i].getId(this.getId()) + ","
+ messagesProprietaire += "#" + this.messages[i].getId(this.getId()) + ","
else if (this.messages[i].clientARepondu)
- messagesRepondu += ".messages #" + this.messages[i].getId(this.getId()) + ","
+ messagesRepondu += "#" + this.messages[i].getId(this.getId()) + ","
else if (this.messages[i].estUneReponse)
- messagesReponse += ".messages #" + this.messages[i].getId(this.getId()) + ","
+ messagesReponse += "#" + this.messages[i].getId(this.getId()) + ","
}
$(messagesReponse).addClass("reponse")
$(messagesRepondu).addClass("repondu")
*/
Conversation.prototype.setPage = function(pageCourante, dernierePage)
{
- $("#conversations #" + this.getId() + " .numPage").text(pageCourante)
- $("#conversations #" + this.getId() + " .next").css("display", pageCourante == 1 ? "none" : "inline")
- $("#conversations #" + this.getId() + " .prev").css("display", dernierePage ? "none" : "inline")
+ $("#" + this.getId() + " .numPage").text(pageCourante)
+ $("#" + this.getId() + " .next").css("display", pageCourante == 1 ? "none" : "inline")
+ $("#" + this.getId() + " .prev").css("display", dernierePage ? "none" : "inline")
}
/**
{
var thisConversation = this
- $("#conversations #" + this.getId() + " .titre .lien").click(
+ $("#" + this.getId() + " .titre .lien").click(
function()
{
fun(thisConversation.num)
{
var thisConversation = this
- $("#conversations #" + this.getId() + " .titre .fermer").click(
+ $("#" + this.getId() + " .titre .fermer").click(
function()
{
fun(thisConversation.num)
{
var thisConversation = this
- $("#conversations #" + this.getId() + " .next").click(
+ $("#" + this.getId() + " .next").click(
function() { funNext(thisConversation.num) }
)
- $("#conversations #" + this.getId() + " .prev").click(
+ $("#" + this.getId() + " .prev").click(
function() { funPrev(thisConversation.num) }
)
- $("#conversations #" + this.getId() + " .numPage").click(
+ $("#" + this.getId() + " .numPage").click(
function() { funReset(thisConversation.num) }
)
}
this.messages = []
this.messagesParId = {}
this.idDernierMessageAffiche = 0
- $("#conversations #" + this.getId() + " .message").remove()
+ $("#" + this.getId() + " .messages .message").remove()
}
Conversation.prototype.idMessageFromString = function(idString)
Conversation.prototype.flush = function()
{
var thisConversation = this
+ var reverse = this.client.chatOrder == "reverse"
// est-ce que le prochain message est pair ? (permet d'alterner le style des messages)
var messagePair = (this.idDernierMessageAffiche == 0 ? true :
- ($("#" + this.getId() + " .messages div:first").attr("class").search("messagePair") == -1)
+ ($("#" + this.getId() + " .messages div:" + (reverse ? "first" : "last")).attr("class").search("messagePair") == -1)
)
// construction de l'XHTML des messages
XHTML += this.messages[i].XHTML(messagePair, this.getId())
messagePair = !messagePair
}
-
+
var DOM = $(XHTML)
-
+
// pour chaque nouveau message au niveau du document on crée ses événements
DOM.each(function() { thisConversation.attacherEventsSurMessage(this) })
- DOM.prependTo("#" + this.getId() + " .messages")
+ if (reverse)
+ DOM.prependTo("#" + this.getId() + " .messages")
+ else
+ DOM.appendTo("#" + this.getId() + " .messages")
// enlève les messages exedentaires
- var nbMessagesAffiche = $("#" + this.getId() + " .message").size()
+ var nbMessagesAffiche = $("#" + this.getId() + " .messages .message").size()
if (nbMessagesAffiche > this.nbMessageMax)
- $("#conversations #" + this.getId() + " .messages .message").slice(this.nbMessageMax, nbMessagesAffiche).remove()
+ {
+ if (reverse)
+ $("#" + this.getId() + " .messages .message").slice(this.nbMessageMax, nbMessagesAffiche).remove()
+ else
+ $("#" + this.getId() + " .messages .message").slice(0, nbMessagesAffiche - this.nbMessageMax).remove()
+ }
if (this.messages.length > 0)
this.idDernierMessageAffiche = this.messages[this.messages.length-1].id
var mess = message.getConversation(this)
// FIXME : cet appel est très lent
- $("#conversations #" + this.getId() + " .messages .message").each(
+ $("#" + this.getId() + " .messages .message").each(
function()
{
var jq = $(this)
*/
Conversation.prototype.supprimer = function()
{
- $("#conversations #" + this.getId()).remove()
+ $("#" + this.getId()).remove()
}
///////////////////////////////////////////////////////////////////////////////////////////////////
// on réinitialise pour être sur que tout est bien enlevé
this.messagesRepond = {}
- $("#conversations div.message").removeClass("repondEnEvidence")
+ $("#conversations .message").removeClass("repondEnEvidence")
$("form#posterMessage #repondA .messages").empty()
}
*/
Conversations.prototype.ajusterLargeurConversations = function()
{
+ // TODO : trouver mieux !
var largeurPourcent = (100 / this.conversations.length)
+ // obsolète !?
// le "- 0.01" evite que IE se chie dessus lamentablement et affiche les conversations les unes au dessus des autres
- if($.browser["msie"])
- largeurPourcent -= 0.05
- $("#conversations .conversation").css("width", largeurPourcent + "%")
+ //if($.browser["msie"])
+ // largeurPourcent -= 0.05
+ $("#conversations td").css("width", largeurPourcent + "%")
}
/**
$("form#profile input#viewTooltips").attr("checked", this.client.viewTooltips)\r
$("form#profile input#viewTimes").attr("checked", this.client.viewTimes)\r
\r
- $("form#profile select#degreeOstentatoire option").removeAttr("selected")\r
- $("form#profile select#degreeOstentatoire option[value=" + this.client.ostentatiousMaster + "]").attr("selected", "selected")\r
+ $("form#profile select#chatOrder option").removeAttr("selected")\r
+ $("form#profile select#chatOrder option[value=" + this.client.chatOrder + "]").attr("selected", "selected")\r
\r
$("form#profile select#affichagePseudo option").removeAttr("selected")\r
$("form#profile select#affichagePseudo option[value=" + this.client.nickFormat + "]").attr("selected", "selected")\r
+ \r
+ if (this.client.ostentatiousMaster)\r
+ {\r
+ $("form#profile select#degreeOstentatoire option").removeAttr("selected")\r
+ $("form#profile select#degreeOstentatoire option[value=" + this.client.ostentatiousMaster + "]").attr("selected", "selected") \r
+ }\r
\r
$("form#profile button").click(\r
function()\r
{\r
thisPage.client.pseudo = thisPage.formateur.filtrerInputPseudo($("form#profile input.pseudo").val())\r
thisPage.client.email = $("form#profile input.email").val()\r
+ thisPage.client.chatOrder = $("form#profile select#chatOrder option:selected").attr("value") \r
thisPage.client.nickFormat = $("form#profile select#affichagePseudo option:selected").attr("value") \r
- thisPage.client.ostentatiousMaster = $("form#profile select#degreeOstentatoire option:selected").attr("value") \r
+ if (thisPage.client.ekMaster)\r
+ thisPage.client.ostentatiousMaster = $("form#profile select#degreeOstentatoire option:selected").attr("value") \r
thisPage.client.viewTooltips = $("form#profile input#viewTooltips").attr("checked")\r
thisPage.client.viewTimes = $("form#profile input#viewTimes").attr("checked")\r
\r
<td>e-mail</td>\\r
<td><input class="email" type="text" size="40" maxlength="100"/></td>\\r
</tr>\\r
+ <tr>\\r
+ <td>Ordre des messages</td>\\r
+ <td>\\r
+ <select id="chatOrder">\\r
+ <option value="chrono">Chronologique</option>\\r
+ <option value="reverse">Anti-chronologique</option>\\r
+ </select>\\r
+ </td>\\r
+ </tr>\\r
<tr>' +\r
(this.client.ekMaster ? '<td>Degrée d\'ostentation</td>\\r
<td>\\r
% users :\r
nouveau_user/2,\r
nouveau_user/3,\r
- set_profile/11,\r
+ set_profile/12,\r
update_date_derniere_connexion/1,\r
update_ip/2,\r
update_pseudo_user/2,\r
% Mise à par Cookie les autres peuvent être undefined ce qui veut dire qu'ils ne seront pas modifié.\r
% Conversation est de type [{int(), bool()}] où l'entier est la racine, le booléen indique si la conversation est réduite ou non\r
% Ostentatious_master peut valoir invisible, light ou heavy\r
-set_profile(Cookie, Login, Password, Pseudo, Email, Css, Nick_format, View_times, View_tooltips, Conversations, Ostentatious_master) ->\r
+set_profile(Cookie, Login, Password, Pseudo, Email, Css, Chat_order, Nick_format, View_times, View_tooltips, Conversations, Ostentatious_master) ->\r
if Nick_format =:= nick; Nick_format =:= login; Nick_format =:= nick_login,\r
Ostentatious_master =:= invisible; Ostentatious_master =:= light; Ostentatious_master =:= heavy ->\r
resultat_transaction(mnesia:transaction(\r
pseudo = if is_list(Pseudo) -> Pseudo; true -> User#user.pseudo end,\r
email = if is_list(Email) -> Email; true -> User#user.email end,\r
css = if is_list(Css) -> Css; true -> User#user.css end,\r
+ chat_order = Chat_order,\r
nick_format = Nick_format,\r
view_times = View_times,\r
view_tooltips = View_tooltips,\r
{nick, Pseudo},\r
{email, Email},\r
{css, Css},\r
+ {chat_order, Chat_order_str},\r
{nick_format, Nick_format_str},\r
{view_times, View_times},\r
{view_tooltips, View_tooltips},\r
Pseudo,\r
Email,\r
Css,\r
+ list_to_atom(Chat_order_str),\r
list_to_atom(Nick_format_str),\r
View_times,\r
View_tooltips,\r
{login, User#user.login},\r
{email, User#user.email},\r
{css, User#user.css},\r
+ {chat_order, atom_to_list(User#user.chat_order)},\r
{nick_format, atom_to_list(User#user.nick_format)},\r
{view_times, User#user.view_times},\r
{view_tooltips, User#user.view_tooltips},\r
inet:setopts(A#arg.clisock, [{active, true}, {keepalive, true}]),\r
{value, {_, Contenu}} = lists:keysearch("action", 1, yaws_api:parse_post(A)),\r
Ret = traiter_donnees(Contenu, IP),\r
+ %io:format("~p~n", [Ret]),\r
{content, "application/json", Ret}.\r
\r
\r
view_times = true,
view_tooltips = true,
ostentatious_master = light, % peut valoir invisible, light ou heavy. seulement pour ek_master
- message_order = reverse, % can be normal or reverse
+ chat_order = reverse, % peut valoir chrono ou reverse
indice_flood = 0, % integer() est incrémenté lorsque l'utilisateur envoie trop rapidement des messages.
conversations = [], % [{integer(), bool}], la liste des messages correspondant au conversation {racine, reduite?}
ek_master = false,
</file>
<file>
<url>js/pageMinichat.js</url>
- <line>237</line>
- <line>907</line>
- <line>1156</line>
+ <line>245</line>
+ <line>921</line>
+ <line>1170</line>
</file>
</editor-bookmarks>
</project-private>