From 0207c45c90818e7c7df64ea52c61050850dee13d Mon Sep 17 00:00:00 2001
From: thomascube <thomas@roundcube.net>
Date: Mon, 02 Nov 2009 04:58:14 -0500
Subject: [PATCH] More options for top posting feature (#1484272) using patch from Phil Weir

---
 program/js/app.js |  208 ++++++++++++++++++++++-----------------------------
 1 files changed, 90 insertions(+), 118 deletions(-)

diff --git a/program/js/app.js b/program/js/app.js
index 3ada699..dca2956 100644
--- a/program/js/app.js
+++ b/program/js/app.js
@@ -473,9 +473,6 @@
     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
@@ -975,10 +972,6 @@
         clearTimeout(this.request_timer);
         break;
 
-      case 'insert-sig':
-        this.change_identity($("[name='_from']")[0], true);
-        break;
-
       case 'add-attachment':
         this.show_attachment_form(true);
         
@@ -991,6 +984,10 @@
       
       case 'remove-attachment':
         this.remove_attachment(props);
+        break;
+
+      case 'insert-sig':
+        this.change_identity($("[name='_from']")[0], true);
         break;
 
       case 'reply-all':
@@ -2311,147 +2308,122 @@
       show_sig = this.env.show_sig;
 
     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;
-
-    // enable manual signature insert
-    if (this.env.signatures && this.env.signatures[id])
-      this.enable_command('insert-sig', true);
-    else {
-      this.enable_command('insert-sig', false);
-      if (!this.env.signatures)
-        return true;
-      }
+    var sig, p, len = message.length;
 
     if (!this.env.identity)
       this.env.identity = id
-
-    if (!show_sig)
-      return false;
   
-    if (!is_html)
-      {
-      var input_message = $("[name='_message']");
-      var message = input_message.val();
-      var pos, cursor_pos, p = -1;
+    // enable manual signature insert
+    if (this.env.signatures && this.env.signatures[id])
+      this.enable_command('insert-sig', true);
+    else
+      this.enable_command('insert-sig', false);
 
+    if (!is_html && show_sig) {
       // remove the 'old' signature
-      if (this.env.identity && this.env.signatures[this.env.identity])
-        {
+      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 (sig.indexOf('-- ') != 0)
+          sig = '-- \n'+sig;
 
-	if (this.env.top_posting)
-          p = message.indexOf(sig);
-        else {
-	  if (sig.indexOf('-- ')!=0)
-            sig = '-- \n'+sig;
-          p = message.lastIndexOf(sig);
-	  }
-	  
-        if (p>=0)
-          message = message.substring(0, p) + message.substring(p+sig.length, message.length);
-	}
+        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);
+          }
+        }
+      }
 
-      input_message.get(0).focus();
+      message = message.replace(/[\r\n]+$/, '');
+      len = message.length;
 
       // add the new signature string
-      if (this.env.signatures[id])
-        {
+      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'];
-	else
-          sig = this.env.signatures[id]['text'];
 
-	if (this.env.top_posting) {
-	  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' + message.substring(pos, message.length);
-	    cursor_pos = pos;
-	    }
-	  else { // on top
-	    cursor_pos = 0;
-	    message = '\n\n' + sig + '\n' + message;
-	    }
-	  }
-	else {
-          message = message.replace(/[\r\n]+$/, '');
+        if (sig.indexOf('-- ') != 0)
+          sig = '-- \n'+sig;
 
-          if (sig.indexOf('-- ')!=0)
-            sig = '-- \n'+sig;
-	  cursor_pos = message.length ? message.length+1 : 0;
-          message += '\n\n' + sig;
-	  }
+        if (this.env.sig_above) {
+          message = message.replace(/^[\r\n]+/, '');
+          message = new_message+'\n\n'+sig+'\n\n'+message;
         }
+        else
+          message += '\n\n'+sig;
 
-      input_message.val(message);
-
-      // move cursor before the signature
-      if (typeof(cursor_pos) != 'undefined')
-        this.set_caret_pos(input_message.get(0), cursor_pos);
+        if (len)
+          len += 1;
+        }
       }
-    // html
-    else
+    else if (show_sig)
       {
       var editor = tinyMCE.get(this.env.composebody);
-      var sigElem = editor.dom.get('_rc_sig');
 
-      // 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.top_posting) {
-          // 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 {
-            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'));
-
-          body.appendChild(sigElem);
-          }
-	}
-
-      if (this.env.signatures[id])
+      if (this.env.signatures)
         {
-        if (this.env.signatures[id]['is_html']) {
-          sig = this.env.signatures[id]['text'];
-          if (!this.env.top_posting && this.env.signatures[id]['plain_text'].indexOf('-- ')!=0)
-            sig = '-- <br />' + sig;
-	  }
-	else {
-          sig = this.env.signatures[id]['text'];
-	  if (!this.env.top_posting && sig.indexOf('-- ')!=0)
-            sig = '-- \n' + sig;
-	  sig = '<pre>' + sig + '</pre>';
+        // 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);
           }
-        
-        sigElem.innerHTML = sig;
+          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;
+          }
+        }
+
+        if (htmlsig)
+          sigElem.innerHTML = newsig;
+        else
+          sigElem.innerHTML = '<pre>' + newsig + '</pre>';
         }
       }
 
+    input_message.val(message);
+
+    // move cursor before the signature
+    if (!is_html)
+      this.set_caret_pos(input_message.get(0), (this.env.top_posting ? 0 : len));
+
     this.env.identity = id;
     return true;
     };

--
Gitblit v1.9.1