From a96183883d95dc83a7d0951f5b834e44b062f9cf Mon Sep 17 00:00:00 2001
From: thomascube <thomas@roundcube.net>
Date: Thu, 04 Mar 2010 02:39:53 -0500
Subject: [PATCH] Changed signature separator when top-posting (#1486330)

---
 CHANGELOG                      |    1 
 program/include/rcube_imap.php |  150 +++++++++++++++++++++++++------------------------
 program/steps/mail/compose.inc |    3 +
 program/js/app.js              |    9 +-
 4 files changed, 85 insertions(+), 78 deletions(-)

diff --git a/CHANGELOG b/CHANGELOG
index 9a0afce..cbd39a1 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,6 +1,7 @@
 CHANGELOG RoundCube Webmail
 ===========================
 
+- Changed signature separator when top-posting (#1486330)
 - Let the admin define defaults for search modifiers (#1485897)
 - Fix long e-mail addresses validation (#1486453)
 - Remember search modifiers in user prefs (#1486146)
diff --git a/program/include/rcube_imap.php b/program/include/rcube_imap.php
index f66c082..307914e 100644
--- a/program/include/rcube_imap.php
+++ b/program/include/rcube_imap.php
@@ -599,22 +599,24 @@
       {
         if ($this->skip_deleted) {
           // @TODO: this could be cached
-	  if ($msg_index = $this->_search_index($mailbox, 'ALL UNDELETED')) {
+          if ($msg_index = $this->_search_index($mailbox, 'ALL UNDELETED')) {
             $max = max($msg_index);
             list($begin, $end) = $this->_get_message_range(count($msg_index), $page);
             $msg_index = array_slice($msg_index, $begin, $end-$begin);
-	    }
-	} else if ($max = iil_C_CountMessages($this->conn, $mailbox)) {
+          }
+        }
+        else if ($max = iil_C_CountMessages($this->conn, $mailbox)) {
           list($begin, $end) = $this->_get_message_range($max, $page);
-	  $msg_index = range($begin+1, $end);
-	} else
-	  $msg_index = array();
+          $msg_index = range($begin+1, $end);
+        }
+        else
+          $msg_index = array();
 
         if ($slice)
           $msg_index = array_slice($msg_index, ($this->sort_order == 'DESC' ? 0 : -$slice), $slice);
 
         // fetch reqested headers from server
-	if ($msg_index)
+        if ($msg_index)
           $this->_fetch_headers($mailbox, join(",", $msg_index), $a_msg_headers, $cache_key);
       }
     // use SORT command
@@ -749,12 +751,12 @@
       // 300: experimantal value for best result
       if (($cnt > 300 && $cnt > $this->page_size) || ($this->index_sort && $this->sort_field == 'date')) {
         // use memory less expensive (and quick) method for big result set
-	$a_index = $this->message_index('', $this->sort_field, $this->sort_order);
+        $a_index = $this->message_index('', $this->sort_field, $this->sort_order);
         // get messages uids for one page...
         $msgs = array_slice($a_index, $start_msg, min($cnt-$start_msg, $this->page_size));
         if ($slice)
           $msgs = array_slice($msgs, -$slice, $slice);
-	// ...and fetch headers
+        // ...and fetch headers
         $this->_fetch_headers($mailbox, join(',', $msgs), $a_msg_headers, NULL);
 
         // return empty array if no messages found
@@ -766,7 +768,7 @@
         $sorter->sort_headers($a_msg_headers);
 
         return array_values($a_msg_headers);
-        }
+      }
       else {
         // for small result set we can fetch all messages headers
         $this->_fetch_headers($mailbox, join(',', $msgs), $a_msg_headers, NULL);
@@ -779,7 +781,7 @@
         $a_msg_headers = iil_SortHeaders($a_msg_headers, $this->sort_field, $this->sort_order);
 
         // only return the requested part of the set
-	$a_msg_headers = array_slice(array_values($a_msg_headers), $start_msg, min($cnt-$start_msg, $this->page_size));
+        $a_msg_headers = array_slice(array_values($a_msg_headers), $start_msg, min($cnt-$start_msg, $this->page_size));
         if ($slice)
           $a_msg_headers = array_slice($a_msg_headers, -$slice, $slice);
 
@@ -848,15 +850,15 @@
 
       foreach ($a_header_index as $i => $headers) {
         if ($this->caching_enabled && $cache_index[$headers->id] != $headers->uid) {
-	  // prevent index duplicates
-	  if ($cache_index[$headers->id]) {
-	    $this->remove_message_cache($cache_key, $headers->id, true);
-	    unset($cache_index[$headers->id]);
-	    }
+          // prevent index duplicates
+          if ($cache_index[$headers->id]) {
+            $this->remove_message_cache($cache_key, $headers->id, true);
+            unset($cache_index[$headers->id]);
+          }
           // add message to cache
-	  $this->add_message_cache($cache_key, $headers->id, $headers, NULL,
-	    !in_array($headers->uid, $cache_index));
-	  }
+          $this->add_message_cache($cache_key, $headers->id, $headers, NULL,
+            !in_array($headers->uid, $cache_index));
+        }
 
         $a_msg_headers[$headers->uid] = $headers;
         }
@@ -912,20 +914,20 @@
       
       // use message index sort for sorting by Date
       if ($this->index_sort && $this->sort_field == 'date')
-        {
-	$msgs = $this->search_set;
-	
-	if ($this->search_sort_field != 'date')
-	  sort($msgs);
-	
+      {
+        $msgs = $this->search_set;
+
+        if ($this->search_sort_field != 'date')
+          sort($msgs);
+
         if ($this->sort_order == 'DESC')
           $this->cache[$key] = array_reverse($msgs);
         else
           $this->cache[$key] = $msgs;
-        }
+      }
       // sort with SORT command
       else if ($this->get_capability('sort'))
-        {
+      {
         if ($this->sort_field && $this->search_sort_field != $this->sort_field)
           $this->search('', $this->search_string, $this->search_charset, $this->sort_field);
 
@@ -933,9 +935,9 @@
           $this->cache[$key] = array_reverse($this->search_set);
         else
           $this->cache[$key] = $this->search_set;
-        }
+      }
       else
-        {
+      {
         $a_index = iil_C_FetchHeaderIndex($this->conn, $mailbox, join(',', $this->search_set), $this->sort_field, $this->skip_deleted);
 
         if ($this->sort_order=="ASC")
@@ -944,7 +946,7 @@
           arsort($a_index);
 
         $this->cache[$key] = array_keys($a_index);
-	}
+      }
     }
 
     // have stored it in RAM
@@ -1032,11 +1034,11 @@
       // other message at this position
       if (isset($cache_index[$id]))
         {
-	$for_remove[] = $cache_index[$id];
+        $for_remove[] = $cache_index[$id];
         unset($cache_index[$id]);
         }
         
-	$for_update[] = $id;
+        $for_update[] = $id;
       }
 
     // clear messages at wrong positions and those deleted that are still in cache_index      
@@ -1051,7 +1053,7 @@
       if ($headers = iil_C_FetchHeader($this->conn, $mailbox, join(',', $for_update), false, $this->fetch_add_headers))
         foreach ($headers as $header)
           $this->add_message_cache($cache_key, $header->id, $header, NULL,
-		in_array($header->uid, (array)$for_remove));
+            in_array($header->uid, (array)$for_remove));
       }
     }
 
