From 340546c975bca94526a3e16039895a6d0600828b Mon Sep 17 00:00:00 2001
From: alecpl <alec@alec.pl>
Date: Tue, 31 May 2011 03:38:56 -0400
Subject: [PATCH] - Optimization for spellcheck_before_send: don't invoke new ajax request. While we already have mispellings, we can return them and enable spellchecker directly without querying the server again

---
 program/js/googiespell.js       |   83 +++++++++++++++++++++++------------------
 program/steps/mail/sendmail.inc |    5 +-
 program/js/app.js               |   18 +++++++++
 3 files changed, 67 insertions(+), 39 deletions(-)

diff --git a/program/js/app.js b/program/js/app.js
index 5f5473a..32d7a63 100644
--- a/program/js/app.js
+++ b/program/js/app.js
@@ -3018,6 +3018,24 @@
     }
   };
 
+  // resume spellchecking, highlight provided mispellings without new ajax request
+  this.spellcheck_resume = function(ishtml, data)
+  {
+    if (ishtml) {
+      var ed = tinyMCE.get(this.env.composebody);
+        sp = ed.plugins.spellchecker;
+
+      sp.active = 1;
+      sp._markWords(data);
+      ed.nodeChanged();
+    }
+    else {
+      var sp = this.env.spellcheck;
+      sp.prepare(false, true);
+      sp.processData(data);
+    }
+  }
+
   this.set_draft_id = function(id)
   {
     $("input[name='_draft_saveid']").val(id);
diff --git a/program/js/googiespell.js b/program/js/googiespell.js
index d6aea48..c1b04ca 100644
--- a/program/js/googiespell.js
+++ b/program/js/googiespell.js
@@ -203,11 +203,48 @@
 };
 
 this.spellCheck = function(ignore) {
+    this.prepare(ignore);
+
+    var req_text = this.escapeSpecial(this.orginal_text),
+        ref = this;
+
+    $.ajax({ type: 'POST', url: this.getUrl(),
+	data: this.createXMLReq(req_text), dataType: 'text',
+	    error: function(o) {
+            if (ref.custom_ajax_error)
+        	    ref.custom_ajax_error(ref);
+            else
+        	    alert('An error was encountered on the server. Please try again later.');
+            if (ref.main_controller) {
+        	    $(ref.spell_span).remove();
+        	    ref.removeIndicator();
+            }
+            ref.checkSpellingState();
+	    },
+        success: function(data) {
+    	    ref.processData(data);
+    	    if (!ref.results.length) {
+        	    if (!ref.custom_no_spelling_error)
+	    	        ref.flashNoSpellingErrorState();
+            	else
+                	ref.custom_no_spelling_error(ref);
+    	    }
+    	    ref.removeIndicator();
+	    }
+    });
+};
+
+
+//////
+// Spell checking functions
+/////
+this.prepare = function(ignore, no_indicator)
+{
     this.cnt_errors_fixed = 0;
     this.cnt_errors = 0;
     this.setStateChanged('checking_spell');
 
-    if (this.main_controller)
+    if (!no_indicator && this.main_controller)
         this.appendIndicator(this.spell_span);
 
     this.error_links = [];
@@ -235,44 +272,8 @@
         $(this.spell_span).unbind('click');
 
     this.orginal_text = $(this.text_area).val();
-    var req_text = this.escapeSpecial(this.orginal_text);
-    var ref = this;
-
-    $.ajax({ type: 'POST', url: this.getUrl(),
-	data: this.createXMLReq(req_text), dataType: 'text',
-	    error: function(o) {
-            if (ref.custom_ajax_error)
-        	    ref.custom_ajax_error(ref);
-            else
-        	    alert('An error was encountered on the server. Please try again later.');
-            if (ref.main_controller) {
-        	    $(ref.spell_span).remove();
-        	    ref.removeIndicator();
-            }
-            ref.checkSpellingState();
-	    },
-        success: function(data) {
-	        var r_text = data;
-    	    ref.results = ref.parseResult(r_text);
-    	    if (r_text.match(/<c.*>/) != null) {
-        	    // Before parsing be sure that errors were found
-        	    ref.showErrorsInIframe();
-        	    ref.resumeEditingState();
-    	    } else {
-        	    if (!ref.custom_no_spelling_error)
-	    	        ref.flashNoSpellingErrorState();
-            	else
-                	ref.custom_no_spelling_error(ref);
-    	    }
-    	    ref.removeIndicator();
-	    }
-    });
 };
 
-
-//////
-// Spell checking functions
-/////
 this.parseResult = function(r_text) {
     // Returns an array: result[item] -> ['attrs'], ['suggestions']
     var re_split_attr_c = /\w+="(\d+|true)"/g,
@@ -311,6 +312,14 @@
     return results;
 };
 
+this.processData = function(data)
+{
+    this.results = this.parseResult(data);
+    if (this.results.length) {
+   	    this.showErrorsInIframe();
+   	    this.resumeEditingState();
+    }
+};
 
 //////
 // Error menu functions
diff --git a/program/steps/mail/sendmail.inc b/program/steps/mail/sendmail.inc
index 8054304..91d71a7 100644
--- a/program/steps/mail/sendmail.inc
+++ b/program/steps/mail/sendmail.inc
@@ -411,7 +411,7 @@
 
   // Check spelling before send
   if ($CONFIG['spellcheck_before_send'] && $CONFIG['enable_spellcheck']
-    && empty($_SESSION['compose']['spell_checked'])
+    && empty($_SESSION['compose']['spell_checked']) && !empty($message_body)
   ) {
     $spellchecker = new rcube_spellchecker(get_input_value('_lang', RCUBE_INPUT_GPC));
     $spell_result = $spellchecker->check($message_body, $isHtml);
@@ -419,8 +419,9 @@
     $_SESSION['compose']['spell_checked'] = true;
 
     if (!$spell_result) {
+      $result = $isHtml ? $spellchecker->get_words() : $spellchecker->get_xml();
       $OUTPUT->show_message('mispellingsfound', 'error');
-      $OUTPUT->command('command', 'spellcheck');
+      $OUTPUT->command('spellcheck_resume', $isHtml, $result);
       $OUTPUT->send('iframe');
     }
   }

--
Gitblit v1.9.1