From c17dc6aa31aaa6e7f61bd25993be55354e428996 Mon Sep 17 00:00:00 2001
From: alecpl <alec@alec.pl>
Date: Sat, 20 Sep 2008 13:21:15 -0400
Subject: [PATCH] #1485385: fix missing close form tag

---
 program/js/app.js |  344 ++++++++++++++++++++++++++++++--------------------------
 1 files changed, 184 insertions(+), 160 deletions(-)

diff --git a/program/js/app.js b/program/js/app.js
index a6d88aa..d1341c7 100644
--- a/program/js/app.js
+++ b/program/js/app.js
@@ -214,12 +214,6 @@
 
         this.set_page_buttons();
 
-        // focus main window
-        if (this.env.framed && window.parent)
-          window.parent.focus();
-        else
-          window.focus();
-
         // init message compose form
         if (this.env.action=='compose')
           this.init_messageform();
@@ -295,8 +289,10 @@
       case 'settings':
         this.enable_command('preferences', 'identities', 'save', 'folders', true);
         
-        if (this.env.action=='identities' || this.env.action=='edit-identity' || this.env.action=='add-identity')
-          this.enable_command('edit', 'add', 'delete', true);
+        if (this.env.action=='identities' || this.env.action=='edit-identity' || this.env.action=='add-identity') {
+          this.enable_command('add', 'delete', this.env.multiple_identities);
+          this.enable_command('edit', true);
+        }
 
         if (this.env.action=='edit-identity' || this.env.action=='add-identity')
           this.enable_command('save', true);
@@ -388,6 +384,7 @@
       row.unread = this.env.messages[uid].unread ? true : false;
       row.replied = this.env.messages[uid].replied ? true : false;
       row.flagged = this.env.messages[uid].flagged ? true : false;
+      row.forwarded = this.env.messages[uid].forwarded ? true : false;
       }
 
     // set eventhandler to message icon
@@ -761,7 +758,6 @@
         if (props._row.uid)
           {
           uid = props._row.uid;
-          this.message_list.dont_select = true;
           // toggle flagged/unflagged
           if (this.message_list.rows[uid].flagged)
             flag = 'unflagged';
@@ -1237,6 +1233,18 @@
         if (this.env.mailbox.indexOf(id + this.env.delimiter) == 0)
           this.command('list', id);
         }
+
+      // Work around a bug in IE6 and IE7, see #1485309
+      if ((bw.ie6 || bw.ie7) &&
+          li.nextSibling &&
+          (li.nextSibling.getElementsByTagName("ul").length>0) &&
+          li.nextSibling.getElementsByTagName("ul")[0].style &&
+          (li.nextSibling.getElementsByTagName("ul")[0].style.display!='none'))
+        {
+          li.nextSibling.getElementsByTagName("ul")[0].style.display = 'none';
+          li.nextSibling.getElementsByTagName("ul")[0].style.display = '';
+        }
+
       this.http_post('save-pref', '_name=collapsed_folders&_value='+escape(this.env.collapsed_folders));
       this.set_unread_count_display(id, false);
       }
@@ -1335,7 +1343,6 @@
   /*********************************************************/
   /*********     (message) list functionality      *********/
   /*********************************************************/
-
 
   // when user doble-clicks on a row
   this.show_message = function(id, safe, preview)
@@ -1531,6 +1538,98 @@
       || this.env.mailbox.match('^' + RegExp.escape(this.env.junk_mailbox) + RegExp.escape(this.env.delimiter))));
   };
 
