From 41fa0b909ac1fe80dd103e8d986776ef46a5b50a Mon Sep 17 00:00:00 2001
From: thomascube <thomas@roundcube.net>
Date: Mon, 31 Jul 2006 18:51:23 -0400
Subject: [PATCH] Compose, save and sendmail cleanup

---
 program/include/rcube_shared.inc |   19 +++++-
 program/steps/mail/upload.inc    |   12 +---
 program/include/main.inc         |   15 ++++
 program/steps/mail/compose.inc   |    8 +-
 program/steps/mail/sendmail.inc  |   47 ++++++++-------
 program/js/app.js                |   56 ++++++++++--------
 program/include/rcube_imap.inc   |   13 ++--
 7 files changed, 96 insertions(+), 74 deletions(-)

diff --git a/program/include/main.inc b/program/include/main.inc
index bbfba07..48e485c 100644
--- a/program/include/main.inc
+++ b/program/include/main.inc
@@ -712,7 +712,7 @@
     return 'this.'.$command;
   
   else
-    $OUTPUT->add_script(sprintf("%s%s.%s",
+    $OUTPUT->add_script(sprintf("%s%s.%s\n",
                                 $framed ? sprintf('if(parent.%s)parent.', $JS_OBJECT_NAME) : '',
                                 $JS_OBJECT_NAME,
                                 $command));
@@ -789,6 +789,19 @@
   }
 
 
+// send correctly formatted response for a request posted to an iframe
+function rcube_iframe_response($js_code='')
+  {
+  global $OUTPUT, $JS_OBJECT_NAME;
+
+  if (!empty($js_code))
+    $OUTPUT->add_script("if(parent.$JS_OBJECT_NAME){\n" . $js_code . "\n}");
+
+  $OUTPUT->write();
+  exit;
+  }
+
+
 // read directory program/localization/ and return a list of available languages
 function rcube_list_languages()
   {
diff --git a/program/include/rcube_imap.inc b/program/include/rcube_imap.inc
index dad6426..630d2fb 100644
--- a/program/include/rcube_imap.inc
+++ b/program/include/rcube_imap.inc
@@ -1678,7 +1678,7 @@
     {
     $a = $this->_parse_address_list($input);
     $out = array();
-
+    
     if (!is_array($a))
       return $out;
 
@@ -2018,12 +2018,13 @@
     {
     $a = $this->_explode_quoted_string(',', $str);
     $result = array();
-
+    
     foreach ($a as $key => $val)
       {
       $val = str_replace("\"<", "\" <", $val);
-      $sub_a = $this->_explode_quoted_string(' ', $val);
-      
+      $sub_a = $this->_explode_quoted_string(' ', $this->decode_header($val));
+      $result[$key]['name'] = '';
+
       foreach ($sub_a as $k => $v)
         {
         if ((strpos($v, '@') > 0) && (strpos($v, '.') > 0)) 
@@ -2033,9 +2034,7 @@
         }
         
       if (empty($result[$key]['name']))
-        $result[$key]['name'] = $result[$key]['address'];
-        
-      $result[$key]['name'] = $this->decode_header($result[$key]['name']);
+        $result[$key]['name'] = $result[$key]['address'];        
       }
     
     return $result;
diff --git a/program/include/rcube_shared.inc b/program/include/rcube_shared.inc
index 8f4efdb..eab175b 100644
--- a/program/include/rcube_shared.inc
+++ b/program/include/rcube_shared.inc
@@ -33,6 +33,7 @@
   
   var $script_tag_file = "<script type=\"text/javascript\" src=\"%s%s\"></script>\n";
   var $script_tag      = "<script type=\"text/javascript\">\n<!--\n%s\n\n//-->\n</script>\n";
+  var $default_template = "<html>\n<body></body>\n</html>";
   
   var $title = '';
   var $header = '';
@@ -78,10 +79,11 @@
     }
 
 
-  function set_title()
+  function set_title($t)
     {
-    
+    $this->title = $t;
     }
+
 
   function set_charset($charset)
     {
@@ -95,16 +97,25 @@
         $MBSTRING = FALSE;
       }
     }
-    
+
   function get_charset()
     {
     return $this->charset;
     }
 
 
+  function reset()
+    {
+    $this->css = new rcube_css();
+    $this->script_files = array();
+    $this->scripts = array();
+    $this->title = '';
+    }
+
+
   function write($templ='', $base_path='')
     {
-    $output = trim($templ);
+    $output = empty($templ) ? $this->default_template : trim($templ);
   
     // set default page title
     if (!strlen($this->title))
diff --git a/program/js/app.js b/program/js/app.js
index 51d9f85..7342414 100644
--- a/program/js/app.js
+++ b/program/js/app.js
@@ -18,10 +18,9 @@
 var CONTROL_KEY = 1;
 var SHIFT_KEY = 2;
 var CONTROL_SHIFT_KEY = 3;
-var DRAFT_AUTOSAVE = 10; // Minutes
+var DRAFT_AUTOSAVE = 5; // Minutes
 
 var rcube_webmail_client;
-var rcube_save_timer;
 
 function rcube_webmail()
   {
@@ -149,8 +148,8 @@
           this.enable_command('add-attachment', 'send-attachment', 'remove-attachment', 'send', true);
           if (this.env.spellcheck)
             this.enable_command('spellcheck', true);
-	  if (this.env.drafts_mailbox)
-	    this.enable_command('savedraft', true);
+          if (this.env.drafts_mailbox)
+            this.enable_command('savedraft', true);
           }
           
         if (this.env.messagecount)
@@ -455,7 +454,6 @@
  
     // start the auto-save timer
     this.auto_save_start();
-    
     };
 
   this.init_address_input_events = function(obj)
@@ -704,17 +702,15 @@
           {
           var uid = this.get_single_uid();
           if (uid && (!this.env.uid || uid != this.env.uid))
-	    {
+            {
             if (this.env.mailbox==this.env.drafts_mailbox)
               {
               this.set_busy(true);
               location.href = this.env.comm_path+'&_action=compose&_draft_uid='+uid+'&_mbox='+escape(this.env.mailbox);
               }
             else
-              {
               this.show_message(uid);
-	      }
-	    }
+            }
           }
         else if (this.task=='addressbook')
           {
@@ -933,33 +929,34 @@
         break;
 
       case 'savedraft':
-	// Reset the auto-save timer
-        self.clearTimeout(rcube_save_timer);
+        // Reset the auto-save timer
+        self.clearTimeout(this.save_timer);
 
         if (!this.gui_objects.messageform)
           break;
 
-	// if saving Drafts is disabled in main.inc.php
-	if (!this.env.drafts_mailbox)
-	  break;
+        // if saving Drafts is disabled in main.inc.php
+        if (!this.env.drafts_mailbox)
+          break;
 
         this.set_busy(true, 'savingmessage');
         var form = this.gui_objects.messageform;
-	form.target = "savetarget";
+        form.target = "savetarget";
         form.submit();
         break;
 
       case 'send':
         if (!this.gui_objects.messageform)
           break;
-          
+
         if (!this.check_compose_input())
           break;
 
         // all checks passed, send message
         this.set_busy(true, 'sendingmessage');
         var form = this.gui_objects.messageform;
-	form._draft.value='';
+        form.target = "savetarget";     
+        form._draft.value = '';
         form.submit();
         break;
 
@@ -968,7 +965,7 @@
         
       case 'send-attachment':
         // Reset the auto-save timer
-        self.clearTimeout(rcube_save_timer);
+        self.clearTimeout(this.save_timer);
 
         this.upload_file(props)      
         break;
@@ -2014,12 +2011,14 @@
 
     return true;
     };
-    
+
+
   this.auto_save_start = function()
     {
-    rcube_save_timer = self.setTimeout('rcmail.command("savedraft","",this)',DRAFT_AUTOSAVE * 60000);
-    }
- 
+    this.save_timer = self.setTimeout('rcmail.command("savedraft","",this)', DRAFT_AUTOSAVE * 60000);
+    };
+
+
   this.compose_field_hash = function()
     {
     // check input fields
@@ -2190,7 +2189,7 @@
     for (i=0;i<list.length;i++)
       if (list[i].id == name)
 	this.gui_objects.attachmentlist.removeChild(list[i]);
-    }
+    };
 
   this.remove_attachment = function(name)
     {
@@ -2198,7 +2197,7 @@
       this.http_request('remove-attachment', '_filename='+escape(name));
 
     return true;
-    }
+    };
 
   // send remote request to add a new contact
   this.add_contact = function(value)
