FIX de plein de truc, j'ai plus la force de regarder toutes les modifs (vive les...
[euphorik.git] / js / euphorik.js
index c796e41..901915a 100755 (executable)
@@ -1,4 +1,4 @@
-// coding: utf-8\r
+// coding: utf-8\r
 // Copyright 2008 Grégory Burri\r
 //\r
 // This file is part of Euphorik.\r
@@ -158,12 +158,17 @@ Util.prototype.infoBulle = function(message, element)
       {
          if (!thisUtil.bulleActive)
             return
-         
+                  
          var m = $("#messageBulle")
          var f = $("#flecheBulle")
          
+         // remplie le paragraphe de la bulle avec le message
          $("p", m).html(message)
-      
+         
+         // réinitialise la position, évite le cas ou la boite est collé à droite et remplie avec un texte la faisant dépassé
+         // dans ce cas la hauteur n'est pas calculé correctement
+         m.css("top", 0).css("left", 0)
+         
          var positionFleche = {
             left : element.offset().left + element.width() / 2 - f.width() / 2,
             top : element.offset().top - f.height()
@@ -252,19 +257,16 @@ Util.prototype.replaceSelection = function(input, replaceString) {
          this.setCaretToPos(input, selectionStart + replaceString.length)\r
    }\r
    else if (document.selection)
-   {\r
-      var range = document.selection.createRange();\r
+   {
+      input.focus()\r
+      var range = document.selection.createRange()\r
       if (range.parentElement() == input)
       {\r
          var isCollapsed = range.text == ''\r
          range.text = replaceString\r
          if (!isCollapsed)
-         {
-            // there has been a selection\r
-            // it appears range.select() should select the newly \r
-            // inserted text but that fails with IE\r
+         {\r
             range.moveStart('character', -replaceString.length);\r
-            range.select();\r
          }\r
       }\r
    }\r
@@ -301,10 +303,21 @@ function Pages()
    this.pages = {}
 }
 
+/**
+  * Accepte soit un objet soit un string.
+  * un string correspond au nom de la page, par exemple : "page" -> "page.html"
+  */
 Pages.prototype.ajouterPage = function(page)
 {
-   page.pages = this // la magie des langages dynamiques : le foutoire
-   this.pages[page.nom] = page
+   if (typeof page == "string")
+   {
+      this.pages[page] = page
+   }
+   else
+   {
+      page.pages = this // la magie des langages dynamiques : le foutoire
+      this.pages[page.nom] = page
+   }
 }
 
 Pages.prototype.afficherPage = function(nomPage, forcerChargement)
@@ -321,7 +334,12 @@ Pages.prototype.afficherPage = function(nomPage, forcerChargement)
    $("#menu li." + nomPage).addClass("courante")
       
    this.pageCourante = page
-   $("#page").html(this.pageCourante.contenu()).removeClass().addClass(this.pageCourante.nom)
+   var contenu = ""
+   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)
    
    if (this.pageCourante.charger)
       this.pageCourante.charger()
@@ -552,9 +570,7 @@ Client.prototype.setCss = function(css)
       return
 
    this.css = css
-   $("link#cssPrincipale").attr("href", this.css)
-   this.majMenu()\r
-   \r
+   $("link#cssPrincipale").attr("href", this.css)\r
    if (this.autoflush) this.flush(true)
 }
 
@@ -702,14 +718,16 @@ Client.prototype.delCookie = function()
    document.cookie = "cookie=; max-age=0"\r
 }
 
-Client.prototype.setCookie = function(cookie)
+Client.prototype.setCookie = function()
 {
-   if (this.cookie == null)
+   if (this.cookie == null || this.cookie == undefined)
       return
       
-   document.cookie =
-      "cookie="+this.cookie+
-      "; max-age="  + (60 * 60 * 24 * 365)
+   // ne fonctionne pas sous IE....
+   /*document.cookie = "cookie=" + this.cookie + "; max-age="  + (60 * 60 * 24 * 365) */
+   
+   document.cookie = 
+      "cookie="+this.cookie+"; expires=" + new Date(new Date().getTime() + 1000 * 60 * 60 * 24 * 365).toUTCString()
 }
 
 Client.prototype.authentifie = function()
@@ -833,6 +851,7 @@ Client.prototype.chargerDonnees = function(data)
       this.conversations = data["conversations"]
       
       this.majBulle()
+      this.majCssSelectionee()
    }
 }
 
