MOD fin du système de page et cleanage du code
authorGreg Burri <greg.burri@gmail.com>
Tue, 15 Apr 2008 22:29:54 +0000 (22:29 +0000)
committerGreg Burri <greg.burri@gmail.com>
Tue, 15 Apr 2008 22:29:54 +0000 (22:29 +0000)
css/1/pageMinichat.css
js/euphorik.js
js/pageMinichat.js
modules/erl/euphorik_minichat.erl
modules/erl/euphorik_protocole.erl

index d965d6a..e24092c 100755 (executable)
 }      
 
 #page.minichat #conversations .titre .next,
-#page.minichat #conversations .titre .prev
-{
-       display:none
+#page.minichat #conversations .titre .prev {
+       display: none;
 }
-       \r
+
+#page.minichat #conversations .titre .next,
+#page.minichat #conversations .titre .prev,
+#page.minichat #conversations .titre .numPage {
+       background-color: #42380b;
+       cursor: pointer;
+       padding-right: 5px;
+       padding-left: 5px;
+}
+
+#page.minichat #conversations .titre .next:hover,
+#page.minichat #conversations .titre .prev:hover,
+#page.minichat #conversations .titre .numPage:hover {
+       background-color: #7c6e2e
+}
+
+\r
 #page.minichat #pages {\r
        margin-top: 10px;\r
 }\r
index 8487f77..4b76b93 100755 (executable)
@@ -53,11 +53,12 @@ String.prototype.rtrim = function()
        return this.replace(/\s+$/, "");\r
 }\r
 \r
-String.prototype.dump = function()\r
-{\r
+String.prototype.dump = function(titre)\r
+{
+   titre = titre == undefined ? "" : titre\r
    if (typeof dump != "undefined")\r
    {\r
-      dump("\n--- EUPHORIK.CH ---\n")\r
+      dump("\n--- EUPHORIK.CH : " + titre + " ---\n")\r
       dump(this)\r
       dump("\n------\n")\r
    }\r
@@ -123,25 +124,29 @@ Util.prototype.serializeXML = function(documentXML)
       return documentXML.xml\r
 }\r
 
+var documentXMLBase = undefined // singleton 
 Util.prototype.creerDocumentXMLAction = function()
-{\r
-   if (document.implementation && document.implementation.createDocument)\r
-   {\r
-      // var doc = document.implementation.createDocument("", "action", null)
-      var parser = new DOMParser();
-      var doc =  parser.parseFromString("<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<action/>", "text/xml")
-      //alert(this.serializeXML(doc))
-      return doc\r
-   }\r
-   else if (window.ActiveXObject)\r
+{
+   // FIXME : essayer de garder le doc de base en cache (singleton) et d'en retourner une copie
+   if (true)//documentXMLBase == undefined)
    {\r
-      var doc = new ActiveXObject("MSXML2.DOMDocument") //("Microsoft.XMLDOM")\r
-      doc.appendChild(doc.createElement("action"));\r
-      //doc.loadXML("<action></action>")\r
-      //alert(doc.documentElement)\r
-      //doc.createElement("action")\r
-      return doc\r
-   }   
+      if (document.implementation && document.implementation.createDocument)\r
+      {\r
+         // var doc = document.implementation.createDocument("", "action", null)
+         var parser = new DOMParser();
+         documentXMLBase =  parser.parseFromString("<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<action/>", "text/xml")
+         //alert(this.serializeXML(doc))\r
+      }\r
+      else if (window.ActiveXObject)\r
+      {\r
+         documentXMLBase = new ActiveXObject("MSXML2.DOMDocument") //("Microsoft.XMLDOM")\r
+         documentXMLBase.appendChild(doc.createElement("action"));\r
+         //doc.loadXML("<action></action>")\r
+         //alert(doc.documentElement)\r
+         //doc.createElement("action")\r
+      }
+   }
+   return documentXMLBase
 }
 
 Util.prototype.xmlVersAction = function(xml)
@@ -298,7 +303,7 @@ Formateur.prototype.traitementComplet = function(M, pseudo)
 }
 \r
 /**\r
-  * FIXME : Cette méthode est attrocement lourde !!\r
+  * FIXME : Cette méthode est attrocement lourde ! A optimiser.\r
   */
 Formateur.prototype.traiterSmiles = function(M)
 {  
@@ -434,21 +439,43 @@ Client.prototype.setCss = function(css)
 }
 
 Client.prototype.pageSuivante = function(numConv)
