From 59478e06c25303a790a0840ab2ac30662c4ef781 Mon Sep 17 00:00:00 2001 From: Hugues Hiegel Date: Tue, 5 Aug 2014 16:46:22 +0200 Subject: c'est la merde.. --- program/js/googiespell.js | 1136 +-------------------------------------------- 1 file changed, 1 insertion(+), 1135 deletions(-) (limited to 'program/js/googiespell.js') diff --git a/program/js/googiespell.js b/program/js/googiespell.js index 9832116dd..6d0a19c06 100644 --- a/program/js/googiespell.js +++ b/program/js/googiespell.js @@ -1,1135 +1 @@ -/* - +-----------------------------------------------------------------------+ - | Roundcube SpellCheck script | - | jQuery'fied spell checker based on GoogieSpell 4.0 | - | (which was published under GPL "version 2 or any later version") | - | | - | This file is part of the Roundcube Webmail client | - | Copyright (C) 2006 Amir Salihefendic | - | Copyright (C) 2009 The Roundcube Dev Team | - | Copyright (C) 2011 Kolab Systems AG | - | | - | Licensed under the GNU General Public License version 3 or | - | any later version with exceptions for skins & plugins. | - | See the README file for a full license statement. | - | | - +-----------------------------------------------------------------------+ - | Authors: 4mir Salihefendic | - | Aleksander Machniak - | - +-----------------------------------------------------------------------+ -*/ - -var GOOGIE_CUR_LANG, - GOOGIE_DEFAULT_LANG = 'en'; - -function GoogieSpell(img_dir, server_url, has_dict) -{ - var ref = this, - cookie_value = rcmail.get_cookie('language'); - - GOOGIE_CUR_LANG = cookie_value != null ? cookie_value : GOOGIE_DEFAULT_LANG; - - this.array_keys = function(arr) { - var res = []; - for (var key in arr) { res.push([key]); } - return res; - } - - this.img_dir = img_dir; - this.server_url = server_url; - - this.org_lang_to_word = { - "da": "Dansk", "de": "Deutsch", "en": "English", - "es": "Español", "fr": "Français", "it": "Italiano", - "nl": "Nederlands", "pl": "Polski", "pt": "Português", - "ru": "Русский", "fi": "Suomi", "sv": "Svenska" - }; - this.lang_to_word = this.org_lang_to_word; - this.langlist_codes = this.array_keys(this.lang_to_word); - this.show_change_lang_pic = true; - this.change_lang_pic_placement = 'right'; - this.report_state_change = true; - - this.ta_scroll_top = 0; - this.el_scroll_top = 0; - - this.lang_chck_spell = "Check spelling"; - this.lang_revert = "Revert to"; - this.lang_close = "Close"; - this.lang_rsm_edt = "Resume editing"; - this.lang_no_error_found = "No spelling errors found"; - this.lang_no_suggestions = "No suggestions"; - this.lang_learn_word = "Add to dictionary"; - - this.show_spell_img = false; // roundcube mod. - this.decoration = true; - this.use_close_btn = false; - this.edit_layer_dbl_click = true; - this.report_ta_not_found = true; - - // Extensions - this.custom_ajax_error = null; - this.custom_no_spelling_error = null; - this.custom_menu_builder = []; // Should take an eval function and a build menu function - this.custom_item_evaulator = null; // Should take an eval function and a build menu function - this.extra_menu_items = []; - this.custom_spellcheck_starter = null; - this.main_controller = true; - this.has_dictionary = has_dict; - - // Observers - this.lang_state_observer = null; - this.spelling_state_observer = null; - this.show_menu_observer = null; - this.all_errors_fixed_observer = null; - - // Focus links - used to give the text box focus - this.use_focus = false; - this.focus_link_t = null; - this.focus_link_b = null; - - // Counters - this.cnt_errors = 0; - this.cnt_errors_fixed = 0; - - // Set document's onclick to hide the language and error menu - $(document).bind('click', function(e) { - var target = $(e.target); - if(target.attr('googie_action_btn') != '1' && ref.isLangWindowShown()) - ref.hideLangWindow(); - if(target.attr('googie_action_btn') != '1' && ref.isErrorWindowShown()) - ref.hideErrorWindow(); - }); - - -this.decorateTextarea = function(id) -{ - this.text_area = typeof id === 'string' ? document.getElementById(id) : id; - - if (this.text_area) { - if (!this.spell_container && this.decoration) { - var table = document.createElement('table'), - tbody = document.createElement('tbody'), - tr = document.createElement('tr'), - spell_container = document.createElement('td'), - r_width = this.isDefined(this.force_width) ? this.force_width : this.text_area.offsetWidth, - r_height = this.isDefined(this.force_height) ? this.force_height : 16; - - tr.appendChild(spell_container); - tbody.appendChild(tr); - $(table).append(tbody).insertBefore(this.text_area).width('100%').height(r_height); - $(spell_container).height(r_height).width(r_width).css('text-align', 'right'); - - this.spell_container = spell_container; - } - - this.checkSpellingState(); - } - else if (this.report_ta_not_found) - alert('Text area not found'); -}; - -////// -// API Functions (the ones that you can call) -///// -this.setSpellContainer = function(id) -{ - this.spell_container = typeof id === 'string' ? document.getElementById(id) : id; -}; - -this.setLanguages = function(lang_dict) -{ - this.lang_to_word = lang_dict; - this.langlist_codes = this.array_keys(lang_dict); -}; - -this.setCurrentLanguage = function(lan_code) -{ - GOOGIE_CUR_LANG = lan_code; - - //Set cookie - var now = new Date(); - now.setTime(now.getTime() + 365 * 24 * 60 * 60 * 1000); - rcmail.set_cookie('language', lan_code, now); -}; - -this.setForceWidthHeight = function(width, height) -{ - // Set to null if you want to use one of them - this.force_width = width; - this.force_height = height; -}; - -this.setDecoration = function(bool) -{ - this.decoration = bool; -}; - -this.dontUseCloseButtons = function() -{ - this.use_close_btn = false; -}; - -this.appendNewMenuItem = function(name, call_back_fn, checker) -{ - this.extra_menu_items.push([name, call_back_fn, checker]); -}; - -this.appendCustomMenuBuilder = function(eval_fn, builder) -{ - this.custom_menu_builder.push([eval_fn, builder]); -}; - -this.setFocus = function() -{ - try { - this.focus_link_b.focus(); - this.focus_link_t.focus(); - return true; - } - catch(e) { - return false; - } -}; - - -////// -// Set functions (internal) -///// -this.setStateChanged = function(current_state) -{ - this.state = current_state; - if (this.spelling_state_observer != null && this.report_state_change) - this.spelling_state_observer(current_state, this); -}; - -this.setReportStateChange = function(bool) -{ - this.report_state_change = bool; -}; - - -////// -// Request functions -///// -this.getUrl = function() -{ - return this.server_url + GOOGIE_CUR_LANG; -}; - -this.escapeSpecial = function(val) -{ - return val ? val.replace(/&/g, "&").replace(//g, ">") : ''; -}; - -this.createXMLReq = function (text) -{ - return '' - + '' - + '' + text + ''; -}; - -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(); - } - }); -}; - -this.learnWord = function(word, id) -{ - word = this.escapeSpecial(word.innerHTML); - - var ref = this, - req_text = '' + word + ''; - - $.ajax({ type: 'POST', url: this.getUrl(), data: 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.'); - }, - success: function(data) { - } - }); -}; - - -////// -// Spell checking functions -///// -this.prepare = function(ignore, no_indicator) -{ - this.cnt_errors_fixed = 0; - this.cnt_errors = 0; - this.setStateChanged('checking_spell'); - - if (!no_indicator && this.main_controller) - this.appendIndicator(this.spell_span); - - this.error_links = []; - this.ta_scroll_top = this.text_area.scrollTop; - this.ignore = ignore; - this.hideLangWindow(); - - if ($(this.text_area).val() == '' || ignore) { - if (!this.custom_no_spelling_error) - this.flashNoSpellingErrorState(); - else - this.custom_no_spelling_error(this); - this.removeIndicator(); - return; - } - - this.createEditLayer(this.text_area.offsetWidth, this.text_area.offsetHeight); - this.createErrorWindow(); - $('body').append(this.error_window); - - try { netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead"); } - catch (e) { } - - if (this.main_controller) - $(this.spell_span).unbind('click'); - - this.orginal_text = $(this.text_area).val(); -}; - -this.parseResult = function(r_text) -{ - // Returns an array: result[item] -> ['attrs'], ['suggestions'] - var re_split_attr_c = /\w+="(\d+|true)"/g, - re_split_text = /\t/g, - matched_c = r_text.match(/]*>[^<]*<\/c>/g), - results = []; - - if (matched_c == null) - return results; - - for (var i=0, len=matched_c.length; i < len; i++) { - var item = []; - this.errorFound(); - - // Get attributes - item['attrs'] = []; - var c_attr, val, - split_c = matched_c[i].match(re_split_attr_c); - for (var j=0; j < split_c.length; j++) { - c_attr = split_c[j].split(/=/); - val = c_attr[1].replace(/"/g, ''); - item['attrs'][c_attr[0]] = val != 'true' ? parseInt(val) : val; - } - - // Get suggestions - item['suggestions'] = []; - var only_text = matched_c[i].replace(/<[^>]*>/g, ''), - split_t = only_text.split(re_split_text); - for (var k=0; k < split_t.length; k++) { - if(split_t[k] != '') - item['suggestions'].push(split_t[k]); - } - results.push(item); - } - - return results; -}; - -this.processData = function(data) -{ - this.results = this.parseResult(data); - if (this.results.length) { - this.showErrorsInIframe(); - this.resumeEditingState(); - } -}; - -////// -// Error menu functions -///// -this.createErrorWindow = function() -{ - this.error_window = document.createElement('div'); - $(this.error_window).addClass('googie_window popupmenu').attr('googie_action_btn', '1'); -}; - -this.isErrorWindowShown = function() -{ - return $(this.error_window).is(':visible'); -}; - -this.hideErrorWindow = function() -{ - $(this.error_window).hide(); - $(this.error_window_iframe).hide(); -}; - -this.updateOrginalText = function(offset, old_value, new_value, id) -{ - var part_1 = this.orginal_text.substring(0, offset), - part_2 = this.orginal_text.substring(offset+old_value.length), - add_2_offset = new_value.length - old_value.length; - - this.orginal_text = part_1 + new_value + part_2; - $(this.text_area).val(this.orginal_text); - for (var j=0, len=this.results.length; j id) - this.results[j]['attrs']['o'] += add_2_offset; - } -}; - -this.saveOldValue = function(elm, old_value) { - elm.is_changed = true; - elm.old_value = old_value; -}; - -this.createListSeparator = function() -{ - var td = document.createElement('td'), - tr = document.createElement('tr'); - - $(td).html(' ').attr('googie_action_btn', '1') - .css({'cursor': 'default', 'font-size': '3px', 'border-top': '1px solid #ccc', 'padding-top': '3px'}); - tr.appendChild(td); - - return tr; -}; - -this.correctError = function(id, elm, l_elm, rm_pre_space) -{ - var old_value = elm.innerHTML, - new_value = l_elm.nodeType == 3 ? l_elm.nodeValue : l_elm.innerHTML, - offset = this.results[id]['attrs']['o']; - - if (rm_pre_space) { - var pre_length = elm.previousSibling.innerHTML; - elm.previousSibling.innerHTML = pre_length.slice(0, pre_length.length-1); - old_value = " " + old_value; - offset--; - } - - this.hideErrorWindow(); - this.updateOrginalText(offset, old_value, new_value, id); - - $(elm).html(new_value).css('color', 'green').attr('is_corrected', true); - - this.results[id]['attrs']['l'] = new_value.length; - - if (!this.isDefined(elm.old_value)) - this.saveOldValue(elm, old_value); - - this.errorFixed(); -}; - -this.ignoreError = function(elm, id) -{ - // @TODO: ignore all same words - $(elm).removeAttr('class').css('color', '').unbind(); - this.hideErrorWindow(); -}; - -this.showErrorWindow = function(elm, id) -{ - if (this.show_menu_observer) - this.show_menu_observer(this); - - var ref = this, - pos = $(elm).offset(), - table = document.createElement('table'), - list = document.createElement('tbody'); - - $(this.error_window).html(''); - $(table).addClass('googie_list').attr('googie_action_btn', '1'); - - // Check if we should use custom menu builder, if not we use the default - var changed = false; - for (var k=0; k 0) - list.appendChild(this.createListSeparator()); - - var loop = function(i) { - if (i < ref.extra_menu_items.length) { - var e_elm = ref.extra_menu_items[i]; - - if (!e_elm[2] || e_elm[2](elm, ref)) { - var e_row = document.createElement('tr'), - e_col = document.createElement('td'); - - $(e_col).html(e_elm[0]) - .mouseover(ref.item_onmouseover) - .mouseout(ref.item_onmouseout) - .click(function() { return e_elm[1](elm, ref) }); - - e_row.appendChild(e_col); - list.appendChild(e_row); - } - loop(i+1); - } - }; - - loop(0); - loop = null; - - //Close button - if (this.use_close_btn) { - list.appendChild(this.createCloseButton(this.hideErrorWindow)); - } - } - - table.appendChild(list); - this.error_window.appendChild(table); - - // calculate and set position - var height = $(this.error_window).height(), - width = $(this.error_window).width(), - pageheight = $(document).height(), - pagewidth = $(document).width(), - top = pos.top + height + 20 < pageheight ? pos.top + 20 : pos.top - height, - left = pos.left + width < pagewidth ? pos.left : pos.left - width; - - $(this.error_window).css({'top': top+'px', 'left': left+'px'}).show(); - - // Dummy for IE - dropdown bug fix - if (document.all && !window.opera) { - if (!this.error_window_iframe) { - var iframe = $('