+  // set message icon
+  this.set_message_icon = function(uid)
+  {
+    var icn_src;
+    var rows = this.message_list.rows;
+
+    if (!rows[uid])
+      return false;
+
+    if (rows[uid].deleted && this.env.deletedicon)
+      icn_src = this.env.deletedicon;
+    else if (rows[uid].replied && this.env.repliedicon)
+      {
+      if (rows[uid].forwarded && this.env.forwardedrepliedicon)
+        icn_src = this.env.forwardedrepliedicon;
+      else
+        icn_src = this.env.repliedicon;
+      }
+    else if (rows[uid].forwarded && this.env.forwardedicon)
+      icn_src = this.env.forwardedicon;
+    else if (rows[uid].unread && this.env.unreadicon)
+      icn_src = this.env.unreadicon;
+    else if (this.env.messageicon)
+      icn_src = this.env.messageicon;
+      
+    if (icn_src && rows[uid].icon)
+      rows[uid].icon.src = icn_src;
+
+    icn_src = '';
+    
+    if (rows[uid].flagged && this.env.flaggedicon)
+      icn_src = this.env.flaggedicon;
+    else if (this.env.unflaggedicon)
+      icn_src = this.env.unflaggedicon;
+
+    if (rows[uid].flagged_icon && icn_src)
+      rows[uid].flagged_icon.src = icn_src;
+  }
+
+  // set message status
+  this.set_message_status = function(uid, flag, status)
+    {
+    var rows = this.message_list.rows;
+
+    if (!rows[uid]) return false;
+
+    if (flag == 'unread')
+      rows[uid].unread = status;
+    else if(flag == 'deleted')
+      rows[uid].deleted = status;
+    else if (flag == 'replied')
+      rows[uid].replied = status;
+    else if (flag == 'forwarded')
+      rows[uid].forwarded = status;
+    else if (flag == 'flagged')
+      rows[uid].flagged = status;
+    }
+
+  // set message row status, class and icon
+  this.set_message = function(uid, flag, status)
+    {
+    var rows = this.message_list.rows;
+
+    if (!rows[uid]) return false;
+    
+    if (flag)
+      this.set_message_status(uid, flag, status);
+    
+    if (rows[uid].unread && rows[uid].classname.indexOf('unread')<0)
+      {
+      rows[uid].classname += ' unread';
+      this.set_classname(rows[uid].obj, 'unread', true);
+      }
+    else if (!rows[uid].unread && rows[uid].classname.indexOf('unread')>=0)
+      {
+      rows[uid].classname = rows[uid].classname.replace(/\s*unread/, '');
+      this.set_classname(rows[uid].obj, 'unread', false);
+      }
+    
+    if (rows[uid].deleted && rows[uid].classname.indexOf('deleted')<0)
+      {
+      rows[uid].classname += ' deleted';
+      this.set_classname(rows[uid].obj, 'deleted', true);
+      }
+    else if (!rows[uid].deleted && rows[uid].classname.indexOf('deleted')>=0)
+      {
+      rows[uid].classname = rows[uid].classname.replace(/\s*deleted/, '');
+      this.set_classname(rows[uid].obj, 'deleted', false);
+      }
+
+    this.set_message_icon(uid);
+    }
 
   // move selected messages to the specified mailbox
   this.move_messages = function(mbox)
@@ -1630,20 +1729,9 @@
         else
         {
           rows[id].deleted = true;
-        
-          if (rows[id].classname.indexOf('deleted')<0)
-          {
-            rows[id].classname += ' deleted';
-            this.set_classname(rows[id].obj, 'deleted', true);
-          }
           if (this.env.read_when_deleted)
-          {
-            rows[id].classname = rows[id].classname.replace(/\s*unread/, '');
-            this.set_classname(rows[id].obj, 'unread', false);
-          }
-        
-          if (rows[id].icon && this.env.deletedicon)
-            rows[id].icon.src = this.env.deletedicon;
+    	    rows[id].unread = false;
+	  this.set_message(id);
         }
       }
     }
@@ -1718,88 +1806,18 @@
   this.toggle_read_status = function(flag, a_uids)
   {
     // mark all message rows as read/unread
-    var icn_src;
-    var rows = this.message_list.rows;
     for (var i=0; i<a_uids.length; i++)
-      {
-      uid = a_uids[i];
-      if (rows[uid])
-        {
-        rows[uid].unread = (flag=='unread' ? true : false);
-        
-        if (rows[uid].classname.indexOf('unread')<0 && rows[uid].unread)
-          {
-          rows[uid].classname += ' unread';
-          this.set_classname(rows[uid].obj, 'unread', true);
-
-          if (this.env.unreadicon)
-            icn_src = this.env.unreadicon;
-          }
-        else if (!rows[uid].unread)
-          {
-          rows[uid].classname = rows[uid].classname.replace(/\s*unread/, '');
-          this.set_classname(rows[uid].obj, 'unread', false);
-
-          if (this.env.messageicon)
-            icn_src = this.env.messageicon;
-          }
-
-        if (rows[uid].icon && icn_src 
-            && !(rows[uid].replied && this.env.repliedicon)
-            && !(rows[uid].deleted && this.env.deletedicon))
-          rows[uid].icon.src = icn_src;
-        }
-      }
+      this.set_message(a_uids[i], 'unread', (flag=='unread' ? true : false));
 
     this.http_post('mark', '_uid='+a_uids.join(',')+'&_flag='+flag);
   };
 