+{
+   if (numConv < 0 && this.pagePrincipale > 1)
+      this.pagePrincipale -= 1
+   else if (this.conversations[numConv].page > 1)
+      this.conversations[numConv].page -= 1
+   this.flush(false)
+}
+
+Client.prototype.pagePrecedente = function(numConv)
 {
    if (numConv < 0)
       this.pagePrincipale += 1
-   else
+   else 
       this.conversations[numConv].page += 1
    this.flush(false)
 }
 
-Client.prototype.pagePrecedente = function(numConv)
+/**
+  * Définit la première page pour la conversation donnée.
+  * @return true si la page a changé sinon false
+  */
+Client.prototype.goPremierePage = function(numConv)
 {
    if (numConv < 0)
-      this.pagePrincipale -= 1
-   else 
-      this.conversations[numConv].page -= 1
+   {
+      if (this.pagePrincipale == 1)
+         return false
+      this.pagePrincipale = 1
+   }
+   else
+   {
+      if (this.conversations[numConv].page == 1)
+         return false
+      this.conversations[numConv].page = 1
+   }
    this.flush(false)
+   return true
 }
 
 /**
@@ -551,6 +578,10 @@ Client.prototype.getXMLEnregistrement = function(login, password)
    return XMLDocument   
 }
 
+/**
+  * Sérialize le profile en XML.
+  * TODO : méthode assez lourde, 3.25ms de moyenne
+  */
 Client.prototype.getXMLProfile = function()
 {
    var XMLDocument = this.util.creerDocumentXMLAction()
@@ -581,7 +612,7 @@ Client.prototype.getXMLProfile = function()
    XMLDocument.documentElement.appendChild(nodeCSS)
    
    var nodePagePrincipale = XMLDocument.createElement("pagePrincipale")
-   nodePagePrincipale.appendChild(XMLDocument.createTextNode(this.pagePrincipale))
+   nodePagePrincipale.appendChild(XMLDocument.createTextNode(this.pagePrincipale < 1 ? 1 : this.pagePrincipale))
    XMLDocument.documentElement.appendChild(nodePagePrincipale)
    
    // mémorise les conversations affichées
@@ -729,7 +760,7 @@ Client.prototype.connexion = function(action)
          success:
             function(data)
             {
-               //thisClient.util.serializer.serializeToString(data).dump()
+               //thisClient.util.serializer.serializeToString(data).dump("Charger client")
                thisClient.chargerDonnees(data)
             }
       }
@@ -762,7 +793,7 @@ Client.prototype.chargerDonnees = function(data)
       
       // la page de la conversation principale
       var tmp = jQuery("pagePrincipale", data.documentElement)
-      this.pagePrincipale = tmp.length < 1 ? 1 : tmp.text()
+      this.pagePrincipale = tmp.length < 1 ? 1 : parseInt(tmp.text())
       
       // met à jour la css
       if (this.css != "")
@@ -792,7 +823,7 @@ Client.prototype.flush = function(async)
       async = true
 
    thisClient = this