@@ -1078,28 +1080,28 @@
     // try search with US-ASCII charset (should be supported by server)
     // only if UTF-8 search is not supported
     if (empty($results) && !is_array($results) && !empty($charset) && $charset != 'US-ASCII')
+    {
+      // convert strings to US_ASCII
+      if(preg_match_all('/\{([0-9]+)\}\r\n/', $str, $matches, PREG_OFFSET_CAPTURE))
       {
-	// convert strings to US_ASCII
-        if(preg_match_all('/\{([0-9]+)\}\r\n/', $str, $matches, PREG_OFFSET_CAPTURE))
-	  {
-	  $last = 0; $res = '';
-	  foreach($matches[1] as $m)
-	    {
-	    $string_offset = $m[1] + strlen($m[0]) + 4; // {}\r\n
-	    $string = substr($str, $string_offset - 1, $m[0]);
-	    $string = rcube_charset_convert($string, $charset, 'US-ASCII');
-	    if (!$string) continue;
-	    $res .= sprintf("%s{%d}\r\n%s", substr($str, $last, $m[1] - $last - 1), strlen($string), $string);
-	    $last = $m[0] + $string_offset - 1;
-	    }
-	    if ($last < strlen($str))
-	      $res .= substr($str, $last, strlen($str)-$last);
-	  }
-	else // strings for conversion not found
-	  $res = $str;
-	  
-	$results = $this->search($mbox_name, $res, NULL, $sort_field);
+        $last = 0; $res = '';
+        foreach($matches[1] as $m)
+        {
+          $string_offset = $m[1] + strlen($m[0]) + 4; // {}\r\n
+          $string = substr($str, $string_offset - 1, $m[0]);
+          $string = rcube_charset_convert($string, $charset, 'US-ASCII');
+          if (!$string) continue;
+          $res .= sprintf("%s{%d}\r\n%s", substr($str, $last, $m[1] - $last - 1), strlen($string), $string);
+          $last = $m[0] + $string_offset - 1;
+        }
+        if ($last < strlen($str))
+          $res .= substr($str, $last, strlen($str)-$last);
       }
+      else // strings for conversion not found
+      $res = $str;
+
+      $results = $this->search($mbox_name, $res, NULL, $sort_field);
+    }
 
     $this->set_search_set($str, $results, $charset, $sort_field);
 
