From 1c585394b5d08124451340b0e75df060c3f6a23a Mon Sep 17 00:00:00 2001
From: svncommit <devs@roundcube.net>
Date: Wed, 24 May 2006 14:25:47 -0400
Subject: [PATCH] Fixed bug with toggling new status of message after it had been marked as deleted Addded undelete functionality that works like Thunderbird (pressing delete icon/key on deleted message undeletes) fixed many but not all of the 'strict' javascript error messages

---
 program/js/app.js |  162 ++++++++++++++++++++++++++++++++++++++---------------
 1 files changed, 116 insertions(+), 46 deletions(-)

diff --git a/program/js/app.js b/program/js/app.js
index da7d18c..a6b43cb 100644
--- a/program/js/app.js
+++ b/program/js/app.js
@@ -29,6 +29,7 @@
   this.commands = new Object();
   this.selection = new Array();
   this.last_selected = 0;
+  this.in_message_list = false;
 
   // create public reference to myself
   rcube_webmail_client = this;
@@ -256,8 +257,8 @@
   // reset last clicked if user clicks on anything other than the message table
   this.reset_click = function()
     {
-	this.in_message_list = false;
-	};
+    this.in_message_list = false;
+    };
 	
   this.click_on_list = function(e)
     {
@@ -328,8 +329,12 @@
       for(var r=0; r<msg_list.tBodies[0].childNodes.length; r++)
         {
         row = msg_list.tBodies[0].childNodes[r];
+        while (row && (row.nodeType != 1 || row.style.display == 'none')) {
+          row = row.nextSibling;
+          r++;
+        }
         //row = msg_list.tBodies[0].rows[r];
-        this.init_message_row(row);
+        if (row) this.init_message_row(row);
         }
       }
       
@@ -989,7 +994,7 @@
   // set command enabled or disabled
   this.enable_command = function()
     {
-    var args = this.enable_command.arguments;
+    var args = arguments;
     if(!args.length) return -1;
 
     var command;
@@ -1001,6 +1006,7 @@
       this.commands[command] = enable;
       this.set_button(command, (enable ? 'act' : 'pas'));
       }
+      return true;
     };
 
 
@@ -1355,9 +1361,11 @@
     // reset selection first
     this.clear_selection();
     
-    for (var n in this.list_rows)
+    for (var n in this.list_rows) {
       if (!filter || this.list_rows[n][filter]==true)
-      this.highlight_row(n, true);
+        this.highlight_row(n, true);
+    }
+    return true;  
     };
     
 
@@ -1520,6 +1528,7 @@
     // send request to server
     var url = '_mbox='+escape(mbox);
     this.http_request('purge', url+add_url, lock);
+    return true;
     };
     
 
@@ -1611,10 +1620,11 @@
       this.permanently_remove_messages();
     // if there isn't a defined trash mailbox and the config is set to flag for deletion
     else if (!this.env.trash_mailbox && this.env.flag_for_deletion) {
-      this.mark_message('delete',this.env.uid);
+      flag = 'delete';
+      this.mark_message(flag);
       if(this.env.action=="show"){
         this.command('nextmessage','',this);
-      } else {
+      } else if (this.selection.length == 1) {
         next_row = this.get_next_row();
         prev_row = this.get_prev_row();
         new_row = (next_row) ? next_row : prev_row;
@@ -1653,11 +1663,9 @@
           break;
         case 'delete':
         case 'undelete':
-          this.toggle_delete_status(flag,a_uids);
+          this.toggle_delete_status(a_uids);
           break;
       }
-    // send request to server
-    this.http_request('mark', '_uid='+a_uids.join(',')+'&_flag='+flag);
     };
 
   // set class to read/unread
@@ -1694,10 +1702,11 @@
           this.message_rows[uid].icon.src = icn_src;
         }
       }
+      this.http_request('mark', '_uid='+a_uids.join(',')+'&_flag='+flag);
   }
   
   // mark all message rows as deleted/undeleted
