From b37e6987b5a401e18a71369a79cfb7d570b9666e Mon Sep 17 00:00:00 2001
From: thomascube <thomas@roundcube.net>
Date: Thu, 23 Dec 2010 06:21:16 -0500
Subject: [PATCH] Show the same message only once; increase display time for warnings

---
 CHANGELOG         |    2 ++
 program/js/app.js |   45 +++++++++++++++++++++++++--------------------
 2 files changed, 27 insertions(+), 20 deletions(-)

diff --git a/CHANGELOG b/CHANGELOG
index ea3f944..320ec30 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,6 +1,8 @@
 CHANGELOG Roundcube Webmail
 ===========================
 
+- Show the same message only once (#1487641)
+
 RELEASE 0.5-RC
 --------------
 - Plugin API: Add 'pass' argument in 'authenticate' hook (#1487134)
diff --git a/program/js/app.js b/program/js/app.js
index 90c18b6..fe0a75a 100644
--- a/program/js/app.js
+++ b/program/js/app.js
@@ -37,7 +37,7 @@
 
   // webmail client settings
   this.dblclick_time = 500;
-  this.message_time = 1500;
+  this.message_time = 2000;
 
   this.identifier_expr = new RegExp('[^0-9a-z\-_]', 'gi');
 
@@ -4520,35 +4520,35 @@
 
     type = type ? type : 'notice';
 
-    var date = new Date(),
-      id = type + date.getTime();
+    var ref = this,
+      date = new Date(),
+      id = type + date.getTime(),
+      timeout = type == 'loading' ? this.env.request_timeout * 1000 : (this.message_time * (type == 'error' || type == 'warning' ? 2 : 1));
 
-    if (type == 'loading') {
-      if (!msg)
-        msg = this.get_label('loading');
+    if (type == 'loading' && !msg)
+      msg = this.get_label('loading');
 
-      // The same message of type 'loading' is already displayed
-      if (this.messages[msg]) {
-        this.messages[msg].elements.push(id);
-        return id;
-      }
+    // The same message is already displayed
+    if (this.messages[msg]) {
+      this.messages[msg].elements.push(id);
+      window.setTimeout(function() { ref.hide_message(id, true); }, timeout);
+      return id;
     }
 
-    var ref = this,
-      obj = $('<div>').addClass(type).html(msg),
+    var obj = $('<div>').addClass(type).html(msg).data('msg', msg),
       cont = $(this.gui_objects.message).show();
 
     if (type == 'loading') {
       obj.appendTo(cont);
       this.messages[msg] = {'obj': obj, 'elements': [id]};
-      window.setTimeout(function() { rcmail.hide_message(id); }, this.env.request_timeout * 1000);
+      window.setTimeout(function() { rcmail.hide_message(id); }, timeout);
       return id;
     }
     else {
-      obj.appendTo(cont).bind('mousedown', function() { return ref.hide_message(obj); });
-      window.setTimeout(function() { ref.hide_message(obj, true); },
-        this.message_time * (type == 'error' ? 2 : 1));
-      return obj;
+      obj.appendTo(cont).bind('mousedown', function() { return ref.hide_message(obj, true); });
+      window.setTimeout(function() { ref.hide_message(id, true); }, timeout);
+      this.messages[msg] = { 'obj': obj, 'elements': [id] };
+      return id;
     }
   };
 
@@ -4560,16 +4560,21 @@
       return parent.rcmail.hide_message(obj, fade);
 
     if (typeof(obj) == 'object') {
-      // custom message
+      // hide message object
       $(obj)[fade?'fadeOut':'hide']();
+      
+      var msg = $(obj).data('msg');
+      if (this.messages[msg])
+        delete this.messages[msg];
     }
     else {
-      // 'loading' message
+      // hide message by id
       var k, n, m = this.messages;
       for (k in m) {
         for (n in m[k].elements) {
           if (m[k] && m[k].elements[n] == obj) {
             m[k].elements.splice(n, 1);
+            // hide dom element if last instance is removed
             if (!m[k].elements.length) {
               m[k].obj[fade?'fadeOut':'hide']();
               delete m[k];

--
Gitblit v1.9.1