@@ -882,8 +901,6 @@ Client.prototype.flush = function(async)
 
 Client.prototype.majMenu = function()
 {
-   // TODO : à virer : ne plus changer de style de display ... spa beau .. ou trouver une autre méthode
-   // var displayType = this.css == "css/3/euphorik.css" ? "block" : "inline" //this.client
    displayType = "block"
 
    $("#menu .admin").css("display", this.ekMaster ? displayType : "none")
@@ -917,6 +934,20 @@ Client.prototype.majBulle = function()
    this.util.bulleActive = this.viewTooltips
 }
 
+/**
+  * Met à jour la css sélectionnée, lors du chargement des données.
+  */
+Client.prototype.majCssSelectionee = function()
+{
+   // extraction du numéro de la css courante
+   var numCssCourante = this.css.match(/^.*?\/(\d)\/.*$/)
+   if (numCssCourante[1] != undefined)
+   {
+      $("#menuCss option").removeAttr("selected")
+      $("#menuCss option[value=" + numCssCourante[1]+ "]").attr("selected", "selected")
+   }
+}
+
 Client.prototype.slap = function(userId, raison)
 {
    var thisClient = this
@@ -979,6 +1010,16 @@ Client.prototype.kick = function(userId, raison)
 
 /**
    * classe permettant de gérer les événements (push serveur).
+   * l'information envoyé est sous la forme :
+   *  {
+   *     "action" : "wait_event"
+   *     "page" : <page>
+   *     [..]
+   *  }
+   * l'information reçu est sous la forme :
+   *  {
+   *     "reply" : <reply>
+   *  }
    * @page la page
    */
 function PageEvent(page, util)
@@ -1009,9 +1050,11 @@ PageEvent.prototype.stopAttenteCourante = function()
 /**
   * Attend un événement lié à la page. 
   * @funSend une fonction renvoyant les données json à envoyer
-  * @funReceive une fonction qui accepte un paramètre correspondant au données reçues
+  * @funsReceive est un objet comprenant les fonctions à appeler en fonction du "reply"
+  * les fonctions acceptent un paramètre correspondant au données reçues.
+  * exemple : {"new_message" : function(data){ ... }}
   */
-PageEvent.prototype.waitEvent = function(funSend, funReceive)
+PageEvent.prototype.waitEvent = function(funSend, funsReceive)
 {
    this.stopAttenteCourante()
    
@@ -1035,22 +1078,25 @@ PageEvent.prototype.waitEvent = function(funSend, funReceive)
    this.attenteCourante = jQuery.ajax({
       type: "POST",
       url: "request",
-      dataType: "json",
+      dataType: "json",\r
+      // Obsolète (voir TODO)\r
+      //timeout: 300000, // timeout de 5min. Gros HACK pas beau. FIXME problème décrit ici : http://groups.google.com/group/jquery-en/browse_thread/thread/8724e64af3333a76
       data: this.util.jsonVersAction(dataToSend),
       success:
          function(data)
          {            
             ;; dumpObj(data)
             
-            funReceive(data)
+            funsReceive[data["reply"]](data)
             
             // rappel de la fonction dans 100 ms
-            setTimeout(function(){ thisPageEvent.waitEvent2(funSend, funReceive) }, 100)
+            setTimeout(function(){ thisPageEvent.waitEvent2(funSend, funsReceive) }, 100)
          },
       error:
          function(XMLHttpRequest, textStatus, errorThrown)
          {
-            setTimeout(function(){ thisPageEvent.waitEvent2(funSend, funReceive) }, 1000)
+            ;; console.log("Connexion perdue dans waitEvent")
+            setTimeout(function(){ thisPageEvent.waitEvent2(funSend, funsReceive) }, 1000)
          }
    })
 }
@@ -1058,11 +1104,11 @@ PageEvent.prototype.waitEvent = function(funSend, funReceive)
 /**
   * Si un stopAttenteCourante survient un peu n'importe quand il faut imédiatement arreter de boucler.
   */
-PageEvent.prototype.waitEvent2 = function(funSend, funReceive)
+PageEvent.prototype.waitEvent2 = function(funSend, funsReceive)
 {
    if (this.stop)
       return
-   this.waitEvent(funSend, funReceive)
+   this.waitEvent(funSend, funsReceive)
 }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -1114,12 +1160,17 @@ $(document).ready(
       })
       $("#menu .register").click(function(){ pages.afficherPage("register") })
       $("#menu .about").click(function(){ pages.afficherPage("about") })
+      
+      // 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 PageMinichat(client, formateur, util))
       pages.ajouterPage(new PageAdmin(client, formateur, util))
       pages.ajouterPage(new PageProfile(client, formateur, util))
       pages.ajouterPage(new PageRegister(client, formateur, util))
       pages.ajouterPage(new PageAbout(client, formateur, util))
+      pages.ajouterPage("conditions_utilisation")
+      
       pages.afficherPage("minichat")
    }
 )