@@ -2230,7 +2229,14 @@
     this.env.search_request = null;
     return true;
     };
-    
+
+
+  this.sent_successfully = function(msg)
+    {
+    this.list_mailbox();
+    this.display_message(msg, 'confirmation', true);
+    }
+
 
   /*********************************************************/
   /*********     keyboard live-search methods      *********/
diff --git a/program/steps/mail/compose.inc b/program/steps/mail/compose.inc
index 877948c..32378f5 100644
--- a/program/steps/mail/compose.inc
+++ b/program/steps/mail/compose.inc
@@ -50,7 +50,7 @@
 $_SESSION['compose'] = array('id' => uniqid(rand()));
 
 // add some labels to client
-rcube_add_label('nosubject', 'norecipientwarning', 'nosubjectwarning', 'nobodywarning', 'notsentwarning', 'savingmessage', 'savingmessage', 'messagesaved');
+rcube_add_label('nosubject', 'norecipientwarning', 'nosubjectwarning', 'nobodywarning', 'notsentwarning', 'savingmessage', 'sendingmessage', 'messagesaved');
 
 
 if ($_GET['_reply_uid'] || $_GET['_forward_uid'] || $_GET['_draft_uid'])
@@ -411,8 +411,8 @@
     rcube_add_label('checking');
     }
  