-  this.toggle_delete_status = function(flag, a_uids) {
+  this.toggle_delete_status = function(a_uids) {
     if (this.env.read_when_deleted) {
       this.toggle_read_status('read',a_uids);
     }
@@ -1705,41 +1714,86 @@
     if (this.env.action == "show")
       return false;
 
-    var icn_src;
-    for (var i=0; i<a_uids.length; i++)
-      {
+    if (a_uids.length==1){
+      if(this.message_rows[uid].classname.indexOf('deleted') < 0 ){
+      	this.flag_as_deleted(a_uids)
+      } else {
+      	this.flag_as_undeleted(a_uids)
+      }
+      return true;
+    }
+    
+    var all_deleted = true;
+    
+    for (var i=0; i<a_uids.length; i++) {
       uid = a_uids[i];
-      if (this.message_rows[uid])
-        {
-        this.message_rows[uid].deleted = (flag=='undelete' ? false : true);
-        
-        if (this.message_rows[uid].classname.indexOf('deleted')<0 && this.message_rows[uid].deleted)
-          {
-          this.message_rows[uid].classname += ' deleted';
-          this.set_classname(this.message_rows[uid].obj, 'deleted', true);
-
-          if (this.env.deletedicon)
-            icn_src = this.env.deletedicon;
-          }
-        else if (!this.message_rows[uid].deleted)
-          {
-          this.message_rows[uid].classname = this.message_rows[uid].classname.replace(/\s*deleted/, '');
-          this.set_classname(this.message_rows[uid].obj, 'deleted', false);
-
-          if (this.message_rows[uid].unread && this.env.unreadicon)
-            icn_src = this.env.unreadicon;
-          else if (this.message_rows[uid].replied && this.env.repliedicon)
-            icn_src = this.env.repliedicon;
-          else if (this.env.messageicon)
-            icn_src = this.env.messageicon;
-          }
-
-        if (this.message_rows[uid].icon && icn_src)
-          this.message_rows[uid].icon.src = icn_src;
+      if (this.message_rows[uid]) {
+        if (this.message_rows[uid].classname.indexOf('deleted')<0) {
+          all_deleted = false;
+          break;
         }
       }
+    }
+    
+    if (all_deleted)
+      this.flag_as_undeleted(a_uids);
+    else
+      this.flag_as_deleted(a_uids);
+    
+    return true;
   }
 
+  this.flag_as_undeleted = function(a_uids){
+    // if deleting message from "view message" don't bother with delete icon
+    if (this.env.action == "show")
+      return false;
+
+    var icn_src;
+      
+    for (var i=0; i<a_uids.length; i++) {
+      uid = a_uids[i];
+      if (this.message_rows[uid]) {
+        this.message_rows[uid].deleted = false;
+        
+        if (this.message_rows[uid].classname.indexOf('deleted') > 0) {
+          this.message_rows[uid].classname = this.message_rows[uid].classname.replace(/\s*deleted/, '');
+          this.set_classname(this.message_rows[uid].obj, 'deleted', false);
+        }
+        if (this.message_rows[uid].unread && this.env.unreadicon)
+          icn_src = this.env.unreadicon;
+        else if (this.message_rows[uid].replied && this.env.repliedicon)
+          icn_src = this.env.repliedicon;
+        else if (this.env.messageicon)
+          icn_src = this.env.messageicon;
+        if (this.message_rows[uid].icon && icn_src)
+          this.message_rows[uid].icon.src = icn_src;
+      }
+    }
+    this.http_request('mark', '_uid='+a_uids.join(',')+'&_flag=undelete');
+    return true;
+  }
+  
+  this.flag_as_deleted = function(a_uids) {
+    // if deleting message from "view message" don't bother with delete icon
+    if (this.env.action == "show")
+      return false;
+
+    for (var i=0; i<a_uids.length; i++) {
+      uid = a_uids[i];
+      if (this.message_rows[uid]) {
+        this.message_rows[uid].deleted = true;
+        
+        if (this.message_rows[uid].classname.indexOf('deleted')<0) {
+          this.message_rows[uid].classname += ' deleted';
+          this.set_classname(this.message_rows[uid].obj, 'deleted', true);
+        }
+        if (this.message_rows[uid].icon && this.env.deletedicon)
+          this.message_rows[uid].icon.src = this.env.deletedicon;
+      }
+    }
+    this.http_request('mark', '_uid='+a_uids.join(',')+'&_flag=delete');
+    return true;  
+  }
 
   /*********************************************************/
   /*********        message compose methods        *********/
@@ -1853,6 +1907,7 @@
       input_message.value = message;
       
     this.env.identity = id;
+    return true;
     };
 
 
@@ -1880,6 +1935,8 @@
     // clear upload form
     if (!a && this.gui_objects.attachmentform && this.gui_objects.attachmentform!=this.gui_objects.messageform)
       this.gui_objects.attachmentform.reset();
+    
+    return true;  
     };
 
 
@@ -1929,6 +1986,7 @@
     
     // set reference to the form object
     this.gui_objects.attachmentform = form;
+    return true;
     };
 
 
