var setCookie = function (name, value, expires, path, domain, secure) { var curCookie = name + "=" + escape(value) + ((expires) ? "; expires=" + expires.toGMTString() : "") + ((path) ? "; path=" + path : "") + ((domain) ? "; domain=" + domain : "") + ((secure) ? "; secure" : ""); document.cookie = curCookie; }; var getCookie = function (name) { var dc = document.cookie; var prefix = name + "="; var begin = dc.indexOf("; " + prefix); if (begin == -1) { begin = dc.indexOf(prefix); if (begin != 0) { return null; } } else { begin += 2; } var end = document.cookie.indexOf(";", begin); if (end == -1) { end = dc.length; } return unescape(dc.substring(begin + prefix.length, end)); }; /**** Last Modified:22/08/06 11:19:24 GoogieSpell Google spell checker for your own web-apps :) Copyright Amir Salihefendic 2006 LICENSE GPL(see gpl.txt for more information) This basically means that you can't use this script with/in proprietary software! There is another license that permits you to use this script with proprietary software. Check out:... for more info. AUTHOR 4mir Salihefendic(http://amix.dk) - amix@amix.dk VERSION 3.96 ****/ var GOOGIE_CUR_LANG = null, GOOGIE_DEFAULT_LANG = 'en', brdr_style = '1px solid #9fb091', bg_clr = '#f5f5eb', p_dding = '3px', m_rgin = '0 auto', cor_txt_clr = 'green', org_txt_clr = '#b91414'; var GoogieSpell = function(img_dir, server_url) { var cookie_value; var lang; cookie_value = getCookie('language'); if (cookie_value != null) { GOOGIE_CUR_LANG = cookie_value; } else { GOOGIE_CUR_LANG = GOOGIE_DEFAULT_LANG; } 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', 'fi': 'Suomi', 'sv': 'Svenska' }; this.lang_to_word = this.org_lang_to_word; this.langlist_codes = AJS.keys(this.lang_to_word); this.show_change_lang_pic = true; this.change_lang_pic_placement = 'left'; 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.show_spell_img = true; this.decoration = true; this.use_close_btn = true; 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; //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 on click to hide the language and error menu var fn = function (e) { var elm = AJS.getEventElm(e); if (elm.googie_action_btn != 1 && this.isLangWindowShown()) { this.hideLangWindow(); } if (elm.googie_action_btn != 1 && this.isErrorWindowShown()) { this.hideErrorWindow(); } }; AJS.AEV(document, 'click', AJS.$b(fn, this)); }; GoogieSpell.prototype.decorateTextarea = function (id) { if (typeof(id) == 'string') { this.text_area = AJS.$(id); } else { this.text_area = id; } var r_width, r_height; if (this.text_area != null) { if (!AJS.isDefined(this.spell_container) && this.decoration) { //var table=AJS.TABLE(); //var tbody=AJS.TBODY(); //var tr=AJS.TR(); var div = AJS.DIV(); //var span=AJS.SPAN(); if (AJS.isDefined(this.force_width)) { r_width = this.force_width; } else { r_width = this.text_area.offsetWidth + 'px'; } if (AJS.isDefined(this.force_height)) { r_height = this.force_height; } else { r_height = ''; } //var spell_container=AJS.TD(); var spell_container = AJS.SPAN(); this.spell_container = spell_container; div.appendChild(spell_container); div.style.clear = 'none'; div.style.cssFloat = 'right'; div.style.marginTop = '-1.3em'; //tr.appendChild(spell_container); //tbody.appendChild(tr); //table.appendChild(tbody); //table.style.float='right'; //table.style.clear='none'; //AJS.insertBefore(table,this.text_area); AJS.insertBefore(div, this.text_area); //Set width //AJS.setHeight(table,spell_container,r_height); //AJS.setWidth(table,spell_container,r_width); //spell_container.style.textAlign='right'; } this.checkSpellingState(); } else if (this.report_ta_not_found) { alert('Text area not found'); } }; ////// //API Functions(the ones that you can call) ///// GoogieSpell.prototype.setSpellContainer = function (elm) { this.spell_container = AJS.$(elm); }; GoogieSpell.prototype.setLanguages = function (lang_dict) { this.lang_to_word = lang_dict; this.langlist_codes = AJS.keys(lang_dict); }; GoogieSpell.prototype.setForceWidthHeight = function (width, height) { /*** Set to null if you want to use one of them ***/ this.force_width = width; this.force_height = height; }; GoogieSpell.prototype.setDecoration = function (bool) { this.decoration = bool; }; GoogieSpell.prototype.dontUseCloseButtons = function () { this.use_close_btn = false; }; GoogieSpell.prototype.appendNewMenuItem = function (name, call_back_fn, checker) { this.extra_menu_items.push([name, call_back_fn, checker]); }; GoogieSpell.prototype.appendCustomMenuBuilder = function (eva, builder) { this.custom_menu_builder.push([eva, builder]); }; GoogieSpell.prototype.setFocus = function () { try { this.focus_link_b.focus(); this.focus_link_t.focus(); return true; } catch(e) { return false; } }; ////// //Set functions(internal) ///// GoogieSpell.prototype.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); } }; GoogieSpell.prototype.setReportStateChange = function (bool) { this.report_state_change = bool; }; ////// //Request functions ///// GoogieSpell.prototype.getGoogleUrl = function () { return this.server_url + GOOGIE_CUR_LANG; }; GoogieSpell.escapeSpecial = function (val) { return val.replace(/&/g, '&').replace(//g, '>'); }; GoogieSpell.createXMLReq = function (text) { return '<' + '?xml version="1.0" encoding="utf-8" ?' + '>' + text + ''; }; GoogieSpell.prototype.spellCheck = function (ignore) { var me = this; this.cnt_errors_fixed = 0; this.cnt_errors = 0; this.setStateChanged('checking_spell'); if (this.main_controller) { this.appendIndicator(this.spell_span); } this.error_links = []; this.ta_scroll_top = this.text_area.scrollTop; try { this.hideLangWindow(); } catch(e) {} this.createEditLayer(this.text_area.offsetWidth, this.text_area.offsetHeight); this.createErrorWindow(); AJS.getBody().appendChild(this.error_window); try { netscape.security.PrivilegeManager.enablePrivilege('UniversalBrowserRead'); } catch(e) {} if (this.main_controller) { this.spell_span.onclick = null; } this.orginal_text = this.text_area.value; if (this.text_area.value == '' || ignore) { if (!me.custom_no_spelling_error) { me.flashNoSpellingErrorState(); } else { me.custom_no_spelling_error(me); } me.removeIndicator(); return; } //Create request var d = AJS.getRequest(this.getGoogleUrl()); var reqdone = function (res_txt) { var r_text = res_txt; me.results = me.parseResult(r_text); if (r_text.match(//) != null) { //Before parsing be sure that errors were found me.showErrorsInIframe(); me.resumeEditingState(); } else { if (!me.custom_no_spelling_error) { me.flashNoSpellingErrorState(); } else { me.custom_no_spelling_error(me); } } me.removeIndicator(); }; d.addCallback(reqdone); reqdone = null; var reqfailed = function (res_txt, req) { if (me.custom_ajax_error) { me.custom_ajax_error(req); } else { alert('An error was encountered on the server. Please try again later.'); } if (me.main_controller) { AJS.removeElement(me.spell_span); me.removeIndicator(); } me.checkSpellingState(); }; d.addErrback(reqfailed); reqfailed = null; var req_text = GoogieSpell.escapeSpecial(this.orginal_text); d.sendReq(GoogieSpell.createXMLReq(req_text)); }; ////// //Spell checking functions ///// GoogieSpell.prototype.parseResult = function (r_text) { /*** Returns an array result[item] -> ['attrs'],['suggestions'] **/ var re_split_attr_c = /\w+="(\d+|true)"/g; var re_split_text = /\t/g; var matched_c = r_text.match(/]*>[^<]*<\/c>/g); var results = []; if (matched_c == null) { return results; } for (var i = 0; i < matched_c.length; i++) { var item = []; this.errorFound(); //Get attributes item['attrs'] = []; var split_c = matched_c[i].match(re_split_attr_c); for (var j = 0; j < split_c.length; j++) { var c_attr = split_c[j].split('='); var val = c_attr[1].replace(/"/g, ''); if (val != 'true') { item['attrs'][c_attr[0]] = parseInt(val); } else { item['attrs'][c_attr[0]] = val; } } //Get suggestions item['suggestions'] = []; var only_text = matched_c[i].replace(/<[^>]*>/g, ''); var 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; }; ////// //Counters ///// GoogieSpell.prototype.errorFixed = function () { this.cnt_errors_fixed++; if (this.all_errors_fixed_observer) { if (this.cnt_errors_fixed == this.cnt_errors) { this.hideErrorWindow(); this.all_errors_fixed_observer(); } } }; GoogieSpell.prototype.errorFound = function () { this.cnt_errors++; }; ////// //Error menu functions ///// GoogieSpell.prototype.createErrorWindow = function () { this.error_window = AJS.DIV(); this.error_window.className = 'googie_window'; this.error_window.googie_action_btn = '1'; }; GoogieSpell.prototype.isErrorWindowShown = function () { return this.error_window != null && this.error_window.style.visibility == 'visible'; }; GoogieSpell.prototype.hideErrorWindow = function () { try { this.error_window.style.visibility = 'hidden'; if (this.error_window_iframe) { this.error_window_iframe.style.visibility = 'hidden'; } } catch(e) {} }; GoogieSpell.prototype.updateOrginalText = function (offset, old_value, new_value, id) { var part_1 = this.orginal_text.substring(0, offset); var part_2 = this.orginal_text.substring(offset + old_value.length); this.orginal_text = part_1 + new_value + part_2; this.text_area.value = this.orginal_text; var add_2_offset = new_value.length - old_value.length; var len = this.results.length; for (var j = 0; j < len; j++) { //Don't edit the offset of the current item if (j != id && j > id) { this.results[j]['attrs']['o'] += add_2_offset; } } }; GoogieSpell.prototype.saveOldValue = function (elm, old_value) { elm.is_changed = true; elm.old_value = old_value; }; GoogieSpell.prototype.createListSeparator = function () { var e_col = AJS.TD(' '); e_col.googie_action_btn = '1'; e_col.style.cursor = 'default'; e_col.style.fontSize = '3px'; e_col.style.borderTop = '1px solid #ccc'; e_col.style.paddingTop = '3px'; return AJS.TR(e_col); }; GoogieSpell.prototype.correctError = function (id, elm, l_elm, /*optional*/ rm_pre_space) { var old_value = elm.innerHTML, new_value = 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.innerHTML = new_value; elm.style.color = cor_txt_clr; elm.is_corrected = true; this.results[id]['attrs']['l'] = new_value.length; if (!AJS.isDefined(elm.old_value)) { this.saveOldValue(elm, old_value); } this.errorFixed(); }; GoogieSpell.prototype.showErrorWindow = function (elm, id) { if (this.show_menu_observer) { this.show_menu_observer(this); } var me = this; var abs_pos = AJS.absolutePosition(elm); abs_pos.y -= this.edit_layer.scrollTop; this.error_window.style.visibility = 'visible'; AJS.setTop(this.error_window, (abs_pos.y + 20)); AJS.setLeft(this.error_window, (abs_pos.x)); this.error_window.innerHTML = ''; var table = AJS.TABLE({ 'class': 'googie_list' }); table.googie_action_btn = '1'; var list = AJS.TBODY(); //Checkif we should use custom menu builder,if not we use the default var changed = false; if (this.custom_menu_builder != []) { for (var k = 0; k < this.custom_menu_builder.length; k++) { var eb = this.custom_menu_builder[k]; if (eb[0]((this.results[id]))) { changed = eb[1](this, list, elm); break; } } } if (!changed) { //Build up the result list var suggestions = this.results[id]['suggestions']; var offset = this.results[id]['attrs']['o']; var len = this.results[id]['attrs']['l']; if (suggestions.length == 0) { var row = AJS.TR(); var item = AJS.TD({ 'style': 'cursor:default' }); var dummy = AJS.SPAN(); dummy.innerHTML = this.lang_no_suggestions; AJS.ACN(item, AJS.TN(dummy.innerHTML)); item.googie_action_btn = '1'; row.appendChild(item); list.appendChild(row); } for (i = 0; i < suggestions.length; i++) { var row = AJS.TR(); var item = AJS.TD(); var dummy = AJS.SPAN(); dummy.innerHTML = suggestions[i]; item.appendChild(AJS.TN(dummy.innerHTML)); var fn = function (e) { var l_elm = AJS.getEventElm(e); this.correctError(id, elm, l_elm); }; AJS.AEV(item, 'click', AJS.$b(fn, this)); item.onmouseover = GoogieSpell.item_onmouseover; item.onmouseout = GoogieSpell.item_onmouseout; row.appendChild(item); list.appendChild(row); } //The element is changed,append the revert if (elm.is_changed && elm.innerHTML != elm.old_value) { var old_value = elm.old_value; var revert_row = AJS.TR(); var revert = AJS.TD(); revert.onmouseover = GoogieSpell.item_onmouseover; revert.onmouseout = GoogieSpell.item_onmouseout; var rev_span = AJS.SPAN({ 'class': 'googie_list_revert' }); rev_span.innerHTML = this.lang_revert + ' ' + old_value; revert.appendChild(rev_span); var fn = function (e) { this.updateOrginalText(offset, elm.innerHTML, old_value, id); elm.is_corrected = true; elm.style.color = org_txt_clr; elm.innerHTML = old_value; this.hideErrorWindow(); }; AJS.AEV(revert, 'click', AJS.$b(fn, this)); revert_row.appendChild(revert); list.appendChild(revert_row); } //Append the edit box var edit_row = AJS.TR(); var edit = AJS.TD({ 'style': 'cursor:default' }); var edit_input = AJS.INPUT({ 'style': 'width:112px;margin:0;padding:0', 'value': elm.innerHTML }); edit_input.googie_action_btn = '1'; var onsub = function () { if (edit_input.value != '') { if (!AJS.isDefined(elm.old_value)) { this.saveOldValue(elm, elm.innerHTML); } this.updateOrginalText(offset, elm.innerHTML, edit_input.value, id); elm.style.color = cor_txt_clr; elm.is_corrected = true; elm.innerHTML = edit_input.value; this.hideErrorWindow(); } return false; }; onsub = AJS.$b(onsub, this); var ok_pic = AJS.IMG({ 'src': this.img_dir + 'ok.gif', 'style': 'width:16px;height:16px;margin-left:2px;margin-right:2px;cursor:pointer' }); var edit_form = AJS.FORM({ 'style': 'margin:0;padding:0;cursor:default' }, edit_input, ok_pic); edit_form.googie_action_btn = '1'; edit.googie_action_btn = '1'; AJS.AEV(edit_form, 'submit', onsub); AJS.AEV(ok_pic, 'click', onsub); edit.appendChild(edit_form); edit_row.appendChild(edit); list.appendChild(edit_row); //Append extra menu items if (this.extra_menu_items.length > 0) { AJS.ACN(list, this.createListSeparator()); } var loop = function (i) { if (i < me.extra_menu_items.length) { var e_elm = me.extra_menu_items[i]; if (!e_elm[2] || e_elm[2](elm, me)) { var e_row = AJS.TR(); var e_col = AJS.TD(e_elm[0]); e_col.onmouseover = GoogieSpell.item_onmouseover; e_col.onmouseout = GoogieSpell.item_onmouseout; var fn = function () { return e_elm[1](elm, me); }; AJS.AEV(e_col, 'click', fn); AJS.ACN(e_row, e_col); AJS.ACN(list, e_row); } loop(i + 1); } }; loop(0); loop = null; //Close button if (this.use_close_btn) { AJS.ACN(list, this.createCloseButton(this.hideErrorWindow)); } } table.appendChild(list); this.error_window.appendChild(table); //Dummy for IE - dropdown bug fix if (AJS.isIe() && !this.error_window_iframe) { var iframe = AJS.IFRAME({ 'style': 'position:absolute;z-index:0' }); AJS.ACN(AJS.getBody(), iframe); this.error_window_iframe = iframe; } if (AJS.isIe()) { var iframe = this.error_window_iframe; AJS.setTop(iframe, this.error_window.offsetTop); AJS.setLeft(iframe, this.error_window.offsetLeft); AJS.setWidth(iframe, this.error_window.offsetWidth); AJS.setHeight(iframe, this.error_window.offsetHeight); iframe.style.visibility = 'visible'; } //Set focus on the last element var link = this.createFocusLink('link'); list.appendChild(AJS.TR(AJS.TD({ 'style': 'text-align:right;font-size:1px;height:1px;margin:0;padding:0' }, link))); link.focus(); }; ////// //Edit layer(the layer where the suggestions are stored) ////// GoogieSpell.prototype.createEditLayer = function (width, height) { this.edit_layer = AJS.DIV({ 'class': 'googie_edit_layer' }); //Set the style so it looks like edit areas this.edit_layer.className = this.text_area.className; this.edit_layer.style.border = brdr_style; this.edit_layer.style.backgroundColor = bg_clr; this.edit_layer.style.padding = p_dding; this.edit_layer.style.margin = m_rgin; AJS.setWidth(this.edit_layer, (width - 8)); if (AJS.nodeName(this.text_area) != 'input' || this.text_area.value == '') { this.edit_layer.style.overflow = 'auto'; AJS.setHeight(this.edit_layer, (height - 6)); } else { this.edit_layer.style.overflow = 'hidden'; } if (this.edit_layer_dbl_click) { var me = this; var fn = function (e) { if (AJS.getEventElm(e).className != 'googie_link' && !me.isErrorWindowShown()) { me.resumeEditing(); var fn1 = function () { me.text_area.focus(); fn1 = null; }; AJS.callLater(fn1, 10); } return false; }; this.edit_layer.ondblclick = fn; fn = null; } }; GoogieSpell.prototype.resumeEditing = function () { this.setStateChanged('spell_check'); this.switch_lan_pic.style.display = 'inline'; this.el_scroll_top = this.edit_layer.scrollTop; this.hideErrorWindow(); //Remove the EDIT_LAYER try { this.edit_layer.parentNode.removeChild(this.edit_layer); if (this.use_focus) { AJS.removeElement(this.focus_link_t); AJS.removeElement(this.focus_link_b); } } catch(e) {} AJS.showElement(this.text_area); if (this.main_controller) { this.spell_span.className = 'googie_no_style'; } this.text_area.scrollTop = this.el_scroll_top; //elm.onmouseout=null; this.checkSpellingState(false); }; GoogieSpell.prototype.createErrorLink = function (text, id) { var elm = AJS.SPAN({ 'class': 'googie_link' }); var me = this; var d = function (e) { me.showErrorWindow(elm, id); d = null; return false; }; AJS.AEV(elm, 'click', d); elm.googie_action_btn = '1'; elm.g_id = id; elm.is_corrected = false; elm.oncontextmenu = d; elm.innerHTML = text; return elm; }; GoogieSpell.createPart = function (txt_part) { if (txt_part == ' ') { return AJS.TN(' '); } var result = AJS.SPAN() var is_first = true; var is_safari = (navigator.userAgent.toLowerCase().indexOf('safari') != -1); var part = AJS.SPAN(); txt_part = GoogieSpell.escapeSpecial(txt_part); txt_part = txt_part.replace(/\n/g, '
'); txt_part = txt_part.replace(/ /g, '  '); txt_part = txt_part.replace(/^ /g, ' '); txt_part = txt_part.replace(/ $/g, ' '); part.innerHTML = txt_part; return part; }; GoogieSpell.prototype.showErrorsInIframe = function () { var output = AJS.DIV(); output.style.textAlign = 'left'; var pointer = 0; var results = this.results; if (results.length > 0) { for (var i = 0; i < results.length; i++) { var offset = results[i]['attrs']['o']; var len = results[i]['attrs']['l']; var part_1_text = this.orginal_text.substring(pointer, offset); var part_1 = GoogieSpell.createPart(part_1_text); output.appendChild(part_1); pointer += offset - pointer; //If the last child was an error,then insert some space var err_link = this.createErrorLink(this.orginal_text.substr(offset, len), i); this.error_links.push(err_link); output.appendChild(err_link); pointer += len; } //Insert the rest of the orginal text var part_2_text = this.orginal_text.substr(pointer, this.orginal_text.length); var part_2 = GoogieSpell.createPart(part_2_text); output.appendChild(part_2); } else output.innerHTML = this.orginal_text; var me = this; if (this.custom_item_evaulator) AJS.map(this.error_links, function (elm) { me.custom_item_evaulator(me, elm); }); AJS.ACN(this.edit_layer, output); //Hide text area this.text_area_bottom = this.text_area.offsetTop + this.text_area.offsetHeight; AJS.hideElement(this.text_area); AJS.insertBefore(this.edit_layer, this.text_area); if (this.use_focus) { this.focus_link_t = this.createFocusLink('focus_t'); this.focus_link_b = this.createFocusLink('focus_b'); AJS.insertBefore(this.focus_link_t, this.edit_layer); AJS.insertAfter(this.focus_link_b, this.edit_layer); } this.edit_layer.scrollTop = this.ta_scroll_top; }; ////// //Choose language menu ////// GoogieSpell.prototype.createLangWindow = function () { this.language_window = AJS.DIV({ 'class': 'googie_window' }); AJS.setWidth(this.language_window, 100); this.language_window.googie_action_btn = '1'; //Build up the result list var table = AJS.TABLE({ 'class': 'googie_list' }); AJS.setWidth(table, '100%'); var list = AJS.TBODY(); this.lang_elms = []; for (i = 0; i < this.langlist_codes.length; i++) { var row = AJS.TR(); var item = AJS.TD(); item.googieId = this.langlist_codes[i]; this.lang_elms.push(item); var lang_span = AJS.SPAN(); lang_span.innerHTML = this.lang_to_word[this.langlist_codes[i]]; item.appendChild(AJS.TN(lang_span.innerHTML)); var fn = function (e) { var elm = AJS.getEventElm(e); this.deHighlightCurSel(); this.setCurrentLanguage(elm.googieId); if (this.lang_state_observer != null) { this.lang_state_observer(); } this.highlightCurSel(); this.hideLangWindow(); }; AJS.AEV(item, 'click', AJS.$b(fn, this)); item.onmouseover = function (e) { var i_it = AJS.getEventElm(e); if (i_it.className != 'googie_list_selected') { i_it.className = 'googie_list_onhover'; } }; item.onmouseout = function (e) { var i_it = AJS.getEventElm(e); if (i_it.className != 'googie_list_selected') { i_it.className = 'googie_list_onout'; } }; row.appendChild(item); list.appendChild(row); } //Close button if (this.use_close_btn) { list.appendChild(this.createCloseButton(this.hideLangWindow)); } this.highlightCurSel(); table.appendChild(list); this.language_window.appendChild(table); }; GoogieSpell.prototype.setCurrentLanguage = function (lan_code) { GOOGIE_CUR_LANG = lan_code; //Set cookie var now = new Date(); now.setTime(now.getTime() + 365 * 24 * 60 * 60 * 1000); setCookie('language', lan_code, now); }; GoogieSpell.prototype.isLangWindowShown = function () { return this.language_window != null && this.language_window.style.visibility == 'visible'; }; GoogieSpell.prototype.hideLangWindow = function () { try { this.language_window.style.visibility = 'hidden'; this.switch_lan_pic.className = 'googie_lang_3d_on'; } catch(e) {} }; GoogieSpell.prototype.deHighlightCurSel = function () { this.lang_cur_elm.className = 'googie_list_onout'; }; GoogieSpell.prototype.highlightCurSel = function () { if (GOOGIE_CUR_LANG == null) { GOOGIE_CUR_LANG = GOOGIE_DEFAULT_LANG; } for (var i = 0; i < this.lang_elms.length; i++) { if (this.lang_elms[i].googieId == GOOGIE_CUR_LANG) { this.lang_elms[i].className = 'googie_list_selected'; this.lang_cur_elm = this.lang_elms[i]; } else { this.lang_elms[i].className = 'googie_list_onout'; } } }; GoogieSpell.prototype.showLangWindow = function (elm, ofst_top, ofst_left) { if (this.show_menu_observer) { this.show_menu_observer(this); } if (!AJS.isDefined(ofst_top)) { ofst_top = 20; } if (!AJS.isDefined(ofst_left)) { ofst_left = 100; } this.createLangWindow(); AJS.getBody().appendChild(this.language_window); var abs_pos = AJS.absolutePosition(elm); AJS.showElement(this.language_window); AJS.setTop(this.language_window, (abs_pos.y + ofst_top)); AJS.setLeft(this.language_window, (abs_pos.x + ofst_left - this.language_window.offsetWidth)); this.highlightCurSel(); this.language_window.style.visibility = 'visible'; }; GoogieSpell.prototype.createChangeLangPic = function () { var img = AJS.IMG({ 'src': this.img_dir + 'change_lang.gif', 'alt': 'Change language' }); img.googie_action_btn = '1'; var switch_lan = AJS.SPAN({ 'class': 'googie_lang_3d_on', 'style': 'padding-left:6px' }, img); var fn = function (e) { var elm = AJS.getEventElm(e); if (AJS.nodeName(elm) == 'img') { elm = elm.parentNode; } if (elm.className == 'googie_lang_3d_click') { elm.className = 'googie_lang_3d_on'; this.hideLangWindow(); } else { elm.className = 'googie_lang_3d_click'; this.showLangWindow(switch_lan); } }; AJS.AEV(switch_lan, 'click', AJS.$b(fn, this)); return switch_lan; }; GoogieSpell.prototype.createSpellDiv = function () { var chk_spell = AJS.SPAN({ 'class': 'googie_check_spelling_link' }); //////////////////////////////////////ERIC chk_spell.onmouseover = GoogieSpell.item_onmover; chk_spell.onmouseout = GoogieSpell.item_onmout; //////////////////////////////////////ERIC chk_spell.innerHTML = this.lang_chck_spell; var spell_img = null; if (this.show_spell_img) { spell_img = AJS.IMG({ 'src': this.img_dir + 'spellc.gif' }); } return AJS.SPAN(spell_img, ' ', chk_spell); }; //////////////////////////////////////ERIC GoogieSpell.item_onmover = function (e) { var elm = AJS.getEventElm(e); elm.className = 'googie_check_spelling_link_hover'; }; GoogieSpell.item_onmout = function (e) { var elm = AJS.getEventElm(e); elm.className = 'googie_check_spelling_link'; }; //////////////////////////////////////ERIC ////// //State functions ///// GoogieSpell.prototype.flashNoSpellingErrorState = function (on_finish) { var no_spell_errors; if (on_finish) { var fn = function () { on_finish(); this.checkSpellingState(); }; no_spell_errors = fn; } else { no_spell_errors = this.checkSpellingState; } this.setStateChanged('no_error_found'); if (this.main_controller) { AJS.hideElement(this.switch_lan_pic); var dummy = AJS.IMG({ 'src': this.img_dir + 'blank.gif', 'style': 'height:16px;width:1px' }); var rsm = AJS.SPAN(); rsm.innerHTML = this.lang_no_error_found; AJS.RCN(this.spell_span, AJS.SPAN(dummy, rsm)); this.spell_span.className = 'googie_check_spelling_ok'; this.spell_span.style.textDecoration = 'none'; this.spell_span.style.cursor = 'default'; AJS.callLater(AJS.$b(no_spell_errors, this), 1200, [false]); } }; GoogieSpell.prototype.resumeEditingState = function () { this.setStateChanged('resume_editing'); //Change link text to resume if (this.main_controller) { AJS.hideElement(this.switch_lan_pic); var dummy = AJS.IMG({ 'src': this.img_dir + 'blank.gif', 'style': 'height:16px;width:1px' }); var rsm = AJS.SPAN(); rsm.innerHTML = this.lang_rsm_edt; AJS.RCN(this.spell_span, AJS.SPAN(dummy, rsm)); rsm.className = 'googie_check_spelling_ok'; var fn = function (e) { this.resumeEditing(); }; AJS.AEV(this.spell_span, 'click', AJS.$b(fn, this), true); this.spell_span.className = 'googie_resume_editing'; //////////////////////////////////////ERIC this.spell_span.onmouseover = GoogieSpell.item_onmover; this.spell_span.onmouseout = GoogieSpell.item_onmout; //////////////////////////////////////ERIC } try { this.edit_layer.scrollTop = this.ta_scroll_top; } catch(e) {} }; GoogieSpell.prototype.checkSpellingState = function (fire) { if (!AJS.isDefined(fire) || fire) { this.setStateChanged('spell_check'); } if (this.show_change_lang_pic) { this.switch_lan_pic = this.createChangeLangPic(); } else { this.switch_lan_pic = AJS.SPAN(); } var span_chck = this.createSpellDiv(); var fn = function () { this.spellCheck(); }; if (this.custom_spellcheck_starter) { span_chck.onclick = this.custom_spellcheck_starter; } else { AJS.AEV(span_chck, 'click', AJS.$b(fn, this), true); } this.spell_span = span_chck; if (this.main_controller) { if (this.change_lang_pic_placement == 'left') { AJS.RCN(this.spell_container, span_chck, ' ', this.switch_lan_pic); } else { AJS.RCN(this.spell_container, this.switch_lan_pic, ' ', span_chck); } } }; ////// //Misc. functions ///// GoogieSpell.item_onmouseover = function (e) { var elm = AJS.getEventElm(e); if (elm.className != 'googie_list_revert' && elm.className != 'googie_list_close') { elm.className = 'googie_list_onhover'; } else { elm.parentNode.className = 'googie_list_onhover'; } }; GoogieSpell.item_onmouseout = function (e) { var elm = AJS.getEventElm(e); if (elm.className != 'googie_list_revert' && elm.className != 'googie_list_close') { elm.className = 'googie_list_onout'; } else { elm.parentNode.className = 'googie_list_onout'; } }; GoogieSpell.prototype.createCloseButton = function (c_fn) { return this.createButton(this.lang_close, 'googie_list_close', AJS.$b(c_fn, this)); }; GoogieSpell.prototype.createButton = function (name, css_class, c_fn) { var btn_row = AJS.TR(); var btn = AJS.TD(); btn.onmouseover = GoogieSpell.item_onmouseover; btn.onmouseout = GoogieSpell.item_onmouseout; var spn_btn; if (css_class != '') { spn_btn = AJS.SPAN({ 'class': css_class }); spn_btn.innerHTML = name; } else { spn_btn = AJS.TN(name); } btn.appendChild(spn_btn); AJS.AEV(btn, 'click', c_fn); btn_row.appendChild(btn); return btn_row; }; GoogieSpell.prototype.removeIndicator = function (elm) { try { AJS.removeElement(this.indicator); } catch(e) {} }; GoogieSpell.prototype.appendIndicator = function (elm) { var img = AJS.IMG({ 'src': this.img_dir + 'indicator.gif', 'style': 'margin-right:5px' }); AJS.setWidth(img, 12); AJS.setHeight(img, 12); this.indicator = img; img.style.textDecoration = 'none'; try { AJS.insertBefore(img, elm); } catch(e) {} }; GoogieSpell.prototype.createFocusLink = function (name) { return AJS.A({ 'href': 'javascript:void(0)', name: name }); };