-  $out .= '<iframe name="savetarget" src="program/blank.gif" style="width:0;height:0;visibility:hidden;"></iframe>';
- 
+  $out .= "\n".'<iframe name="savetarget" src="program/blank.gif" style="width:0;height:0;visibility:hidden;"></iframe>';
+
   return $out;
   }
 
@@ -791,8 +791,6 @@
   
   $OUTPUT->add_script(sprintf("$JS_OBJECT_NAME.set_env('contacts', %s);", array2js($a_contacts)));
   }
-
-
 
 
 parse_template('compose');
diff --git a/program/steps/mail/sendmail.inc b/program/steps/mail/sendmail.inc
index b48dc0c..ddd1800 100644
--- a/program/steps/mail/sendmail.inc
+++ b/program/steps/mail/sendmail.inc
@@ -36,7 +36,6 @@
 /****** message sending functions ********/
 
 
-
 function rcmail_get_identity($id)
   {
   global $DB, $CHARSET, $OUTPUT;
@@ -63,12 +62,17 @@
   return FALSE;  
   }
 
+
 if (strlen($_POST['_draft_saveid']) > 3)
   $olddraftmessageid = get_input_value('_draft_saveid', RCUBE_INPUT_POST);
 
 $message_id = sprintf('<%s@%s>', md5(uniqid('rcmail'.rand(),true)), $_SESSION['imap_host']);
-
 $savedraft = !empty($_POST['_draft']) ? TRUE : FALSE;
+
+// remove all scripts and act as called in frame
+$OUTPUT->reset();
+$_framed = TRUE;
+
 
 /****** check submission and compose message ********/
 
@@ -76,7 +80,8 @@
 if (empty($_POST['_to']) && empty($_POST['_subject']) && $_POST['_message'])
   {
   show_message("sendingfailed", 'error'); 
-  rcmail_overwrite_action('compose');
+  //rcmail_overwrite_action('compose');
+  rcube_iframe_response();
   return;
   }
 
@@ -274,7 +279,7 @@
   if (!$sent)
     {
     show_message("sendingfailed", 'error'); 
-    rcmail_overwrite_action('compose');
+    rcube_iframe_response();
     return;
     }
   