-  // set class to read/unread
-  this.mark_as_read_from_preview = function(uid)
-  {
-    var icn_src;
-    var rows = parent.rcmail.message_list.rows;
-    if(rows[uid].unread)
-      {
-        rows[uid].unread = false;
-        rows[uid].classname = rows[uid].classname.replace(/\s*unread/, '');
-        parent.rcmail.set_classname(rows[uid].obj, 'unread', false);
-
-        if (rows[uid].replied && parent.rcmail.env.repliedicon)
-          icn_src = parent.rcmail.env.repliedicon;
-        else if (rows[uid].deleted && parent.rcmail.env.deletedicon)
-          icn_src = parent.rcmail.env.deletedicon;
-        else if (parent.rcmail.env.messageicon)
-          icn_src = parent.rcmail.env.messageicon;
-      
-        if (rows[uid].icon && icn_src)
-          rows[uid].icon.src = icn_src;
-      }
-  }
-  
-  
   // set image to flagged or unflagged
   this.toggle_flagged_status = function(flag, a_uids)
   {
     // mark all message rows as flagged/unflagged
-    var icn_src;
-    var rows = this.message_list.rows;
     for (var i=0; i<a_uids.length; i++)
-      {
-      uid = a_uids[i];
-      if (rows[uid])
-        {
-        rows[uid].flagged = (flag=='flagged' ? true : false);
-
-        if (rows[uid].flagged && this.env.flaggedicon)
-          icn_src = this.env.flaggedicon;
-        else if (this.env.unflaggedicon)
-          icn_src = this.env.unflaggedicon;
-
-        if (rows[uid].flagged_icon && icn_src)
-          rows[uid].flagged_icon.src = icn_src;
-        }
-      }
+      this.set_message(a_uids[i], 'flagged', (flag=='flagged' ? true : false));
 
     this.http_post('mark', '_uid='+a_uids.join(',')+'&_flag='+flag);
   };
