From 655bd9ade2d78b8f167379abc482e981c7a95e29 Mon Sep 17 00:00:00 2001
From: thomascube <thomas@roundcube.net>
Date: Tue, 03 Nov 2009 04:58:14 -0500
Subject: [PATCH] Cleanup top-posting feature (sorry, there are again some new texts)

---
 program/localization/de_DE/labels.inc |    4 
 program/steps/settings/func.inc       |   12 +-
 program/localization/en_US/labels.inc |    4 
 program/localization/de_CH/labels.inc |    4 
 program/js/app.js                     |  160 ++++++++++++++++++++-------------------
 program/steps/settings/save_prefs.inc |    2 
 6 files changed, 98 insertions(+), 88 deletions(-)

diff --git a/program/js/app.js b/program/js/app.js
index dca2956..4c8daee 100644
--- a/program/js/app.js
+++ b/program/js/app.js
@@ -472,12 +472,17 @@
     this.init_address_input_events(input_to);
     this.init_address_input_events($("[name='_cc']"));
     this.init_address_input_events($("[name='_bcc']"));
+    
+    if (!html_mode)
+      this.set_caret_pos(input_message, this.env.top_posting ? 0 : $(input_message).val().length);
 
     // add signature according to selected identity
     if (input_from.attr('type') == 'select-one' && $("input[name='_draft_saveid']").val() == ''
         && !html_mode) {  // if we have HTML editor, signature is added in callback
       this.change_identity(input_from[0]);
     }
+    else if (!html_mode) 
+      this.set_caret_pos(input_message, this.env.top_posting ? 0 : $(input_message).val().length);
 
     if (input_to.val() == '')
       input_to.focus();
@@ -2300,7 +2305,7 @@
     };
     
   this.change_identity = function(obj, show_sig)
