alecpl
2011-05-31 340546c975bca94526a3e16039895a6d0600828b
- 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


3 files modified
106 ■■■■■ changed files
program/js/app.js 18 ●●●●● patch | view | raw | blame | history
program/js/googiespell.js 83 ●●●●● patch | view | raw | blame | history
program/steps/mail/sendmail.inc 5 ●●●●● patch | view | raw | blame | history
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);
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
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');
    }
  }