]> git.donarmstrong.com Git - roundcube.git/blob - program/js/googiespell.js
Imported Upstream version 0.2~stable
[roundcube.git] / program / js / googiespell.js
1 var AJS={getElement:function(id){
2 if(typeof (id)=="string"){
3 return document.getElementById(id);
4 }else{
5 return id;
6 }
7 },getElements:function(){
8 var _2=new Array();
9 for(var i=0;i<arguments.length;i++){
10 var _4=this.getElement(arguments[i]);
11 _2.push(_4);
12 }
13 return _2;
14 },getQueryArgument:function(_5){
15 var _6=window.location.search.substring(1);
16 var _7=_6.split("&");
17 for(var i=0;i<_7.length;i++){
18 var _9=_7[i].split("=");
19 if(_9[0]==_5){
20 return _9[1];
21 }
22 }
23 return null;
24 },isIe:function(){
25 return (navigator.userAgent.toLowerCase().indexOf("msie")!=-1&&navigator.userAgent.toLowerCase().indexOf("opera")==-1);
26 },getBody:function(){
27 return this.getElementsByTagAndClassName("body")[0];
28 },getElementsByTagAndClassName:function(_a,_b,_c){
29 var _d=new Array();
30 if(!this.isDefined(_c)){
31 _c=document;
32 }
33 if(!this.isDefined(_a)){
34 _a="*";
35 }
36 var _e=_c.getElementsByTagName(_a);
37 var _f=_e.length;
38 var _10=new RegExp("(^|\\s)"+_b+"(\\s|$)");
39 for(i=0,j=0;i<_f;i++){
40 if(_10.test(_e[i].className)||_b==null){
41 _d[j]=_e[i];
42 j++;
43 }
44 }
45 return _d;
46 },appendChildNodes:function(_11){
47 if(arguments.length>=2){
48 for(var i=1;i<arguments.length;i++){
49 var n=arguments[i];
50 if(typeof (n)=="string"){
51 n=document.createTextNode(n);
52 }
53 if(this.isDefined(n)){
54 _11.appendChild(n);
55 }
56 }
57 }
58 return _11;
59 },replaceChildNodes:function(_14){
60 var _15;
61 while((_15=_14.firstChild)){
62 _14.removeChild(_15);
63 }
64 if(arguments.length<2){
65 return _14;
66 }else{
67 return this.appendChildNodes.apply(this,arguments);
68 }
69 },insertAfter:function(_16,_17){
70 _17.parentNode.insertBefore(_16,_17.nextSibling);
71 },insertBefore:function(_18,_19){
72 _19.parentNode.insertBefore(_18,_19);
73 },showElement:function(elm){
74 elm.style.display="";
75 },hideElement:function(elm){
76 elm.style.display="none";
77 },isElementHidden:function(elm){
78 return elm.style.visibility=="hidden";
79 },swapDOM:function(_1d,src){
80 _1d=this.getElement(_1d);
81 var _1f=_1d.parentNode;
82 if(src){
83 src=this.getElement(src);
84 _1f.replaceChild(src,_1d);
85 }else{
86 _1f.removeChild(_1d);
87 }
88 return src;
89 },removeElement:function(elm){
90 this.swapDOM(elm,null);
91 },isDict:function(o){
92 var _22=String(o);
93 return _22.indexOf(" Object")!=-1;
94 },createDOM:function(_23,_24){
95 var i=0;
96 elm=document.createElement(_23);
97 if(this.isDict(_24[i])){
98 for(k in _24[0]){
99 if(k=="style"){
100 elm.style.cssText=_24[0][k];
101 }else{
102 if(k=="class"){
103 elm.className=_24[0][k];
104 }else{
105 elm.setAttribute(k,_24[0][k]);
106 }
107 }
108 }
109 i++;
110 }
111 if(_24[0]==null){
112 i=1;
113 }
114 for(i;i<_24.length;i++){
115 var n=_24[i];
116 if(this.isDefined(n)){
117 if(typeof (n)=="string"){
118 n=document.createTextNode(n);
119 }
120 elm.appendChild(n);
121 }
122 }
123 return elm;
124 },UL:function(){
125 return this.createDOM.apply(this,["ul",arguments]);
126 },LI:function(){
127 return this.createDOM.apply(this,["li",arguments]);
128 },TD:function(){
129 return this.createDOM.apply(this,["td",arguments]);
130 },TR:function(){
131 return this.createDOM.apply(this,["tr",arguments]);
132 },TH:function(){
133 return this.createDOM.apply(this,["th",arguments]);
134 },TBODY:function(){
135 return this.createDOM.apply(this,["tbody",arguments]);
136 },TABLE:function(){
137 return this.createDOM.apply(this,["table",arguments]);
138 },INPUT:function(){
139 return this.createDOM.apply(this,["input",arguments]);
140 },SPAN:function(){
141 return this.createDOM.apply(this,["span",arguments]);
142 },B:function(){
143 return this.createDOM.apply(this,["b",arguments]);
144 },A:function(){
145 return this.createDOM.apply(this,["a",arguments]);
146 },DIV:function(){
147 return this.createDOM.apply(this,["div",arguments]);
148 },IMG:function(){
149 return this.createDOM.apply(this,["img",arguments]);
150 },BUTTON:function(){
151 return this.createDOM.apply(this,["button",arguments]);
152 },H1:function(){
153 return this.createDOM.apply(this,["h1",arguments]);
154 },H2:function(){
155 return this.createDOM.apply(this,["h2",arguments]);
156 },H3:function(){
157 return this.createDOM.apply(this,["h3",arguments]);
158 },BR:function(){
159 return this.createDOM.apply(this,["br",arguments]);
160 },TEXTAREA:function(){
161 return this.createDOM.apply(this,["textarea",arguments]);
162 },FORM:function(){
163 return this.createDOM.apply(this,["form",arguments]);
164 },P:function(){
165 return this.createDOM.apply(this,["p",arguments]);
166 },SELECT:function(){
167 return this.createDOM.apply(this,["select",arguments]);
168 },OPTION:function(){
169 return this.createDOM.apply(this,["option",arguments]);
170 },TN:function(_27){
171 return document.createTextNode(_27);
172 },IFRAME:function(){
173 return this.createDOM.apply(this,["iframe",arguments]);
174 },SCRIPT:function(){
175 return this.createDOM.apply(this,["script",arguments]);
176 },getXMLHttpRequest:function(){
177 var _28=[function(){
178 return new XMLHttpRequest();
179 },function(){
180 return new ActiveXObject("Msxml2.XMLHTTP");
181 },function(){
182 return new ActiveXObject("Microsoft.XMLHTTP");
183 },function(){
184 return new ActiveXObject("Msxml2.XMLHTTP.4.0");
185 },function(){
186 throw "Browser does not support XMLHttpRequest";
187 }];
188 for(var i=0;i<_28.length;i++){
189 var _2a=_28[i];
190 try{
191 return _2a();
192 }
193 catch(e){
194 }
195 }
196 },doSimpleXMLHttpRequest:function(url){
197 var req=this.getXMLHttpRequest();
198 req.open("GET",url,true);
199 return this.sendXMLHttpRequest(req);
200 },getRequest:function(url,_2e){
201 var req=this.getXMLHttpRequest();
202 req.open("POST",url,true);
203 req.setRequestHeader("Content-type","application/x-www-form-urlencoded");
204 return this.sendXMLHttpRequest(req);
205 },sendXMLHttpRequest:function(req,_31){
206 var d=new AJSDeferred(req);
207 var _33=function(){
208 if(req.readyState==4){
209 try{
210 var _34=req.status;
211 }
212 catch(e){
213 }
214 if(_34==200||_34==304||req.responseText==null){
215 d.callback(req,_31);
216 }else{
217 d.errback();
218 }
219 }
220 };
221 req.onreadystatechange=_33;
222 return d;
223 },reprString:function(o){
224 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");
225 },serializeJSON:function(o){
226 var _37=typeof (o);
227 if(_37=="undefined"){
228 return "undefined";
229 }else{
230 if(_37=="number"||_37=="boolean"){
231 return o+"";
232 }else{
233 if(o===null){
234 return "null";
235 }
236 }
237 }
238 if(_37=="string"){
239 return this.reprString(o);
240 }
241 var me=arguments.callee;
242 var _39;
243 if(typeof (o.__json__)=="function"){
244 _39=o.__json__();
245 if(o!==_39){
246 return me(_39);
247 }
248 }
249 if(typeof (o.json)=="function"){
250 _39=o.json();
251 if(o!==_39){
252 return me(_39);
253 }
254 }
255 if(_37!="function"&&typeof (o.length)=="number"){
256 var res=[];
257 for(var i=0;i<o.length;i++){
258 var val=me(o[i]);
259 if(typeof (val)!="string"){
260 val="undefined";
261 }
262 res.push(val);
263 }
264 return "["+res.join(",")+"]";
265 }
266 res=[];
267 for(var k in o){
268 var _3e;
269 if(typeof (k)=="number"){
270 _3e="\""+k+"\"";
271 }else{
272 if(typeof (k)=="string"){
273 _3e=this.reprString(k);
274 }else{
275 continue;
276 }
277 }
278 val=me(o[k]);
279 if(typeof (val)!="string"){
280 continue;
281 }
282 res.push(_3e+":"+val);
283 }
284 return "{"+res.join(",")+"}";
285 },loadJSONDoc:function(url){
286 var d=this.getRequest(url);
287 var _41=function(req){
288 var _43=req.responseText;
289 return eval("("+_43+")");
290 };
291 d.addCallback(_41);
292 return d;
293 },keys:function(obj){
294 var _45=[];
295 for(var _46 in obj){
296 _45.push(_46);
297 }
298 return _45;
299 },urlencode:function(str){
300 return encodeURIComponent(str.toString());
301 },isDefined:function(o){
302 return (o!="undefined"&&o!=null);
303 },isArray:function(obj){
304 try{
305 return (typeof (obj.length)=="undefined")?false:true;
306 }
307 catch(e){
308 return false;
309 }
310 },isObject:function(obj){
311 return (obj&&typeof obj=="object");
312 },exportDOMElements:function(){
313 UL=this.UL;
314 LI=this.LI;
315 TD=this.TD;
316 TR=this.TR;
317 TH=this.TH;
318 TBODY=this.TBODY;
319 TABLE=this.TABLE;
320 INPUT=this.INPUT;
321 SPAN=this.SPAN;
322 B=this.B;
323 A=this.A;
324 DIV=this.DIV;
325 IMG=this.IMG;
326 BUTTON=this.BUTTON;
327 H1=this.H1;
328 H2=this.H2;
329 H3=this.H3;
330 BR=this.BR;
331 TEXTAREA=this.TEXTAREA;
332 FORM=this.FORM;
333 P=this.P;
334 SELECT=this.SELECT;
335 OPTION=this.OPTION;
336 TN=this.TN;
337 IFRAME=this.IFRAME;
338 SCRIPT=this.SCRIPT;
339 },exportToGlobalScope:function(){
340 getElement=this.getElement;
341 getQueryArgument=this.getQueryArgument;
342 isIe=this.isIe;
343 $=this.getElement;
344 getElements=this.getElements;
345 getBody=this.getBody;
346 getElementsByTagAndClassName=this.getElementsByTagAndClassName;
347 appendChildNodes=this.appendChildNodes;
348 ACN=appendChildNodes;
349 replaceChildNodes=this.replaceChildNodes;
350 RCN=replaceChildNodes;
351 insertAfter=this.insertAfter;
352 insertBefore=this.insertBefore;
353 showElement=this.showElement;
354 hideElement=this.hideElement;
355 isElementHidden=this.isElementHidden;
356 swapDOM=this.swapDOM;
357 removeElement=this.removeElement;
358 isDict=this.isDict;
359 createDOM=this.createDOM;
360 this.exportDOMElements();
361 getXMLHttpRequest=this.getXMLHttpRequest;
362 doSimpleXMLHttpRequest=this.doSimpleXMLHttpRequest;
363 getRequest=this.getRequest;
364 sendXMLHttpRequest=this.sendXMLHttpRequest;
365 reprString=this.reprString;
366 serializeJSON=this.serializeJSON;
367 loadJSONDoc=this.loadJSONDoc;
368 keys=this.keys;
369 isDefined=this.isDefined;
370 isArray=this.isArray;
371 }};
372 AJSDeferred=function(req){
373 this.callbacks=[];
374 this.req=req;
375 this.callback=function(res){
376 while(this.callbacks.length>0){
377 var fn=this.callbacks.pop();
378 res=fn(res);
379 }
380 };
381 this.errback=function(e){
382 alert("Error encountered:\n"+e);
383 };
384 this.addErrback=function(fn){
385 this.errback=fn;
386 };
387 this.addCallback=function(fn){
388 this.callbacks.unshift(fn);
389 };
390 this.addCallbacks=function(fn1,fn2){
391 this.addCallback(fn1);
392 this.addErrback(fn2);
393 };
394 this.sendReq=function(_53){
395 if(AJS.isObject(_53)){
396 var _54=[];
397 for(k in _53){
398 _54.push(k+"="+AJS.urlencode(_53[k]));
399 }
400 _54=_54.join("&");
401 this.req.send(_54);
402 }else{
403 if(AJS.isDefined(_53)){
404 this.req.send(_53);
405 }else{
406 this.req.send("");
407 }
408 }
409 };
410 };
411 AJSDeferred.prototype=new AJSDeferred();
412 var GOOGIE_CUR_LANG="en";
413 function GoogieSpell(_55,_56){
414 var _57;
415 var _58;
416 _57=getCookie("language");
417 if(_57!=null){
418 GOOGIE_CUR_LANG=_57;
419 }
420 this.img_dir=_55;
421 this.server_url=_56;
422 this.lang_to_word={"da":"Dansk","de":"Deutsch","en":"English","es":"Espa&#241;ol","fr":"Fran&#231;ais","it":"Italiano","nl":"Nederlands","pl":"Polski","pt":"Portugu&#234;s","fi":"Suomi","sv":"Svenska"};
423 this.langlist_codes=AJS.keys(this.lang_to_word);
424 this.show_change_lang_pic=true;
425 this.lang_state_observer=null;
426 this.spelling_state_observer=null;
427 this.request=null;
428 this.error_window=null;
429 this.language_window=null;
430 this.edit_layer=null;
431 this.orginal_text=null;
432 this.results=null;
433 this.text_area=null;
434 this.gselm=null;
435 this.ta_scroll_top=0;
436 this.el_scroll_top=0;
437 this.lang_chck_spell="Check spelling";
438 this.lang_rsm_edt="Resume editing";
439 this.lang_close="Close";
440 this.lang_no_error_found="No spelling errors found";
441 this.lang_revert="Revert to";
442 this.show_spell_img=false;
443 };
444 GoogieSpell.prototype.setStateChanged=function(_59){
445 if(this.spelling_state_observer!=null){
446 this.spelling_state_observer(_59);
447 }
448 };
449 GoogieSpell.item_onmouseover=function(e){
450 var elm=GoogieSpell.getEventElm(e);
451 if(elm.className!="googie_list_close"&&elm.className!="googie_list_revert"){
452 elm.className="googie_list_onhover";
453 }else{
454 elm.parentNode.className="googie_list_onhover";
455 }
456 };
457 GoogieSpell.item_onmouseout=function(e){
458 var elm=GoogieSpell.getEventElm(e);
459 if(elm.className!="googie_list_close"&&elm.className!="googie_list_revert"){
460 elm.className="googie_list_onout";
461 }else{
462 elm.parentNode.className="googie_list_onout";
463 }
464 };
465 GoogieSpell.prototype.getGoogleUrl=function(){
466 return this.server_url+GOOGIE_CUR_LANG;
467 };
468 GoogieSpell.prototype.spellCheck=function(elm,_5f){
469 this.ta_scroll_top=this.text_area.scrollTop;
470 this.appendIndicator(elm);
471 try{
472 this.hideLangWindow();
473 }
474 catch(e){
475 }
476 this.gselm=elm;
477 this.createEditLayer(this.text_area.offsetWidth,this.text_area.offsetHeight);
478 this.createErrorWindow();
479 AJS.getBody().appendChild(this.error_window);
480 try{
481 netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead");
482 }
483 catch(e){
484 }
485 this.gselm.onclick=null;
486 this.orginal_text=this.text_area.value;
487 var me=this;
488 var d=AJS.getRequest(this.getGoogleUrl());
489 var _62=function(req){
490 var _64=req.responseText;
491 if(_64.match(/<c.*>/)!=null){
492 var _65=GoogieSpell.parseResult(_64);
493 me.results=_65;
494 me.showErrorsInIframe(_65);
495 me.resumeEditingState();
496 }else{
497 me.flashNoSpellingErrorState();
498 }
499 me.removeIndicator();
500 };
501 var _66=function(req){
502 alert("An error was encountered on the server. Please try again later.");
503 AJS.removeElement(me.gselm);
504 me.checkSpellingState();
505 me.removeIndicator();
506 };
507 d.addCallback(_62);
508 d.addErrback(_66);
509 var _68=GoogieSpell.escapeSepcial(this.orginal_text);
510 d.sendReq(GoogieSpell.createXMLReq(_68));
511 };
512 GoogieSpell.escapeSepcial=function(val){
513 return val.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;");
514 };
515 GoogieSpell.createXMLReq=function(_6a){
516 return "<?xml version=\"1.0\" encoding=\"utf-8\" ?><spellrequest textalreadyclipped=\"0\" ignoredups=\"0\" ignoredigits=\"1\" ignoreallcaps=\"1\"><text>"+_6a+"</text></spellrequest>";
517 };
518 GoogieSpell.parseResult=function(_6b){
519 var _6c=/\w="\d+"/g;
520 var _6d=/\t/g;
521 var _6e=_6b.match(/<c[^>]*>[^<]*<\/c>/g);
522 var _6f=new Array();
523 for(var i=0;i<_6e.length;i++){
524 var _71=new Array();
525 _71["attrs"]=new Array();
526 var _72=_6e[i].match(_6c);
527 for(var j=0;j<_72.length;j++){
528 var _74=_72[j].split(/=/);
529 _71["attrs"][_74[0]]=parseInt(_74[1].replace("\"",""));
530 }
531 _71["suggestions"]=new Array();
532 var _75=_6e[i].replace(/<[^>]*>/g,"");
533 var _76=_75.split(_6d);
534 for(var k=0;k<_76.length;k++){
535 if(_76[k]!=""){
536 _71["suggestions"].push(_76[k]);
537 }
538 }
539 _6f.push(_71);
540 }
541 return _6f;
542 };
543 GoogieSpell.prototype.createErrorWindow=function(){
544 this.error_window=AJS.DIV();
545 this.error_window.className="googie_window";
546 };
547 GoogieSpell.prototype.hideErrorWindow=function(){
548 this.error_window.style.visibility="hidden";
549 };
550 GoogieSpell.prototype.updateOrginalText=function(_78,_79,_7a,id){
551 var _7c=this.orginal_text.substring(0,_78);
552 var _7d=this.orginal_text.substring(_78+_79.length);
553 this.orginal_text=_7c+_7a+_7d;
554 var _7e=_7a.length-_79.length;
555 for(var j=0;j<this.results.length;j++){
556 if(j!=id&&j>id){
557 this.results[j]["attrs"]["o"]+=_7e;
558 }
559 }
560 };
561 GoogieSpell.prototype.saveOldValue=function(id,_81){
562 this.results[id]["is_changed"]=true;
563 this.results[id]["old_value"]=_81;
564 };
565 GoogieSpell.prototype.showErrorWindow=function(elm,id){
566 var me=this;
567 var _85=GoogieSpell.absolutePosition(elm);
568 _85.y-=this.edit_layer.scrollTop;
569 this.error_window.style.visibility="visible";
570 this.error_window.style.top=(_85.y+20)+"px";
571 this.error_window.style.left=(_85.x)+"px";
572 this.error_window.innerHTML="";
573 var _86=AJS.TABLE({"class":"googie_list"});
574 var _87=AJS.TBODY();
575 var _88=this.results[id]["suggestions"];
576 var _89=this.results[id]["attrs"]["o"];
577 var len=this.results[id]["attrs"]["l"];
578 if(_88.length==0){
579 var row=AJS.TR();
580 var _8c=AJS.TD();
581 var _8d=AJS.SPAN();
582 _8c.appendChild(AJS.TN("No suggestions :("));
583 row.appendChild(_8c);
584 _87.appendChild(row);
585 }
586 for(i=0;i<_88.length;i++){
587 var row=AJS.TR();
588 var _8c=AJS.TD();
589 var _8d=AJS.SPAN();
590 _8d.innerHTML=_88[i];
591 _8c.appendChild(AJS.TN(_8d.innerHTML));
592 _8c.onclick=function(e){
593 var _8f=GoogieSpell.getEventElm(e);
594 var _90=elm.innerHTML;
595 var _91=_8f.innerHTML;
596 elm.style.color="green";
597 elm.innerHTML=_8f.innerHTML;
598 me.hideErrorWindow();
599 me.updateOrginalText(_89,_90,_91,id);
600 me.results[id]["attrs"]["l"]=_91.length;
601 me.saveOldValue(id,_90);
602 };
603 _8c.onmouseover=GoogieSpell.item_onmouseover;
604 _8c.onmouseout=GoogieSpell.item_onmouseout;
605 row.appendChild(_8c);
606 _87.appendChild(row);
607 }
608 if(this.results[id]["is_changed"]){
609 var _92=this.results[id]["old_value"];
610 var _89=this.results[id]["attrs"]["o"];
611 var _93=AJS.TR();
612 var _94=AJS.TD();
613 _94.onmouseover=GoogieSpell.item_onmouseover;
614 _94.onmouseout=GoogieSpell.item_onmouseout;
615 var _95=AJS.SPAN({"class":"googie_list_revert"});
616 _95.innerHTML=this.lang_revert+" "+_92;
617 _94.appendChild(_95);
618 _94.onclick=function(e){
619 me.updateOrginalText(_89,elm.innerHTML,_92,id);
620 elm.style.color="#b91414";
621 elm.innerHTML=_92;
622 me.hideErrorWindow();
623 };
624 _93.appendChild(_94);
625 _87.appendChild(_93);
626 }
627 var _97=AJS.TR();
628 var _98=AJS.TD();
629 var _99=AJS.INPUT({"style":"width: 120px; margin:0; padding:0"});
630 var _9a=function(){
631 if(_99.value!=""){
632 me.saveOldValue(id,elm.innerHTML);
633 me.updateOrginalText(_89,elm.innerHTML,_99.value,id);
634 elm.style.color="green";
635 elm.innerHTML=_99.value;
636 me.hideErrorWindow();
637 return false;
638 }
639 };
640 var _9b=AJS.IMG({"src":this.img_dir+"ok.gif","style":"width: 32px; height: 16px; margin-left: 2px; margin-right: 2px;"});
641 var _9c=AJS.FORM({"style":"margin: 0; padding: 0"},_99,_9b);
642 _9b.onclick=_9a;
643 _9c.onsubmit=_9a;
644 _98.appendChild(_9c);
645 _97.appendChild(_98);
646 _87.appendChild(_97);
647 var _9d=AJS.TR();
648 var _9e=AJS.TD();
649 _9e.onmouseover=GoogieSpell.item_onmouseover;
650 _9e.onmouseout=GoogieSpell.item_onmouseout;
651 var _9f=AJS.SPAN({"class":"googie_list_close"});
652 _9f.innerHTML=this.lang_close;
653 _9e.appendChild(_9f);
654 _9e.onclick=function(){
655 me.hideErrorWindow();
656 };
657 _9d.appendChild(_9e);
658 _87.appendChild(_9d);
659 _86.appendChild(_87);
660 this.error_window.appendChild(_86);
661 };
662 GoogieSpell.prototype.createEditLayer=function(_a0,_a1){
663 this.edit_layer=AJS.DIV({"class":"googie_edit_layer"});
664 this.edit_layer.className=this.text_area.className;
665 this.edit_layer.style.border="1px solid #999";
666 this.edit_layer.style.overflow="auto";
667 this.edit_layer.style.backgroundColor="#F1EDFE";
668 this.edit_layer.style.padding="3px";
669 this.edit_layer.style.width=(_a0-8)+"px";
670 this.edit_layer.style.height=_a1+"px";
671 };
672 GoogieSpell.prototype.resumeEditing=function(e,me){
673 this.setStateChanged("check_spelling");
674 me.switch_lan_pic.style.display="inline";
675 this.el_scroll_top=me.edit_layer.scrollTop;
676 var elm=GoogieSpell.getEventElm(e);
677 AJS.replaceChildNodes(elm,this.createSpellDiv());
678 elm.onclick=function(e){
679 me.spellCheck(elm,me.text_area.id);
680 };
681 me.hideErrorWindow();
682 me.edit_layer.parentNode.removeChild(me.edit_layer);
683 me.text_area.value=me.orginal_text;
684 AJS.showElement(me.text_area);
685 me.gselm.className="googie_no_style";
686 me.text_area.scrollTop=this.el_scroll_top;
687 elm.onmouseout=null;
688 };
689 GoogieSpell.prototype.createErrorLink=function(_a6,id){
690 var elm=AJS.SPAN({"class":"googie_link"});
691 var me=this;
692 elm.onclick=function(){
693 me.showErrorWindow(elm,id);
694 };
695 elm.innerHTML=_a6;
696 return elm;
697 };
698 GoogieSpell.createPart=function(_aa){
699 if(_aa==" "){
700 return AJS.TN(" ");
701 }
702 var _ab=AJS.SPAN();
703 var _ac=true;
704 var _ad=(navigator.userAgent.toLowerCase().indexOf("safari")!=-1);
705 var _ae=AJS.SPAN();
706 _aa=GoogieSpell.escapeSepcial(_aa);
707 _aa=_aa.replace(/\n/g,"<br>");
708 _aa=_aa.replace(/  /g," &nbsp;");
709 _aa=_aa.replace(/^ /g,"&nbsp;");
710 _aa=_aa.replace(/ $/g,"&nbsp;");
711 _ae.innerHTML=_aa;
712 return _ae;
713 };
714 GoogieSpell.prototype.showErrorsInIframe=function(_af){
715 var _b0=AJS.DIV();
716 _b0.style.textAlign="left";
717 var _b1=0;
718 for(var i=0;i<_af.length;i++){
719 var _b3=_af[i]["attrs"]["o"];
720 var len=_af[i]["attrs"]["l"];
721 var _b5=this.orginal_text.substring(_b1,_b3);
722 var _b6=GoogieSpell.createPart(_b5);
723 _b0.appendChild(_b6);
724 _b1+=_b3-_b1;
725 _b0.appendChild(this.createErrorLink(this.orginal_text.substr(_b3,len),i));
726 _b1+=len;
727 }
728 var _b7=this.orginal_text.substr(_b1,this.orginal_text.length);
729 var _b8=GoogieSpell.createPart(_b7);
730 _b0.appendChild(_b8);
731 this.edit_layer.appendChild(_b0);
732 AJS.hideElement(this.text_area);
733 this.text_area.parentNode.insertBefore(this.edit_layer,this.text_area.nextSibling);
734 this.edit_layer.scrollTop=this.ta_scroll_top;
735 };
736 GoogieSpell.Position=function(x,y){
737 this.x=x;
738 this.y=y;
739 };
740 GoogieSpell.absolutePosition=function(_bb){
741 var _bc=new GoogieSpell.Position(_bb.offsetLeft,_bb.offsetTop);
742 if(_bb.offsetParent){
743 var _bd=GoogieSpell.absolutePosition(_bb.offsetParent);
744 _bc.x+=_bd.x;
745 _bc.y+=_bd.y;
746 }
747 return _bc;
748 };
749 GoogieSpell.getEventElm=function(e){
750 var _bf;
751 if(!e){
752 var e=window.event;
753 }
754 if(e.target){
755 _bf=e.target;
756 }else{
757 if(e.srcElement){
758 _bf=e.srcElement;
759 }
760 }
761 if(_bf.nodeType==3){
762 _bf=_bf.parentNode;
763 }
764 return _bf;
765 };
766 GoogieSpell.prototype.removeIndicator=function(elm){
767 if(window.rcube_webmail_client){
768 rcube_webmail_client.set_busy(false);
769 }
770 };
771 GoogieSpell.prototype.appendIndicator=function(elm){
772 if(window.rcube_webmail_client){
773 rcube_webmail_client.set_busy(true,"checking");
774 }
775 };
776 GoogieSpell.prototype.createLangWindow=function(){
777 this.language_window=AJS.DIV({"class":"googie_window"});
778 this.language_window.style.width="130px";
779 var _c2=AJS.TABLE({"class":"googie_list"});
780 var _c3=AJS.TBODY();
781 this.lang_elms=new Array();
782 for(i=0;i<this.langlist_codes.length;i++){
783 var row=AJS.TR();
784 var _c5=AJS.TD();
785 _c5.googieId=this.langlist_codes[i];
786 this.lang_elms.push(_c5);
787 var _c6=AJS.SPAN();
788 _c6.innerHTML=this.lang_to_word[this.langlist_codes[i]];
789 _c5.appendChild(AJS.TN(_c6.innerHTML));
790 var me=this;
791 _c5.onclick=function(e){
792 var elm=GoogieSpell.getEventElm(e);
793 me.deHighlightCurSel();
794 me.setCurrentLanguage(elm.googieId);
795 if(me.lang_state_observer!=null){
796 me.lang_state_observer();
797 }
798 me.highlightCurSel();
799 me.hideLangWindow();
800 };
801 _c5.onmouseover=function(e){
802 var _cb=GoogieSpell.getEventElm(e);
803 if(_cb.className!="googie_list_selected"){
804 _cb.className="googie_list_onhover";
805 }
806 };
807 _c5.onmouseout=function(e){
808 var _cd=GoogieSpell.getEventElm(e);
809 if(_cd.className!="googie_list_selected"){
810 _cd.className="googie_list_onout";
811 }
812 };
813 row.appendChild(_c5);
814 _c3.appendChild(row);
815 }
816 this.highlightCurSel();
817 var _ce=AJS.TR();
818 var _cf=AJS.TD();
819 _cf.onmouseover=GoogieSpell.item_onmouseover;
820 _cf.onmouseout=GoogieSpell.item_onmouseout;
821 var _d0=AJS.SPAN({"class":"googie_list_close"});
822 _d0.innerHTML=this.lang_close;
823 _cf.appendChild(_d0);
824 var me=this;
825 _cf.onclick=function(e){
826 me.hideLangWindow();
827 GoogieSpell.item_onmouseout(e);
828 };
829 _ce.appendChild(_cf);
830 _c3.appendChild(_ce);
831 _c2.appendChild(_c3);
832 this.language_window.appendChild(_c2);
833 };
834 GoogieSpell.prototype.setCurrentLanguage=function(_d2){
835 GOOGIE_CUR_LANG=_d2;
836 var now=new Date();
837 now.setTime(now.getTime()+365*24*60*60*1000);
838 setCookie("language",_d2,now);
839 };
840 GoogieSpell.prototype.hideLangWindow=function(){
841 this.language_window.style.visibility="hidden";
842 this.switch_lan_pic.className="googie_lang_3d_on";
843 };
844 GoogieSpell.prototype.deHighlightCurSel=function(){
845 this.lang_cur_elm.className="googie_list_onout";
846 };
847 GoogieSpell.prototype.highlightCurSel=function(){
848 for(var i=0;i<this.lang_elms.length;i++){
849 if(this.lang_elms[i].googieId==GOOGIE_CUR_LANG){
850 this.lang_elms[i].className="googie_list_selected";
851 this.lang_cur_elm=this.lang_elms[i];
852 }else{
853 this.lang_elms[i].className="googie_list_onout";
854 }
855 }
856 };
857 GoogieSpell.prototype.showLangWindow=function(elm,_d6,_d7){
858 if(!AJS.isDefined(_d6)){
859 _d6=20;
860 }
861 if(!AJS.isDefined(_d7)){
862 _d7=50;
863 }
864 this.createLangWindow();
865 AJS.getBody().appendChild(this.language_window);
866 var _d8=GoogieSpell.absolutePosition(elm);
867 AJS.showElement(this.language_window);
868 this.language_window.style.top=(_d8.y+_d6)+"px";
869 this.language_window.style.left=(_d8.x+_d7-this.language_window.offsetWidth)+"px";
870 this.highlightCurSel();
871 this.language_window.style.visibility="visible";
872 };
873 GoogieSpell.prototype.flashNoSpellingErrorState=function(){
874 this.setStateChanged("no_error_found");
875 var me=this;
876 AJS.hideElement(this.switch_lan_pic);
877 this.gselm.innerHTML=this.lang_no_error_found;
878 this.gselm.className="googie_check_spelling_ok";
879 this.gselm.style.textDecoration="none";
880 this.gselm.style.cursor="default";
881 var fu=function(){
882 AJS.removeElement(me.gselm);
883 me.checkSpellingState();
884 };
885 setTimeout(fu,1000);
886 };
887 GoogieSpell.prototype.resumeEditingState=function(){
888 this.setStateChanged("resume_editing");
889 var me=this;
890 AJS.hideElement(me.switch_lan_pic);
891 me.gselm.innerHTML=this.lang_rsm_edt;
892 me.gselm.onclick=function(e){
893 me.resumeEditing(e,me);
894 };
895 me.gselm.className="googie_check_spelling_ok";
896 me.edit_layer.scrollTop=me.ta_scroll_top;
897 };
898 GoogieSpell.prototype.createChangeLangPic=function(){
899 var _dd=AJS.A({"class":"googie_lang_3d_on","style":"padding-left: 6px;"},AJS.IMG({"src":this.img_dir+"change_lang.gif","alt":"Change language"}));
900 _dd.onmouseover=function(){
901 if(this.className!="googie_lang_3d_click"){
902 this.className="googie_lang_3d_on";
903 }
904 };
905 var me=this;
906 _dd.onclick=function(){
907 if(this.className=="googie_lang_3d_click"){
908 me.hideLangWindow();
909 }else{
910 me.showLangWindow(_dd);
911 this.className="googie_lang_3d_click";
912 }
913 };
914 return _dd;
915 };
916 GoogieSpell.prototype.createSpellDiv=function(){
917 var _df=AJS.SPAN({"class":"googie_check_spelling_link"});
918 _df.innerHTML=this.lang_chck_spell;
919 var _e0=null;
920 if(this.show_spell_img){
921 _e0=AJS.IMG({"src":this.img_dir+"spellc.gif"});
922 }
923 return AJS.SPAN(_e0," ",_df);
924 };
925 GoogieSpell.prototype.checkSpellingState=function(){
926 this.setStateChanged("check_spelling");
927 var me=this;
928 if(this.show_change_lang_pic){
929 this.switch_lan_pic=this.createChangeLangPic();
930 }else{
931 this.switch_lan_pic=AJS.SPAN();
932 }
933 var _e2=this.createSpellDiv();
934 _e2.onclick=function(){
935 me.spellCheck(_e2);
936 };
937 AJS.appendChildNodes(this.spell_container,_e2," ",this.switch_lan_pic);
938 this.check_link=_e2;
939 };
940 GoogieSpell.prototype.setLanguages=function(_e3){
941 this.lang_to_word=_e3;
942 this.langlist_codes=AJS.keys(_e3);
943 };
944 GoogieSpell.prototype.decorateTextarea=function(id,_e5,_e6){
945 var me=this;
946 if(typeof (id)=="string"){
947 this.text_area=AJS.getElement(id);
948 }else{
949 this.text_area=id;
950 }
951 var _e8;
952 if(this.text_area!=null){
953 if(AJS.isDefined(_e5)){
954 if(typeof (_e5)=="string"){
955 this.spell_container=AJS.getElement(_e5);
956 }else{
957 this.spell_container=_e5;
958 }
959 }else{
960 var _e9=AJS.TABLE();
961 var _ea=AJS.TBODY();
962 var tr=AJS.TR();
963 if(AJS.isDefined(_e6)){
964 _e8=_e6;
965 }else{
966 _e8=this.text_area.offsetWidth+"px";
967 }
968 var _ec=AJS.TD();
969 this.spell_container=_ec;
970 tr.appendChild(_ec);
971 _ea.appendChild(tr);
972 _e9.appendChild(_ea);
973 AJS.insertBefore(_e9,this.text_area);
974 _e9.style.width="100%";
975 _ec.style.width=_e8;
976 _ec.style.textAlign="right";
977 }
978 this.checkSpellingState();
979 }else{
980 alert("Text area not found");
981 }
982 };
983