diff options
Diffstat (limited to 'program')
-rw-r--r-- | program/js/app.js | 10 | ||||
-rw-r--r-- | program/js/common.js | 17 | ||||
-rw-r--r-- | program/js/googiespell.js | 2603 | ||||
-rw-r--r-- | program/steps/mail/compose.inc | 24 |
4 files changed, 547 insertions, 2107 deletions
diff --git a/program/js/app.js b/program/js/app.js index 40979094a..8ac0e7256 100644 --- a/program/js/app.js +++ b/program/js/app.js @@ -903,6 +903,7 @@ function rcube_webmail() } else if (this.env.spellcheck && this.env.spellcheck.spellCheck && this.spellcheck_ready) { this.env.spellcheck.spellCheck(); + this.set_spellcheck_state('checking'); } break; @@ -2112,7 +2113,7 @@ function rcube_webmail() this.stop_spellchecking = function() { if (this.env.spellcheck && !this.spellcheck_ready) { - exec_event(this.env.spellcheck.check_link, 'click'); + $(this.env.spellcheck.spell_span).trigger('click'); this.set_spellcheck_state('ready'); } }; @@ -2122,16 +2123,15 @@ function rcube_webmail() if (this.env.spellcheck) { // stop spellchecking process if (!vis) - this.stop_spellchecking(); + this.stop_spellchecking(); - this.env.spellcheck.check_link.style.visibility = vis ? 'visible' : 'hidden'; - this.env.spellcheck.switch_lan_pic.style.visibility = vis ? 'visible' : 'hidden'; + $(this.env.spellcheck.spell_container).css('visibility', vis ? 'visible' : 'hidden'); } }; this.set_spellcheck_state = function(s) { - this.spellcheck_ready = (s=='check_spelling' || s=='spell_check' || s=='ready'); + this.spellcheck_ready = (s == 'ready' || s == 'no_error_found'); this.enable_command('spellcheck', this.spellcheck_ready); }; diff --git a/program/js/common.js b/program/js/common.js index 407da4170..25b654612 100644 --- a/program/js/common.js +++ b/program/js/common.js @@ -634,20 +634,3 @@ if (bw.ie) return o; } } - - -// Fire event on specified element -function exec_event(element,event) -{ - if (document.createEventObject) { - // dispatch for IE - var evt = document.createEventObject(); - return element.fireEvent('on'+event,evt) - } - else { - // dispatch for firefox + others - var evt = document.createEvent("HTMLEvents"); - evt.initEvent(event, true, true); // event type,bubbling,cancelable - return !element.dispatchEvent(evt); - } -} diff --git a/program/js/googiespell.js b/program/js/googiespell.js index b336b79cd..7b698ec82 100644 --- a/program/js/googiespell.js +++ b/program/js/googiespell.js @@ -1,1468 +1,43 @@ /* -Last Modified: 29/04/07 18:44:48 - -AJS JavaScript library - A very small library with a lot of functionality -AUTHOR - 4mir Salihefendic (http://amix.dk) - amix@amix.dk -LICENSE - Copyright (c) 2006 Amir Salihefendic. All rights reserved. - Copyright (c) 2005 Bob Ippolito. All rights reserved. - http://www.opensource.org/licenses/mit-license.php -VERSION - 4.0 -SITE - http://orangoo.com/AmiNation/AJS -**/ -if(!AJS) { -var AJS = { - BASE_URL: "", - - drag_obj: null, - drag_elm: null, - _drop_zones: [], - _drag_zones: [], - _cur_pos: null, - - ajaxErrorHandler: null, - -//// -// General accessor functions -//// - getQueryArgument: function(var_name) { - var query = window.location.search.substring(1); - var vars = query.split("&"); - for (var i=0;i<vars.length;i++) { - var pair = vars[i].split("="); - if (pair[0] == var_name) { - return pair[1]; - } - } - return null; - }, - - isIe: function() { - return (navigator.userAgent.toLowerCase().indexOf("msie") != -1 && navigator.userAgent.toLowerCase().indexOf("opera") == -1); - }, - isNetscape7: function() { - return (navigator.userAgent.toLowerCase().indexOf("netscape") != -1 && navigator.userAgent.toLowerCase().indexOf("7.") != -1); - }, - isSafari: function() { - return (navigator.userAgent.toLowerCase().indexOf("khtml") != -1); - }, - isOpera: function() { - return (navigator.userAgent.toLowerCase().indexOf("opera") != -1); - }, - isMozilla: function() { - return (navigator.userAgent.toLowerCase().indexOf("gecko") != -1 && navigator.productSub >= 20030210); - }, - isMac: function() { - return (navigator.userAgent.toLowerCase().indexOf('macintosh') != -1); - }, - - -//// -// Array functions -//// - //Shortcut: AJS.$A - createArray: function(v) { - if(AJS.isArray(v) && !AJS.isString(v)) - return v; - else if(!v) - return []; - else - return [v]; - }, - - forceArray: function(args) { - var r = []; - AJS.map(args, function(elm) { - r.push(elm); - }); - return r; - }, - - join: function(delim, list) { - try { - return list.join(delim); - } - catch(e) { - var r = list[0] || ''; - AJS.map(list, function(elm) { - r += delim + elm; - }, 1); - return r + ''; - } - }, - - isIn: function(elm, list) { - var i = AJS.getIndex(elm, list); - if(i != -1) - return true; - else - return false; - }, - - getIndex: function(elm, list/*optional*/, eval_fn) { - for(var i=0; i < list.length; i++) - if(eval_fn && eval_fn(list[i]) || elm == list[i]) - return i; - return -1; - }, - - getFirst: function(list) { - if(list.length > 0) - return list[0]; - else - return null; - }, - - getLast: function(list) { - if(list.length > 0) - return list[list.length-1]; - else - return null; - }, - - update: function(l1, l2) { - for(var i in l2) - l1[i] = l2[i]; - return l1; - }, - - flattenList: function(list) { - var r = []; - var _flatten = function(r, l) { - AJS.map(l, function(o) { - if(o == null) {} - else if (AJS.isArray(o)) - _flatten(r, o); - else - r.push(o); - }); - } - _flatten(r, list); - return r; - }, - - -//// -// Functional programming -//// - map: function(list, fn,/*optional*/ start_index, end_index) { - var i = 0, l = list.length; - if(start_index) - i = start_index; - if(end_index) - l = end_index; - for(i; i < l; i++) { - var val = fn.apply(null, [list[i], i]); - if(val != undefined) - return val; - } - }, - - rmap: function(list, fn) { - var i = list.length-1, l = 0; - for(i; i >= l; i--) { - var val = fn.apply(null, [list[i], i]); - if(val != undefined) - return val; - } - }, - - filter: function(list, fn, /*optional*/ start_index, end_index) { - var r = []; - AJS.map(list, function(elm) { - if(fn(elm)) - r.push(elm); - }, start_index, end_index); - return r; - }, - - partial: function(fn) { - var args = AJS.$FA(arguments); - args.shift(); - return function() { - args = args.concat(AJS.$FA(arguments)); - return fn.apply(window, args); - } - }, - - -//// -// DOM functions -//// - //Shortcut: AJS.$ - getElement: function(id) { - if(AJS.isString(id) || AJS.isNumber(id)) - return document.getElementById(id); - else - return id; - }, - - //Shortcut: AJS.$$ - getElements: function(/*id1, id2, id3*/) { - var args = AJS.forceArray(arguments); - var elements = new Array(); - for (var i = 0; i < args.length; i++) { - var element = AJS.getElement(args[i]); - elements.push(element); - } - return elements; - }, - - //Shortcut: AJS.$bytc - getElementsByTagAndClassName: function(tag_name, class_name, /*optional*/ parent) { - var class_elements = []; - if(!AJS.isDefined(parent)) - parent = document; - if(!AJS.isDefined(tag_name)) - tag_name = '*'; - - var els = parent.getElementsByTagName(tag_name); - var els_len = els.length; - var pattern = new RegExp("(^|\\s)" + class_name + "(\\s|$)"); - - for (i = 0, j = 0; i < els_len; i++) { - if ( pattern.test(els[i].className) || class_name == null ) { - class_elements[j] = els[i]; - j++; - } - } - return class_elements; - }, - - _nodeWalk: function(elm, tag_name, class_name, fn_next_elm) { - var p = fn_next_elm(elm); - - var checkFn; - if(tag_name && class_name) { - checkFn = function(p) { - return AJS.nodeName(p) == tag_name && AJS.hasClass(p, class_name); - } - } - else if(tag_name) { - checkFn = function(p) { return AJS.nodeName(p) == tag_name; } - } - else { - checkFn = function(p) { return AJS.hasClass(p, class_name); } - } - - while(p) { - if(checkFn(p)) - return p; - p = fn_next_elm(p); - } - return null; - }, - - getParentBytc: function(elm, tag_name, class_name) { - return AJS._nodeWalk(elm, tag_name, class_name, function(m) { return m.parentNode; }); - }, - - getPreviousSiblingBytc: function(elm, tag_name, class_name) { - return AJS._nodeWalk(elm, tag_name, class_name, function(m) { return m.previousSibling; }); - }, - - getNextSiblingBytc: function(elm, tag_name, class_name) { - return AJS._nodeWalk(elm, tag_name, class_name, function(m) { return m.nextSibling; }); - }, - - //Shortcut: AJS.$f - getFormElement: function(form, name) { - form = AJS.$(form); - var r = null; - AJS.map(form.elements, function(elm) { - if(elm.name && elm.name == name) - r = elm; - }); - return r; - }, - - formContents: function(form) { - var form = AJS.$(form); - var r = {}; - var fn = function(elms) { - AJS.map(elms, function(e) { - if(e.name) - r[e.name] = e.value || ''; - }); - } - fn(AJS.$bytc('input', null, form)); - fn(AJS.$bytc('textarea', null, form)); - return r; - }, - - getBody: function() { - return AJS.$bytc('body')[0] - }, - - nodeName: function(elm) { - return elm.nodeName.toLowerCase(); - }, - - hasParent: function(elm, parent_to_consider, max_look_up) { - if(elm == parent_to_consider) - return true; - if(max_look_up == 0) - return false; - return AJS.hasParent(elm.parentNode, parent_to_consider, max_look_up-1); - }, - - isElementHidden: function(elm) { - return ((elm.style.display == "none") || (elm.style.visibility == "hidden")); - }, - - //Shortcut: AJS.DI - documentInsert: function(elm) { - if(typeof(elm) == 'string') - elm = AJS.HTML2DOM(elm); - document.write('<span id="dummy_holder"></span>'); - AJS.swapDOM(AJS.$('dummy_holder'), elm); - }, - - cloner: function(element) { - return function() { - return element.cloneNode(true); - } - }, - - appendToTop: function(elm/*, elms...*/) { - var args = AJS.forceArray(arguments).slice(1); - if(args.length >= 1) { - var first_child = elm.firstChild; - if(first_child) { - while(true) { - var t_elm = args.shift(); - if(t_elm) - AJS.insertBefore(t_elm, first_child); - else - break; - } - } - else { - AJS.ACN.apply(null, arguments); - } - } - return elm; - }, - - //Shortcut: AJS.ACN - appendChildNodes: function(elm/*, elms...*/) { - if(arguments.length >= 2) { - AJS.map(arguments, function(n) { - if(AJS.isString(n)) - n = AJS.TN(n); - if(AJS.isDefined(n)) - elm.appendChild(n); - }, 1); - } - return elm; - }, - - //Shortcut: AJS.RCN - replaceChildNodes: function(elm/*, elms...*/) { - var child; - while ((child = elm.firstChild)) - elm.removeChild(child); - if (arguments.length < 2) - return elm; - else - return AJS.appendChildNodes.apply(null, arguments); - return elm; - }, - - insertAfter: function(elm, reference_elm) { - reference_elm.parentNode.insertBefore(elm, reference_elm.nextSibling); - return elm; - }, - - insertBefore: function(elm, reference_elm) { - reference_elm.parentNode.insertBefore(elm, reference_elm); - return elm; - }, - - showElement: function(/*elms...*/) { - var args = AJS.forceArray(arguments); - AJS.map(args, function(elm) { elm.style.display = ''}); - }, - - hideElement: function(elm) { - var args = AJS.forceArray(arguments); - AJS.map(args, function(elm) { elm.style.display = 'none'}); - }, - - swapDOM: function(dest, src) { - dest = AJS.getElement(dest); - var parent = dest.parentNode; - if (src) { - src = AJS.getElement(src); - parent.replaceChild(src, dest); - } else { - parent.removeChild(dest); - } - return src; - }, - - removeElement: function(/*elm1, elm2...*/) { - var args = AJS.forceArray(arguments); - AJS.map(args, function(elm) { AJS.swapDOM(elm, null); }); - }, - - createDOM: function(name, attrs) { - var i=0, attr; - elm = document.createElement(name); - - if(AJS.isDict(attrs[i])) { - for(k in attrs[0]) { - attr = attrs[0][k]; - if(k == "style") - elm.style.cssText = attr; - else if(k == "class" || k == 'className') - elm.className = attr; - else { - elm.setAttribute(k, attr); - } - } - i++; - } - - if(attrs[0] == null) - i = 1; - - AJS.map(attrs, function(n) { - if(n) { - if(AJS.isString(n) || AJS.isNumber(n)) - n = AJS.TN(n); - elm.appendChild(n); - } - }, i); - return elm; - }, - - _createDomShortcuts: function() { - var elms = [ - "ul", "li", "td", "tr", "th", - "tbody", "table", "input", "span", "b", - "a", "div", "img", "button", "h1", - "h2", "h3", "br", "textarea", "form", - "p", "select", "option", "optgroup", "iframe", "script", - "center", "dl", "dt", "dd", "small", - "pre" - ]; - var extends_ajs = function(elm) { - AJS[elm.toUpperCase()] = function() { - return AJS.createDOM.apply(null, [elm, arguments]); - }; - } - AJS.map(elms, extends_ajs); - AJS.TN = function(text) { return document.createTextNode(text) }; - }, - - getCssDim: function(dim) { - if(AJS.isString(dim)) - return dim; - else - return dim + "px"; - }, - getCssProperty: function(elm, prop) { - elm = AJS.$(elm); - var y; - if(elm.currentStyle) - y = elm.currentStyle[prop]; - else if (window.getComputedStyle) - y = document.defaultView.getComputedStyle(elm,null).getPropertyValue(prop); - return y; - }, - - setStyle: function(/*elm1, elm2..., property, new_value*/) { - var args = AJS.forceArray(arguments); - var new_val = args.pop(); - var property = args.pop(); - AJS.map(args, function(elm) { - elm.style[property] = AJS.getCssDim(new_val); - }); - }, - - setWidth: function(/*elm1, elm2..., width*/) { - var args = AJS.forceArray(arguments); - args.splice(args.length-1, 0, 'width'); - AJS.setStyle.apply(null, args); - }, - setHeight: function(/*elm1, elm2..., height*/) { - var args = AJS.forceArray(arguments); - args.splice(args.length-1, 0, 'height'); - AJS.setStyle.apply(null, args); - }, - setLeft: function(/*elm1, elm2..., left*/) { - var args = AJS.forceArray(arguments); - args.splice(args.length-1, 0, 'left'); - AJS.setStyle.apply(null, args); - }, - setTop: function(/*elm1, elm2..., top*/) { - var args = AJS.forceArray(arguments); - args.splice(args.length-1, 0, 'top'); - AJS.setStyle.apply(null, args); - }, - setClass: function(/*elm1, elm2..., className*/) { - var args = AJS.forceArray(arguments); - var c = args.pop(); - AJS.map(args, function(elm) { elm.className = c}); - }, - addClass: function(/*elm1, elm2..., className*/) { - var args = AJS.forceArray(arguments); - var cls = args.pop(); - var add_class = function(o) { - if(!new RegExp("(^|\\s)" + cls + "(\\s|$)").test(o.className)) - o.className += (o.className ? " " : "") + cls; - }; - AJS.map(args, function(elm) { add_class(elm); }); - }, - hasClass: function(elm, cls) { - if(!elm.className) - return false; - return elm.className == cls || - elm.className.search(new RegExp(" " + cls + "|^" + cls)) != -1 - }, - removeClass: function(/*elm1, elm2..., className*/) { - var args = AJS.forceArray(arguments); - var cls = args.pop(); - var rm_class = function(o) { - o.className = o.className.replace(new RegExp("\\s?" + cls, 'g'), ""); - }; - AJS.map(args, function(elm) { rm_class(elm); }); - }, - - setHTML: function(elm, html) { - elm.innerHTML = html; - return elm; - }, - - RND: function(tmpl, ns, scope) { - scope = scope || window; - var fn = function(w, g) { - g = g.split("|"); - var cnt = ns[g[0]]; - for(var i=1; i < g.length; i++) - cnt = scope[g[i]](cnt); - if(cnt == '') - return ''; - if(cnt == 0 || cnt == -1) - cnt += ''; - return cnt || w; - }; - return tmpl.replace(/%\(([A-Za-z0-9_|.]*)\)/g, fn); - }, - - HTML2DOM: function(html,/*optional*/ first_child) { - var d = AJS.DIV(); - d.innerHTML = html; - if(first_child) - return d.childNodes[0]; - else - return d; - }, - - preloadImages: function(/*img_src1, ..., img_srcN*/) { - AJS.AEV(window, 'load', AJS.$p(function(args) { - AJS.map(args, function(src) { - var pic = new Image(); - pic.src = src; - }); - }, arguments)); - }, - - -//// -// Effects -//// - setOpacity: function(elm, p) { - elm.style.opacity = p; - elm.style.filter = "alpha(opacity="+ p*100 +")"; - }, - - resetOpacity: function(elm) { - elm.style.opacity = 1; - elm.style.filter = ""; - }, - -//// -// Ajax functions -//// - getXMLHttpRequest: function() { - var try_these = [ - function () { return new XMLHttpRequest(); }, - function () { return new ActiveXObject('Msxml2.XMLHTTP'); }, - function () { return new ActiveXObject('Microsoft.XMLHTTP'); }, - function () { return new ActiveXObject('Msxml2.XMLHTTP.4.0'); }, - function () { throw "Browser does not support XMLHttpRequest"; } - ]; - for (var i = 0; i < try_these.length; i++) { - var func = try_these[i]; - try { - return func(); - } catch (e) { - } - } - }, - - getRequest: function(url, data, type) { - if(!type) - type = "POST"; - var req = AJS.getXMLHttpRequest(); - - if(url.indexOf("http://") == -1) { - if(AJS.BASE_URL != '') { - if(AJS.BASE_URL.lastIndexOf('/') != AJS.BASE_URL.length-1) - AJS.BASE_URL += '/'; - url = AJS.BASE_URL + url; - } - } - - req.open(type, url, true); - if(type == "POST") - req.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); - return AJS._sendXMLHttpRequest(req); - }, - - _sendXMLHttpRequest: function(req, data) { - var d = new AJSDeferred(req); - - var onreadystatechange = function () { - if (req.readyState == 4) { - var status = ''; - try { - status = req.status; - } - catch(e) {}; - if(status == 200 || status == 304 || req.responseText == null) { - d.callback(); - } - else { - if(d.errbacks.length == 0) { - if(AJS.ajaxErrorHandler) - AJS.ajaxErrorHandler(req.responseText, req); - } - else - d.errback(); - } - } - } - req.onreadystatechange = onreadystatechange; - return d; - }, - - _reprString: function(o) { - return ('"' + o.replace(/(["\\])/g, '\\$1') + '"' - ).replace(/[\f]/g, "\\f" - ).replace(/[\b]/g, "\\b" - ).replace(/[\n]/g, "\\n" - ).replace(/[\t]/g, "\\t" - ).replace(/[\r]/g, "\\r"); - }, - - _reprDate: function(db) { - var year = db.getFullYear(); - var dd = db.getDate(); - var mm = db.getMonth()+1; - - var hh = db.getHours(); - var mins = db.getMinutes(); - - function leadingZero(nr) { - if (nr < 10) nr = "0" + nr; - return nr; - } - if(hh == 24) hh = '00'; - - var time = leadingZero(hh) + ':' + leadingZero(mins); - return '"' + year + '-' + mm + '-' + dd + 'T' + time + '"'; - }, - - serializeJSON: function(o) { - var objtype = typeof(o); - if (objtype == "undefined") { - return "undefined"; - } else if (objtype == "number" || objtype == "boolean") { - return o + ""; - } else if (o === null) { - return "null"; - } - if (objtype == "string") { - return AJS._reprString(o); - } - if(objtype == 'object' && o.getFullYear) { - return AJS._reprDate(o); - } - var me = arguments.callee; - if (objtype != "function" && typeof(o.length) == "number") { - var res = []; - for (var i = 0; i < o.length; i++) { - var val = me(o[i]); - if (typeof(val) != "string") { - val = "undefined"; - } - res.push(val); - } - return "[" + res.join(",") + "]"; - } - // it's a function with no adapter, bad - if (objtype == "function") - return null; - res = []; - for (var k in o) { - var useKey; - if (typeof(k) == "number") { - useKey = '"' + k + '"'; - } else if (typeof(k) == "string") { - useKey = AJS._reprString(k); - } else { - // skip non-string or number keys - continue; - } - val = me(o[k]); - if (typeof(val) != "string") { - // skip non-serializable values - continue; - } - res.push(useKey + ":" + val); - } - return "{" + res.join(",") + "}"; - }, - - loadJSONDoc: function(url) { - var d = AJS.getRequest(url); - var eval_req = function(data, req) { - var text = req.responseText; - if(text == "Error") - d.errback(req); - else - return AJS.evalTxt(text); - }; - d.addCallback(eval_req); - return d; - }, - - evalTxt: function(txt) { - try { - return eval('('+ txt + ')'); - } - catch(e) { - return eval(txt); - } - }, - - evalScriptTags: function(html) { - var script_data = html.match(/<script.*?>((\n|\r|.)*?)<\/script>/g); - if(script_data != null) { - for(var i=0; i < script_data.length; i++) { - var script_only = script_data[i].replace(/<script.*?>/g, ""); - script_only = script_only.replace(/<\/script>/g, ""); - eval(script_only); - } - } - }, - - queryArguments: function(data) { - var post_data = []; - for(k in data) - post_data.push(k + "=" + AJS.urlencode(data[k])); - return post_data.join("&"); - }, - - -//// -// Position and size -//// - getMousePos: function(e) { - var posx = 0; - var posy = 0; - if (!e) var e = window.event; - if (e.pageX || e.pageY) { - posx = e.pageX; - posy = e.pageY; - } - else if (e.clientX || e.clientY) { - posx = e.clientX + document.body.scrollLeft + document.documentElement.scrollLeft; - posy = e.clientY + document.body.scrollTop + document.documentElement.scrollTop; - } - return {x: posx, y: posy}; - }, - - getScrollTop: function() { - //From: http://www.quirksmode.org/js/doctypes.html - var t; - if (document.documentElement && document.documentElement.scrollTop) - t = document.documentElement.scrollTop; - else if (document.body) - t = document.body.scrollTop; - return t; - }, - - absolutePosition: function(elm) { - var posObj = {'x': elm.offsetLeft, 'y': elm.offsetTop}; - - if(elm.offsetParent) { - var next = elm.offsetParent; - while(next) { - posObj.x += next.offsetLeft; - posObj.y += next.offsetTop; - next = next.offsetParent; - } - } - // safari bug - if (AJS.isSafari() && elm.style.position == 'absolute' ) { - posObj.x -= document.body.offsetLeft; - posObj.y -= document.body.offsetTop; - } - return posObj; - }, - - getWindowSize: function(doc) { - doc = doc || document; - var win_w, win_h; - if (self.innerHeight) { - win_w = self.innerWidth; - win_h = self.innerHeight; - } else if (doc.documentElement && doc.documentElement.clientHeight) { - win_w = doc.documentElement.clientWidth; - win_h = doc.documentElement.clientHeight; - } else if (doc.body) { - win_w = doc.body.clientWidth; - win_h = doc.body.clientHeight; - } - return {'w': win_w, 'h': win_h}; - }, - - isOverlapping: function(elm1, elm2) { - var pos_elm1 = AJS.absolutePosition(elm1); - var pos_elm2 = AJS.absolutePosition(elm2); - - var top1 = pos_elm1.y; - var left1 = pos_elm1.x; - var right1 = left1 + elm1.offsetWidth; - var bottom1 = top1 + elm1.offsetHeight; - var top2 = pos_elm2.y; - var left2 = pos_elm2.x; - var right2 = left2 + elm2.offsetWidth; - var bottom2 = top2 + elm2.offsetHeight; - var getSign = function(v) { - if(v > 0) return "+"; - else if(v < 0) return "-"; - else return 0; - } - - if ((getSign(top1 - bottom2) != getSign(bottom1 - top2)) && - (getSign(left1 - right2) != getSign(right1 - left2))) - return true; - return false; - }, - - -//// -// Events -//// - getEventElm: function(e) { - if(e && !e.type && !e.keyCode) - return e - var targ; - if (!e) var e = window.event; - if (e.target) targ = e.target; - else if (e.srcElement) targ = e.srcElement; - if (targ.nodeType == 3) // defeat Safari bug - targ = targ.parentNode; - return targ; - }, - - _getRealScope: function(fn, /*optional*/ extra_args) { - extra_args = AJS.$A(extra_args); - var scope = fn._cscope || window; - - return function() { - var args = AJS.$FA(arguments).concat(extra_args); - return fn.apply(scope, args); - }; - }, - - _unloadListeners: function() { - if(AJS.listeners) - AJS.map(AJS.listeners, function(elm, type, fn) { AJS.REV(elm, type, fn) }); - AJS.listeners = []; - }, - - setEventKey: function(e) { - e.key = e.keyCode ? e.keyCode : e.charCode; - - if(window.event) { - e.ctrl = window.event.ctrlKey; - e.shift = window.event.shiftKey; - } - else { - e.ctrl = e.ctrlKey; - e.shift = e.shiftKey; - } - switch(e.key) { - case 63232: - e.key = 38; - break; - case 63233: - e.key = 40; - break; - case 63235: - e.key = 39; - break; - case 63234: - e.key = 37; - break; - } - }, - - //Shortcut: AJS.AEV - addEventListener: function(elm, type, fn, /*optional*/listen_once, cancle_bubble) { - if(!cancle_bubble) - cancle_bubble = false; - - var elms = AJS.$A(elm); - AJS.map(elms, function(elmz) { - if(listen_once) - fn = AJS._listenOnce(elmz, type, fn); - - //Hack since it does not work in all browsers - if(AJS.isIn(type, ['submit', 'load', 'scroll', 'resize'])) { - var old = elm['on' + type]; - elm['on' + type] = function() { - if(old) { - fn(arguments); - return old(arguments); - } - else - return fn(arguments); - }; - return; - } - - //Fix keyCode - if(AJS.isIn(type, ['keypress', 'keydown', 'keyup', 'click'])) { - var old_fn = fn; - fn = function(e) { - AJS.setEventKey(e); - return old_fn.apply(null, arguments); - } - } - - if (elmz.attachEvent) { - //FIXME: We ignore cancle_bubble for IE... could be a problem? - elmz.attachEvent("on" + type, fn); - } - else if(elmz.addEventListener) - elmz.addEventListener(type, fn, cancle_bubble); - - AJS.listeners = AJS.$A(AJS.listeners); - AJS.listeners.push([elmz, type, fn]); - }); - }, - - //Shortcut: AJS.REV - removeEventListener: function(elm, type, fn, /*optional*/cancle_bubble) { - if(!cancle_bubble) - cancle_bubble = false; - if(elm.removeEventListener) { - elm.removeEventListener(type, fn, cancle_bubble); - if(AJS.isOpera()) - elm.removeEventListener(type, fn, !cancle_bubble); - } - else if(elm.detachEvent) - elm.detachEvent("on" + type, fn); - }, - - //Shortcut: AJS.$b - bind: function(fn, scope, /*optional*/ extra_args) { - fn._cscope = scope; - return AJS._getRealScope(fn, extra_args); - }, - - bindMethods: function(self) { - for (var k in self) { - var func = self[k]; - if (typeof(func) == 'function') { - self[k] = AJS.$b(func, self); - } - } - }, - - _listenOnce: function(elm, type, fn) { - var r_fn = function() { - AJS.removeEventListener(elm, type, r_fn); - fn(arguments); - } - return r_fn; - }, - - callLater: function(fn, interval) { - var fn_no_send = function() { - fn(); - }; - window.setTimeout(fn_no_send, interval); - }, - - preventDefault: function(e) { - if(AJS.isIe()) - window.event.returnValue = false; - else - e.preventDefault(); - }, - - -//// -// Drag and drop -//// - dragAble: function(elm, /*optional*/ handler, args) { - if(!args) - args = {}; - if(!AJS.isDefined(args['move_x'])) - args['move_x'] = true; - if(!AJS.isDefined(args['move_y'])) - args['move_y'] = true; - if(!AJS.isDefined(args['moveable'])) - args['moveable'] = false; - if(!AJS.isDefined(args['hide_on_move'])) - args['hide_on_move'] = true; - if(!AJS.isDefined(args['on_mouse_up'])) - args['on_mouse_up'] = null; - if(!AJS.isDefined(args['cursor'])) - args['cursor'] = 'move'; - if(!AJS.isDefined(args['max_move'])) - args['max_move'] = {'top': null, 'left': null}; - - elm = AJS.$(elm); - - if(!handler) - handler = elm; - - handler = AJS.$(handler); - var old_cursor = handler.style.cursor; - handler.style.cursor = args['cursor']; - elm.style.position = 'relative'; - - AJS.addClass(handler, '_ajs_handler'); - handler._args = args; - handler._elm = elm; - AJS.AEV(handler, 'mousedown', AJS._dragStart); - }, - - _dragStart: function(e) { - var handler = AJS.getEventElm(e); - if(!AJS.hasClass(handler, '_ajs_handler')) { - handler = AJS.getParentBytc(handler, null, '_ajs_handler'); - } - if(handler) - AJS._dragInit(e, handler._elm, handler._args); - }, - - dropZone: function(elm, args) { - elm = AJS.$(elm); - var item = {elm: elm}; - AJS.update(item, args); - AJS._drop_zones.push(item); - }, - - removeDragAble: function(elm) { - AJS.REV(elm, 'mousedown', AJS._dragStart); - elm.style.cursor = ''; - }, - - removeDropZone: function(elm) { - var i = AJS.getIndex(elm, AJS._drop_zones, function(item) { - if(item.elm == elm) return true; - }); - if(i != -1) { - AJS._drop_zones.splice(i, 1); - } - }, - - _dragInit: function(e, click_elm, args) { - AJS.drag_obj = new Object(); - AJS.drag_obj.args = args; - - AJS.drag_obj.click_elm = click_elm; - AJS.drag_obj.mouse_pos = AJS.getMousePos(e); - AJS.drag_obj.click_elm_pos = AJS.absolutePosition(click_elm); - - AJS.AEV(document, 'mousemove', AJS._dragMove, false, true); - AJS.AEV(document, 'mouseup', AJS._dragStop, false, true); - - if (AJS.isIe()) - window.event.cancelBubble = true; - AJS.preventDefault(e); - }, - - _initDragElm: function(elm) { - if(AJS.drag_elm && AJS.drag_elm.style.display == 'none') - AJS.removeElement(AJS.drag_elm); - - if(!AJS.drag_elm) { - AJS.drag_elm = AJS.DIV(); - var d = AJS.drag_elm; - AJS.insertBefore(d, AJS.getBody().firstChild); - AJS.setHTML(d, elm.innerHTML); - - d.className = elm.className; - d.style.cssText = elm.style.cssText; - - d.style.position = 'absolute'; - d.style.zIndex = 10000; - - var t = AJS.absolutePosition(elm); - AJS.setTop(d, t.y); - AJS.setLeft(d, t.x); - - if(AJS.drag_obj.args.on_init) { - AJS.drag_obj.args.on_init(elm); - } - } - }, - - _dragMove: function(e) { - var drag_obj = AJS.drag_obj; - var click_elm = drag_obj.click_elm; - - AJS._initDragElm(click_elm); - var drag_elm = AJS.drag_elm; - - if(drag_obj.args['hide_on_move']) - click_elm.style.visibility = 'hidden'; - - var cur_pos = AJS.getMousePos(e); - - var mouse_pos = drag_obj.mouse_pos; - - var click_elm_pos = drag_obj.click_elm_pos; - - var p_x, p_y; - p_x = cur_pos.x - (mouse_pos.x - click_elm_pos.x); - p_y = cur_pos.y - (mouse_pos.y - click_elm_pos.y); - - AJS.map(AJS._drop_zones, function(d_z) { - if(AJS.isOverlapping(d_z['elm'], drag_elm)) { - if(d_z['elm'] != drag_elm) { - var on_hover = d_z['on_hover']; - if(on_hover) - on_hover(d_z['elm'], click_elm, drag_elm); - } - } - }); - - if(drag_obj.args['on_drag']) - drag_obj.args['on_drag'](click_elm, e); - - var max_move_top = drag_obj.args['max_move']['top']; - var max_move_left = drag_obj.args['max_move']['left']; - if(drag_obj.args['move_x']) { - if(max_move_left == null || max_move_left <= p) - AJS.setLeft(elm, p_x); - } - - if(drag_obj.args['move_y']) { - if(max_move_top == null || max_move_top <= p_y) - AJS.setTop(elm, p_y); - } - if(AJS.isIe()) { - window.event.cancelBubble = true; - window.event.returnValue = false; - } - else - e.preventDefault(); - - //Moving scroll to the top, should move the scroll up - var sc_top = AJS.getScrollTop(); - var sc_bottom = sc_top + AJS.getWindowSize().h; - var d_e_top = AJS.absolutePosition(drag_elm).y; - var d_e_bottom = drag_elm.offsetTop + drag_elm.offsetHeight; - - if(d_e_top <= sc_top + 20) { - window.scrollBy(0, -15); - } - else if(d_e_bottom >= sc_bottom - 20) { - window.scrollBy(0, 15); - } - }, - - _dragStop: function(e) { - var drag_obj = AJS.drag_obj; - var drag_elm = AJS.drag_elm; - var click_elm = drag_obj.click_elm; - - AJS.REV(document, "mousemove", AJS._dragMove, true); - AJS.REV(document, "mouseup", AJS._dragStop, true); - - var dropped = false; - AJS.map(AJS._drop_zones, function(d_z) { - if(AJS.isOverlapping(d_z['elm'], click_elm)) { - if(d_z['elm'] != click_elm) { - var on_drop = d_z['on_drop']; - if(on_drop) { - dropped = true; - on_drop(d_z['elm'], click_elm); - } - } - } - }); - - if(drag_obj.args['moveable']) { - var t = parseInt(click_elm.style.top) || 0; - var l = parseInt(click_elm.style.left) || 0; - var drag_elm_xy = AJS.absolutePosition(drag_elm); - var click_elm_xy = AJS.absolutePosition(click_elm); - AJS.setTop(click_elm, t + drag_elm_xy.y - click_elm_xy.y); - AJS.setLeft(click_elm, l + drag_elm_xy.x - click_elm_xy.x); - } - - if(!dropped && drag_obj.args['on_mouse_up']) - drag_obj.args['on_mouse_up'](click_elm, e); - - if(drag_obj.args['hide_on_move']) - drag_obj.click_elm.style.visibility = 'visible'; - - if(drag_obj.args.on_end) { - drag_obj.args.on_end(click_elm); - } - - AJS._dragObj = null; - if(drag_elm) - AJS.hideElement(drag_elm); - AJS.drag_elm = null; - }, - - -//// -// Misc. -//// - keys: function(obj) { - var rval = []; - for (var prop in obj) { - rval.push(prop); - } - return rval; - }, - - values: function(obj) { - var rval = []; - for (var prop in obj) { - rval.push(obj[prop]); - } - return rval; - }, - - urlencode: function(str) { - return encodeURIComponent(str.toString()); - }, - - isDefined: function(o) { - return (o != "undefined" && o != null) - }, - - isArray: function(obj) { - return obj instanceof Array; - }, - - isString: function(obj) { - return (typeof obj == 'string'); - }, - - isNumber: function(obj) { - return (typeof obj == 'number'); - }, - - isObject: function(obj) { - return (typeof obj == 'object'); - }, - - isFunction: function(obj) { - return (typeof obj == 'function'); - }, - - isDict: function(o) { - var str_repr = String(o); - return str_repr.indexOf(" Object") != -1; - }, - - exportToGlobalScope: function() { - for(e in AJS) - window[e] = AJS[e]; - }, - - log: function(o) { - if(window.console) - console.log(o); - else { - var div = AJS.$('ajs_logger'); - if(!div) { - div = AJS.DIV({id: 'ajs_logger', 'style': 'color: green; position: absolute; left: 0'}); - div.style.top = AJS.getScrollTop() + 'px'; - AJS.ACN(AJS.getBody(), div); - } - AJS.setHTML(div, ''+o); - } - } - -} - -AJS.Class = function(members) { - var fn = function() { - if(arguments[0] != 'no_init') { - return this.init.apply(this, arguments); - } - } - fn.prototype = members; - AJS.update(fn, AJS.Class.prototype); - return fn; -} -AJS.Class.prototype = { - extend: function(members) { - var parent = new this('no_init'); - for(k in members) { - var prev = parent[k]; - var cur = members[k]; - if (prev && prev != cur && typeof cur == 'function') { - cur = this._parentize(cur, prev); - } - parent[k] = cur; - } - return new AJS.Class(parent); - }, - - implement: function(members) { - AJS.update(this.prototype, members); - }, - - _parentize: function(cur, prev) { - return function(){ - this.parent = prev; - return cur.apply(this, arguments); - } - } -}; - -//Shortcuts -AJS.$ = AJS.getElement; -AJS.$$ = AJS.getElements; -AJS.$f = AJS.getFormElement; -AJS.$b = AJS.bind; -AJS.$p = AJS.partial; -AJS.$FA = AJS.forceArray; -AJS.$A = AJS.createArray; -AJS.DI = AJS.documentInsert; -AJS.ACN = AJS.appendChildNodes; -AJS.RCN = AJS.replaceChildNodes; -AJS.AEV = AJS.addEventListener; -AJS.REV = AJS.removeEventListener; -AJS.$bytc = AJS.getElementsByTagAndClassName; - -AJSDeferred = function(req) { - this.callbacks = []; - this.errbacks = []; - this.req = req; -} -AJSDeferred.prototype = { - excCallbackSeq: function(req, list) { - var data = req.responseText; - while (list.length > 0) { - var fn = list.pop(); - var new_data = fn(data, req); - if(new_data) - data = new_data; - } - }, - - callback: function () { - this.excCallbackSeq(this.req, this.callbacks); - }, - - errback: function() { - if(this.errbacks.length == 0) - alert("Error encountered:\n" + this.req.responseText); - - this.excCallbackSeq(this.req, this.errbacks); - }, - - addErrback: function(fn) { - this.errbacks.unshift(fn); - }, - - addCallback: function(fn) { - this.callbacks.unshift(fn); - }, - - abort: function() { - this.req.abort(); - }, - - addCallbacks: function(fn1, fn2) { - this.addCallback(fn1); - this.addErrback(fn2); - }, - - sendReq: function(data) { - if(AJS.isObject(data)) { - this.req.send(AJS.queryArguments(data)); - } - else if(AJS.isDefined(data)) - this.req.send(data); - else { - this.req.send(""); - } - } -}; - -//Prevent memory-leaks -AJS.addEventListener(window, 'unload', AJS._unloadListeners); -AJS._createDomShortcuts() -} - -script_loaded = true; - -/**** -Last Modified: 13/05/07 00:25:28 - - GoogieSpell - Google spell checker for your own web-apps :) + SpellCheck + jQuery'fied spell checker based on GoogieSpell 4.0 Copyright Amir Salihefendic 2006 + Copyright Aleksander Machniak 2009 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 + GPL + AUTHORS 4mir Salihefendic (http://amix.dk) - amix@amix.dk - VERSION - 4.0 -****/ -var GOOGIE_CUR_LANG = null; -var GOOGIE_DEFAULT_LANG = "en"; + Aleksander Machniak - alec [at] alec.pl +*/ + +var SPELL_CUR_LANG = null; +var GOOGIE_DEFAULT_LANG = 'en'; function GoogieSpell(img_dir, server_url) { - var cookie_value; - var lang; - cookie_value = getCookie('language'); + var ref = this; - if(cookie_value != null) - GOOGIE_CUR_LANG = cookie_value; - else - GOOGIE_CUR_LANG = GOOGIE_DEFAULT_LANG; + this.array_keys = function(arr) { + var res = []; + for (var key in arr) { res.push([key]); } + return res; + } + + var cookie_value = getCookie('language'); + GOOGIE_CUR_LANG = cookie_value != null ? cookie_value : 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.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.langlist_codes = this.array_keys(this.lang_to_word); this.show_change_lang_pic = true; - this.change_lang_pic_placement = "left"; - + this.change_lang_pic_placement = 'right'; this.report_state_change = true; this.ta_scroll_top = 0; @@ -1475,7 +50,7 @@ function GoogieSpell(img_dir, server_url) { this.lang_no_error_found = "No spelling errors found"; this.lang_no_suggestions = "No suggestions"; - this.show_spell_img = false; // modified by roundcube + this.show_spell_img = false; // roundcube mod. this.decoration = true; this.use_close_btn = true; this.edit_layer_dbl_click = true; @@ -1504,102 +79,89 @@ function GoogieSpell(img_dir, server_url) { //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)); -} + $(document).bind('click', function(e) { + if($(e.target).attr('googie_action_btn') != '1' && ref.isLangWindowShown()) + ref.hideLangWindow(); + if($(e.target).attr('googie_action_btn') != '1' && ref.isErrorWindowShown()) + ref.hideErrorWindow(); + }); -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(); - 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(); - this.spell_container = spell_container; - tr.appendChild(spell_container); +this.decorateTextarea = function(id) { + this.text_area = typeof(id) == 'string' ? document.getElementById(id) : id; - tbody.appendChild(tr); - table.appendChild(tbody); + if (this.text_area) { + if (!this.spell_container && this.decoration) { + var table = document.createElement('TABLE'); + var tbody = document.createElement('TBODY'); + var tr = document.createElement('TR'); + var spell_container = document.createElement('TD'); - AJS.insertBefore(table, this.text_area); + var r_width = this.isDefined(this.force_width) ? this.force_width : this.text_area.offsetWidth; + var r_height = this.isDefined(this.force_height) ? this.force_height : 16; - //Set width - AJS.setHeight(table, spell_container, r_height); - AJS.setWidth(table, spell_container, '100%'); // modified by roundcube (old: r_width) + 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'); - spell_container.style.textAlign = "right"; + this.spell_container = spell_container; } this.checkSpellingState(); } else - if(this.report_ta_not_found) - alert("Text area not found"); + 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); +this.setSpellContainer = function(id) { + this.spell_container = typeof(id) == 'string' ? document.getElementById(id) : id; + } -GoogieSpell.prototype.setLanguages = function(lang_dict) { +this.setLanguages = function(lang_dict) { this.lang_to_word = lang_dict; - this.langlist_codes = AJS.keys(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); + setCookie('language', lan_code, now); } -GoogieSpell.prototype.setForceWidthHeight = function(width, height) { - /*** - Set to null if you want to use one of them - ***/ +this.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.setDecoration = function(bool) { this.decoration = bool; } -GoogieSpell.prototype.dontUseCloseButtons = function() { +this.dontUseCloseButtons = function() { this.use_close_btn = false; } -GoogieSpell.prototype.appendNewMenuItem = function(name, call_back_fn, checker) { +this.appendNewMenuItem = function(name, call_back_fn, checker) { this.extra_menu_items.push([name, call_back_fn, checker]); } -GoogieSpell.prototype.appendCustomMenuBuilder = function(eval, builder) { +this.appendCustomMenuBuilder = function(eval, builder) { this.custom_menu_builder.push([eval, builder]); } -GoogieSpell.prototype.setFocus = function() { +this.setFocus = function() { try { this.focus_link_b.focus(); this.focus_link_t.focus(); @@ -1610,25 +172,17 @@ GoogieSpell.prototype.setFocus = function() { } } -GoogieSpell.prototype.getValue = function(ta) { - return ta.value; -} - -GoogieSpell.prototype.setValue = function(ta, value) { - ta.value = value; -} - ////// // Set functions (internal) ///// -GoogieSpell.prototype.setStateChanged = function(current_state) { +this.setStateChanged = function(current_state) { this.state = current_state; - if(this.spelling_state_observer != null && this.report_state_change) + if (this.spelling_state_observer != null && this.report_state_change) this.spelling_state_observer(current_state, this); } -GoogieSpell.prototype.setReportStateChange = function(bool) { +this.setReportStateChange = function(bool) { this.report_state_change = bool; } @@ -1636,219 +190,181 @@ GoogieSpell.prototype.setReportStateChange = function(bool) { ////// // Request functions ///// -GoogieSpell.prototype.getGoogleUrl = function() { +this.getUrl = function() { return this.server_url + GOOGIE_CUR_LANG; } -GoogieSpell.escapeSepcial = function(val) { +this.escapeSpecial = function(val) { return val.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">"); } -GoogieSpell.createXMLReq = function (text) { - return '<?xml version="1.0" encoding="utf-8" ?><spellrequest textalreadyclipped="0" ignoredups="0" ignoredigits="1" ignoreallcaps="1"><text>' + text + '</text></spellrequest>'; +this.createXMLReq = function (text) { + return '<?xml version="1.0" encoding="utf-8" ?>' + + '<spellrequest textalreadyclipped="0" ignoredups="0" ignoredigits="1" ignoreallcaps="1">' + + '<text>' + text + '</text></spellrequest>'; } -GoogieSpell.prototype.spellCheck = function(ignore) { - var me = this; - +this.spellCheck = function(ignore) { this.cnt_errors_fixed = 0; this.cnt_errors = 0; - this.setStateChanged("checking_spell"); + this.setStateChanged('checking_spell'); - if(this.main_controller) + 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.ignore = ignore; + this.hideLangWindow(); - if(this.getValue(this.text_area) == '' || ignore) { - if(!me.custom_no_spelling_error) - me.flashNoSpellingErrorState(); + if ($(this.text_area).val() == '' || ignore) { + if (!this.custom_no_spelling_error) + this.flashNoSpellingErrorState(); else - me.custom_no_spelling_error(me); - me.removeIndicator(); - return ; + this.custom_no_spelling_error(this); + this.removeIndicator(); + return; } this.createEditLayer(this.text_area.offsetWidth, this.text_area.offsetHeight); - this.createErrorWindow(); - AJS.getBody().appendChild(this.error_window); + $('body').append(this.error_window); try { netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead"); } catch (e) { } - if(this.main_controller) - this.spell_span.onclick = null; - - this.orginal_text = this.getValue(this.text_area); - - //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(/<c.*>/) != 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.escapeSepcial(this.orginal_text); - d.sendReq(GoogieSpell.createXMLReq(req_text)); + if (this.main_controller) + $(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 ///// -GoogieSpell.prototype.parseResult = function(r_text) { - /*** - Retunrs an array - result[item] -> ['attrs'], ['suggestions'] - ***/ +this.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[^>]*>[^<]*<\/c>/g); var results = new Array(); - if(matched_c == null) + if (matched_c == null) return results; - for(var i=0; i < matched_c.length; i++) { + for (var i=0; i < matched_c.length; i++) { var item = new Array(); this.errorFound(); //Get attributes item['attrs'] = new Array(); var split_c = matched_c[i].match(re_split_attr_c); - for(var j=0; j < split_c.length; j++) { + 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; - } + item['attrs'][c_attr[0]] = val != 'true' ? parseInt(val) : val; } //Get suggestions item['suggestions'] = new Array(); - var only_text = matched_c[i].replace(/<[^>]*>/g, ""); + 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]); - } + 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"; +this.createErrorWindow = function() { + this.error_window = document.createElement('DIV'); + $(this.error_window).addClass('googie_window').attr('googie_action_btn', '1'); } -GoogieSpell.prototype.isErrorWindowShown = function() { - return this.error_window != null && this.error_window.style.visibility == "visible"; +this.isErrorWindowShown = function() { + return $(this.error_window).is(':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) {} +this.hideErrorWindow = function() { + $(this.error_window).css('visibility', 'hidden'); + $(this.error_window_iframe).css('visibility', 'hidden'); } -GoogieSpell.prototype.updateOrginalText = function(offset, old_value, new_value, id) { +this.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.setValue(this.text_area, this.orginal_text); + $(this.text_area).val(this.orginal_text); var add_2_offset = new_value.length - old_value.length; - for(var j=0; j < this.results.length; j++) { + for (var j=0; j < this.results.length; j++) { //Don't edit the offset of the current item - if(j != id && j > id){ + if (j != id && j > id) this.results[j]['attrs']['o'] += add_2_offset; - } } } -GoogieSpell.prototype.saveOldValue = function(elm, old_value) { +this.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"; +this.createListSeparator = function() { + var td = document.createElement('TD'); + var tr = document.createElement('TR'); - return AJS.TR(e_col); + $(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; } -GoogieSpell.prototype.correctError = function(id, elm, l_elm, /*optional*/ rm_pre_space) { +this.correctError = function(id, elm, l_elm, rm_pre_space) { var old_value = elm.innerHTML; var new_value = l_elm.innerHTML; var offset = this.results[id]['attrs']['o']; - if(rm_pre_space) { + 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; @@ -1856,44 +372,38 @@ GoogieSpell.prototype.correctError = function(id, elm, l_elm, /*optional*/ rm_pr } this.hideErrorWindow(); - this.updateOrginalText(offset, old_value, new_value, id); - elm.innerHTML = new_value; - - elm.style.color = "green"; - elm.is_corrected = true; + $(elm).html(new_value).css('color', 'green').attr('is_corrected', true); this.results[id]['attrs']['l'] = new_value.length; - if(!AJS.isDefined(elm.old_value)) + if (!this.isDefined(elm.old_value)) this.saveOldValue(elm, old_value); this.errorFixed(); } -GoogieSpell.prototype.showErrorWindow = function(elm, id) { - if(this.show_menu_observer) +this.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"; + var ref = this; + var pos = $(elm).offset(); + pos.top -= this.edit_layer.scrollTop; - AJS.setTop(this.error_window, (abs_pos.y+20)); - AJS.setLeft(this.error_window, (abs_pos.x)); + $(this.error_window).css({'visibility': 'visible', + 'top': (pos.top+20)+'px', 'left': (pos.left)+'px'}).html(''); - this.error_window.innerHTML = ""; + var table = document.createElement('TABLE'); + var list = document.createElement('TBODY'); - var table = AJS.TABLE({'class': 'googie_list'}); - table.googie_action_btn = "1"; - var list = AJS.TBODY(); + $(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; - if(this.custom_menu_builder != []) { - for(var k=0; k<this.custom_menu_builder.length; k++) { + 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); @@ -1901,137 +411,131 @@ GoogieSpell.prototype.showErrorWindow = function(elm, id) { } } } - if(!changed) { + 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"; + if (suggestions.length == 0) { + var row = document.createElement('TR'); + var item = document.createElement('TD'); + var dummy = document.createElement('SPAN'); + + $(dummy).text(this.lang_no_suggestions); + $(item).attr('googie_action_btn', '1').css('cursor', 'default'); + + item.appendChild(dummy); 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); - }; + for (i=0; i < suggestions.length; i++) { + var row = document.createElement('TR'); + var item = document.createElement('TD'); + var dummy = document.createElement('SPAN'); - AJS.AEV(item, "click", AJS.$b(fn, this)); + $(dummy).html(suggestions[i]); + + $(item).bind('mouseover', this.item_onmouseover) + .bind('mouseout', this.item_onmouseout) + .bind('click', function(e) { ref.correctError(id, elm, e.target.firstChild) }); - item.onmouseover = GoogieSpell.item_onmouseover; - item.onmouseout = GoogieSpell.item_onmouseout; + item.appendChild(dummy); row.appendChild(item); list.appendChild(row); } //The element is changed, append the revert - if(elm.is_changed && elm.innerHTML != elm.old_value) { + if (elm.is_changed && elm.innerHTML != elm.old_value) { var old_value = elm.old_value; - var revert_row = AJS.TR(); - var revert = AJS.TD(); + var revert_row = document.createElement('TR'); + var revert = document.createElement('TD'); + var rev_span = document.createElement('SPAN'); + + $(rev_span).addClass('googie_list_revert').html(this.lang_revert + ' ' + old_value); + + $(revert).bind('mouseover', this.item_onmouseover) + .bind('mouseout', this.item_onmouseout) + .bind('click', function(e) { + ref.updateOrginalText(offset, elm.innerHTML, old_value, id); + $(elm).attr('is_corrected', true).css('color', '#b91414').html(old_value); + ref.hideErrorWindow(); + }); - 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 = "#b91414"; - 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: 120px; margin:0; padding:0', 'value': elm.innerHTML}); - edit_input.googie_action_btn = "1"; + var edit_row = document.createElement('TR'); + var edit = document.createElement('TD'); + var edit_input = document.createElement('INPUT'); + var ok_pic = document.createElement('IMG'); + var edit_form = document.createElement('FORM'); 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 = "green" - elm.is_corrected = true; - elm.innerHTML = edit_input.value; - - this.hideErrorWindow(); + if (edit_input.value != '') { + if (!ref.isDefined(elm.old_value)) + ref.saveOldValue(elm, elm.innerHTML); + + ref.updateOrginalText(offset, elm.innerHTML, edit_input.value, id); + $(elm).attr('is_corrected', true).css('color', 'green').html(edit_input.value); + ref.hideErrorWindow(); } return false; }; - onsub = AJS.$b(onsub, this); - - var ok_pic = AJS.IMG({'src': this.img_dir + "ok.gif", 'style': 'width: 32px; 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"; + $(edit_input).width(120).css({'margin': 0, 'padding': 0}); + $(edit_input).val(elm.innerHTML).attr('googie_action_btn', '1'); + $(edit).css('cursor', 'default').attr('googie_action_btn', '1'); + + $(ok_pic).attr('src', this.img_dir + 'ok.gif') + .width(32).height(16) + .css({'cursor': 'pointer', 'margin-left': '2px', 'margin-right': '2px'}) + .bind('click', onsub); - AJS.AEV(edit_form, "submit", onsub); - AJS.AEV(ok_pic, "click", onsub); + $(edit_form).attr('googie_action_btn', '1') + .css({'margin': 0, 'padding': 0, 'cursor': 'default', 'white-space': 'nowrap'}) + .bind('submit', onsub); + edit_form.appendChild(edit_input); + edit_form.appendChild(ok_pic); 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()); - + if (this.extra_menu_items.length > 0) + list.appendChild(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); - + 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'); + var e_col = document.createElement('TD'); + + $(e_col).html(e_elm[0]) + .bind('mouseover', ref.item_onmouseover) + .bind('mouseout', ref.item_onmouseout) + .bind('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) { - AJS.ACN(list, this.createCloseButton(this.hideErrorWindow)); + if (this.use_close_btn) { + list.appendChild(this.createCloseButton(this.hideErrorWindow)); } } @@ -2039,154 +543,117 @@ GoogieSpell.prototype.showErrorWindow = function(elm, id) { 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"; + if ($.browser.msie) { + if (!this.error_window_iframe) { + var iframe = $('<iframe>').css('position', 'absolute').css('z-index', 0); + $('body').append(iframe); + this.error_window_iframe = iframe; + } + + $(this.error_window_iframe).css({'visibility': 'visible', + 'top': this.error_window.offsetTop, 'left': this.error_window.offsetLeft, + 'width': this.error_window.offsetWidth, 'height': this.error_window.offsetHeight}); } - - //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'}); +this.createEditLayer = function(width, height) { + this.edit_layer = document.createElement('DIV'); + $(this.edit_layer).addClass('googie_edit_layer').width(width-10).height(height); - //Set the style so it looks like edit areas - this.edit_layer.className = this.text_area.className; - this.edit_layer.style.border = "1px solid #999"; - this.edit_layer.style.backgroundColor = "#F1EDFE"; // modified by roundcube - this.edit_layer.style.padding = "3px"; - this.edit_layer.style.margin = "0px"; - - AJS.setWidth(this.edit_layer, (width-8)); - - if(AJS.nodeName(this.text_area) != "input" || this.getValue(this.text_area) == "") { - this.edit_layer.style.overflow = "auto"; - AJS.setHeight(this.edit_layer, (height-6)); - } - else { - this.edit_layer.style.overflow = "hidden"; + if (this.text_area.nodeName != 'INPUT' || $(this.text_area).val() == '') { + $(this.edit_layer).css('overflow', 'auto').height(height-4); + } else { + $(this.edit_layer).css('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 ref = this; + if (this.edit_layer_dbl_click) { + $(this.edit_layer).bind('click', function(e) { + if (e.target.className != 'googie_link' && !ref.isErrorWindowShown()) { + ref.resumeEditing(); var fn1 = function() { - me.text_area.focus(); + $(ref.text_area).focus(); fn1 = null; }; - AJS.callLater(fn1, 10); + window.setTimeout(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.resumeEditing = function() { + this.setStateChanged('ready'); - if(this.edit_layer) + if (this.edit_layer) this.el_scroll_top = this.edit_layer.scrollTop; this.hideErrorWindow(); - if(this.main_controller) - this.spell_span.className = "googie_no_style"; + if (this.main_controller) + $(this.spell_span).removeClass().addClass('googie_no_style'); - if(!this.ignore) { - //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) { + if (!this.ignore) { + if (this.use_focus) { + $(this.focus_link_t).remove(); + $(this.focus_link_b).remove(); } - AJS.showElement(this.text_area); + $(this.edit_layer).remove(); + $(this.text_area).show(); - if(this.el_scroll_top != undefined) + if (this.el_scroll_top != undefined) this.text_area.scrollTop = this.el_scroll_top; } - this.checkSpellingState(false); } -GoogieSpell.prototype.createErrorLink = function(text, id) { - var elm = AJS.SPAN({'class': 'googie_link'}); - var me = this; +this.createErrorLink = function(text, id) { + var elm = document.createElement('SPAN'); + var ref = this; var d = function (e) { - me.showErrorWindow(elm, id); - d = null; - return false; + ref.showErrorWindow(elm, id); + d = null; + return false; }; - AJS.AEV(elm, "click", d); + + $(elm).html(text).addClass('googie_link').bind('click', d) + .attr({'googie_action_btn' : '1', 'g_id' : id, 'is_corrected' : false}); - 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); +this.createPart = function(txt_part) { + if (txt_part == " ") + return document.createTextNode(" "); - var part = AJS.SPAN(); - txt_part = GoogieSpell.escapeSepcial(txt_part); + txt_part = this.escapeSpecial(txt_part); txt_part = txt_part.replace(/\n/g, "<br>"); txt_part = txt_part.replace(/ /g, " "); txt_part = txt_part.replace(/^ /g, " "); txt_part = txt_part.replace(/ $/g, " "); - part.innerHTML = txt_part; - - return part; + var span = document.createElement('SPAN'); + $(span).html(txt_part); + return span; } -GoogieSpell.prototype.showErrorsInIframe = function() { - var output = AJS.DIV(); - output.style.textAlign = "left"; +this.showErrorsInIframe = function() { + var output = document.createElement('DIV') var pointer = 0; var results = this.results; - if(results.length > 0) { - for(var i=0; i < results.length; i++) { + 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); + var part_1 = this.createPart(part_1_text); + output.appendChild(part_1); pointer += offset - pointer; @@ -2198,96 +665,90 @@ GoogieSpell.prototype.showErrorsInIframe = function() { } //Insert the rest of the orginal text var part_2_text = this.orginal_text.substr(pointer, this.orginal_text.length); + var part_2 = this.createPart(part_2_text); - var part_2 = GoogieSpell.createPart(part_2_text); output.appendChild(part_2); } else output.innerHTML = this.orginal_text; + $(output).css('text-align', 'left'); + var me = this; - if(this.custom_item_evaulator) - AJS.map(this.error_links, function(elm){me.custom_item_evaulator(me, elm)}); + if (this.custom_item_evaulator) + $.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); + $(this.edit_layer).append(output); - AJS.insertBefore(this.edit_layer, this.text_area); + //Hide text area and show edit layer + $(this.text_area).hide(); + $(this.edit_layer).insertBefore(this.text_area); - if(this.use_focus) { + 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.focus_link_t).insertBefore(this.edit_layer); + $(this.focus_link_b).insertAfter(this.edit_layer); } - this.edit_layer.scrollTop = this.ta_scroll_top; +// 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"; +this.createLangWindow = function() { + this.language_window = document.createElement('DIV'); + $(this.language_window).addClass('googie_window') + .width(100).attr('googie_action_btn', '1'); //Build up the result list - var table = AJS.TABLE({'class': 'googie_list'}); - AJS.setWidth(table, "100%"); - var list = AJS.TBODY(); + var table = document.createElement('TABLE'); + var list = document.createElement('TBODY'); + var ref = this; + $(table).addClass('googie_list').width('100%'); this.lang_elms = new Array(); - for(i=0; i < this.langlist_codes.length; i++) { - var row = AJS.TR(); - var item = AJS.TD(); - item.googieId = this.langlist_codes[i]; + for (i=0; i < this.langlist_codes.length; i++) { + var row = document.createElement('TR'); + var item = document.createElement('TD'); + var span = document.createElement('SPAN'); + + $(span).text(this.lang_to_word[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"; - }; + $(item).attr('googieId', this.langlist_codes[i]) + .bind('click', function(e) { + ref.deHighlightCurSel(); + ref.setCurrentLanguage($(this).attr('googieId')); + + if (ref.lang_state_observer != null) { + ref.lang_state_observer(); + } + + ref.highlightCurSel(); + ref.hideLangWindow(); + }) + .bind('mouseover', function(e) { + if (this.className != "googie_list_selected") + this.className = "googie_list_onhover"; + }) + .bind('mouseout', function(e) { + if (this.className != "googie_list_selected") + this.className = "googie_list_onout"; + }); + + item.appendChild(span); row.appendChild(item); list.appendChild(row); } //Close button - if(this.use_close_btn) { - list.appendChild(this.createCloseButton(this.hideLangWindow)); + if (this.use_close_btn) { + list.appendChild(this.createCloseButton(function () { ref.hideLangWindow.apply(ref) })); } this.highlightCurSel(); @@ -2296,36 +757,24 @@ GoogieSpell.prototype.createLangWindow = function() { 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); +this.isLangWindowShown = function() { + return $(this.language_window).is(':hidden'); } -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) {} +this.hideLangWindow = function() { + $(this.language_window).css('visibility', 'hidden'); + $(this.switch_lan_pic).removeClass().addClass('googie_lang_3d_on'); } -GoogieSpell.prototype.deHighlightCurSel = function() { - this.lang_cur_elm.className = "googie_list_onout"; +this.deHighlightCurSel = function() { + $(this.lang_cur_elm).removeClass().addClass('googie_list_onout'); } -GoogieSpell.prototype.highlightCurSel = function() { - if(GOOGIE_CUR_LANG == null) +this.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) { + for (var i=0; i < this.lang_elms.length; i++) { + if ($(this.lang_elms[i]).attr('googieId') == GOOGIE_CUR_LANG) { this.lang_elms[i].className = "googie_list_selected"; this.lang_cur_elm = this.lang_elms[i]; } @@ -2335,219 +784,223 @@ GoogieSpell.prototype.highlightCurSel = function() { } } -GoogieSpell.prototype.showLangWindow = function(elm, ofst_top, ofst_left) { - if(this.show_menu_observer) +this.showLangWindow = function(elm) { + if (this.show_menu_observer) this.show_menu_observer(this); - if(!AJS.isDefined(ofst_top)) - ofst_top = 18; // modified by roundcube - if(!AJS.isDefined(ofst_left)) - ofst_left = 22; // modified by roundcube this.createLangWindow(); - AJS.getBody().appendChild(this.language_window); + $('body').append(this.language_window); + + var pos = $(elm).offset(); + var top = pos.top + $(elm).height(); + var left = this.change_lang_pic_placement == 'right' ? + pos.left - 100 + $(elm).width() : pos.left + $(elm).width(); - 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.language_window).css({'visibility': 'visible', 'top' : top+'px','left' : left+'px'}); 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); - } - } +this.createChangeLangPic = function() { + var img = $('<img>') + .attr({src: this.img_dir + 'change_lang.gif', 'alt': 'Change language', 'googie_action_btn': '1'}); + + var switch_lan = document.createElement('SPAN'); + var ref = this; + + $(switch_lan).addClass('googie_lang_3d_on') + .append(img) + .bind('click', function(e) { + var elm = this.tagName == 'IMG' ? this.parentNode : this; + if($(elm).hasClass('googie_lang_3d_click')) { + elm.className = 'googie_lang_3d_on'; + ref.hideLangWindow(); + } + else { + elm.className = 'googie_lang_3d_click'; + ref.showLangWindow(elm); + } + }); - 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'}); +this.createSpellDiv = function() { + var span = document.createElement('SPAN'); - 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); + $(span).addClass('googie_check_spelling_link').text(this.lang_chck_spell); + + if (this.show_spell_img) { + $(span).append(' ').append($('<img>').attr('src', this.img_dir + 'spellc.gif')); + } + return span; } ////// // 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"; +this.flashNoSpellingErrorState = function(on_finish) { + this.setStateChanged('no_error_found'); + + var ref = this; + if (this.main_controller) { + var no_spell_errors; + if (on_finish) { + var fn = function() { + on_finish(); + ref.checkSpellingState(); + }; + no_spell_errors = fn; + } + else + no_spell_errors = function () { ref.checkSpellingState() }; + + var rsm = $('<span>').text(this.lang_no_error_found); + + $(this.switch_lan_pic).hide(); + $(this.spell_span).empty().append(rsm) + .removeClass().addClass('googie_check_spelling_ok'); - AJS.callLater(AJS.$b(no_spell_errors, this), 1200, [false]); + window.setTimeout(no_spell_errors, 1000); } } -GoogieSpell.prototype.resumeEditingState = function() { - this.setStateChanged("resume_editing"); +this.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)); - - var fn = function(e) { - this.resumeEditing(); - } - this.spell_span.onclick = AJS.$b(fn, this); + if (this.main_controller) { + var rsm = $('<span>').text(this.lang_rsm_edt); + var ref = this; - this.spell_span.className = "googie_resume_editing"; + $(this.switch_lan_pic).hide(); + $(this.spell_span).empty().unbind().append(rsm) + .bind('click', function() { ref.resumeEditing() }) + .removeClass().addClass('googie_resume_editing'); } try { this.edit_layer.scrollTop = this.ta_scroll_top; } - catch(e) { } + catch (e) {}; } -GoogieSpell.prototype.checkSpellingState = function(fire) { - if(!AJS.isDefined(fire) || fire) - this.setStateChanged("spell_check"); +this.checkSpellingState = function(fire) { + if (fire) + this.setStateChanged('ready'); - if(this.show_change_lang_pic) + if (this.show_change_lang_pic) this.switch_lan_pic = this.createChangeLangPic(); else - this.switch_lan_pic = AJS.SPAN(); + this.switch_lan_pic = document.createElement('SPAN'); var span_chck = this.createSpellDiv(); - var fn = function() { - this.spellCheck(); - }; + var ref = this; - if(this.custom_spellcheck_starter) - span_chck.onclick = this.custom_spellcheck_starter; + if (this.custom_spellcheck_starter) + $(span_chck).bind('click', function(e) { ref.custom_spellcheck_starter() }); else { - span_chck.onclick = AJS.$b(fn, this); + $(span_chck).bind('click', function(e) { ref.spellCheck() }); } - 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); + if (this.main_controller) { + if (this.change_lang_pic_placement == 'left') { + $(this.spell_container).empty().append(this.switch_lan_pic).append(' ').append(span_chck); + } else { + $(this.spell_container).empty().append(span_chck).append(' ').append(this.switch_lan_pic); + } } - // modified by roundcube - this.check_link = span_chck; + + this.spell_span = 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"; +this.isDefined = function(o) { + return (o != 'undefined' && o != null) } -GoogieSpell.prototype.createCloseButton = function(c_fn) { - return this.createButton(this.lang_close, 'googie_list_close', AJS.$b(c_fn, this)); +this.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.createButton = function(name, css_class, c_fn) { - var btn_row = AJS.TR(); - var btn = AJS.TD(); +this.errorFound = function() { + this.cnt_errors++; +} - btn.onmouseover = GoogieSpell.item_onmouseover; - btn.onmouseout = GoogieSpell.item_onmouseout; +this.createCloseButton = function(c_fn) { + return this.createButton(this.lang_close, 'googie_list_close', c_fn); +} +this.createButton = function(name, css_class, c_fn) { + var btn_row = document.createElement('TR'); + var btn = document.createElement('TD'); var spn_btn; - if(css_class != "") { - spn_btn = AJS.SPAN({'class': css_class}); - spn_btn.innerHTML = name; - } - else { - spn_btn = AJS.TN(name); + + if (css_class) { + spn_btn = document.createElement('SPAN'); + $(spn_btn).addClass(css_class).html(name); + } else { + spn_btn = document.createTextNode(name); } + + $(btn).bind('click', c_fn) + .bind('mouseover', this.item_onmouseover) + .bind('mouseout', this.item_onmouseout); + btn.appendChild(spn_btn); - AJS.AEV(btn, "click", c_fn); btn_row.appendChild(btn); return btn_row; } -GoogieSpell.prototype.removeIndicator = function(elm) { - // modified by roundcube +this.removeIndicator = function(elm) { + //$(this.indicator).remove(); + // roundcube mod. if (window.rcmail) - rcmail.set_busy(false); - //try { AJS.removeElement(this.indicator); } - //catch(e) {} + rcmail.set_busy(false); } -GoogieSpell.prototype.appendIndicator = function(elm) { +this.appendIndicator = function(elm) { // modified by roundcube if (window.rcmail) - rcmail.set_busy(true, 'checking'); - /* - var img = AJS.IMG({'src': this.img_dir + 'indicator.gif', 'style': 'margin-right: 5px;'}); - AJS.setWidth(img, 16); - AJS.setHeight(img, 16); - this.indicator = img; - img.style.textDecoration = "none"; - try { - AJS.insertBefore(img, elm); - } - catch(e) {} - */ + rcmail.set_busy(true, 'checking'); +/* + this.indicator = document.createElement('IMG'); + $(this.indicator).attr('src', this.img_dir + 'indicator.gif') + .css({'margin-right': '5px', 'text-decoration': 'none'}).width(16).height(16); + + if (elm) + $(this.indicator).insertBefore(elm); + else + $('body').append(this.indicator); +*/ +} + +this.createFocusLink = function(name) { + var link = document.createElement('A'); + $(link).attr({'href': 'javascript:;', 'name': name}); + return link; } -GoogieSpell.prototype.createFocusLink = function(name) { - return AJS.A({'href': 'javascript:;', name: name}); +this.item_onmouseover = function(e) { + if (this.className != "googie_list_revert" && this.className != "googie_list_close") + this.className = "googie_list_onhover"; + else + this.parentNode.className = "googie_list_onhover"; +} +this.item_onmouseout = function(e) { + if (this.className != "googie_list_revert" && this.className != "googie_list_close") + this.className = "googie_list_onout"; + else + this.parentNode.className = "googie_list_onout"; } + + +}; diff --git a/program/steps/mail/compose.inc b/program/steps/mail/compose.inc index 9328cc5ac..8ddb2f590 100644 --- a/program/steps/mail/compose.inc +++ b/program/steps/mail/compose.inc @@ -433,6 +433,7 @@ function rcmail_compose_body($attrib) "googie.lang_no_error_found = \"%s\";\n". "googie.setLanguages(%s);\n". "googie.setCurrentLanguage('%s');\n". + "googie.setSpellContainer('spellcheck-control');\n". "googie.decorateTextarea('%s');\n". "%s.set_env('spellcheck', googie);", $RCMAIL->comm_path, @@ -834,23 +835,26 @@ function rcmail_editor_selector($attrib) { global $CONFIG, $MESSAGE, $compose_mode; - $choices = array( - 'html' => 'htmltoggle', - 'plain' => 'plaintoggle' - ); - // determine whether HTML or plain text should be checked $useHtml = $CONFIG['htmleditor'] ? true : false; if ($compose_mode) $useHtml = ($useHtml && $MESSAGE->has_html_part()); - $editorid = empty($attrib['editorid']) ? 'rcmComposeMessage' : $attrib['editorid']; + if (empty($attrib['editorid'])) + $attrib['editorid'] = 'rcmComposeMessage'; + + if (empty($attrib['name'])) + $attrib['name'] = 'editorSelect'; + + $attrib['onchange'] = "return rcmail_toggle_editor(this.value=='html', '".$attrib['editorid']."', '_is_html')"; + + $select = new html_select($attrib); + + $select->add(Q(rcube_label('htmltoggle')), 'html'); + $select->add(Q(rcube_label('plaintoggle')), 'plain'); - $selector = ''; - $chosenvalue = $useHtml ? 'html' : 'plain'; - $radio = new html_radiobutton(array('name' => '_editorSelect', - 'onclick' => "return rcmail_toggle_editor(this.value=='html', '$editorid', '_is_html')")); + return $select->show($useHtml ? 'html' : 'plain'); foreach ($choices as $value => $text) { |