@@ -1249,9 +1251,9 @@
       // Example of structure for malformed MIME message:
       // ("text" "plain" ("charset" "us-ascii") NIL NIL "7bit" 2154 70 NIL NIL NIL)
       if ($headers->ctype && $headers->ctype != 'text/plain'
-	  && $structure[0] == 'text' && $structure[1] == 'plain') {
-	return false;  
-	}
+          && $structure[0] == 'text' && $structure[1] == 'plain') {
+        return false;
+      }
 
       $struct = &$this->_structure_part($structure);
       $struct->headers = get_object_vars($headers);
@@ -1302,17 +1304,17 @@
       for ($i=0, $count=0; $i<count($part); $i++)
         if (is_array($part[$i]) && count($part[$i]) > 3) {
           // fetch message headers if message/rfc822 or named part (could contain Content-Location header)
-	  if (!is_array($part[$i][0])) {
+          if (!is_array($part[$i][0])) {
             $tmp_part_id = $struct->mime_id ? $struct->mime_id.'.'.($i+1) : $i+1;
             if (strtolower($part[$i][0]) == 'message' && strtolower($part[$i][1]) == 'rfc822') {
-	      $raw_part_headers[] = $tmp_part_id;
-	      $mime_part_headers[] = $tmp_part_id;
-              }
+              $raw_part_headers[] = $tmp_part_id;
+              $mime_part_headers[] = $tmp_part_id;
+            }
             else if (in_array('name', (array)$part[$i][2]) && (empty($part[$i][3]) || $part[$i][3]=='NIL')) {
-	      $mime_part_headers[] = $tmp_part_id;
-	      }
+              $mime_part_headers[] = $tmp_part_id;
             }
           }
+        }
         
       // pre-fetch headers of all parts (in one command for better performance)
       // @TODO: we could do this before _structure_part() call, to fetch
@@ -1330,8 +1332,8 @@
         if (is_array($part[$i]) && count($part[$i]) > 3) {
           $tmp_part_id = $struct->mime_id ? $struct->mime_id.'.'.($i+1) : $i+1;
           $struct->parts[] = $this->_structure_part($part[$i], ++$count, $struct->mime_id,
-	    $mime_part_headers[$tmp_part_id], $raw_part_headers[$tmp_part_id]);
-	}
+            $mime_part_headers[$tmp_part_id], $raw_part_headers[$tmp_part_id]);
+        }
 
       return $struct;
       }