@@ -284,6 +289,8 @@
     $IMAP->set_flag($_SESSION['compose']['reply_uid'], 'ANSWERED');
 
   } // End of SMTP Delivery Block
+
+
 
 // Determine which folder to save message
 if ($savedraft)
@@ -312,17 +319,13 @@
   // raise error if saving failed
   if (!$saved)
     {
-    // clear the "saving message" busy status, and display failure
-    $errorout = sprintf("parent.%s.display_message('%s', '%s');",
-                       $JS_OBJECT_NAME,
-                       addslashes(rep_specialchars_output(rcube_label(array('name' => 'errorsaving', 'vars' => NULL)))),
-                       'error');
-    print "<html><script type=\"text/javascript\">$errorout</script></html>";
     raise_error(array('code' => 800,
                       'type' => 'imap',
                       'file' => __FILE__,
                       'message' => "Could not save message in $CONFIG[$store_target]"), TRUE, FALSE);
-    exit;
+    
+    show_message('errorsaving', 'error');
+    rcube_iframe_response($errorout);
     }
 
   if ($olddraftmessageid)
@@ -343,24 +346,20 @@
 if ($savedraft)
   {
   // clear the "saving message" busy status, and display success
-  $frameout = sprintf("parent.%s.display_message('%s', '%s');",
-                     $JS_OBJECT_NAME,
-                     addslashes(rep_specialchars_output(rcube_label(array('name' => 'messagesaved', 'vars' => NULL)))),
-                     'confirmation');
+  show_message('messagesaved', 'confirmation');
 
   // update "_draft_saveid" on the page, which is used to delete a previous draft
-  $frameout .= 'var foundid = parent.rcube_find_object("_draft_saveid",parent.document);';
-  $frameout .= sprintf('foundid.value = "%s";',str_replace(array('<','>'),"",$message_id));
+  $frameout = "var foundid = parent.rcube_find_object('_draft_saveid', parent.document);\n";
+  $frameout .= sprintf("foundid.value = '%s';\n", str_replace(array('<','>'), "", $message_id));
 
   // update the "cmp_hash" to prevent "Unsaved changes" warning
-  $frameout .= sprintf("parent.%s.cmp_hash = parent.%s.compose_field_hash();",$JS_OBJECT_NAME,$JS_OBJECT_NAME);
-  
+  $frameout .= sprintf("parent.%s.cmp_hash = parent.%s.compose_field_hash();\n", $JS_OBJECT_NAME, $JS_OBJECT_NAME);
+
   // start the auto-save timer again
-  $frameout .= sprintf("parent.%s.auto_save_start();",$JS_OBJECT_NAME);
+  $frameout .= sprintf("parent.%s.auto_save_start();", $JS_OBJECT_NAME);
 
   // send html page with JS calls as response
-  print "<html><script type=\"text/javascript\">$frameout</script></html>";
-  exit;
+  rcube_iframe_response($frameout);
   }
 else
   {
@@ -379,8 +378,10 @@
       fclose($fp);
       }
     }
-  show_message('messagesent', 'confirmation');
+
   rcmail_compose_cleanup();
+  rcube_iframe_response(sprintf("parent.$JS_OBJECT_NAME.sent_successfully('%s');",
+                                rep_specialchars_output(rcube_label('messagesent'), 'js')));
   }
 
 
diff --git a/program/steps/mail/upload.inc b/program/steps/mail/upload.inc
index 0af8eed..abab389 100644
--- a/program/steps/mail/upload.inc
+++ b/program/steps/mail/upload.inc
@@ -53,18 +53,12 @@
 
 
 // send html page with JS calls as response
-print <<<EOF
-<html>
-<script type="text/javascript">
-if (parent.$JS_OBJECT_NAME)
-{
+$frameout = <<<EOF
 $response
 parent.$JS_OBJECT_NAME.show_attachment_form(false);
 parent.$JS_OBJECT_NAME.auto_save_start();
-}
-</script>
-</html>
 EOF;
-exit;
+
+rcube_iframe_response($frameout);
 
 ?>

--
Gitblit v1.9.1