@@ -1811,7 +1829,7 @@
     
     if (a_uids.length==1)
     {
-      if (!rows.length || (rows[a_uids[0]] && rows[a_uids[0]].classname.indexOf('deleted') < 0))
+      if (!rows.length || (rows[a_uids[0]] && !rows[a_uids[0]].deleted))
         this.flag_as_deleted(a_uids);
       else
         this.flag_as_undeleted(a_uids);
@@ -1824,7 +1842,7 @@
     {
       uid = a_uids[i];
       if (rows[uid]) {
-        if (rows[uid].classname.indexOf('deleted')<0)
+        if (!rows[uid].deleted)
         {
           all_deleted = false;
           break;
@@ -1843,31 +1861,8 @@
 
   this.flag_as_undeleted = function(a_uids)
   {
-    var icn_src;
-    var rows = this.message_list ? this.message_list.rows : new Array();
-      
     for (var i=0; i<a_uids.length; i++)
-    {
-      uid = a_uids[i];
-      if (rows[uid]) {
-        rows[uid].deleted = false;
-        
-        if (rows[uid].classname.indexOf('deleted') > 0)
-        {
-          rows[uid].classname = rows[uid].classname.replace(/\s*deleted/, '');
-          this.set_classname(rows[uid].obj, 'deleted', false);
-        }
-        if (rows[uid].unread && this.env.unreadicon)
-          icn_src = this.env.unreadicon;
-        else if (rows[uid].replied && this.env.repliedicon)
-          icn_src = this.env.repliedicon;
-        else if (this.env.messageicon)
-          icn_src = this.env.messageicon;
-
-        if (rows[uid].icon && icn_src)
-          rows[uid].icon.src = icn_src;
-      }
-    }
+      this.set_message(a_uids[i], 'deleted', false);
 
     this.http_post('mark', '_uid='+a_uids.join(',')+'&_flag=undelete');
     return true;
@@ -1885,22 +1880,7 @@
       uid = a_uids[i];
       if (rows[uid])
         {
-        rows[uid].deleted = true;
-        
-        if (rows[uid].classname.indexOf('deleted')<0)
-          {
-          rows[uid].classname += ' deleted';
-          this.set_classname(rows[uid].obj, 'deleted', true);
-          }
-        if (this.env.read_when_deleted)
-        {
-          rows[uid].classname = rows[uid].classname.replace(/\s*unread/, '');
-          this.set_classname(rows[uid].obj, 'unread', false);
-        }
-          
-        if (rows[uid].icon && this.env.deletedicon)
-          rows[uid].icon.src = this.env.deletedicon;
-
+	this.set_message(uid, 'deleted', true);
         if (rows[uid].unread)
           r_uids[r_uids.length] = uid;
         }
@@ -1932,12 +1912,7 @@
         {
         rows[uid].unread = false;
         rows[uid].read = true;
-        
-        rows[uid].classname = rows[uid].classname.replace(/\s*unread/, '');
-        this.set_classname(rows[uid].obj, 'unread', false);
-
-        if (rows[uid].icon)
-          rows[uid].icon.src = this.env.deletedicon;
+	this.set_message(uid);
         }
       }
   };
@@ -2335,7 +2310,6 @@
   /*********     keyboard live-search methods      *********/
   /*********************************************************/
 
-
   // handler for keyboard events on address-fields
   this.ksearch_keypress = function(e, obj)
     {
@@ -2555,7 +2529,6 @@
   /*********************************************************/
   /*********         address book methods          *********/
   /*********************************************************/
-
 
   this.contactlist_keypress = function(list)
     {
@@ -2894,6 +2867,7 @@
       if (this.env.folder && name != '')
         name = this.env.folder+this.env.delimiter+name;
 
+      this.set_busy(true, 'foldercreating');
       this.http_post('create-folder', '_name='+urlencode(name), true);
       }
     else if (form.elements['_folder_name'])
@@ -2968,6 +2942,7 @@
         if (this.name_input.__parent)
           newname = this.name_input.__parent + this.env.delimiter + newname;
 
+        this.set_busy(true, 'folderrenaming');
         this.http_post('rename-folder', '_folder_oldname='+urlencode(this.env.subscriptionrows[this.edit_folder][0])+'&_folder_newname='+urlencode(newname), true);
         }
       }
@@ -2987,7 +2962,8 @@
 
     if (folder && confirm(this.get_label('deletefolderconfirm')))
       {
-      this.http_post('delete-folder', '_mboxes='+urlencode(folder));
+      this.set_busy(true, 'folderdeleting');
+      this.http_post('delete-folder', '_mboxes='+urlencode(folder), true);
       this.set_env('folder', null);
 
       if (this.gui_objects.createfolderhint)
@@ -3469,6 +3445,7 @@
     this.env.messages[uid] = {deleted:flags.deleted?1:0,
                               replied:flags.replied?1:0,
                               unread:flags.unread?1:0,
+			      forwarded:flags.forwarded?1:0,
                               flagged:flags.flagged?1:0};
     
     var row = document.createElement('TR');
@@ -3478,10 +3455,21 @@
     if (this.message_list.in_selection(uid))
       row.className += ' selected';
 
-    var icon = flags.deleted && this.env.deletedicon ? this.env.deletedicon:
-               (flags.unread && this.env.unreadicon ? this.env.unreadicon :
-               (flags.replied && this.env.repliedicon ? this.env.repliedicon : this.env.messageicon));
-
+    var icon = this.env.messageicon;
+    if (flags.deleted && this.env.deletedicon)
+      icon = this.env.deletedicon;
+    else if (flags.replied && this.env.repliedicon)
+      {
+      if (flags.forwarded && this.env.forwardedrepliedicon)
+        icon = this.env.forwardedrepliedicon;
+      else
+        icon = this.env.repliedicon;
+      }
+    else if (flags.forwarded && this.env.forwardedicon)
+      icon = this.env.forwardedicon;
+    else if(flags.unread && this.env.unreadicon)
+      icon = this.env.unreadicon;
+    
     var col = document.createElement('TD');
     col.className = 'icon';
     col.innerHTML = icon ? '<img src="'+icon+'" alt="" />' : '';
@@ -3513,6 +3501,14 @@
     row.appendChild(col);
 
     this.message_list.insert_row(row, attop);
+
+    // remove 'old' row
+    if (attop && this.env.pagesize && this.message_list.rowcount > this.env.pagesize)
+      {
+	var uid = this.message_list.get_last_row();
+        this.message_list.remove_row(uid);
+	this.message_list.clear_selection(uid);
+      }
     };
 
 
@@ -3608,12 +3604,6 @@
       }
     };
 