@@ -1452,7 +1454,7 @@
       // some servers (eg. dovecot-1.x) have no support for parameter value continuations
       // we must fetch and parse headers "manually"
       if ($i<2) {
-	if (!$headers)
+        if (!$headers)
           $headers = iil_C_FetchPartHeader($this->conn, $this->mailbox, $this->_msg_id, false, $part->mime_id);
         $filename_mime = '';
         $i = 0;
@@ -1469,7 +1471,7 @@
         $i++;
       }
       if ($i<2) {
-	if (!$headers)
+        if (!$headers)
           $headers = iil_C_FetchPartHeader($this->conn, $this->mailbox, $this->_msg_id, false, $part->mime_id);
         $filename_encoded = '';
         $i = 0; $matches = array();
@@ -1486,7 +1488,7 @@
         $i++;
       }
       if ($i<2) {
-	if (!$headers)
+        if (!$headers)
           $headers = iil_C_FetchPartHeader($this->conn, $this->mailbox, $this->_msg_id, false, $part->mime_id);
         $filename_mime = '';
         $i = 0; $matches = array();
@@ -1503,7 +1505,7 @@
         $i++;
       }
       if ($i<2) {
-	if (!$headers)
+        if (!$headers)
           $headers = iil_C_FetchPartHeader($this->conn, $this->mailbox, $this->_msg_id, false, $part->mime_id);
         $filename_encoded = '';
         $i = 0; $matches = array();
@@ -1525,8 +1527,8 @@
     // decode filename
     if (!empty($filename_mime)) {
       $part->filename = rcube_imap::decode_mime_string($filename_mime, 
-        $part->charset ? $part->charset : $this->struct_charset ? $this->struct_charset :
-	    rc_detect_encoding($filename_mime, $this->default_charset));
+        $part->charset ? $part->charset : ($this->struct_charset ? $this->struct_charset :
+          rc_detect_encoding($filename_mime, $this->default_charset)));
       } 
     else if (!empty($filename_encoded)) {
       // decode filename according to RFC 2231, Section 4
@@ -1549,10 +1551,10 @@
   function _structure_charset($structure)
     {
       while (is_array($structure)) {
-	if (is_array($structure[2]) && $structure[2][0] == 'charset')
-	  return $structure[2][1];
-	$structure = $structure[0];
-	}
+        if (is_array($structure[2]) && $structure[2][0] == 'charset')
+          return $structure[2][1];
+        $structure = $structure[0];
+      }
     } 
 
 
diff --git a/program/js/app.js b/program/js/app.js
index ab70b02..f6cf04b 100644
--- a/program/js/app.js
+++ b/program/js/app.js
@@ -2316,6 +2316,7 @@
     var input_message = $("[name='_message']");
     var message = input_message.val();
     var is_html = ($("input[name='_is_html']").val() == '1');
+    var sig_separator = this.env.sig_above && (this.env.compose_mode == 'reply' || this.env.compose_mode == 'forward') ? '---' : '-- ';
     var sig, cursor_pos, p = -1;
 
     if (!this.env.identity)
@@ -2333,7 +2334,7 @@
         sig = this.env.signatures[this.env.identity].is_html ? this.env.signatures[this.env.identity].plain_text : this.env.signatures[this.env.identity].text;
         
         if (sig.indexOf('-- ') != 0)
-          sig = '-- \n'+sig;
+          sig = sig_separator + '\n' + sig;
 
         p = this.env.sig_above ? message.indexOf(sig) : message.lastIndexOf(sig);
         if (p >= 0)
@@ -2344,7 +2345,7 @@
       if (show_sig && this.env.signatures && this.env.signatures[id]) {
         sig = this.env.signatures[id]['is_html'] ? this.env.signatures[id]['plain_text'] : this.env.signatures[id]['text'];
         if (sig.indexOf('-- ') != 0)
-          sig = '-- \n'+sig;
+          sig = sig_separator + '\n' + sig;
 
         if (this.env.sig_above) {
           if (p >= 0) { // in place of removed signature
@@ -2413,12 +2414,12 @@
         if (this.env.signatures[id].is_html) {
           sig = this.env.signatures[id].text;
           if (this.env.signatures[id].plain_text.indexOf('-- ') != 0)
-            sig = '-- <br />' + sig;
+            sig = sig_separator + '<br />' + sig;
         }
         else {
           sig = this.env.signatures[id].text;
           if (sig.indexOf('-- ') != 0)
-            sig = '-- \n' + sig;
+            sig = sig_separator + '\n' + sig;
           sig = '<pre>' + sig + '</pre>';
         }
 
diff --git a/program/steps/mail/compose.inc b/program/steps/mail/compose.inc
index ed4903b..52a396b 100644
--- a/program/steps/mail/compose.inc
+++ b/program/steps/mail/compose.inc
@@ -151,6 +151,8 @@
 
     if (!empty($_SESSION['compose']['param']['all']))
       $MESSAGE->reply_all = 1;
+      
+    $OUTPUT->set_env('compose_mode', 'reply');
   }
   else if ($compose_mode == RCUBE_COMPOSE_DRAFT)
   {
@@ -166,6 +168,7 @@
   else if ($compose_mode == RCUBE_COMPOSE_FORWARD)
   {
     $_SESSION['compose']['forward_uid'] = $msg_uid;
+    $OUTPUT->set_env('compose_mode', 'forward');
   }
 }
 

--
Gitblit v1.9.1