-   //thisClient.util.log(this.util.xmlVersAction(this.getXMLProfile()).action)      
+   //this.util.xmlVersAction(this.getXMLProfile()).action.dump("Flush client")      
    jQuery.ajax(
       {
          async: async,
index c41aa6a..ed1a46c 100755 (executable)
@@ -175,19 +175,7 @@ PageMinichat.prototype.envoyerMessage = function(pseudo, message)
       {\r
          this.util.messageDialogue("login impossible")\r
          return\r
-      }
-
-   //this.util.log(this.util.xmlVersAction(this.getXMLmessage(pseudo, message, repondA)).action)\r
-   //alert(this.util.xmlVersAction(this.getXMLMessage(pseudo, message, repondA)).action)
-   /* Obsolète\r
-   jQuery.post("request",  this.util.xmlVersAction(this.getXMLMessage(pseudo, message, repondA)),
-      function(data, textStatus)
-      {
-         // TODO : traiter les erreurs
-         //alert(data)
-         jQuery("form input.message").val("")
-      }
-   )*/\r
+      }\r
    \r
    jQuery.ajax(\r
       {\r
@@ -305,7 +293,6 @@ Message.prototype.getConversation = function(messages)
   */
 function Conversation(num, util, formateur, funFermer)
 {
-   //alert("ok")
    var thisConversation = this
 
    this.num = num // peut changer au cours de la vie de la conversation
@@ -320,7 +307,7 @@ function Conversation(num, util, formateur, funFermer)
       '<div id="' + this.getId() + '" class="conversation">\
       <div class="titre">' +
          (funFermer == undefined ? '' : '<div class="fermer">x</div>') +
-         '<span class="prev">&lt;</span><span class="numPage">1</span><span class="next">&gt;</span>\
+         '<span class="next">&lt;</span><span class="numPage">1</span><span class="prev">&gt;</span>\
          </div>\
       </div>'
    )
@@ -347,24 +334,34 @@ function Conversation(num, util, formateur, funFermer)
 
 /**
   * Défini les fonctions (callback) appelées lorsque l'on change de page.
-  * @funNext appelé lorsque l'on revient une page en arrière
-  * @funPrev appelé lorsque l'on passe à la page suisvante
   * @pageCourante la page courante
   * @dernierePage true si c'est la dernière page sinon false
   */
-Conversation.prototype.initPage = function(funNext, funPrev, pageCourante, dernierePage)
+Conversation.prototype.setPage = function(pageCourante, dernierePage)
 {
-   var thisConversation = this
+   jQuery("#conversations #" + this.getId() + " .numPage").text(pageCourante)
+   jQuery("#conversations #" + this.getId() + " .next").css("display", pageCourante == 1 ? "none" : "inline")
+   jQuery("#conversations #" + this.getId() + " .prev").css("display", dernierePage ? "none" : "inline")
+}
 
+/**
+  * @funNext appelé lorsque l'on passe à la page suivante (de 2 à 1 par exemple)
+  * @funPrev appelé lorsque l'on passe à la page précédente (de 1 à 2 par exemple)
+  * @funReset appelé lorsque l'on souhaite revenir à la page une
+  */
+Conversation.prototype.setFunPage = function(funNext, funPrev, funReset)
+{
+   var thisConversation = this
+   
    jQuery("#conversations #" + this.getId() + " .next").click(
       function() { funNext(thisConversation.num) }
    )
    jQuery("#conversations #" + this.getId() + " .prev").click(
       function() { funPrev(thisConversation.num) }
    )
-   
-   jQuery("#conversations #" + this.getId() + " .next").css("display", pageCourante == 1 ? "none" : "inline")
-   jQuery("#conversations #" + this.getId() + " .prev").css("display", dernierePage ? "none" : "inline")
+   jQuery("#conversations #" + this.getId() + " .numPage").click(
+      function() { funReset(thisConversation.num) }
+   )
 }
 
 /**
@@ -414,7 +411,7 @@ Conversation.prototype.flush = function(funClickExtract)
          XHTML += 
             "<div id=\"" + message.id + "\" class=\"" + (parseInt(message.id, 36) % 2 == 0 ? "messagePair" : "messageImpair") + " message" +
                (this.messages[i].appartientAuClient ? " proprietaire" : "")  + (this.messages[i].clientARepondu ? " repondu" : "") + (this.messages[i].estUneReponse ? " reponse" : "") + (this.messages[i].systeme ? " systeme" : "") +
-            "\" >" +
+            "\" &gt;" +
                "<div class=\"extraire\">&gt;</div>" +
                "[<span class=\"date\">" + message.date + "</span>]" +
                "<span class=\"pseudo\">" + this.formateur.traitementComplet(message.pseudo) + "</span>:" +
@@ -422,9 +419,8 @@ Conversation.prototype.flush = function(funClickExtract)
                "<span class=\"contenu\">" + (message.systeme ? this.formateur.remplacerBalisesHTML(message.contenu) : this.formateur.traitementComplet(message.contenu, message.pseudo)) + "</span>" +
             "</div>"
       }
-   //alert(this.getId())
+      
    jQuery("#conversations #" + this.getId()).prepend(XHTML)
-   //alert(jQuery("#conversations").text())
    
    // mise à jour des images (LightBox) après l'ajout de message
    if (myLightbox != null)
@@ -438,13 +434,6 @@ Conversation.prototype.flush = function(funClickExtract)
    jQuery("#conversations #" + this.getId() + " .message").filter(function(){return parseInt(jQuery(this).attr("id"), 36) > parseInt(idDernierMessageAffiche, 36)}).each(
       function()
       {
-         /*jQuery(".extraire", this).click(
-            function(event)
-            {
-               funClickExtract()
-               return false
-            }
-         )*/
          jQuery(this).click(
             function(event)
             {
@@ -531,7 +520,7 @@ function Messages(client, formateur, util)
    this.util = util
    
    this.conversations = new Array() // les conversations, la première représente la conversation principale
-   this.conversations[0] = new Conversation(0, this.util, this.formateur)
+   this.nouvelleConversation(0)
 
    this.idDernierMessage = null // l'id du dernier message connu
    
@@ -546,8 +535,6 @@ Messages.prototype.getXMLrafraichirMessages = function()
 {
    var XMLDocument = this.util.creerDocumentXMLAction()
    XMLDocument.documentElement.setAttribute("name", "refreshMessages")
-   \r
-   //alert(this.util.serializer.serializeToString(XMLDocument))\r
    
    if (this.client.identifie())
    {
@@ -567,26 +554,6 @@ Messages.prototype.getXMLrafraichirMessages = function()
    nodeNombreMessage.appendChild(XMLDocument.createTextNode(conf.nbMessageAffiche))
    XMLDocument.documentElement.appendChild(nodeNombreMessage)
    
-   /*var nodePage = XMLDocument.createElement("page")
-   nodePage.appendChild(XMLDocument.createTextNode(this.conversations[0].page))
-   XMLDocument.documentElement.appendChild(nodePage)*/
-   
-   // les conversations
-   /* Obsolète, le serveur les recupères directement auprès des informations utilisateurs
-   for (var i = 0; i < this.client.conversations.length; i++)
-   {
-      var nodeConversation = XMLDocument.createElement("conversation")
-      XMLDocument.documentElement.appendChild(nodeConversation)
-      
-      var nodeRacine = XMLDocument.createElement("racine")
-      nodeRacine.appendChild(XMLDocument.createTextNode(this.client.conversations[i].racine))
-      nodeConversation.appendChild(nodeRacine)
-      
-      var nodePageConv = XMLDocument.createElement("page")
-      nodePageConv.appendChild(XMLDocument.createTextNode(this.client.conversations[i].page))
-      nodeConversation.appendChild(nodePageConv)
-   }*/
-   
    return XMLDocument;
 }
 
@@ -614,10 +581,8 @@ Messages.prototype.ajouterMessage = function(element, numConversation)
 
    // pas d'utilisation de jquery pour des raisons de performance
    var id = element.getAttribute("id")
-   //alert(parseInt(null, 36) +" " + parseInt(this.idDernierMessage, 36))
    if (this.idDernierMessage == null || parseInt(id, 36) > parseInt(this.idDernierMessage, 36))
       this.idDernierMessage = id
-   //alert(this.idDernierMessage)
    
    var message = new Message(
       id,      \r
@@ -634,19 +599,45 @@ Messages.prototype.ajouterMessage = function(element, numConversation)
    
    if (this.conversations[numConversation] == null)
    {
-      this.conversations[numConversation] = new Conversation(numConversation, this.util, this.formateur,
+      this.nouvelleConversation(
+         numConversation,
          function(num) // fermeture de la conversation
          {
             thisMessages.supprimerConversation(num)
          }
       )
-      
-      this.ajusterLargeurConversations()
    }
 
    this.conversations[numConversation].ajouterMessage(message)
 }
 
+Messages.prototype.nouvelleConversation = function(num, funFermer)
+{
+   var thisMessages = this
+
+   this.conversations[num] = new Conversation(num, this.util, this.formateur, funFermer)
+
+   this.conversations[num].setFunPage(
+      function(num) // page suivante
+      {
+         thisMessages.client.pageSuivante(num - 1)
+         thisMessages.rafraichirMessages(true)
+      },
+      function(num) // page précédente
+      {
+         thisMessages.client.pagePrecedente(num - 1)
+         thisMessages.rafraichirMessages(true)
+      },
+      function(num) // retour à la page une
+      {
+         if (thisMessages.client.goPremierePage(num - 1))
+            thisMessages.rafraichirMessages(true)
+      }
+   )
+   
+   this.ajusterLargeurConversations()
+}
+
 /**
   * Enlève une conversation.
   */
@@ -730,8 +721,7 @@ Messages.prototype.rafraichirMessages = function(vider)
    if (vider)
       this.idDernierMessage = null\r
       
-   this.util.xmlVersAction(this.getXMLrafraichirMessages()).action.dump()
-   //alert(this.util.xmlVersAction(this.getXMLrafraichirMessages()).action)
+   //this.util.xmlVersAction(this.getXMLrafraichirMessages()).action.dump()
    this.attenteCourante = jQuery.ajax({
          type: "POST",
          url: "request",
@@ -740,13 +730,11 @@ Messages.prototype.rafraichirMessages = function(vider)
          success:
             function(data)
             {            \r
-               thisMessages.util.serializer.serializeToString(data).dump()\r
+               //thisMessages.util.serializer.serializeToString(data).dump()\r
             
                if (vider)
                   thisMessages.viderMessages()
                
-               //thisMessages.MAJPages(parseInt(jQuery("nbPage", data.documentElement).text()))
-               
                // ajoute les messages reçu à leur conversation respective
                var numConv = 0
                jQuery("conversation", data.documentElement).each(
@@ -760,18 +748,10 @@ Messages.prototype.rafraichirMessages = function(vider)
                            messages.push(this)
                         }
                      )
-                     //alert("ajoutMess : " + messages.length + " " + numConv)
+                     
                      thisMessages.ajouterMessages(messages, numConv)
                      
-                     thisMessages.conversations[numConv].initPage(
-                        function(num) // page suivante
-                        {
-                           thisMessages.client.pageSuivante(num - 1)
-                        },
-                        function(num) // page précédente
-                        {
-                           thisMessages.client.pagePrecedente(num - 1)
-                        },
+                     thisMessages.conversations[numConv].setPage(
                         numConv == 0 ? thisMessages.client.pagePrincipale : thisMessages.client.conversations[numConv - 1].page,
                         jQuery("autresPages", this).text() != "true"
                      )
@@ -779,9 +759,6 @@ Messages.prototype.rafraichirMessages = function(vider)
                   }
                )
                
-               // demande à toutes les conversations d'afficher les messages non-affichés
-               //thisMessages.flush()
-               
                // rappel de la fonction dans 100 ms
                setTimeout(function(){ thisMessages.rafraichirMessages() }, 100);
             },
@@ -793,52 +770,3 @@ Messages.prototype.rafraichirMessages = function(vider)
       }
    )
 }
-
-/* Osbolète
-Messages.prototype.MAJPages = function(nbPage)
-{
-   //alert(nbPage)
-   
-   var thisMessages = this
-   
-   var nbPageActuel = jQuery("#pages span").size()
-
-   for(var p = nbPageActuel + 1; p <= nbPage && p <= 3; p++)
-   {  
-      jQuery("#pages").append("<span " + (this.page == p ? "class=\"pageCourante\"" : "" ) + ">" + p + "</span>").click(
-         function(event)
-         {
-            var target = jQuery(event.target)
-            
-            if(!target.is("span"))
-               return
-            
-            thisMessages.allerSurLaPage(parseInt(jQuery(event.target).text()))
-         }
-      )
-   }
-}*/
-
-/* Obsolète
-Messages.prototype.allerSurLaPage = function(page)
-{            
-   if (page == this.page)
-      return
-   this.page = page
-   
-   var thisMessages = this
-      
-   //jQuery("#pages span").removeClass("pageCourante")
-   jQuery("#pages span").each(
-      function(i)
-      {
-         if (jQuery(this).text() == thisMessages.page)
-            jQuery(this).addClass("pageCourante")
-         else
-            jQuery(this).removeClass("pageCourante")
-      }
-   )
-
-   this.rafraichirMessages(true)
-}*/
-
index 53fe1e3..4268fef 100755 (executable)
@@ -205,13 +205,14 @@ set_profile(Cookie, Login, Password, Pseudo, Email, Css, Page_principale, Conver
                      login_deja_pris;\r
                   _ ->               \r
                      User_modifie = User#user{
-                        % TODO : pourquoi ne pas tester avec la valeur "undefined" plutôt qu'avec "is_list" ?\r
+                        % TODO : pourquoi ne pas tester avec la valeur "undefined" plutôt qu'avec "is_list" ?
+                        % TODO : validation plus strict des données (pas de page négative dans les conv par exemple)\r
                         login = if is_list(Login) -> Login; true -> User#user.login end,\r
                         password = if is_list(Password) -> Password; true -> User#user.password end,\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,
-                        page_principale = if is_list(Page_principale) -> Page_principale; true -> User#user.page_principale end,
+                        page_principale = if is_integer(Page_principale), Page_principale > 0 -> Page_principale; true -> User#user.page_principale end,
                         conversations = if is_list(Conversations) -> Conversations; true -> User#user.conversations end\r
                      },\r
                      mnesia:write(User_modifie),\r
index 19932f2..251d4c1 100755 (executable)
@@ -199,7 +199,7 @@ refreshMessage(Action) ->
                            )
                         ]
                      }\r
-                  end,            
+                  end,
                   euphorik_minichat_conversation:conversations(User#user.conversations, Nb_message, Dernier_id, User#user.page_principale)\r
                )
             }];