-  // update parent's mailboxlist (from preview)
-  this.set_unread_count_from_preview = function(mbox, count, set_title)
-  {
-    parent.rcmail.set_unread_count(mbox, count, set_title);
-  }
-  
   // add row to contacts list
   this.add_contact_row = function(cid, cols, select)
     {
@@ -3648,13 +3638,21 @@
   this.toggle_editor = function(checkbox, textAreaId)
     {
     var ischecked = checkbox.checked;
+    var composeElement = document.getElementById(textAreaId);
+    
     if (ischecked)
       {
-        tinyMCE.execCommand('mceAddControl', true, textAreaId);
+      var existingPlainText = composeElement.value;
+      var htmlText = "<pre>" + existingPlainText + "</pre>";
+      composeElement.value = htmlText;
+      tinyMCE.execCommand('mceAddControl', true, textAreaId);
       }
     else
       {
-        tinyMCE.execCommand('mceRemoveControl', true, textAreaId);
+      var thisMCE = tinyMCE.get(textAreaId);
+      var existingHtml = thisMCE.getContent();
+      this.html2plain(existingHtml, textAreaId);
+      tinyMCE.execCommand('mceRemoveControl', true, textAreaId);
       }
     };
 
@@ -3683,6 +3681,7 @@
       }
     };
 
+
   // display all-headers row and fetch raw message headers
   this.load_headers = function(elem)
     {
@@ -3697,7 +3696,7 @@
     // fetch headers only once
     if (!this.gui_objects.all_headers_box.innerHTML)
       {
-      this.set_busy(true, 'loading');
+      this.display_message(this.get_label('loading'), 'loading', true); 
       this.http_post('headers', '_uid='+this.env.uid);
       }
     }
@@ -3713,6 +3712,32 @@
     this.set_classname(elem, 'show-headers', true);
     this.gui_objects.all_headers_row.style.display = 'none';
     elem.onclick = function() { rcmail.load_headers(elem); }
+    }
+
+
+  /********************************************************/
+  /*********  html to text conversion functions   *********/
+  /********************************************************/
+
+  this.html2plain = function(htmlText, id)
+    {
+    var http_request = new rcube_http_request();
+    var url = this.env.bin_path+'html2text.php';
+    var rcmail = this;
+
+    this.set_busy(true, 'converting');
+    console.log('HTTP POST: '+url);
+
+    http_request.onerror = function(o) { rcmail.http_error(o); };
+    http_request.oncomplete = function(o) { rcmail.set_text_value(o, id); };
+    http_request.POST(url, htmlText, 'application/octet-stream');
+    }
+
+  this.set_text_value = function(httpRequest, id)
+    {
+    this.set_busy(false);
+    document.getElementById(id).value = httpRequest.get_text();
+    console.log(httpRequest.get_text());
     }
 
 
@@ -4150,4 +4175,3 @@
     window.setTimeout('if (window[\''+o+'\'] && window[\''+o+'\'].init) { '+o+'.init(); }',
                       bw.win ? 500 : 200);
   }
-

--
Gitblit v1.9.1