thomascube
2006-07-31 41fa0b909ac1fe80dd103e8d986776ef46a5b50a
Compose, save and sendmail cleanup

7 files modified
170 ■■■■■ changed files
program/include/main.inc 15 ●●●●● patch | view | raw | blame | history
program/include/rcube_imap.inc 13 ●●●● patch | view | raw | blame | history
program/include/rcube_shared.inc 19 ●●●● patch | view | raw | blame | history
program/js/app.js 56 ●●●●● patch | view | raw | blame | history
program/steps/mail/compose.inc 8 ●●●●● patch | view | raw | blame | history
program/steps/mail/sendmail.inc 47 ●●●● patch | view | raw | blame | history
program/steps/mail/upload.inc 12 ●●●● patch | view | raw | blame | history
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()
  {
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;
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))
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      *********/
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');
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')));
  }
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);
?>