source: trunk/phpgwapi/js/htmlarea/plugins/SpellChecker/spell-check-ui.js @ 2

Revision 2, 11.2 KB checked in by niltonneto, 17 years ago (diff)

Removida todas as tags usadas pelo CVS ($Id, $Source).
Primeira versão no CVS externo.

  • Property svn:eol-style set to native
  • Property svn:executable set to *
Line 
1// Spell Checker Plugin for HTMLArea-3.0
2// Sponsored by www.americanbible.org
3// Implementation by Mihai Bazon, http://dynarch.com/mishoo/
4//
5// (c) dynarch.com 2003.
6// Distributed under the same terms as HTMLArea itself.
7// This notice MUST stay intact for use (see license.txt).
8//
9
10// internationalization file was already loaded in parent ;-)
11var SpellChecker = window.opener.SpellChecker;
12var i18n = SpellChecker.I18N;
13
14var HTMLArea = window.opener.HTMLArea;
15var is_ie = HTMLArea.is_ie;
16var editor = SpellChecker.editor;
17var frame = null;
18var currentElement = null;
19var wrongWords = null;
20var modified = false;
21var allWords = {};
22var fixedWords = [];
23var suggested_words = {};
24
25function makeCleanDoc(leaveFixed) {
26        // document.getElementById("status").innerHTML = 'Please wait: rendering valid HTML';
27        var words = wrongWords.concat(fixedWords);
28        for (var i = words.length; --i >= 0;) {
29                var el = words[i];
30                if (!(leaveFixed && /HA-spellcheck-fixed/.test(el.className))) {
31                        el.parentNode.insertBefore(el.firstChild, el);
32                        el.parentNode.removeChild(el);
33                } else
34                        el.className = "HA-spellcheck-fixed";
35        }
36        // we should use innerHTML here, but IE6's implementation fucks up the
37        // HTML to such extent that our poor Perl parser doesn't understand it
38        // anymore.
39        return window.opener.HTMLArea.getHTML(frame.contentWindow.document.body, false, editor);
40};
41
42function recheckClicked() {
43        document.getElementById("status").innerHTML = i18n["Please wait: changing dictionary to"] + ': "' + document.getElementById("f_dictionary").value + '".';
44        var field = document.getElementById("f_content");
45        field.value = makeCleanDoc(true);
46        field.form.submit();
47};
48
49function saveClicked() {
50        if (modified) {
51                editor.setHTML(makeCleanDoc(false));
52        }
53        window.close();
54        return false;
55};
56
57function cancelClicked() {
58        var ok = true;
59        if (modified) {
60                ok = confirm(i18n["QUIT_CONFIRMATION"]);
61        }
62        if (ok) {
63                window.close();
64        }
65        return false;
66};
67
68function replaceWord(el) {
69        var replacement = document.getElementById("v_replacement").value;
70        var this_word_modified = (el.innerHTML != replacement);
71        if (this_word_modified)
72                modified = true;
73        if (el) {
74                el.className = el.className.replace(/\s*HA-spellcheck-(hover|fixed)\s*/g, " ");
75        }
76        el.className += " HA-spellcheck-fixed";
77        el.__msh_fixed = true;
78        if (!this_word_modified) {
79                return false;
80        }
81        el.innerHTML = replacement;
82};
83
84function replaceClicked() {
85        replaceWord(currentElement);
86        var start = currentElement.__msh_id;
87        var index = start;
88        do {
89                ++index;
90                if (index == wrongWords.length) {
91                        index = 0;
92                }
93        } while ((index != start) && wrongWords[index].__msh_fixed);
94        if (index == start) {
95                index = 0;
96                alert(i18n["Finished list of mispelled words"]);
97        }
98        wrongWords[index].__msh_wordClicked(true);
99        return false;
100};
101
102function revertClicked() {
103        document.getElementById("v_replacement").value = currentElement.__msh_origWord;
104        replaceWord(currentElement);
105        currentElement.className = "HA-spellcheck-error HA-spellcheck-current";
106        return false;
107};
108
109function replaceAllClicked() {
110        var replacement = document.getElementById("v_replacement").value;
111        var ok = true;
112        var spans = allWords[currentElement.__msh_origWord];
113        if (spans.length == 0) {
114                alert("An impossible condition just happened.  Call FBI.  ;-)");
115        } else if (spans.length == 1) {
116                replaceClicked();
117                return false;
118        }
119        /*
120        var message = "The word \"" + currentElement.__msh_origWord + "\" occurs " + spans.length + " times.\n";
121        if (replacement == currentElement.__msh_origWord) {
122                ok = confirm(message + "Ignore all occurrences?");
123        } else {
124                ok = confirm(message + "Replace all occurrences with \"" + replacement + "\"?");
125        }
126        */
127        if (ok) {
128                for (var i in spans) {
129                        if (spans[i] != currentElement) {
130                                replaceWord(spans[i]);
131                        }
132                }
133                // replace current element the last, so that we jump to the next word ;-)
134                replaceClicked();
135        }
136        return false;
137};
138
139function ignoreClicked() {
140        document.getElementById("v_replacement").value = currentElement.__msh_origWord;
141        replaceClicked();
142        return false;
143};
144
145function ignoreAllClicked() {
146        document.getElementById("v_replacement").value = currentElement.__msh_origWord;
147        replaceAllClicked();
148        return false;
149};
150
151function learnClicked() {
152        alert("Not [yet] implemented");
153        return false;
154};
155
156function internationalizeWindow() {
157        var types = ["div", "span", "button"];
158        for (var i in types) {
159                var tag = types[i];
160                var els = document.getElementsByTagName(tag);
161                for (var j = els.length; --j >= 0;) {
162                        var el = els[j];
163                        if (el.childNodes.length == 1 && /\S/.test(el.innerHTML)) {
164                                var txt = el.innerHTML;
165                                if (typeof i18n[txt] != "undefined") {
166                                        el.innerHTML = i18n[txt];
167                                }
168                        }
169                }
170        }
171};
172
173function initDocument() {
174        internationalizeWindow();
175        modified = false;
176        frame = document.getElementById("i_framecontent");
177        var field = document.getElementById("f_content");
178        field.value = HTMLArea.getHTML(editor._doc.body, false, editor);
179        field.form.submit();
180        document.getElementById("f_init").value = "0";
181
182        // assign some global event handlers
183
184        var select = document.getElementById("v_suggestions");
185        select.onchange = function() {
186                document.getElementById("v_replacement").value = this.value;
187        };
188        if (is_ie) {
189                select.attachEvent("ondblclick", replaceClicked);
190        } else {
191                select.addEventListener("dblclick", replaceClicked, true);
192        }
193
194        document.getElementById("b_replace").onclick = replaceClicked;
195        // document.getElementById("b_learn").onclick = learnClicked;
196        document.getElementById("b_replall").onclick = replaceAllClicked;
197        document.getElementById("b_ignore").onclick = ignoreClicked;
198        document.getElementById("b_ignall").onclick = ignoreAllClicked;
199        document.getElementById("b_recheck").onclick = recheckClicked;
200        document.getElementById("b_revert").onclick = revertClicked;
201        document.getElementById("b_info").onclick = displayInfo;
202
203        document.getElementById("b_ok").onclick = saveClicked;
204        document.getElementById("b_cancel").onclick = cancelClicked;
205
206        select = document.getElementById("v_dictionaries");
207        select.onchange = function() {
208                document.getElementById("f_dictionary").value = this.value;
209        };
210};
211
212function getAbsolutePos(el) {
213        var r = { x: el.offsetLeft, y: el.offsetTop };
214        if (el.offsetParent) {
215                var tmp = getAbsolutePos(el.offsetParent);
216                r.x += tmp.x;
217                r.y += tmp.y;
218        }
219        return r;
220};
221
222function wordClicked(scroll) {
223        var self = this;
224        if (scroll) (function() {
225                var pos = getAbsolutePos(self);
226                var ws = { x: frame.offsetWidth - 4,
227                           y: frame.offsetHeight - 4 };
228                var wp = { x: frame.contentWindow.document.body.scrollLeft,
229                           y: frame.contentWindow.document.body.scrollTop };
230                pos.x -= Math.round(ws.x/2);
231                if (pos.x < 0) pos.x = 0;
232                pos.y -= Math.round(ws.y/2);
233                if (pos.y < 0) pos.y = 0;
234                frame.contentWindow.scrollTo(pos.x, pos.y);
235        })();
236        if (currentElement) {
237                var a = allWords[currentElement.__msh_origWord];
238                currentElement.className = currentElement.className.replace(/\s*HA-spellcheck-current\s*/g, " ");
239                for (var i in a) {
240                        var el = a[i];
241                        if (el != currentElement) {
242                                el.className = el.className.replace(/\s*HA-spellcheck-same\s*/g, " ");
243                        }
244                }
245        }
246        currentElement = this;
247        this.className += " HA-spellcheck-current";
248        var a = allWords[currentElement.__msh_origWord];
249        for (var i in a) {
250                var el = a[i];
251                if (el != currentElement) {
252                        el.className += " HA-spellcheck-same";
253                }
254        }
255        // document.getElementById("b_replall").disabled = (a.length <= 1);
256        // document.getElementById("b_ignall").disabled = (a.length <= 1);
257        var txt;
258        if (a.length == 1) {
259                txt = "one occurrence";
260        } else if (a.length == 2) {
261                txt = "two occurrences";
262        } else {
263                txt = a.length + " occurrences";
264        }
265        var suggestions = suggested_words[this.__msh_origWord];
266        if (suggestions)
267                suggestions = suggestions.split(/,/);
268        else
269                suggestions = [];
270        var select = document.getElementById("v_suggestions");
271        document.getElementById("statusbar").innerHTML = "Found " + txt +
272                ' for word "<b>' + currentElement.__msh_origWord + '</b>"';
273        for (var i = select.length; --i >= 0;) {
274                select.remove(i);
275        }
276        for (var i = 0; i < suggestions.length; ++i) {
277                var txt = suggestions[i];
278                var option = document.createElement("option");
279                option.value = txt;
280                option.appendChild(document.createTextNode(txt));
281                select.appendChild(option);
282        }
283        document.getElementById("v_currentWord").innerHTML = this.__msh_origWord;
284        if (suggestions.length > 0) {
285                select.selectedIndex = 0;
286                select.onchange();
287        } else {
288                document.getElementById("v_replacement").value = this.innerHTML;
289        }
290        select.style.display = "none";
291        select.style.display = "block";
292        return false;
293};
294
295function wordMouseOver() {
296        this.className += " HA-spellcheck-hover";
297};
298
299function wordMouseOut() {
300        this.className = this.className.replace(/\s*HA-spellcheck-hover\s*/g, " ");
301};
302
303function displayInfo() {
304        var info = frame.contentWindow.spellcheck_info;
305        if (!info)
306                alert("No information available");
307        else {
308                var txt = "** Document information **";
309                for (var i in info) {
310                        txt += "\n" + i + " : " + info[i];
311                }
312                alert(txt);
313        }
314        return false;
315};
316
317function finishedSpellChecking() {
318        // initialization of global variables
319        currentElement = null;
320        wrongWords = null;
321        allWords = {};
322        fixedWords = [];
323        suggested_words = frame.contentWindow.suggested_words;
324
325        document.getElementById("status").innerHTML = "HTMLArea Spell Checker (<a href='readme-tech.html' target='_blank' title='Technical information'>info</a>)";
326        var doc = frame.contentWindow.document;
327        var spans = doc.getElementsByTagName("span");
328        var sps = [];
329        var id = 0;
330        for (var i = 0; i < spans.length; ++i) {
331                var el = spans[i];
332                if (/HA-spellcheck-error/.test(el.className)) {
333                        sps.push(el);
334                        el.__msh_wordClicked = wordClicked;
335                        el.onclick = function(ev) {
336                                ev || (ev = window.event);
337                                ev && HTMLArea._stopEvent(ev);
338                                return this.__msh_wordClicked(false);
339                        };
340                        el.onmouseover = wordMouseOver;
341                        el.onmouseout = wordMouseOut;
342                        el.__msh_id = id++;
343                        var txt = (el.__msh_origWord = el.firstChild.data);
344                        el.__msh_fixed = false;
345                        if (typeof allWords[txt] == "undefined") {
346                                allWords[txt] = [el];
347                        } else {
348                                allWords[txt].push(el);
349                        }
350                } else if (/HA-spellcheck-fixed/.test(el.className)) {
351                        fixedWords.push(el);
352                }
353        }
354        wrongWords = sps;
355        if (sps.length == 0) {
356                if (!modified) {
357                        alert(i18n["NO_ERRORS_CLOSING"]);
358                        window.close();
359                } else {
360                        alert(i18n["NO_ERRORS"]);
361                }
362                return false;
363        }
364        (currentElement = sps[0]).__msh_wordClicked(true);
365        var as = doc.getElementsByTagName("a");
366        for (var i = as.length; --i >= 0;) {
367                var a = as[i];
368                a.onclick = function() {
369                        if (confirm(i18n["CONFIRM_LINK_CLICK"] + ":\n" +
370                                    this.href + "\n" + i18n["I will open it in a new page."])) {
371                                window.open(this.href);
372                        }
373                        return false;
374                };
375        }
376        var dicts = doc.getElementById("HA-spellcheck-dictionaries");
377        if (dicts) {
378                dicts.parentNode.removeChild(dicts);
379                dicts = dicts.innerHTML.split(/,/);
380                var select = document.getElementById("v_dictionaries");
381                for (var i = select.length; --i >= 0;) {
382                        select.remove(i);
383                }
384                for (var i = 0; i < dicts.length; ++i) {
385                        var txt = dicts[i];
386                        var option = document.createElement("option");
387                        if (/^@(.*)$/.test(txt)) {
388                                txt = RegExp.$1;
389                                option.selected = true;
390                        }
391                        option.value = txt;
392                        option.appendChild(document.createTextNode(txt));
393                        select.appendChild(option);
394                }
395        }
396};
Note: See TracBrowser for help on using the repository browser.