From ed5d29f4b3c57235594931d33dde7cccaf7cd58b Mon Sep 17 00:00:00 2001
From: thomascube <thomas@roundcube.net>
Date: Thu, 25 May 2006 14:25:04 -0400
Subject: [PATCH] Finalized GoogieSpell integration

---
 program/js/app.js |  204 +++++++++++++++++++++++++++++++++++++-------------
 1 files changed, 151 insertions(+), 53 deletions(-)

diff --git a/program/js/app.js b/program/js/app.js
index da7d18c..98a30d3 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;
@@ -141,7 +142,11 @@
           }  
 
         if (this.env.action=='compose')
+          {
           this.enable_command('add-attachment', 'send-attachment', 'send', true);
+          if (this.env.spellcheck)
+            this.enable_command('spellcheck', true);
+          }
           
         if (this.env.messagecount)
           this.enable_command('select-all', 'select-none', 'sort', 'expunge', true);
@@ -254,15 +259,29 @@
     };
 
   // reset last clicked if user clicks on anything other than the message table
-  this.reset_click = function()
-    {
-	this.in_message_list = false;
-	};
+  this.reset_click = function() {
+    this.in_message_list = false;
+	for (var n=0; n<this.selection.length; n++) {
+      id = this.selection[n];
+      if (this.list_rows[id].obj) {
+        this.set_classname(this.list_rows[id].obj, 'selected', false);
+		this.set_classname(this.list_rows[id].obj, 'unfocused', true);
+	  }
+    }
+  };
 	
   this.click_on_list = function(e)
     {
     if (!e)
       e = window.event;
+
+    for (var n=0; n<this.selection.length; n++) {
+      id = this.selection[n];
+      if (this.list_rows[id].obj) {
+        this.set_classname(this.list_rows[id].obj, 'selected', true);
+		this.set_classname(this.list_rows[id].obj, 'unfocused', false);
+	  }
+    }
 
     this.in_message_list = true;
     e.cancelBubble = true;
@@ -328,8 +347,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);
         }
       }
       
@@ -856,7 +879,12 @@
           parent.location.href = url;
         else
           location.href = url;
-        break;    
+        break;
+        
+      case 'spellcheck':
+        if (this.env.spellcheck && this.env.spellcheck.spellCheck)
+          this.env.spellcheck.spellCheck(this.env.spellcheck.check_link);
+        break;
 
       case 'send':
         if (!this.gui_objects.messageform)
@@ -989,7 +1017,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 +1029,7 @@
       this.commands[command] = enable;
       this.set_button(command, (enable ? 'act' : 'pas'));
       }
+      return true;
     };
 
 
@@ -1247,7 +1276,7 @@
       if (!this.in_selection(id))  // select row
         {
         this.selection[this.selection.length] = id;
-        this.set_classname(this.list_rows[id].obj, 'selected', true);    
+        this.set_classname(this.list_rows[id].obj, 'selected', true);
         }
       else  // unselect row
         {
@@ -1256,6 +1285,7 @@
         var a_post = this.selection.slice(p+1, this.selection.length);
         this.selection = a_pre.concat(a_post);
         this.set_classname(this.list_rows[id].obj, 'selected', false);
+        this.set_classname(this.list_rows[id].obj, 'unfocused', false);
         }
       selected = (this.selection.length==1);
       }
@@ -1328,9 +1358,10 @@
   this.clear_selection = function()
     {
     for(var n=0; n<this.selection.length; n++)
-      if (this.list_rows[this.selection[n]])
+      if (this.list_rows[this.selection[n]]) {
         this.set_classname(this.list_rows[this.selection[n]].obj, 'selected', false);
-
+        this.set_classname(this.list_rows[this.selection[n]].obj, 'unfocused', false);
+	  }
     this.selection = new Array();    
     };
 
@@ -1355,9 +1386,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 +1553,7 @@
     // send request to server
     var url = '_mbox='+escape(mbox);
     this.http_request('purge', url+add_url, lock);
+    return true;
     };
     
 
@@ -1611,10 +1645,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 +1688,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 +1727,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 +1739,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[a_uids[0]].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 +1932,7 @@
       input_message.value = message;
       
     this.env.identity = id;
+    return true;
     };
 
 
@@ -1880,6 +1960,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 +2011,7 @@
     
     // set reference to the form object
     this.gui_objects.attachmentform = form;
+    return true;
     };
 
 
@@ -1942,6 +2025,7 @@
     var li = document.createElement('LI');
     li.innerHTML = name;
     this.gui_objects.attachmentlist.appendChild(li);
+    return true;
     };
 
 
@@ -1950,6 +2034,8 @@
     {
     if (value)
       this.http_request('addcontact', '_address='+value);
+    
+    return true;
     };
 
   // send remote request to search mail
@@ -1961,6 +2047,7 @@
       this.set_busy(true, 'searching');
       this.http_request('search', '_search='+value+'&_mbox='+mbox, true);
       }
+    return true;
     };
 
   // reset quick-search form
@@ -1970,6 +2057,7 @@
       this.gui_objects.qsearchbox.value = '';
       
     this.env.search_request = null;
+    return true;
     };
     
 
@@ -2012,6 +2100,7 @@
           highlight.removeAttribute('id');
           //highlight.removeAttribute('class');
           this.set_classname(highlight, 'selected', false);
+          this.set_classname(highlight, 'unfocused', false);
           }
 
         if (next)
@@ -2271,6 +2360,7 @@
       this.set_busy(true);
       target.location.href = this.env.comm_path+'&_action='+action+'&_cid='+cid+add_url;
       }
+    return true;
     };
 
 
@@ -2307,6 +2397,7 @@
 
     // send request to server
     this.http_request('delete', '_cid='+a_cids.join(',')+'&_from='+(this.env.action ? this.env.action : ''));
+    return true;
     };
 
 
@@ -2317,10 +2408,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 +2433,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 +2472,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 +2488,7 @@
       this.set_busy(true);
       target.location.href = this.env.comm_path+'&_action='+action+'&_iid='+id+add_url;
       }
+    return true;
     };
 
 
@@ -2418,9 +2513,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;
     };
 
 
@@ -2743,8 +2839,10 @@
       var current_li = document.getElementById('rcmbx'+s_current);
       var mbox_li = document.getElementById('rcmbx'+s_mbox);
       
-      if (current_li)
+      if (current_li) {
         this.set_classname(current_li, 'selected', false);
+        this.set_classname(current_li, 'unfocused', false);
+        }
       if (mbox_li)
         this.set_classname(mbox_li, 'selected', true);
       }

--
Gitblit v1.9.1