FIX minifix
[euphorik.git] / js / euphorik.js
index 126f335..1b78ba8 100755 (executable)
@@ -134,6 +134,49 @@ Util.prototype.messageDialogue = function(message, type, boutons, formate)
    this.timeoutMessageDialogue = setTimeout(fermer, conf.tempsAffichageMessageDialogue)   
 }\r
 
+/**
+  * Affiche un info bulle lorsque le curseur survole l'élément donné.
+  * FIXME : le width de element ne tient pas compte du padding !?
+  */
+Util.prototype.infoBulle = function(message, element)
+{
+   var virerMess = function()
+      {   
+         $("#flecheBulle").remove()
+         $("#messageBulle").remove()
+      }
+
+   element.click(virerMess)
+
+   element.hover(
+      function(e)
+      {
+         f = $('<div id="flecheBulle"></div>').appendTo("body")
+         m = $('<div id="messageBulle"><p>' + message + '</p></div>').appendTo("body")
+         var positionFleche = {
+            left : element.offset().left + element.width() / 2 - f.width() / 2,
+            top : element.offset().top - f.height()
+         }
+         var positionMessage = {
+            left : element.offset().left + element.width() / 2 - m.width() / 2,
+            top : element.offset().top - f.height() - m.height()
+         }
+         var depassementDroit = (positionMessage.left + m.width()) - $("body").width()
+         if (depassementDroit > 0)
+            positionMessage.left -= depassementDroit
+         else
+         {
+            if (positionMessage.left < 0)
+               positionMessage.left = 0
+         }
+         
+         m.css("top", positionMessage.top).css("left", positionMessage.left).show()
+         f.css("top", positionFleche.top).css("left", positionFleche.left).show()
+      },
+      virerMess
+   )
+}
+
 /**
   * Utilisé pour l'envoie de donnée avec la méthode ajax de jQuery.
   */
@@ -914,6 +957,9 @@ function PageEvent(page, util)
    
    // l'objet JSONHttpRequest représentant la connexion d'attente
    this.attenteCourante = null
+   
+   // le multhreading du pauvre, merci javascript de m'offrire autant de primitives pour la gestion de la concurrence...
+   this.stop = false
 }
 
 /**
@@ -921,8 +967,12 @@ function PageEvent(page, util)
   */
 PageEvent.prototype.stopAttenteCourante = function()
 {
+   this.stop = true
+         
    if (this.attenteCourante != null)
+   {
       this.attenteCourante.abort()   
+   }
 }
 
 /**
@@ -932,11 +982,13 @@ PageEvent.prototype.stopAttenteCourante = function()
   */
 PageEvent.prototype.waitEvent = function(funSend, funReceive)
 {
-   var thisPageEvent = this
-      
    this.stopAttenteCourante()
+   
+   this.stop = false
+   
+   var thisPageEvent = this
       
-   // on doit conserver l'ordre des valeurs de l'objet JSON (le serveur les veux dans l'ordre définit dans le protocole)
+   // on doit conserver l'ordre des valeurs de l'objet JSON (le serveur les veut dans l'ordre définit dans le protocole)
    // TODO : ya pas mieux ?
    var dataToSend = 
    {
@@ -948,6 +1000,7 @@ PageEvent.prototype.waitEvent = function(funSend, funReceive)
       dataToSend[v] = poulpe[v]
    
    ;;; dumpObj(dataToSend)
+   
    this.attenteCourante = jQuery.ajax({
       type: "POST",
       url: "request",
@@ -961,15 +1014,24 @@ PageEvent.prototype.waitEvent = function(funSend, funReceive)
             funReceive(data)
             
             // rappel de la fonction dans 100 ms
-            setTimeout(function(){ thisPageEvent.waitEvent(funSend, funReceive) }, 100);
+            setTimeout(function(){ thisPageEvent.waitEvent2(funSend, funReceive) }, 100)
          },
       error:
          function(XMLHttpRequest, textStatus, errorThrown)
          {
-            setTimeout(function(){ thisPageEvent.waitEvent(funSend, funReceive) }, 1000);
+            setTimeout(function(){ thisPageEvent.waitEvent2(funSend, funReceive) }, 1000)
          }
    })
+}
 
+/**
+  * Si un stopAttenteCourante survient un peu n'importe quand il faut imédiatement arreter de boucler.
+  */
+PageEvent.prototype.waitEvent2 = function(funSend, funReceive)
+{
+   if (this.stop)
+      return
+   this.waitEvent(funSend, funReceive)
 }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////