@@ -1942,6 +2000,7 @@
     var li = document.createElement('LI');
     li.innerHTML = name;
     this.gui_objects.attachmentlist.appendChild(li);
+    return true;
     };
 
 
@@ -1950,6 +2009,8 @@
     {
     if (value)
       this.http_request('addcontact', '_address='+value);
+    
+    return true;
     };
 
   // send remote request to search mail
@@ -1961,6 +2022,7 @@
       this.set_busy(true, 'searching');
       this.http_request('search', '_search='+value+'&_mbox='+mbox, true);
       }
+    return true;
     };
 
   // reset quick-search form
@@ -1970,6 +2032,7 @@
       this.gui_objects.qsearchbox.value = '';
       
     this.env.search_request = null;
+    return true;
     };
     
 
@@ -2271,6 +2334,7 @@
       this.set_busy(true);
       target.location.href = this.env.comm_path+'&_action='+action+'&_cid='+cid+add_url;
       }
+    return true;
     };
 
 
@@ -2307,6 +2371,7 @@
 
     // send request to server
     this.http_request('delete', '_cid='+a_cids.join(',')+'&_from='+(this.env.action ? this.env.action : ''));
+    return true;
     };
 
 
@@ -2317,10 +2382,11 @@
       return false;
       
     var row = this.contact_rows[cid].obj;
-    for (var c=0; c<cols_arr.length; c++)
+    for (var c=0; c<cols_arr.length; c++){
       if (row.cells[c])
         row.cells[c].innerHTML = cols_arr[c];
-
+    }
+    return true;
     };
   
   
@@ -2341,6 +2407,8 @@
 
     if (action == 'ldappublicsearch')
       target.location.href = this.env.comm_path+'&_action='+action+add_url;
+      
+    return true;
     };
  
   // add ldap contacts to address book
@@ -2378,7 +2446,7 @@
   this.load_identity = function(id, action)
     {
     if (action=='edit-identity' && (!id || id==this.env.iid))
-      return;
+      return false;
 
     var add_url = '';
     var target = window;
@@ -2394,6 +2462,7 @@
       this.set_busy(true);
       target.location.href = this.env.comm_path+'&_action='+action+'&_iid='+id+add_url;
       }
+    return true;
     };
 
 
@@ -2418,9 +2487,10 @@
 
     // if (this.env.framed && id)
       this.set_busy(true);
-      location.href = this.env.comm_path+'&_action=delete-identity&_iid='+id;
+      location.href = this.env.comm_path+'&_action=delete-identity&_iid='+id;     
     // else if (id)
     //  this.http_request('delete-identity', '_iid='+id);
+    return true;
     };
 
 

--
Gitblit v1.9.1