-    {
+  {
     if (!obj || !obj.options)
       return false;
 
@@ -2310,9 +2315,8 @@
     var id = obj.options[obj.selectedIndex].value;
     var input_message = $("[name='_message']");
     var message = input_message.val();
-    var new_message = '';
     var is_html = ($("input[name='_is_html']").val() == '1');
-    var sig, p, len = message.length;
+    var sig, cursor_pos, p = -1;
 
     if (!this.env.identity)
       this.env.identity = id
@@ -2323,110 +2327,108 @@
     else
       this.enable_command('insert-sig', false);
 
-    if (!is_html && show_sig) {
+    if (!is_html) {
       // remove the 'old' signature
-      if (this.env.identity && this.env.signatures && this.env.signatures[this.env.identity]) {
-        if (this.env.signatures[this.env.identity]['is_html'])
-          sig = this.env.signatures[this.env.identity]['plain_text'];
-        else
-          sig = this.env.signatures[this.env.identity]['text'];
+      if (show_sig && this.env.identity && this.env.signatures && this.env.signatures[this.env.identity]) {
+        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;
 
-        p = message.lastIndexOf(sig);
-        if (p >= 0) {
-          if (this.env.sig_above) {
-            new_message = message.substring(0, p-1);
-            new_message = new_message.replace(/[\r\n]+$/, '');
-            message = message.substring(p+sig.length, message.length);
-          }
-          else {
-            message = message.substring(0, p-1) + message.substring(p+sig.length, message.length);
-          }
-        }
+        p = this.env.sig_above ? message.indexOf(sig) : message.lastIndexOf(sig);
+        if (p >= 0)
+          message = message.substring(0, p) + message.substring(p+sig.length, message.length);
       }
 
-      message = message.replace(/[\r\n]+$/, '');
-      len = message.length;
-
       // add the new signature string
-      if (this.env.signatures && this.env.signatures[id]) {
-        sig = this.env.signatures[id]['text'];
-        if (this.env.signatures[id]['is_html'])
-          sig = this.env.signatures[id]['plain_text'];
-
+      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;
 
         if (this.env.sig_above) {
-          message = message.replace(/^[\r\n]+/, '');
-          message = new_message+'\n\n'+sig+'\n\n'+message;
+          if (p >= 0) { // in place of removed signature
+            message = message.substring(0, p) + sig + message.substring(p, message.length);
+            cursor_pos = p - 1;
+          } 
+          else if (pos = this.get_caret_pos(input_message.get(0))) { // at cursor position
+            message = message.substring(0, pos) + '\n' + sig + '\n\n' + message.substring(pos, message.length);
+            cursor_pos = pos;
+          }
+          else { // on top
+            cursor_pos = 0;
+            message = '\n\n' + sig + '\n\n' + message.replace(/^[\r\n]+/, '');
+          } 
         }
-        else
-          message += '\n\n'+sig;
-
-        if (len)
-          len += 1;
+        else {
+          message = message.replace(/[\r\n]+$/, '');
+          cursor_pos = !this.env.top_posting && message.length ? message.length+1 : 0;
+          message += '\n\n' + sig;
         }
       }
-    else if (show_sig)
-      {
+      else
+        cursor_pos = this.env.top_posting ? 0 : message.length;
+
+      input_message.val(message);
+      
+      // move cursor before the signature
+      this.set_caret_pos(input_message.get(0), cursor_pos);
+    }
+    else if (is_html && this.env.signatures) {  // html
       var editor = tinyMCE.get(this.env.composebody);
+      var sigElem = editor.dom.get('_rc_sig');
 
-      if (this.env.signatures)
-        {
-        // Append the signature as a div within the body
-        var sigElem = editor.dom.get('_rc_sig');
-        var newsig = '';
-        var htmlsig = true;
-
-        if (!sigElem)
-          {
-          // add empty line before signature on IE
-          if (bw.ie)
-            editor.getBody().appendChild(editor.getDoc().createElement('br'));
-
-          sigElem = editor.getDoc().createElement('div');
-          sigElem.setAttribute('id', '_rc_sig');
-          if (this.env.sig_above) {
-            editor.getBody().insertBefore(sigElem, editor.getBody().firstChild);
-            editor.getBody().insertBefore(editor.getDoc().createElement('br'), editor.getBody().firstChild);
-            editor.getBody().insertBefore(editor.getDoc().createElement('br'), editor.getBody().firstChild);
+      // Append the signature as a div within the body
+      if (!sigElem) {
+        var body = editor.getBody();
+        var doc = editor.getDoc();
+          
+        sigElem = doc.createElement('div');
+        sigElem.setAttribute('id', '_rc_sig');
+          
+        if (this.env.sig_above) {
+          // if no existing sig and top posting then insert at caret pos
+          editor.getWin().focus(); // correct focus in IE
+            
+          var node = editor.selection.getNode();
+          if (node.nodeName == 'BODY') {
+            // no real focus, insert at start
+            body.insertBefore(sigElem, body.firstChild);
+            body.insertBefore(doc.createElement('br'), body.firstChild);
           }
-          else
-          editor.getBody().appendChild(sigElem);
-          }
-
-        if (this.env.signatures[id])
-        {
-          newsig = this.env.signatures[id]['text'];
-          htmlsig = this.env.signatures[id]['is_html'];
-
-          if (newsig && !this.env.sig_above) {
-            if (htmlsig && this.env.signatures[id]['plain_text'].indexOf('-- ')!=0)
-              newsig = '<p>-- </p>' + newsig;
-            else if (!htmlsig && newsig.indexOf('-- ')!=0)
-              newsig = '-- \n' + newsig;
+          else {
+            body.insertBefore(sigElem, node.nextSibling);
+            body.insertBefore(doc.createElement('br'), node.nextSibling);
           }
         }
+        else {
+          if (bw.ie)  // add empty line before signature on IE
+            body.appendChild(doc.createElement('br'));
 
-        if (htmlsig)
-          sigElem.innerHTML = newsig;
-        else
-          sigElem.innerHTML = '<pre>' + newsig + '</pre>';
+          body.appendChild(sigElem);
         }
       }
 
-    input_message.val(message);
+      if (this.env.signatures[id]) {
+        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;
+        }
+        else {
+          sig = this.env.signatures[id].text;
+          if (sig.indexOf('-- ') != 0)
+            sig = '-- \n' + sig;
+          sig = '<pre>' + sig + '</pre>';
+        }
 
-    // move cursor before the signature
-    if (!is_html)
-      this.set_caret_pos(input_message.get(0), (this.env.top_posting ? 0 : len));
+        sigElem.innerHTML = sig;
+      }
+    }
 
     this.env.identity = id;
     return true;
-    };
+  };
 
   this.show_attachment_form = function(a)
     {
diff --git a/program/localization/de_CH/labels.inc b/program/localization/de_CH/labels.inc
index 7b3f14d..ae41536 100644
--- a/program/localization/de_CH/labels.inc
+++ b/program/localization/de_CH/labels.inc
@@ -266,7 +266,9 @@
 $labels['autoaddsignature'] = 'Signatur automatisch einfügen';
 $labels['newmessageonly'] = 'nur bei neuen Nachrichten';
 $labels['replyandforwardonly'] = 'nur bei Antworten und Weiterleitungen';
-$labels['replysignatureabove'] = 'Beim Antworten die Signatur über der Originalnachricht einfügen';
+$labels['replysignaturepos'] = 'Beim Antworten oder Weiterleiten die Signatur';
+$labels['belowquote'] = 'unter der Originalnachricht einfügen';
+$labels['abovequote'] = 'über der Originalnachricht einfügen';
 $labels['insertsignature'] = 'Signatur einfügen';
 $labels['folder'] = 'Ordner';
 $labels['folders'] = 'Ordner';
diff --git a/program/localization/de_DE/labels.inc b/program/localization/de_DE/labels.inc
index ac53b49..f203b1e 100644
--- a/program/localization/de_DE/labels.inc
+++ b/program/localization/de_DE/labels.inc
@@ -265,7 +265,9 @@
 $labels['autoaddsignature'] = 'Signatur automatisch einfügen';
 $labels['newmessageonly'] = 'nur bei neuen Nachrichten';
 $labels['replyandforwardonly'] = 'nur bei Antworten und Weiterleitungen';
-$labels['replysignatureabove'] = 'Beim Antworten die Signatur über der Originalnachricht einfügen';
+$labels['replysignaturepos'] = 'Beim Antworten die Signatur';
+$labels['belowquote'] = 'unter der Originalnachricht einfügen';
+$labels['abovequote'] = 'über der Originalnachricht einfügen';
 $labels['insertsignature'] = 'Signatur einfügen';
 $labels['folder'] = 'Ordner';
 $labels['folders'] = 'Ordner';
diff --git a/program/localization/en_US/labels.inc b/program/localization/en_US/labels.inc
index 23dcc08..e7d99d2 100644
--- a/program/localization/en_US/labels.inc
+++ b/program/localization/en_US/labels.inc
@@ -321,7 +321,9 @@
 $labels['autoaddsignature'] = 'Automatically add signature';
 $labels['newmessageonly'] = 'new message only';
 $labels['replyandforwardonly'] = 'replies and forwards only';
-$labels['replysignatureabove'] = 'When replying or forwarding place signature above the quote';
+$labels['replysignaturepos'] = 'When replying or forwarding place signature';
+$labels['belowquote'] = 'below the quote';
+$labels['abovequote'] = 'above the quote';
 $labels['insertsignature'] = 'Insert signature';
 
 $labels['folder']  = 'Folder';
diff --git a/program/steps/settings/func.inc b/program/steps/settings/func.inc
index 30a7951..fc17556 100644
--- a/program/steps/settings/func.inc
+++ b/program/steps/settings/func.inc
@@ -452,7 +452,7 @@
     
     if (!isset($no_override['top_posting'])) {
       $field_id = 'rcmfd_top_posting';
-      $select_replymode = new html_select(array('name' => '_top_posting', 'id' => $field_id));
+      $select_replymode = new html_select(array('name' => '_top_posting', 'id' => $field_id, 'onchange' => "\$('#rcmfd_sig_above').attr('disabled',this.selectedIndex==0)"));
       $select_replymode->add(rcube_label('replybottomposting'), 0);
       $select_replymode->add(rcube_label('replytopposting'), 1);
 
@@ -472,17 +472,19 @@
 
       $blocks['sig']['options']['show_sig'] = array(
         'title' => html::label($field_id, Q(rcube_label('autoaddsignature'))),
-        'content' => $select_show_sig->show($config['show_sig']),
+        'content' => $select_show_sig->show($RCMAIL->config->get('show_sig', 1)),
       );
     }
 
     if (!isset($no_override['sig_above'])) {
       $field_id = 'rcmfd_sig_above';
-      $input_sigabove = new html_checkbox(array('name' => '_sig_above', 'id' => $field_id, 'value' => 1));
+      $select_sigabove = new html_select(array('name' => '_sig_above', 'id' => $field_id, 'disabled' => !$config['top_posting']));
+      $select_sigabove->add(rcube_label('belowquote'), 0);
+      $select_sigabove->add(rcube_label('abovequote'), 1);
 
       $blocks['sig']['options']['sig_above'] = array(
-        'title' => html::label($field_id, Q(rcube_label('replysignatureabove'))),
-        'content' => $input_sigabove->show($config['sig_above']?1:0),
+        'title' => html::label($field_id, Q(rcube_label('replysignaturepos'))),
+        'content' => $select_sigabove->show($config['sig_above']?1:0),
       );
     }
 
diff --git a/program/steps/settings/save_prefs.inc b/program/steps/settings/save_prefs.inc
index 824e8f6..5319425 100644
--- a/program/steps/settings/save_prefs.inc
+++ b/program/steps/settings/save_prefs.inc
@@ -65,7 +65,7 @@
       'show_sig'           => isset($_POST['_show_sig']) ? intval($_POST['_show_sig']) : 1,
       'top_posting'        => !empty($_POST['_top_posting']),
       'strip_existing_sig' => isset($_POST['_strip_existing_sig']),
-      'sig_above'          => isset($_POST['_sig_above']) && !empty($_POST['_top_posting']),
+      'sig_above'          => !empty($_POST['_sig_above']) && !empty($_POST['_top_posting']),
     );
 
   break;

--
Gitblit v1.9.1