[LON-CAPA-cvs] cvs: loncom /html/htmlarea/plugins/SpellChecker readme-tech.html spell-check-logic.cgi spell-check-style.css spell-check-ui.html spell-check-ui.js spell-checker.js /html/htmlarea/plugins/SpellChecker/lang cz.js da.js de.js en.js hu.js it.js ro.js /html/htmlarea/plugins/TableOperations table-operations.js /html/htmlarea/plugins/TableOperations/lang cz.js da.js de.js el.js en.js hu.js it.js nl.js no.js ro.js

www lon-capa-cvs@mail.lon-capa.org
Wed, 09 Jun 2004 14:04:39 -0000


This is a MIME encoded message

--www1086789879
Content-Type: text/plain

www		Wed Jun  9 10:04:39 2004 EDT

  Added files:                 
    /loncom/html/htmlarea/plugins/SpellChecker/lang	cz.js da.js de.js 
                                                   	hu.js it.js 
    /loncom/html/htmlarea/plugins/TableOperations/lang	cz.js da.js 
                                                      	de.js el.js 
                                                      	hu.js it.js 
                                                      	nl.js no.js 

  Modified files:              
    /loncom/html/htmlarea/plugins/SpellChecker	readme-tech.html 
                                              	spell-check-logic.cgi 
                                              	spell-check-style.css 
                                              	spell-check-ui.html 
                                              	spell-check-ui.js 
                                              	spell-checker.js 
    /loncom/html/htmlarea/plugins/SpellChecker/lang	en.js ro.js 
    /loncom/html/htmlarea/plugins/TableOperations	table-operations.js 
    /loncom/html/htmlarea/plugins/TableOperations/lang	en.js ro.js 
  Log:
  Plugins to go with HTMLarea RC 1
  
  
--www1086789879
Content-Type: text/plain
Content-Disposition: attachment; filename="www-20040609100439.txt"

Index: loncom/html/htmlarea/plugins/SpellChecker/readme-tech.html
diff -u loncom/html/htmlarea/plugins/SpellChecker/readme-tech.html:1.1 loncom/html/htmlarea/plugins/SpellChecker/readme-tech.html:1.2
--- loncom/html/htmlarea/plugins/SpellChecker/readme-tech.html:1.1	Wed Feb 18 03:07:15 2004
+++ loncom/html/htmlarea/plugins/SpellChecker/readme-tech.html	Wed Jun  9 10:04:38 2004
@@ -59,20 +59,22 @@
       Unicode safe.  HTML entities are expanded into their corresponding
       Unicode characters.  These characters will be matched as part of the
       word passed to Aspell.  All texts passed to Aspell are in Unicode
-      (when appropriate).  However, Aspell seems to not support Unicode
+      (when appropriate).  <strike>However, Aspell seems to not support Unicode
       yet (<a
         href="http://mail.gnu.org/archive/html/aspell-user/2000-11/msg00007.html">thread concerning Aspell and Unicode</a>).
       This mean that words containing Unicode
-      characters that are not in 0..255 are likely to be reported as "mispelled" by Aspell.
+      characters that are not in 0..255 are likely to be reported as "mispelled" by Aspell.</strike>
     </p>
 
     <p>
-      I digged the Net for a couple of hours today and I can't seem to find
-      any open-source spell checker that has Unicode support.  For this
-      reason we keep using Aspell, because it also seems to have the
-      best suggestions engine.  Unicode support will eventually be
-      implemented in Aspell.  <a href="mailto:kevin@atkinson.dhs.org">Email
-        Kevin Atkinson</a> (Aspell author and maintainer) about this ;-)
+      <strong style="font-variant: small-caps; color:
+      red;">Update:</strong> though I've never seen it mentioned
+      anywhere, it looks that Aspell <em>does</em>, in fact, speak
+      Unicode.  Or else, maybe <code>Text::Aspell</code> does
+      transparent conversion; anyway, this new version of our
+      SpellChecker plugin is, as tests show so far, fully
+      Unicode-safe... well, probably the <em>only</em> freeware
+      Web-based spell-checker which happens to have Unicode support.
     </p>
 
     <p>
@@ -96,8 +98,7 @@
 
     <ul>
       <li><a href="http://search.cpan.org/search?query=Text%3A%3AAspell&mode=all" target="_blank">Text::Aspell</a></li>
-      <li><a href="http://search.cpan.org/search?query=HTML%3A%3AParser&mode=all" target="_blank">HTML::Parser</a></li>
-      <li><a href="http://search.cpan.org/search?query=HTML%3A%3AEntities&mode=all" target="_blank">HTML::Entities</a></li>
+      <li><a href="http://search.cpan.org/search?query=XML%3A%3ADOM&mode=all" target="_blank">XML::DOM</a></li>
       <li><a href="http://search.cpan.org/search?query=CGI&mode=all" target="_blank">CGI</a></li>
     </ul>
 
@@ -105,11 +106,9 @@
       others are likely to be available by default in most Perl distributions.</p>
 
     <hr />
-    <address><a href="http://students.infoiasi.ro/~mishoo/">Mihai Bazon</a></address>
+    <address><a href="http://dynarch.com/mishoo/">Mihai Bazon</a></address>
 <!-- Created: Thu Jul 17 13:22:27 EEST 2003 -->
-<!-- hhmts start -->
-Last modified on Sun Aug 10 12:28:24 2003
-<!-- hhmts end -->
+<!-- hhmts start --> Last modified: Fri Jan 30 19:14:11 EET 2004 <!-- hhmts end -->
 <!-- doc-lang: English -->
   </body>
 </html>
Index: loncom/html/htmlarea/plugins/SpellChecker/spell-check-logic.cgi
diff -u loncom/html/htmlarea/plugins/SpellChecker/spell-check-logic.cgi:1.1 loncom/html/htmlarea/plugins/SpellChecker/spell-check-logic.cgi:1.2
--- loncom/html/htmlarea/plugins/SpellChecker/spell-check-logic.cgi:1.1	Wed Feb 18 03:07:15 2004
+++ loncom/html/htmlarea/plugins/SpellChecker/spell-check-logic.cgi	Wed Jun  9 10:04:38 2004
@@ -1,109 +1,87 @@
 #! /usr/bin/perl -w
 
 # Spell Checker Plugin for HTMLArea-3.0
-# Implementation by Mihai Bazon.  Sponsored by www.americanbible.org
+# Sponsored by www.americanbible.org
+# Implementation by Mihai Bazon, http://dynarch.com/mishoo/
 #
-# htmlArea v3.0 - Copyright (c) 2002 interactivetools.com, inc.
+# (c) dynarch.com 2003.
+# Distributed under the same terms as HTMLArea itself.
 # This notice MUST stay intact for use (see license.txt).
 #
-# A free WYSIWYG editor replacement for <textarea> fields.
-# For full source code and docs, visit http://www.interactivetools.com/
-#
-# Version 3.0 developed by Mihai Bazon for InteractiveTools.
-#	     http://students.infoiasi.ro/~mishoo
-#
-# $Id: spell-check-logic.cgi,v 1.1 2004/02/18 08:07:15 www Exp $
+# $Id: spell-check-logic.cgi,v 1.2 2004/06/09 14:04:38 www Exp $
 
 use strict;
 use utf8;
 use Encode;
 use Text::Aspell;
-use HTML::Parser;
-use HTML::Entities;
+use XML::DOM;
 use CGI;
 
-my $debug = 0;
+my $TIMER_start = undef;
+eval {
+    use Time::HiRes qw( gettimeofday tv_interval );
+    $TIMER_start = [gettimeofday()];
+};
+# use POSIX qw( locale_h );
 
-open (DEBUG, '>:encoding(UTF-8)', '> /tmp/spell-check-debug.log') if $debug;
+binmode STDIN, ':utf8';
+binmode STDOUT, ':utf8';
 
-# use Data::Dumper; # for debug only
+my $debug = 0;
 
 my $speller = new Text::Aspell;
 my $cgi = new CGI;
 
+my $total_words = 0;
+my $total_mispelled = 0;
+my $total_suggestions = 0;
+my $total_words_suggested = 0;
+
 # FIXME: report a nice error...
 die "Can't create speller!" unless $speller;
 
+my $dict = $cgi->param('dictionary') || $cgi->cookie('dictionary') || 'en';
+
 # add configurable option for this
-my $dict = $cgi->param('dictionary') || 'en_US';
 $speller->set_option('lang', $dict);
+$speller->set_option('encoding', 'UTF-8');
+#setlocale(LC_CTYPE, $dict);
 
 # ultra, fast, normal, bad-spellers
 # bad-spellers seems to cause segmentation fault
-$speller->set_option('sug-mode', 'ultra');
-
-my @replacements = ();
+$speller->set_option('sug-mode', 'normal');
 
-sub text_handler {
-    my ($offset, $length, $text, $is_cdata) = @_;
-    if ($is_cdata or $text =~ /^\s*$/) {
-        return 0;
-    }
-    # print STDERR "*** OFFSET: $offset, LENGTH: $length, $text\n";
-    $text = decode_entities($text);
-    $text =~ s/&#([0-9]+);/chr($1)/eg;
-    $text =~ s/&#x([0-9a-fA-F]+);/chr(hex $1)/eg;
-    my $repl = spellcheck($text);
-    if ($repl) {
-        push(@replacements, [ $offset, $length, $repl ]);
-    }
-}
+my %suggested_words = ();
+keys %suggested_words = 128;
 
-my $p = HTML::Parser->new
-  (api_version => 3,
-   handlers => { start => [ sub {
-                                my ($self, $tagname, $attrs) = @_;
-                                # print STDERR "\033[1;31m parsing tag: $tagname\033[0m\n";
-                                # following we skip words that have already been marked as "fixed".
-                                if ($tagname eq "span" and $attrs->{class} =~ /HA-spellcheck-fixed/) {
-                                    $self->handler(text => undef);
-                                }
-                            }, "self, tagname, attr"
-                          ],
-                 end => [ sub {
-                              my ($self, $tagname) = @_;
-                              # print STDERR "\033[1;32m END tag: $tagname\033[0m\n";
-                              $self->handler(text => \&text_handler, 'offset, length, dtext, is_cdata');
-                          }, "self, tagname"
-                        ]
-               }
-  );
-$p->handler(text => \&text_handler, 'offset, length, dtext, is_cdata');
-$p->case_sensitive(1);
-my $file_content = $cgi->param('content');
-
-if ($debug) {
-    open (FOO, '>:encoding(UTF-8)', '/tmp/spell-check-before');
-    print FOO $file_content, "\n";
-    close(FOO);
-}
+my $file_content = decode('UTF-8', $cgi->param('content'));
+$file_content = parse_with_dom($file_content);
 
-$p->parse($file_content);
-$p->eof();
+my $ck_dictionary = $cgi->cookie(-name     => 'dictionary',
+                                 -value    => $dict,
+                                 -expires  => '+30d');
+
+print $cgi->header(-type    => 'text/html; charset: utf-8',
+                   -cookie  => $ck_dictionary);
+
+my $js_suggested_words = make_js_hash(\%suggested_words);
+my $js_spellcheck_info = make_js_hash_from_array
+  ([
+    [ 'Total words'           , $total_words ],
+    [ 'Mispelled words'       , $total_mispelled . ' in dictionary \"'.$dict.'\"' ],
+    [ 'Total suggestions'     , $total_suggestions ],
+    [ 'Total words suggested' , $total_words_suggested ],
+    [ 'Spell-checked in'      , defined $TIMER_start ? (tv_interval($TIMER_start) . ' seconds') : 'n/a' ]
+   ]);
 
-foreach (reverse @replacements) {
-    substr($file_content, $_->[0], $_->[1], $_->[2]);
-}
-
-# we output UTF-8
-binmode(STDOUT, ':encoding(UTF-8)'); # apparently, this sucks.
-print "Content-type: text/html; charset: utf-8\n\n";
-print qq^
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+print qq^<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 <html>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 <link rel="stylesheet" type="text/css" media="all" href="spell-check-style.css" />
+<script type="text/javascript">
+  var suggested_words = { $js_suggested_words };
+  var spellcheck_info = { $js_spellcheck_info }; </script>
 </head>
 <body onload="window.parent.finishedSpellChecking();">^;
 
@@ -112,44 +90,121 @@
     my @dicts = $speller->dictionary_info();
     my $dictionaries = '';
     foreach my $i (@dicts) {
-        $dictionaries .= ',' . $i->{name} unless $i->{jargon};
+        next if $i->{jargon};
+        my $name = $i->{name};
+        if ($name eq $dict) {
+            $name = '@'.$name;
+        }
+        $dictionaries .= ',' . $name;
     }
     $dictionaries =~ s/^,//;
-    print qq^
-<div id="HA-spellcheck-dictionaries"
->$dictionaries</div>
-^;
-}
-
-if ($debug) {
-    open (FOO, '>:encoding(UTF-8)', '/tmp/spell-check-after');
-    print FOO $file_content, "\n";
-    close(FOO);
+    print qq^<div id="HA-spellcheck-dictionaries">$dictionaries</div>^;
 }
 
 print '</body></html>';
 
 # Perl is beautiful.
 sub spellcheck {
-    my $text = shift;
-    sub check {                 # called for each word in the text
+    my $node = shift;
+    my $doc = $node->getOwnerDocument;
+    my $check = sub {                 # called for each word in the text
         # input is in UTF-8
-        my $U_word = shift;
-        my $word = encode($speller->get_option('encoding'), $U_word);
-        print DEBUG "*$U_word* ----> |$word|\n" if $debug;
-        if ($speller->check($word)) {
-            return $U_word;      # we return the word in UTF-8
+        my $word = shift;
+        my $already_suggested = defined $suggested_words{$word};
+        ++$total_words;
+        if (!$already_suggested && $speller->check($word)) {
+            return undef;
         } else {
             # we should have suggestions; give them back to browser in UTF-8
-            my $suggestions = decode($speller->get_option('encoding'), join(',', $speller->suggest($word)));
-            my $ret = '<span class="HA-spellcheck-error">'.$U_word.'</span><span class="HA-spellcheck-suggestions">'.$suggestions.'</span>';
-            return $ret;
+            ++$total_mispelled;
+            if (!$already_suggested) {
+                # compute suggestions for this word
+                my @suggestions = $speller->suggest($word);
+                my $suggestions = decode($speller->get_option('encoding'), join(',', @suggestions));
+                $suggested_words{$word} = $suggestions;
+                ++$total_suggestions;
+                $total_words_suggested += scalar @suggestions;
+            }
+            # HA-spellcheck-error
+            my $err = $doc->createElement('span');
+            $err->setAttribute('class', 'HA-spellcheck-error');
+            my $tmp = $doc->createTextNode;
+            $tmp->setNodeValue($word);
+            $err->appendChild($tmp);
+            return $err;
+        }
+    };
+    while ($node->getNodeValue =~ /([\p{IsWord}']+)/) {
+        my $word = $1;
+        my $before = $`;
+        my $after = $';
+        my $df = &$check($word);
+        if (!$df) {
+            $before .= $word;
+        }
+        {
+            my $parent = $node->getParentNode;
+            my $n1 = $doc->createTextNode;
+            $n1->setNodeValue($before);
+            $parent->insertBefore($n1, $node);
+            $parent->insertBefore($df, $node) if $df;
+            $node->setNodeValue($after);
         }
     }
-    $text =~ s/([[:word:]']+)/check($1)/egs;
-    # $text =~ s/(\w+)/check($1)/egs;
+};
 
-    # the following is definitely what we want to use; too bad it sucks most.
-    # $text =~ s/(\p{IsWord}+)/check($1)/egs;
-    return $text;
-}
+sub check_inner_text {
+    my $node = shift;
+    my $text = '';
+    for (my $i = $node->getFirstChild; defined $i; $i = $i->getNextSibling) {
+        if ($i->getNodeType == TEXT_NODE) {
+            spellcheck($i);
+        }
+    }
+};
+
+sub parse_with_dom {
+    my ($text) = @_;
+    $text = '<spellchecker>'.$text.'</spellchecker>';
+
+    my $parser = new XML::DOM::Parser;
+    if ($debug) {
+        open(FOO, '>:utf8', '/tmp/foo');
+        print FOO $text;
+        close FOO;
+    }
+    my $doc = $parser->parse($text);
+    my $nodes = $doc->getElementsByTagName('*');
+    my $n = $nodes->getLength;
+
+    for (my $i = 0; $i < $n; ++$i) {
+        my $node = $nodes->item($i);
+        if ($node->getNodeType == ELEMENT_NODE) {
+            check_inner_text($node);
+        }
+    }
+
+    my $ret = $doc->toString;
+    $ret =~ s{<spellchecker>(.*)</spellchecker>}{$1}sg;
+    return $ret;
+};
+
+sub make_js_hash {
+    my ($hash) = @_;
+    my $js_hash = '';
+    while (my ($key, $val) = each %$hash) {
+        $js_hash .= ',' if $js_hash;
+        $js_hash .= '"'.$key.'":"'.$val.'"';
+    }
+    return $js_hash;
+};
+
+sub make_js_hash_from_array {
+    my ($array) = @_;
+    my $js_hash = '';
+    foreach my $i (@$array) {
+        $js_hash .= ',' if $js_hash;
+        $js_hash .= '"'.$i->[0].'":"'.$i->[1].'"';
+    }
+    return $js_hash;
+};
Index: loncom/html/htmlarea/plugins/SpellChecker/spell-check-style.css
diff -u loncom/html/htmlarea/plugins/SpellChecker/spell-check-style.css:1.1 loncom/html/htmlarea/plugins/SpellChecker/spell-check-style.css:1.2
--- loncom/html/htmlarea/plugins/SpellChecker/spell-check-style.css:1.1	Wed Feb 18 03:07:15 2004
+++ loncom/html/htmlarea/plugins/SpellChecker/spell-check-style.css	Wed Jun  9 10:04:38 2004
@@ -1,8 +1,8 @@
-.HA-spellcheck-error { border-bottom: 2px dotted #f00; cursor: default; }
-.HA-spellcheck-same { background-color: #ff8; color: #000; }
+.HA-spellcheck-error { border-bottom: 1px dashed #f00; cursor: default; }
+.HA-spellcheck-same { background-color: #cef; color: #000; }
 .HA-spellcheck-hover { background-color: #433; color: white; }
-.HA-spellcheck-fixed { border-bottom: 1px dotted #0b8; }
-.HA-spellcheck-current { background-color: #7be; color: #000; }
+.HA-spellcheck-fixed { border-bottom: 1px dashed #0b8; }
+.HA-spellcheck-current { background-color: #9be; color: #000; }
 .HA-spellcheck-suggestions { display: none; }
 
 #HA-spellcheck-dictionaries { display: none; }
Index: loncom/html/htmlarea/plugins/SpellChecker/spell-check-ui.html
diff -u loncom/html/htmlarea/plugins/SpellChecker/spell-check-ui.html:1.1 loncom/html/htmlarea/plugins/SpellChecker/spell-check-ui.html:1.2
--- loncom/html/htmlarea/plugins/SpellChecker/spell-check-ui.html:1.1	Wed Feb 18 03:07:15 2004
+++ loncom/html/htmlarea/plugins/SpellChecker/spell-check-ui.html	Wed Jun  9 10:04:38 2004
@@ -7,18 +7,14 @@
     "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
 
    Spell Checker Plugin for HTMLArea-3.0
-   Implementation by Mihai Bazon.  Sponsored by www.americanbible.org
+   Sponsored by www.americanbible.org
+   Implementation by Mihai Bazon, http://dynarch.com/mishoo/
   
-   htmlArea v3.0 - Copyright (c) 2003 interactivetools.com, inc.
+   (c) dynarch.com 2003.
+   Distributed under the same terms as HTMLArea itself.
    This notice MUST stay intact for use (see license.txt).
-  
-   A free WYSIWYG editor replacement for <textarea> fields.
-   For full source code and docs, visit http://www.interactivetools.com/
-  
-   Version 3.0 developed by Mihai Bazon for InteractiveTools.
-  	     http://students.infoiasi.ro/~mishoo
-  
-   $Id: spell-check-ui.html,v 1.1 2004/02/18 08:07:15 www Exp $
+
+   $Id: spell-check-ui.html,v 1.2 2004/06/09 14:04:38 www Exp $
 
 -->
 <html xmlns="http://www.w3.org/1999/xhtml">
@@ -37,7 +33,7 @@
       table { background-color: ButtonFace; color: ButtonText;
       font-family: tahoma,verdana,sans-serif; font-size: 11px; }
 
-      iframe { background-color: #fff; color: #000; }
+      iframe { background-color: #fff; color: #000; height: 100%; width: 100%; }
 
       .controls { width: 13em; }
       .controls .sectitle { /* background-color: #736c6c; color: #fff;
@@ -51,7 +47,7 @@
 
       input, select { font-family: fixed,"andale mono",monospace; }
 
-      #v_currentWord { color: #f00; font-weight: bold; font-size: 120%; }
+      #v_currentWord { color: #f00; font-weight: bold; }
       #statusbar { padding: 7px 0px 0px 5px; }
       #status { font-weight: bold; }
     </style>
@@ -61,12 +57,12 @@
   <body onload="initDocument()">
 
     <form style="display: none;" action="spell-check-logic.cgi"
-        method="post" target="framecontent"
-        accept-charset="utf-8"
-        ><input type="hidden" name="content" id="f_content"
-        /><input type="hidden" name="dictionary" id="f_dictionary"
-        /><input type="hidden" name="init" id="f_init" value="1"
-        /></form>
+          method="post" target="framecontent"
+          accept-charset="UTF-8"
+          ><input type="hidden" name="content" id="f_content"
+          /><input type="hidden" name="dictionary" id="f_dictionary"
+          /><input type="hidden" name="init" id="f_init" value="1"
+    /></form>
 
     <table style="height: 100%; width: 100%; border-collapse: collapse;" cellspacing="0" cellpadding="0">
       <tr>
@@ -80,8 +76,15 @@
       </tr>
       <tr>
         <td valign="top" class="controls">
+          <div class="secbody" style="text-align: center">
+            <button id="b_info">Info</button>
+          </div>
           <div class="sectitle">Original word</div>
-          <div class="secbody" id="v_currentWord" style="text-align: center">pliz weit ;-)</div>
+          <div class="secbody" id="v_currentWord" style="text-align:
+          center; margin-bottom: 0px;">pliz weit ;-)</div>
+          <div class="secbody" style="text-align: center">
+            <button id="b_revert">Revert</button>
+          </div>
           <div class="sectitle">Replace with</div>
           <div class="secbody">
             <input type="text" id="v_replacement" style="width: 94%; margin-left: 3%;" /><br />
Index: loncom/html/htmlarea/plugins/SpellChecker/spell-check-ui.js
diff -u loncom/html/htmlarea/plugins/SpellChecker/spell-check-ui.js:1.1 loncom/html/htmlarea/plugins/SpellChecker/spell-check-ui.js:1.2
--- loncom/html/htmlarea/plugins/SpellChecker/spell-check-ui.js:1.1	Wed Feb 18 03:07:15 2004
+++ loncom/html/htmlarea/plugins/SpellChecker/spell-check-ui.js	Wed Jun  9 10:04:38 2004
@@ -1,46 +1,43 @@
 // Spell Checker Plugin for HTMLArea-3.0
-// Implementation by Mihai Bazon.  Sponsored by www.americanbible.org
+// Sponsored by www.americanbible.org
+// Implementation by Mihai Bazon, http://dynarch.com/mishoo/
 //
-// htmlArea v3.0 - Copyright (c) 2002 interactivetools.com, inc.
+// (c) dynarch.com 2003.
+// Distributed under the same terms as HTMLArea itself.
 // This notice MUST stay intact for use (see license.txt).
 //
-// A free WYSIWYG editor replacement for <textarea> fields.
-// For full source code and docs, visit http://www.interactivetools.com/
-//
-// Version 3.0 developed by Mihai Bazon for InteractiveTools.
-//	     http://students.infoiasi.ro/~mishoo
-//
-// $Id: spell-check-ui.js,v 1.1 2004/02/18 08:07:15 www Exp $
+// $Id: spell-check-ui.js,v 1.2 2004/06/09 14:04:38 www Exp $
 
 // internationalization file was already loaded in parent ;-)
 var SpellChecker = window.opener.SpellChecker;
 var i18n = SpellChecker.I18N;
 
-var is_ie = window.opener.HTMLArea.is_ie;
+var HTMLArea = window.opener.HTMLArea;
+var is_ie = HTMLArea.is_ie;
 var editor = SpellChecker.editor;
 var frame = null;
 var currentElement = null;
 var wrongWords = null;
 var modified = false;
 var allWords = {};
+var fixedWords = [];
+var suggested_words = {};
 
 function makeCleanDoc(leaveFixed) {
 	// document.getElementById("status").innerHTML = 'Please wait: rendering valid HTML';
-	for (var i in wrongWords) {
-		var el = wrongWords[i];
+	var words = wrongWords.concat(fixedWords);
+	for (var i = words.length; --i >= 0;) {
+		var el = words[i];
 		if (!(leaveFixed && /HA-spellcheck-fixed/.test(el.className))) {
 			el.parentNode.insertBefore(el.firstChild, el);
-			el.parentNode.removeChild(el.nextSibling);
 			el.parentNode.removeChild(el);
-		} else {
+		} else
 			el.className = "HA-spellcheck-fixed";
-			el.parentNode.removeChild(el.nextSibling);
-		}
 	}
 	// we should use innerHTML here, but IE6's implementation fucks up the
 	// HTML to such extent that our poor Perl parser doesn't understand it
 	// anymore.
-	return window.opener.HTMLArea.getHTML(frame.contentWindow.document.body, leaveFixed);
+	return window.opener.HTMLArea.getHTML(frame.contentWindow.document.body, false, editor);
 };
 
 function recheckClicked() {
@@ -71,13 +68,15 @@
 
 function replaceWord(el) {
 	var replacement = document.getElementById("v_replacement").value;
-	modified = (el.innerHTML != replacement);
+	var this_word_modified = (el.innerHTML != replacement);
+	if (this_word_modified)
+		modified = true;
 	if (el) {
 		el.className = el.className.replace(/\s*HA-spellcheck-(hover|fixed)\s*/g, " ");
 	}
 	el.className += " HA-spellcheck-fixed";
 	el.__msh_fixed = true;
-	if (!modified) {
+	if (!this_word_modified) {
 		return false;
 	}
 	el.innerHTML = replacement;
@@ -97,7 +96,14 @@
 		index = 0;
 		alert(i18n["Finished list of mispelled words"]);
 	}
-	wrongWords[index].onclick();
+	wrongWords[index].__msh_wordClicked(true);
+	return false;
+};
+
+function revertClicked() {
+	document.getElementById("v_replacement").value = currentElement.__msh_origWord;
+	replaceWord(currentElement);
+	currentElement.className = "HA-spellcheck-error HA-spellcheck-current";
 	return false;
 };
 
@@ -170,7 +176,7 @@
 	modified = false;
 	frame = document.getElementById("i_framecontent");
 	var field = document.getElementById("f_content");
-	field.value = editor.getHTML();
+	field.value = HTMLArea.getHTML(editor._doc.body, false, editor);
 	field.form.submit();
 	document.getElementById("f_init").value = "0";
 
@@ -192,6 +198,8 @@
 	document.getElementById("b_ignore").onclick = ignoreClicked;
 	document.getElementById("b_ignall").onclick = ignoreAllClicked;
 	document.getElementById("b_recheck").onclick = recheckClicked;
+	document.getElementById("b_revert").onclick = revertClicked;
+	document.getElementById("b_info").onclick = displayInfo;
 
 	document.getElementById("b_ok").onclick = saveClicked;
 	document.getElementById("b_cancel").onclick = cancelClicked;
@@ -202,7 +210,30 @@
 	};
 };
 
-function wordClicked() {
+function getAbsolutePos(el) {
+	var r = { x: el.offsetLeft, y: el.offsetTop };
+	if (el.offsetParent) {
+		var tmp = getAbsolutePos(el.offsetParent);
+		r.x += tmp.x;
+		r.y += tmp.y;
+	}
+	return r;
+};
+
+function wordClicked(scroll) {
+	var self = this;
+	if (scroll) (function() {
+		var pos = getAbsolutePos(self);
+		var ws = { x: frame.offsetWidth - 4,
+			   y: frame.offsetHeight - 4 };
+		var wp = { x: frame.contentWindow.document.body.scrollLeft,
+			   y: frame.contentWindow.document.body.scrollTop };
+		pos.x -= Math.round(ws.x/2);
+		if (pos.x < 0) pos.x = 0;
+		pos.y -= Math.round(ws.y/2);
+		if (pos.y < 0) pos.y = 0;
+		frame.contentWindow.scrollTo(pos.x, pos.y);
+	})();
 	if (currentElement) {
 		var a = allWords[currentElement.__msh_origWord];
 		currentElement.className = currentElement.className.replace(/\s*HA-spellcheck-current\s*/g, " ");
@@ -222,8 +253,8 @@
 			el.className += " HA-spellcheck-same";
 		}
 	}
-	document.getElementById("b_replall").disabled = (a.length <= 1);
-	document.getElementById("b_ignall").disabled = (a.length <= 1);
+	// document.getElementById("b_replall").disabled = (a.length <= 1);
+	// document.getElementById("b_ignall").disabled = (a.length <= 1);
 	var txt;
 	if (a.length == 1) {
 		txt = "one occurrence";
@@ -232,14 +263,17 @@
 	} else {
 		txt = a.length + " occurrences";
 	}
+	var suggestions = suggested_words[this.__msh_origWord];
+	if (suggestions)
+		suggestions = suggestions.split(/,/);
+	else
+		suggestions = [];
+	var select = document.getElementById("v_suggestions");
 	document.getElementById("statusbar").innerHTML = "Found " + txt +
 		' for word "<b>' + currentElement.__msh_origWord + '</b>"';
-	var select = document.getElementById("v_suggestions");
 	for (var i = select.length; --i >= 0;) {
 		select.remove(i);
 	}
-	var suggestions;
-	suggestions = this.nextSibling.firstChild.data.split(/,/);
 	for (var i = 0; i < suggestions.length; ++i) {
 		var txt = suggestions[i];
 		var option = document.createElement("option");
@@ -254,6 +288,8 @@
 	} else {
 		document.getElementById("v_replacement").value = this.innerHTML;
 	}
+	select.style.display = "none";
+	select.style.display = "block";
 	return false;
 };
 
@@ -265,11 +301,27 @@
 	this.className = this.className.replace(/\s*HA-spellcheck-hover\s*/g, " ");
 };
 
+function displayInfo() {
+	var info = frame.contentWindow.spellcheck_info;
+	if (!info)
+		alert("No information available");
+	else {
+		var txt = "** Document information **";
+		for (var i in info) {
+			txt += "\n" + i + " : " + info[i];
+		}
+		alert(txt);
+	}
+	return false;
+};
+
 function finishedSpellChecking() {
 	// initialization of global variables
 	currentElement = null;
 	wrongWords = null;
 	allWords = {};
+	fixedWords = [];
+	suggested_words = frame.contentWindow.suggested_words;
 
 	document.getElementById("status").innerHTML = "HTMLArea Spell Checker (<a href='readme-tech.html' target='_blank' title='Technical information'>info</a>)";
 	var doc = frame.contentWindow.document;
@@ -280,7 +332,12 @@
                 var el = spans[i];
                 if (/HA-spellcheck-error/.test(el.className)) {
                         sps.push(el);
-			el.onclick = wordClicked;
+			el.__msh_wordClicked = wordClicked;
+			el.onclick = function(ev) {
+				ev || (ev = window.event);
+				ev && HTMLArea._stopEvent(ev);
+				return this.__msh_wordClicked(false);
+			};
 			el.onmouseover = wordMouseOver;
 			el.onmouseout = wordMouseOut;
 			el.__msh_id = id++;
@@ -291,7 +348,9 @@
 			} else {
 				allWords[txt].push(el);
 			}
-                }
+                } else if (/HA-spellcheck-fixed/.test(el.className)) {
+			fixedWords.push(el);
+		}
         }
 	wrongWords = sps;
 	if (sps.length == 0) {
@@ -303,7 +362,7 @@
 		}
 		return false;
 	}
-	(currentElement = sps[0]).onclick();
+	(currentElement = sps[0]).__msh_wordClicked(true);
 	var as = doc.getElementsByTagName("a");
 	for (var i = as.length; --i >= 0;) {
 		var a = as[i];
@@ -326,6 +385,10 @@
 		for (var i = 0; i < dicts.length; ++i) {
 			var txt = dicts[i];
 			var option = document.createElement("option");
+			if (/^@(.*)$/.test(txt)) {
+				txt = RegExp.$1;
+				option.selected = true;
+			}
 			option.value = txt;
 			option.appendChild(document.createTextNode(txt));
 			select.appendChild(option);
Index: loncom/html/htmlarea/plugins/SpellChecker/spell-checker.js
diff -u loncom/html/htmlarea/plugins/SpellChecker/spell-checker.js:1.1 loncom/html/htmlarea/plugins/SpellChecker/spell-checker.js:1.2
--- loncom/html/htmlarea/plugins/SpellChecker/spell-checker.js:1.1	Wed Feb 18 03:07:15 2004
+++ loncom/html/htmlarea/plugins/SpellChecker/spell-checker.js	Wed Jun  9 10:04:38 2004
@@ -1,16 +1,12 @@
 // Spell Checker Plugin for HTMLArea-3.0
-// Implementation by Mihai Bazon.  Sponsored by www.americanbible.org
+// Sponsored by www.americanbible.org
+// Implementation by Mihai Bazon, http://dynarch.com/mishoo/
 //
-// htmlArea v3.0 - Copyright (c) 2002 interactivetools.com, inc.
+// (c) dynarch.com 2003.
+// Distributed under the same terms as HTMLArea itself.
 // This notice MUST stay intact for use (see license.txt).
 //
-// A free WYSIWYG editor replacement for <textarea> fields.
-// For full source code and docs, visit http://www.interactivetools.com/
-//
-// Version 3.0 developed by Mihai Bazon for InteractiveTools.
-//	     http://students.infoiasi.ro/~mishoo
-//
-// $Id: spell-checker.js,v 1.1 2004/02/18 08:07:15 www Exp $
+// $Id: spell-checker.js,v 1.2 2004/06/09 14:04:38 www Exp $
 
 function SpellChecker(editor) {
 	this.editor = editor;
@@ -28,7 +24,7 @@
 			toolbar.push("separator");
 		} else {
 			var id = "SC-" + btn[0];
-			cfg.registerButton(id, tt[id], "plugins/SpellChecker/img/" + btn[0] + ".gif", false,
+			cfg.registerButton(id, tt[id], editor.imgURL(btn[0] + ".gif", "SpellChecker"), false,
 					   function(editor, id) {
 						   // dispatch button press event
 						   self.buttonPress(editor, id);
@@ -42,6 +38,17 @@
 	}
 };
 
+SpellChecker._pluginInfo = {
+	name          : "SpellChecker",
+	version       : "1.0",
+	developer     : "Mihai Bazon",
+	developer_url : "http://dynarch.com/mishoo/",
+	c_owner       : "Mihai Bazon",
+	sponsor       : "American Bible Society",
+	sponsor_url   : "http://www.americanbible.org",
+	license       : "htmlArea"
+};
+
 SpellChecker.btnList = [
 	null, // separator
 	["spell-check"]
@@ -52,15 +59,15 @@
 	    case "SC-spell-check":
 		SpellChecker.editor = editor;
 		SpellChecker.init = true;
-		var uiurl = editor.config.editorURL + "plugins/SpellChecker/spell-check-ui.html";
+		var uiurl = _editor_url + "plugins/SpellChecker/spell-check-ui.html";
 		var win;
 		if (HTMLArea.is_ie) {
 			win = window.open(uiurl, "SC_spell_checker",
 					  "toolbar=no,location=no,directories=no,status=no,menubar=no," +
-					  "scrollbars=no,resizable=yes,width=600,height=400");
+					  "scrollbars=no,resizable=yes,width=600,height=450");
 		} else {
 			win = window.open(uiurl, "SC_spell_checker",
-					  "toolbar=no,menubar=no,personalbar=no,width=600,height=400," +
+					  "toolbar=no,menubar=no,personalbar=no,width=600,height=450," +
 					  "scrollbars=no,resizable=yes");
 		}
 		win.focus();
Index: loncom/html/htmlarea/plugins/SpellChecker/lang/en.js
diff -u loncom/html/htmlarea/plugins/SpellChecker/lang/en.js:1.1 loncom/html/htmlarea/plugins/SpellChecker/lang/en.js:1.2
--- loncom/html/htmlarea/plugins/SpellChecker/lang/en.js:1.1	Wed Feb 18 03:07:16 2004
+++ loncom/html/htmlarea/plugins/SpellChecker/lang/en.js	Wed Jun  9 10:04:38 2004
@@ -1,7 +1,7 @@
 // I18N constants
 
 // LANG: "en", ENCODING: UTF-8 | ISO-8859-1
-// Author: Mihai Bazon, <mishoo@infoiasi.ro>
+// Author: Mihai Bazon, http://dynarch.com/mishoo
 
 // FOR TRANSLATORS:
 //
@@ -31,6 +31,7 @@
 	"Replace all"                           : "Replace all",
 	"Replace with"                          : "Replace with",
 	"Replace"                               : "Replace",
+	"Revert"                                : "Revert",
 	"SC-spell-check"                        : "Spell-check",
 	"Suggestions"                           : "Suggestions",
 	"pliz weit ;-)"                         : "pliz weit ;-)"
Index: loncom/html/htmlarea/plugins/SpellChecker/lang/ro.js
diff -u loncom/html/htmlarea/plugins/SpellChecker/lang/ro.js:1.1 loncom/html/htmlarea/plugins/SpellChecker/lang/ro.js:1.2
--- loncom/html/htmlarea/plugins/SpellChecker/lang/ro.js:1.1	Wed Feb 18 03:07:16 2004
+++ loncom/html/htmlarea/plugins/SpellChecker/lang/ro.js	Wed Jun  9 10:04:38 2004
@@ -1,7 +1,7 @@
 // I18N constants
 
 // LANG: "ro", ENCODING: UTF-8
-// Author: Mihai Bazon, <mishoo@infoiasi.ro>
+// Author: Mihai Bazon, http://dynarch.com/mishoo
 
 // FOR TRANSLATORS:
 //
Index: loncom/html/htmlarea/plugins/TableOperations/table-operations.js
diff -u loncom/html/htmlarea/plugins/TableOperations/table-operations.js:1.1 loncom/html/htmlarea/plugins/TableOperations/table-operations.js:1.2
--- loncom/html/htmlarea/plugins/TableOperations/table-operations.js:1.1	Wed Feb 18 03:07:16 2004
+++ loncom/html/htmlarea/plugins/TableOperations/table-operations.js	Wed Jun  9 10:04:38 2004
@@ -8,9 +8,9 @@
 // For full source code and docs, visit http://www.interactivetools.com/
 //
 // Version 3.0 developed by Mihai Bazon for InteractiveTools.
-//	     http://students.infoiasi.ro/~mishoo
+//   http://dynarch.com/mishoo
 //
-// $Id: table-operations.js,v 1.1 2004/02/18 08:07:16 www Exp $
+// $Id: table-operations.js,v 1.2 2004/06/09 14:04:38 www Exp $
 
 // Object that will encapsulate all the table operations provided by
 // HTMLArea-3.0 (except "insert table" which is included in the main file)
@@ -30,7 +30,7 @@
 			toolbar.push("separator");
 		} else {
 			var id = "TO-" + btn[0];
-			cfg.registerButton(id, tt[id], "plugins/TableOperations/img/" + btn[0] + ".gif", false,
+			cfg.registerButton(id, tt[id], editor.imgURL(btn[0] + ".gif", "TableOperations"), false,
 					   function(editor, id) {
 						   // dispatch button press event
 						   self.buttonPress(editor, id);
@@ -43,6 +43,17 @@
 	cfg.toolbar.push(toolbar);
 };
 
+TableOperations._pluginInfo = {
+	name          : "TableOperations",
+	version       : "1.0",
+	developer     : "Mihai Bazon",
+	developer_url : "http://dynarch.com/mishoo/",
+	c_owner       : "Mihai Bazon",
+	sponsor       : "Zapatec Inc.",
+	sponsor_url   : "http://www.bloki.com",
+	license       : "htmlArea"
+};
+
 /************************
  * UTILITIES
  ************************/
Index: loncom/html/htmlarea/plugins/TableOperations/lang/en.js
diff -u loncom/html/htmlarea/plugins/TableOperations/lang/en.js:1.1 loncom/html/htmlarea/plugins/TableOperations/lang/en.js:1.2
--- loncom/html/htmlarea/plugins/TableOperations/lang/en.js:1.1	Wed Feb 18 03:07:16 2004
+++ loncom/html/htmlarea/plugins/TableOperations/lang/en.js	Wed Jun  9 10:04:38 2004
@@ -1,7 +1,7 @@
 // I18N constants
 
 // LANG: "en", ENCODING: UTF-8 | ISO-8859-1
-// Author: Mihai Bazon, <mishoo@infoiasi.ro>
+// Author: Mihai Bazon, http://dynarch.com/mishoo
 
 // FOR TRANSLATORS:
 //
Index: loncom/html/htmlarea/plugins/TableOperations/lang/ro.js
diff -u loncom/html/htmlarea/plugins/TableOperations/lang/ro.js:1.1 loncom/html/htmlarea/plugins/TableOperations/lang/ro.js:1.2
--- loncom/html/htmlarea/plugins/TableOperations/lang/ro.js:1.1	Wed Feb 18 03:07:16 2004
+++ loncom/html/htmlarea/plugins/TableOperations/lang/ro.js	Wed Jun  9 10:04:38 2004
@@ -1,7 +1,7 @@
 // I18N constants
 
 // LANG: "ro", ENCODING: UTF-8
-// Author: Mihai Bazon, <mishoo@infoiasi.ro>
+// Author: Mihai Bazon, http://dynarch.com/mishoo
 
 // FOR TRANSLATORS:
 //

Index: loncom/html/htmlarea/plugins/SpellChecker/lang/cz.js
+++ loncom/html/htmlarea/plugins/SpellChecker/lang/cz.js
// I18N constants

// LANG: "cz", ENCODING: UTF-8 | ISO-8859-2
// Author: Jiri Löw, <jirilow@jirilow.com>

// FOR TRANSLATORS:
//
//   1. PLEASE PUT YOUR CONTACT INFO IN THE ABOVE LINE
//      (at least a valid email address)
//
//   2. PLEASE TRY TO USE UTF-8 FOR ENCODING;
//      (if this is not possible, please include a comment
//       that states what encoding is necessary.)

SpellChecker.I18N = {
	"CONFIRM_LINK_CLICK"                    : "Prosím potvrďte otevření tohoto odkazu",
	"Cancel"                                : "Zrušit",
	"Dictionary"                            : "Slovník",
	"Finished list of mispelled words"      : "Dokončen seznam chybných slov",
	"I will open it in a new page."         : "Bude otevřen jej v nové stránce.",
	"Ignore all"                            : "Ignorovat vše",
	"Ignore"                                : "Ignorovat",
	"NO_ERRORS"                             : "Podle zvoleného slovníku nebyla nalezena žádná chybná slova.",
	"NO_ERRORS_CLOSING"                     : "Kontrola správnosti slov dokončena, nebyla nalezena žádná chybná slova. Ukončování ...",
	"OK"                                    : "OK",
	"Original word"                         : "Původní slovo",
	"Please wait.  Calling spell checker."  : "Prosím čekejte. Komunikuace s kontrolou správnosti slov.",
	"Please wait: changing dictionary to"   : "Prosím čekejte: změna adresáře na",
	"QUIT_CONFIRMATION"                     : "Změny budou zrušeny a kontrola správnosti slov ukončena. Prosím potvrďte.",
	"Re-check"                              : "Překontrolovat",
	"Replace all"                           : "Zaměnit všechno",
	"Replace with"                          : "Zaměnit za",
	"Replace"                               : "Zaměnit",
	"SC-spell-check"                        : "Kontrola správnosti slov",
	"Suggestions"                           : "Doporučení",
	"pliz weit ;-)"                         : "strpení prosím ;-)"
};

Index: loncom/html/htmlarea/plugins/SpellChecker/lang/da.js
+++ loncom/html/htmlarea/plugins/SpellChecker/lang/da.js
// I18N constants

// LANG: "en", ENCODING: UTF-8 | ISO-8859-1
// Author: Steen Sønderup, <steen@soenderup.com>

// FOR TRANSLATORS:
//
//   1. PLEASE PUT YOUR CONTACT INFO IN THE ABOVE LINE
//      (at least a valid email address)
//
//   2. PLEASE TRY TO USE UTF-8 FOR ENCODING;
//      (if this is not possible, please include a comment
//       that states what encoding is necessary.)

SpellChecker.I18N = {
	"CONFIRM_LINK_CLICK"                    : "Vil du følge dette link?",
	"Cancel"                                : "Anuler",
	"Dictionary"                            : "Ordbog",
	"Finished list of mispelled words"      : "Listen med stavefejl er gennemgået",
	"I will open it in a new page."         : "Jeg vil åbne det i en ny side.",
	"Ignore all"                            : "Ignorer alle",
	"Ignore"                                : "Ignorer",
	"NO_ERRORS"                             : "Der blev ikke fundet nogle stavefejl med den valgte ordbog.",
	"NO_ERRORS_CLOSING"                     : "Stavekontrollen er gennemført, der blev ikke fundet nogle stavefejl.  Lukker...",
	"OK"                                    : "OK",
	"Original word"                         : "Oprindeligt ord",
	"Please wait.  Calling spell checker."  : "Vent venligst.  Henter stavekontrol.",
	"Please wait: changing dictionary to"   : "Vent venligst: skifter ordbog til",
	"QUIT_CONFIRMATION"                     : "Alle dine ændringer vil gå tabt, vil du fortsætte?",
	"Re-check"                              : "Tjek igen",
	"Replace all"                           : "Erstat alle",
	"Replace with"                          : "Erstat med",
	"Replace"                               : "Erstat",
	"SC-spell-check"                        : "Stavekontrol",
	"Suggestions"                           : "Forslag",
	"pliz weit ;-)"                         : "Vent venligst"
};

Index: loncom/html/htmlarea/plugins/SpellChecker/lang/de.js
+++ loncom/html/htmlarea/plugins/SpellChecker/lang/de.js
// I18N constants

// LANG: "en", ENCODING: UTF-8 | ISO-8859-1
// Author: Broxx, <broxx@broxx.com>

SpellChecker.I18N = {
	"CONFIRM_LINK_CLICK"                    : "Wollen Sie diesen Link oeffnen",
	"Cancel"                                : "Abbrechen",
	"Dictionary"                            : "Woerterbuch",
	"Finished list of mispelled words"      : "Liste der nicht bekannten Woerter",
	"I will open it in a new page."         : "Wird auf neuer Seite geoeffnet",
	"Ignore all"                            : "Alle ignorieren",
	"Ignore"                                : "Ignorieren",
	"NO_ERRORS"                             : "Keine falschen Woerter mit gewaehlten Woerterbuch gefunden",
	"NO_ERRORS_CLOSING"                     : "Rechtsschreibpruefung wurde ohne Fehler fertiggestellt.  Wird nun geschlossen...",
	"OK"                                    : "OK",
	"Original word"                         : "Original Wort",
	"Please wait.  Calling spell checker."  : "Bitte warten.  Woerterbuch wird durchsucht.",
	"Please wait: changing dictionary to"   : "Bitte warten: Woerterbuch wechseln zu",
	"QUIT_CONFIRMATION"                     : "Aenderungen werden nicht uebernommen.  Bitte bestaettigen.",
	"Re-check"                              : "Neuueberpruefung",
	"Replace all"                           : "Alle ersetzen",
	"Replace with"                          : "Ersetzen mit",
	"Replace"                               : "Ersetzen",
	"SC-spell-check"                        : "Ueberpruefung",
	"Suggestions"                           : "Vorschlag",
	"pliz weit ;-)"                         : "bittsche wartn ;-)"
};

Index: loncom/html/htmlarea/plugins/SpellChecker/lang/hu.js
+++ loncom/html/htmlarea/plugins/SpellChecker/lang/hu.js
// I18N constants

// LANG: "hu", ENCODING: UTF-8
// Author: Miklós Somogyi, <somogyine@vnet.hu>

// FOR TRANSLATORS:
//
//   1. PLEASE PUT YOUR CONTACT INFO IN THE ABOVE LINE
//      (at least a valid email address)
//
//   2. PLEASE TRY TO USE UTF-8 FOR ENCODING;
//      (if this is not possible, please include a comment
//       that states what encoding is necessary.)

SpellChecker.I18N = {
	"CONFIRM_LINK_CLICK"                    : "Megerősítés",
	"Cancel"                                : "Mégsem",
	"Dictionary"                            : "Szótár",
	"Finished list of mispelled words"      : "A tévesztett szavak listájának vége",
	"I will open it in a new page."         : "Megnyitás új lapon",
	"Ignore all"                            : "Minden elvetése",
	"Ignore"                                : "Elvetés",
	"NO_ERRORS"                             : "A választott szótár szerint nincs tévesztett szó.",
	"NO_ERRORS_CLOSING"                     : "A helyesírásellenőrzés kész, tévesztett szó nem fordult elő. Bezárás...",
	"OK"                                    : "Rendben",
	"Original word"                         : "Eredeti szó",
	"Please wait.  Calling spell checker."  : "Kis türelmet, a helyesírásellenőrző hívása folyamatban.",
	"Please wait: changing dictionary to"   : "Kis türelmet, szótár cseréje",
	"QUIT_CONFIRMATION"                     : "Kilépés a változások eldobásával. Jóváhagyja?",
	"Re-check"                              : "Újraellenőrzés",
	"Replace all"                           : "Mind cseréje",
	"Replace with"                          : "Csere a következőre:",
	"Replace"                               : "Csere",
	"SC-spell-check"                        : "Helyesírásellenőrzés",
	"Suggestions"                           : "Tippek",
	"pliz weit ;-)"                         : "Kis türelmet ;-)"
};

Index: loncom/html/htmlarea/plugins/SpellChecker/lang/it.js
+++ loncom/html/htmlarea/plugins/SpellChecker/lang/it.js
// I18N constants

// LANG: "it", ENCODING: UTF-8 | ISO-8859-1
// Author: Fabio Rotondo, <fabio@rotondo.it>

SpellChecker.I18N = {
	"CONFIRM_LINK_CLICK"                    : "Devi confermare l'apertura di questo link",
	"Cancel"                                : "Annulla",
	"Dictionary"                            : "Dizionario",
	"Finished list of mispelled words"      : "La lista delle parole scritte male è terminata",
	"I will open it in a new page."         : "Lo aprirò in una nuova pagina.",
	"Ignore all"                            : "Ignora sempre",
	"Ignore"                                : "Ignora",
	"NO_ERRORS"                             : "Non sono state trovate parole scritte male con il dizionario selezionato.",
	"NO_ERRORS_CLOSING"                     : "Controllo completato, non sono state trovate parole scritte male. Sto chiudendo...",
	"OK"                                    : "OK",
	"Original word"                         : "Parola originale",
	"Please wait.  Calling spell checker."  : "Attendere.  Sto invocando lo Spell Checker.",
	"Please wait: changing dictionary to"   : "Attendere. Cambio il dizionario in",
	"QUIT_CONFIRMATION"                     : "Questo annullerà le modifiche e chiuderà lo Spell Checker. Conferma.",
	"Re-check"                              : "Ricontrolla",
	"Replace all"                           : "Sostituisci sempre",
	"Replace with"                          : "Stostituisci con",
	"Replace"                               : "Sostituisci",
	"SC-spell-check"                        : "Spell-check",
	"Suggestions"                           : "Suggerimenti",
	"pliz weit ;-)"                         : "Attendere Prego ;-)"
};

Index: loncom/html/htmlarea/plugins/TableOperations/lang/cz.js
+++ loncom/html/htmlarea/plugins/TableOperations/lang/cz.js
// I18N constants

// LANG: "cz", ENCODING: UTF-8 | ISO-8859-2
// Author: Jiri Löw, <jirilow@jirilow.com>

// FOR TRANSLATORS:
//
//   1. PLEASE PUT YOUR CONTACT INFO IN THE ABOVE LINE
//      (at least a valid email address)
//
//   2. PLEASE TRY TO USE UTF-8 FOR ENCODING;
//      (if this is not possible, please include a comment
//       that states what encoding is necessary.)

TableOperations.I18N = {
	"Align":					  "Zarovnání",
	"All four sides":				  "Všechny čtyři strany",
	"Background":					  "Pozadí",
	"Baseline":                                       "Základní linka",
	"Border":					  "Obrys",
	"Borders":					  "Obrysy",
	"Bottom":                                         "Dolů",
	"CSS Style":					  "Kaskádové styly (CSS)",
	"Caption":					  "Titulek",
	"Cell Properties":                                "Vlastnosti buňky",
	"Center":					  "Na střed",
	"Char":                                           "Znak",
	"Collapsed borders":                              "Stlačené okraje",
	"Color":					  "Barva",
	"Description":					  "Popis",
	"FG Color":					  "Barva popředí",
	"Float":                                          "Obtékání",
	"Frames":					  "Rámečky",
	"Height":                                         "Výška",
	"How many columns would you like to merge?":      "Kolik sloupců si přejete spojit?",
	"How many rows would you like to merge?":         "Kolik řádků si přejete spojit?",
	"Image URL":					  "Adresa obrázku",
	"Justify":                                        "Do stran",
	"Layout":					  "Rozložení",
	"Left":						  "Vlevo",
	"Margin":                                         "Okraj",
	"Middle":                                         "Na střed",
	"No rules":					  "Žádné čáry",
	"No sides":					  "Žádné strany",
	"None":                                           "Žádné",
	"Padding":					  "Odsazování",
	"Please click into some cell":                    "Prosím klikněte do některé buňky",
	"Right":					  "Vpravo",
	"Row Properties":                                 "Vlastnosti řádku",
	"Rules will appear between all rows and columns": "Čáry mezi všemi řádky i sloupci",
	"Rules will appear between columns only":	  "Čáry pouze mezi sloupci",
	"Rules will appear between rows only":		  "Čáry pouze mezi řádky",
	"Rules":					  "Čáry",
	"Spacing and padding":                            "Mezery a odsazování",
	"Spacing":					  "Mezery",
	"Summary":					  "Shrnutí",
	"TO-cell-delete":				  "Smazat buňku",
	"TO-cell-insert-after":				  "Vložit buňku za",
	"TO-cell-insert-before":			  "Vložit buňku před",
	"TO-cell-merge":				  "Spojit buňky",
	"TO-cell-prop":					  "Vlastnosti buňky",
	"TO-cell-split":				  "Rozdělit buňku",
	"TO-col-delete":				  "Smazat sloupec",
	"TO-col-insert-after":				  "Vložit sloupec za",
	"TO-col-insert-before":				  "Vložit sloupec před",
	"TO-col-split":					  "Rozdělit sloupec",
	"TO-row-delete":				  "Smazat řádek",
	"TO-row-insert-above":				  "Smazat řádek nad",
	"TO-row-insert-under":				  "Smazat řádek pod",
	"TO-row-prop":					  "Vlastnosti řádku",
	"TO-row-split":					  "Rozdělit řádek",
	"TO-table-prop":				  "Vlastnosti tabulky",
	"Table Properties":				  "Vlastnosti tabulky",
	"Text align":                                     "Zarovnání textu",
	"The bottom side only":				  "Pouze spodní strana",
	"The left-hand side only":			  "Pouze levá strana",
	"The right and left sides only":		  "Pouze levá a pravá strana",
	"The right-hand side only":			  "Pouze pravá strana",
	"The top and bottom sides only":		  "Pouze horní a dolní strana",
	"The top side only":				  "Pouze horní strana",
	"Top":                                            "Nahoru",	
	"Unset color":                                    "Zrušit barvu",
	"Vertical align":                                 "Svislé zarovnání",
	"Width":					  "Šířka",
	"not-del-last-cell":				  "HTMLArea zbaběle odmítá smazat poslední buňku v řádku.",
	"not-del-last-col":				  "HTMLArea zbaběle odmítá smazat poslední sloupec v tabulce.",
	"not-del-last-row":				  "HTMLArea zbaběle odmítá smazat poslední řádek v tabulce.",
	"percent":					  "procent",
	"pixels":					  "pixelů"
};

Index: loncom/html/htmlarea/plugins/TableOperations/lang/da.js
+++ loncom/html/htmlarea/plugins/TableOperations/lang/da.js
// I18N constants

// LANG: "da", ENCODING: UTF-8 | ISO-8859-1
// Author: Steen Sønderup, <steen@soenderup.com>

// FOR TRANSLATORS:
//
//   1. PLEASE PUT YOUR CONTACT INFO IN THE ABOVE LINE
//      (at least a valid email address)
//
//   2. PLEASE TRY TO USE UTF-8 FOR ENCODING;
//      (if this is not possible, please include a comment
//       that states what encoding is necessary.)

TableOperations.I18N = {
	"Align":											"Placer",
	"All four sides":									"Alle fire sider",
	"Background":										"Baggrund",
	"Baseline":											"Bundlinie",
	"Border":											"Kant",
	"Borders":											"Kanter",
	"Bottom":											"Bund",
	"CSS Style":										"Stil [CSS]",
	"Caption":											"Titel",
	"Cell Properties":									"Celle egenskaber",
	"Center":											"Centrer",
	"Char":												"Plads",
	"Collapsed borders":								"Sammensmelt rammer",
	"Color":											"Farve",
	"Description":										"Beskrivelse",
	"FG Color":											"Font farve",
	"Float":											"Justering",
	"Frames":											"Udvendig",
	"Height":											"Højde",
	"How many columns would you like to merge?":		"Hvor mange kollonner vil du samle?",
	"How many rows would you like to merge?":			"Hvor mange rækker vil du samle?",
	"Image URL":										"Billede URL",
	"Justify":											"Lige margener",
	"Layout":											"Opsætning",
	"Left":												"Venstre",
	"Margin":											"Margen",
	"Middle":											"Centrer",
	"No rules":											"Ingen rammer",
	"No sides":											"Ingen sider",
	"None":												"Ingen",
	"Padding":											"Margen",
	"Please click into some cell":						"Klik på en celle",
	"Right":											"Højre",
	"Row Properties":									"Række egenskaber",
	"Rules will appear between all rows and columns":	"Rammer mellem rækker og kolonner",
	"Rules will appear between columns only":			"Kun rammer mellem kolonner",
	"Rules will appear between rows only":				"Kun rammer mellem rækker",
	"Rules":											"Invendig",
	"Spacing and padding":								"Afstand og margen",
	"Spacing":											"Afstand",
	"Summary":											"Beskrivelse",
	"TO-cell-delete":									"Slet celle",
	"TO-cell-insert-after":								"Indsæt celle efter",
	"TO-cell-insert-before":							"Indsæt celle før",
	"TO-cell-merge":									"Sammensæt celler",
	"TO-cell-prop":										"Celle egenskaber",
	"TO-cell-split":									"Opdel celle",
	"TO-col-delete":									"Slet kollonne",
	"TO-col-insert-after":								"Indsæt kolonne efter",
	"TO-col-insert-before":								"Indsæt kolonne før",
	"TO-col-split":										"Opdel kolonne",
	"TO-row-delete":									"Slet række",
	"TO-row-insert-above":								"Indsæt række før",
	"TO-row-insert-under":								"Indsæt række efter",
	"TO-row-prop":										"Række egenskaber",
	"TO-row-split":										"Opdel række",
	"TO-table-prop":									"Tabel egenskaber",
	"Table Properties":									"Tabel egenskaber",
	"Text align":										"Tekst",
	"The bottom side only":								"Kun i bunden",
	"The left-hand side only":							"Kun i højre side",
	"The right and left sides only":					"Kun i siderne",
	"The right-hand side only":							"Kun i venstre side",
	"The top and bottom sides only":					"Kun i top og bund",
	"The top side only":								"Kun i toppen",
	"Top":												"Top",	
	"Unset color":										"Farve ikke valgt",
	"Vertical align":									"Vertikal placering",
	"Width":											"Bredde",
	"not-del-last-cell":								"Du kan ikke slette den sidste celle i en række.",
	"not-del-last-col":									"Du kan ikke slette den sidste kolonne i en tabel.",
	"not-del-last-row":									"Du kan ikke slette den sidste række i en tabel.",
	"percent":											"procent",
	"pixels":											"pixel"
};

Index: loncom/html/htmlarea/plugins/TableOperations/lang/de.js
+++ loncom/html/htmlarea/plugins/TableOperations/lang/de.js
// I18N constants

// LANG: "de", ENCODING: UTF-8 | ISO-8859-1
// Author: broxx, <broxx@broxx.com>

TableOperations.I18N = {
	"Align":					  "Ausrichten",
	"All four sides":				  "Alle 4 Seiten",
	"Background":					  "Hintergrund",
	"Baseline":                                       "Basislinie",
	"Border":					  "Rand",
	"Borders":					  "Raender",
	"Bottom":                                         "Unten",
	"CSS Style":					  "Style [CSS]",
	"Caption":					  "Ueberschrift",
	"Cell Properties":                                "Zellen",
	"Center":					  "Zentrieren",
	"Char":                                           "Zeichen",
	"Collapsed borders":                              "Collapsed borders",
	"Color":					  "Farbe",
	"Description":					  "Beschreibung",
	"FG Color":					  "FG Farbe",
	"Float":                                          "Ausrichtung",
	"Frames":					  "Rahmen",
	"Height":                                         "Hoehe",
	"How many columns would you like to merge?":      "Wieviele Spalten willst du verbinden?",
	"How many rows would you like to merge?":         "Wieviele Zeilen willst du verbinden?",
	"Image URL":					  "Bild URL",
	"Justify":                                        "Justieren",
	"Layout":					  "Layout",
	"Left":						  "Links",
	"Margin":                                         "Rand",
	"Middle":                                         "Mitte",
	"No rules":					  "Keine Balken",
	"No sides":					  "Keine Seiten",
	"None":                                           "Keine",
	"Padding":					  "Auffuellung",
	"Please click into some cell":                    "Waehle eine Zelle",
	"Right":					  "Rechts",
	"Row Properties":                                 "Reihen",
	"Rules will appear between all rows and columns": "Balken zwischen Reihen und Spalten",
	"Rules will appear between columns only":	  "Balken zwischen Spalten",
	"Rules will appear between rows only":		  "Balken zwischen Reihen",
	"Rules":					  "Balken",
	"Spacing and padding":                            "Abstaende",
	"Spacing":					  "Abstand",
	"Summary":					  "Zusammenfassung",
	"TO-cell-delete":				  "Zelle loeschen",
	"TO-cell-insert-after":				  "Zelle einfuegen nach",
	"TO-cell-insert-before":			  "Zelle einfuegen bevor",
	"TO-cell-merge":				  "Zellen zusammenfuegen",
	"TO-cell-prop":					  "Zelleinstellungen",
	"TO-cell-split":				  "Zellen aufteilen",
	"TO-col-delete":				  "Spalte loeschen",
	"TO-col-insert-after":				  "Spalte einfuegen nach",
	"TO-col-insert-before":				  "Spalte einfuegen bevor",
	"TO-col-split":					  "Spalte aufteilen",
	"TO-row-delete":				  "Reihe loeschen",
	"TO-row-insert-above":				  "Reihe einfuegen vor",
	"TO-row-insert-under":				  "Reihe einfuegen nach",
	"TO-row-prop":					  "Reiheneinstellungen",
	"TO-row-split":					  "Reihen aufteilen",
	"TO-table-prop":				  "Tabelle",
	"Table Properties":				  "Tabelle",
	"Text align":                                     "Ausrichtung",
	"The bottom side only":				  "Nur untere Seite",
	"The left-hand side only":			  "Nur linke Seite",
	"The right and left sides only":		  "Nur linke und rechte Seite",
	"The right-hand side only":			  "Nur rechte Seite",
	"The top and bottom sides only":		  "Nur obere und untere Seite",
	"The top side only":				  "Nur obere Seite",
	"Top":                                            "Oben",	
	"Unset color":                                    "Farbe",
	"Vertical align":                                 "Ausrichtung",
	"Width":					  "Breite",
	"not-del-last-cell":				  "Letzte Zelle in dieser Reihe!",
	"not-del-last-col":				  "Letzte Spalte in dieser Tabelle!",
	"not-del-last-row":				  "Letzte Reihe in dieser Tabelle",
	"percent":					  "%",
	"pixels":					  "pixels"
};

Index: loncom/html/htmlarea/plugins/TableOperations/lang/el.js
+++ loncom/html/htmlarea/plugins/TableOperations/lang/el.js
// I18N constants

// LANG: "el", ENCODING: UTF-8 | ISO-8859-7
// Author: Dimitris Glezos, dimitris@glezos.com

TableOperations.I18N = {
	"Align":					  "Στοίχηση",
	"All four sides":				  "Και οι 4 πλευρές",
	"Background":					  "Φόντο",
	"Baseline":                                       "Baseline",
	"Border":					  "Περίγραμμα",
	"Borders":					  "Περιγράμματα",
	"Bottom":                                         "Κάτω μέρος",
	"CSS Style":					  "Στυλ [CSS]",
	"Caption":					  "Λεζάντα",
	"Cell Properties":                                "Ιδιότητες Κελιού",
	"Center":					  "Κέντρο",
	"Char":                                           "Χαρακτήρας",
	"Collapsed borders":                              "Συμπτυγμένα περιγράμματα",
	"Color":					  "Χρώμα",
	"Description":					  "Περιγραφή",
	"FG Color":					  "Χρώμα αντικειμένων",
	"Float":                                          "Float",
	"Frames":					  "Frames",
	"Height":                                         "Ύψος",
	"How many columns would you like to merge?":      "Πόσες στήλες θέλετε να ενώσετε;",
	"How many rows would you like to merge?":         "Πόσες γραμμές θέλετε να ενώσετε;",
	"Image URL":					  "URL εικόνας",
	"Justify":                                        "Πλήρης στοίχηση",
	"Layout":					  "Διάταξη",
	"Left":						  "Αριστερά",
	"Margin":                                         "Περιθώριο",
	"Middle":                                         "Κέντρο",
	"No rules":					  "Χωρίς Γραμμές",
	"No sides":					  "No sides",
	"None":                                           "Τίποτα",
	"Padding":					  "Εσοχή",
	"Please click into some cell":                    "Κάντε κλικ μέσα σε κάποιο κελί",
	"Right":					  "Δεξιά",
	"Row Properties":                                 "Ιδιότητες Γραμμής",
	"Rules will appear between all rows and columns": "Γραμμές θα εμφανίζονται μεταξύ όλων των γραμμών και στηλών",
	"Rules will appear between columns only":	  "Γραμμές θα εμφανίζονται μόνο μεταξύ στηλών",
	"Rules will appear between rows only":		  "Γραμμές θα εμφανίζονται μόνο μεταξύ γραμμών",
	"Rules":					  "Γραμμές",
	"Spacing and padding":                            "Αποστάσεις και εσοχές",
	"Spacing":					  "Αποστάσεις",
	"Summary":					  "Σύνοψη",
	"TO-cell-delete":				  "Διαγραφή κελιού",
	"TO-cell-insert-after":				  "Εισαγωγή κελιού μετά",
	"TO-cell-insert-before":			  "Εισαγωγή κελιού πριν",
	"TO-cell-merge":				  "Συγχώνευση κελιών",
	"TO-cell-prop":					  "Ιδιότητες κελιού",
	"TO-cell-split":				  "Διαίρεση κελιού",
	"TO-col-delete":				  "Διαγραφή στήλης",
	"TO-col-insert-after":				  "Εισαγωγή στήλης μετά",
	"TO-col-insert-before":				  "Εισαγωγή στήλης πριν",
	"TO-col-split":					  "Διαίρεση στήλης",
	"TO-row-delete":				  "Διαγραφή γραμμής",
	"TO-row-insert-above":				  "Εισαγωγή γραμμής μετά",
	"TO-row-insert-under":				  "Εισαγωγή γραμμής πριν",
	"TO-row-prop":					  "Ιδιότητες γραμμής",
	"TO-row-split":					  "Διαίρεση γραμμής",
	"TO-table-prop":				  "Ιδιότητες πίνακα",
	"Table Properties":				  "Ιδιότητες πίνακα",
	"Text align":                                     "Στοίχηση κειμένου",
	"The bottom side only":				  "Η κάτω πλευρά μόνο",
	"The left-hand side only":			  "Η αριστερή πλευρά μόνο",
	"The right and left sides only":		  "Οι δεξιές και αριστερές πλευρές μόνο",
	"The right-hand side only":			  "Η δεξιά πλευρά μόνο",
	"The top and bottom sides only":		  "Οι πάνω και κάτω πλευρές μόνο",
	"The top side only":				  "Η πάνω πλευρά μόνο",
	"Top":                                            "Πάνω",	
	"Unset color":                                    "Αναίρεση χρώματος",
	"Vertical align":                                 "Κατακόρυφη στοίχηση",
	"Width":					  "Πλάτος",
	"not-del-last-cell":				  "Δεν μπορεί να διαγραφεί το τελευταίο κελί σε μια γραμμή.",
	"not-del-last-col":				  "Δεν μπορεί να διαγραφεί η τελευταία στήλη σε ένα πίνακα.",
	"not-del-last-row":				  "Δεν μπορεί να διαγραφεί η τελευταία γραμμή σε ένα πίνακα.",
	"percent":					  "τοις εκατόν",
	"pixels":					  "pixels"
};

Index: loncom/html/htmlarea/plugins/TableOperations/lang/hu.js
+++ loncom/html/htmlarea/plugins/TableOperations/lang/hu.js
// I18N constants

// LANG: "hu", ENCODING: UTF-8
// Author: Miklós Somogyi, <somogyine@vnet.hu>

// FOR TRANSLATORS:
//
//   1. PLEASE PUT YOUR CONTACT INFO IN THE ABOVE LINE
//      (at least a valid email address)
//
//   2. PLEASE TRY TO USE UTF-8 FOR ENCODING;
//      (if this is not possible, please include a comment
//       that states what encoding is necessary.)

HTMLArea.I18N = {

	// the following should be the filename without .js extension
	// it will be used for automatically load plugin language.
	lang: "hu",

	tooltips: {
		bold:           "Félkövér",
		italic:         "Dőlt",
		underline:      "Aláhúzott",
		strikethrough:  "Áthúzott",
		subscript:      "Alsó index",
		superscript:    "Felső index",
		justifyleft:    "Balra zárt",
		justifycenter:  "Középre zárt",
		justifyright:   "Jobbra zárt",
		justifyfull:    "Sorkizárt",
		orderedlist:    "Számozott lista",
		unorderedlist:  "Számozatlan lista",
		outdent:        "Behúzás csökkentése",
		indent:         "Behúzás növelése",
		forecolor:      "Karakterszín",
		hilitecolor:    "Háttérszín",
		horizontalrule: "Elválasztó vonal",
		createlink:     "Hiperhivatkozás beszúrása",
		insertimage:    "Kép beszúrása",
		inserttable:    "Táblázat beszúrása",
		htmlmode:       "HTML forrás be/ki",
		popupeditor:    "Szerkesztő külön ablakban",
		about:          "Névjegy",
		showhelp:       "Súgó",
		textindicator:  "Aktuális stílus",
		undo:           "Visszavonás",
		redo:           "Újra végrehajtás",
		cut:            "Kivágás",
		copy:           "Másolás",
		paste:          "Beillesztés"
	},

	buttons: {
		"ok":           "Rendben",
		"cancel":       "Mégsem"
	},

	msg: {
		"Path":         "Hierarchia",
		"TEXT_MODE":    "Forrás mód. Visszaváltás [<>] gomb"
	}
};

Index: loncom/html/htmlarea/plugins/TableOperations/lang/it.js
+++ loncom/html/htmlarea/plugins/TableOperations/lang/it.js
// I18N constants

// LANG: "it", ENCODING: UTF-8 | ISO-8859-1
// Author: Fabio Rotondo <fabio@rotondo.it>

TableOperations.I18N = {
	"Align":					  "Allinea",
	"All four sides":				  "Tutti e quattro i lati",
	"Background":					  "Sfondo",
	"Baseline":                                       "Allineamento",
	"Border":					  "Bordo",
	"Borders":					  "Bordi",
	"Bottom":                                         "Basso",
	"CSS Style":					  "Stile [CSS]",
	"Caption":					  "Titolo",
	"Cell Properties":                                "Proprietà della Cella",
	"Center":					  "Centra",
	"Char":                                           "Carattere",
	"Collapsed borders":                              "Bordi chiusi",
	"Color":					  "Colore",
	"Description":					  "Descrizione",
	"FG Color":					  "Colore Principale",
	"Float":                                          "Fluttuante",
	"Frames":					  "Frames",
	"Height":                                         "Altezza",
	"How many columns would you like to merge?":      "Quante colonne vuoi unire?",
	"How many rows would you like to merge?":         "Quante righe vuoi unire?",
	"Image URL":					  "URL dell'Immagine",
	"Justify":                                        "Justifica",
	"Layout":					  "Layout",
	"Left":						  "Sinistra",
	"Margin":                                         "Margine",
	"Middle":                                         "Centrale",
	"No rules":					  "Nessun righello",
	"No sides":					  "Nessun lato",
	"None":                                           "Nulla",
	"Padding":					  "Padding",
	"Please click into some cell":                    "Per favore, clicca in una cella",
	"Right":					  "Destra",
	"Row Properties":                                 "Proprietà della Riga",
	"Rules will appear between all rows and columns": "Le linee appariranno tra tutte le righe e colonne",
	"Rules will appear between columns only":	  "Le linee appariranno solo tra le colonne",
	"Rules will appear between rows only":		  "Le linee appariranno solo tra le righe",
	"Rules":					  "Linee",
	"Spacing and padding":                            "Spaziatura e Padding",
	"Spacing":					  "Spaziatura",
	"Summary":					  "Sommario",
	"TO-cell-delete":				  "Cancella cella",
	"TO-cell-insert-after":				  "Inserisci cella dopo",
	"TO-cell-insert-before":			  "Inserisci cella prima",
	"TO-cell-merge":				  "Unisci celle",
	"TO-cell-prop":					  "Proprietà della cella",
	"TO-cell-split":				  "Dividi cella",
	"TO-col-delete":				  "Cancella colonna",
	"TO-col-insert-after":				  "Inserisci colonna dopo",
	"TO-col-insert-before":				  "Inserisci colonna prima",
	"TO-col-split":					  "Dividi colonna",
	"TO-row-delete":				  "Cancella riga",
	"TO-row-insert-above":				  "Inserisci riga prima",
	"TO-row-insert-under":				  "Inserisci riga dopo",
	"TO-row-prop":					  "Proprietà della riga",
	"TO-row-split":					  "Dividi riga",
	"TO-table-prop":				  "Proprietà della Tabella",
	"Table Properties":				  "Proprietà della Tabella",
	"Text align":                                     "Allineamento del Testo",
	"The bottom side only":				  "Solo la parte inferiore",
	"The left-hand side only":			  "Solo la parte sinistra",
	"The right and left sides only":		  "Solo destra e sinistra",
	"The right-hand side only":			  "Solo la parte destra",
	"The top and bottom sides only":		  "Solo sopra e sotto",
	"The top side only":				  "Solo la parte sopra",
	"Top":                                            "Alto",	
	"Unset color":                                    "Rimuovi colore",
	"Vertical align":                                 "Allineamento verticale",
	"Width":					  "Larghezza",
	"not-del-last-cell":				  "HTMLArea si rifiuta codardamente di cancellare l'ultima cella nella riga.",
	"not-del-last-col":				  "HTMLArea si rifiuta codardamente di cancellare l'ultima colonna nella tabella.",
	"not-del-last-row":				  "HTMLArea si rifiuta codardamente di cancellare l'ultima riga nella tabella.",
	"percent":					  "percento",
	"pixels":					  "pixels"
};

Index: loncom/html/htmlarea/plugins/TableOperations/lang/nl.js
+++ loncom/html/htmlarea/plugins/TableOperations/lang/nl.js
// I18N constants

// LANG: "nl", ENCODING: UTF-8 | ISO-8859-1
// Author: Michel Weegeerink (info@mmc-shop.nl), http://mmc-shop.nl

// FOR TRANSLATORS:
//
//   1. PLEASE PUT YOUR CONTACT INFO IN THE ABOVE LINE
//      (at least a valid email address)
//
//   2. PLEASE TRY TO USE UTF-8 FOR ENCODING;
//      (if this is not possible, please include a comment
//       that states what encoding is necessary.)

TableOperations.I18N = {
	"Align":											"Uitlijning",
	"All four sides":									"Alle 4 zijden",
	"Background":										"Achtergrond",
	"Baseline":											"Basis",
	"Border":											"Rand",
	"Borders":											"Randen",
	"Bottom":											"Onder",
	"CSS Style":										"CSS Style",
	"Caption":											"Opmerking",
	"Cell Properties":									"Celeigenschappen",
	"Center":											"Centreren",
	"Char":												"Karakter",
	"Collapsed borders":								"Geen randen",
	"Color":											"Kleur",
	"Description":										"Omschrijving",
	"FG Color":											"Voorgrond",
	"Float":											"Zwevend",
	"Frames":											"Frames",
	"Height":											"Hoogte",
	"How many columns would you like to merge?":		"Hoeveel kolommen wilt u samenvoegen?",
	"How many rows would you like to merge?":			"Hoeveel rijen wilt u samenvoegen?",
	"Image URL":										"Afbeelding URL",
	"Justify":											"Uitvullen",
	"Layout":											"Opmaak",
	"Left":												"Links",
	"Margin":											"Marge",
	"Middle":											"Midden",
	"No rules":											"Geen regels",
	"No sides":											"Geen zijlijnen",
	"None":												"Geen",
	"Padding":											"Celmarge",
	"Please click into some cell":						"Klik in een cel a.u.b.",
	"Right":											"Rechts",
	"Row Properties":									"Rijeigenschappen",
	"Rules will appear between all rows and columns":	"Regels verschijnen tussen alle rijen en kolommen",
	"Rules will appear between columns only":	  		"Regels verschijnen enkel tussen de kolommen",
	"Rules will appear between rows only":				"Regels verschijnen enkel tussen de rijen",
	"Rules":					  						"Regels",
	"Spacing and padding":                           	"Celmarge en afstand tussen cellen",
	"Spacing":											"marge",
	"Summary":											"Overzicht",
	"TO-cell-delete":				  					"Cel verwijderen",
	"TO-cell-insert-after":				  				"Voeg cel toe achter",
	"TO-cell-insert-before":			  				"Voeg cel toe voor",
	"TO-cell-merge":									"Cellen samenvoegen",
	"TO-cell-prop":										"Celeigenschappen",
	"TO-cell-split":									"Cel splitsen",
	"TO-col-delete":									"Kolom verwijderen",
	"TO-col-insert-after":								"Kolom invoegen achter",
	"TO-col-insert-before":								"Kolom invoegen voor",
	"TO-col-split":										"Kolom splitsen",
	"TO-row-delete":									"Rij verwijderen",
	"TO-row-insert-above":								"Rij invoegen boven",
	"TO-row-insert-under":								"Rij invoegen onder",
	"TO-row-prop":										"Rij eigenschappen",
	"TO-row-split":										"Rij splitsen",
	"TO-table-prop":				  					"Tabel eigenschappen",
	"Table Properties":				  					"Tabel eigenschappen",
	"Text align":                                     	"Text uitlijning",
	"The bottom side only":				  				"Enkel aan de onderkant",
	"The left-hand side only":			 				"Enkel aan de linkerkant",
	"The right and left sides only":		 			"Enkel aan de linker en rechterkant",
	"The right-hand side only":							"Enkel aan de rechterkant",
	"The top and bottom sides only":					"Enkel aan de bovenen onderkant",
	"The top side only":								"Enkel aan de bovenkant",
	"Top":												"Boven",
	"Unset color":										"Wis kleur",
	"Vertical align":									"Vertikale uitlijning",
	"Width":					 						"Breedte",
	"not-del-last-cell":								"HTMLArea kan de laatste cel in deze tabel niet verwijderen.",
	"not-del-last-col":									"HTMLArea kan de laatste kolom in deze tabel niet verwijderen.",
	"not-del-last-row":									"HTMLArea kan de laatste rij in deze tabel niet verwijderen.",
	"percent":											"procent",
	"pixels":											"pixels"
};

Index: loncom/html/htmlarea/plugins/TableOperations/lang/no.js
+++ loncom/html/htmlarea/plugins/TableOperations/lang/no.js
// I18N constants

// LANG: "en", ENCODING: UTF-8 | ISO-8859-1
// Author: Mihai Bazon, <mishoo@infoiasi.ro>
// translated into Norwegia: ses@online.no  11.11.03

// FOR TRANSLATORS:
//
//   1. PLEASE PUT YOUR CONTACT INFO IN THE ABOVE LINE
//      (at least a valid email address)
//
//   2. PLEASE TRY TO USE UTF-8 FOR ENCODING;
//      (if this is not possible, please include a comment
//       that states what encoding is necessary.)

TableOperations.I18N = {
	"Align":					  	"Juster",
	"All four sides":			  	"Alle fire sider",
	"Background":					"Bakgrund",
	"Baseline":                   	"Grunnlinje",
	"Border":					  	"Kantlinje",
	"Borders":					  	"Kantlinjer",
	"Bottom":                     	"Bunn",
	"CSS Style":					"Stil [CSS]",
	"Caption":					  	"Overskrift",
	"Cell Properties":              "Celleegenskaper",
	"Center":					  	"Sentrer",
	"Char":                         "Tegn",
	"Collapsed borders":            "Fjern kantlinjer",
	"Color":					  	"Farge",
	"Description":					"Beskrivelse",
	"FG Color":					  	"FG farge",
	"Float":                        "Flytende",
	"Frames":					  	"rammer",
	"Height":                       "Hyde",
	"How many columns would you like to merge?":      "Hvor mange kolonner vil du sl sammen?",
	"How many rows would you like to merge?":         "Hvor mange rader vil du sl sammen?",
	"Image URL":					"Bildets URL",
	"Justify":                      "Juster",
	"Layout":					  	"Layout",
	"Left":						  	"Venstre",
	"Margin":                       "Marg",
	"Middle":                       "Midten",
	"No rules":					  	"Ingen linjal",
	"No sides":					  	"Ingen sider",
	"None":                         "Ingen",
	"Padding":					  	"Luft",
	"Please click into some cell":  "Klikk i en eller annen celle",
	"Right":					  	"Hyre",
	"Row Properties":               "Egenskaper for rad",
	"Rules will appear between all rows and columns": "Linjer vil synes mellom alle rader og kolonner",
	"Rules will appear between columns only":	  "Linjer vil synes kun mellom kolonner",
	"Rules will appear between rows only":		  "Linjer vil synes kun mellom rader",
	"Rules":					  	"Linjer",
	"Spacing and padding":          "Luft",
	"Spacing":					  	"Luft",
	"Summary":					  	"Sammendrag",
	"TO-cell-delete":				"Slett celle",
	"TO-cell-insert-after":			"Sett inn celle etter",
	"TO-cell-insert-before":		"Sett inn celle foran",
	"TO-cell-merge":				"Sl sammen celler",
	"TO-cell-prop":					"Egenskaper for celle",
	"TO-cell-split":				"Del celle",
	"TO-col-delete":				"Slett kolonne",
	"TO-col-insert-after":			"Skyt inn kolonne etter",
	"TO-col-insert-before":			"Skyt inn kolonne fr",
	"TO-col-split":					"Del kolonne",
	"TO-row-delete":				"Slett rad",
	"TO-row-insert-above":			"Skyt inn rad foran",
	"TO-row-insert-under":			"Skyt inn rad etter",
	"TO-row-prop":					"Egenskaper for rad",
	"TO-row-split":					"Del rad",
	"TO-table-prop":				"Tabellegenskaper",
	"Table Properties":				"Tabellegenskaper",
	"Text align":                   "Juster tekst",
	"The bottom side only":			"Bunnen kun",
	"The left-hand side only":		"Venstresiden kun",
	"The right and left sides only":	"Hyre- og venstresiden kun",
	"The right-hand side only":			"Hyresiden kun",
	"The top and bottom sides only":	"The top and bottom sides only",
	"The top side only":				"Overkanten kun",
	"Top":                          "Overkant",	
	"Unset color":                  "Ikke-bestemt farge",
	"Vertical align":               "Vertikal justering",
	"Width":					  	"Bredde",
	"not-del-last-cell":			"HTMLArea nekter  slette siste cellen i tabellen.",
	"not-del-last-col":				"HTMLArea nekter  slette siste kolonnen i tabellen.",
	"not-del-last-row":				"HTMLArea nekter  slette siste raden i tabellen.",
	"percent":					  	"prosent",
	"pixels":					  	"billedpunkter"
};

--www1086789879--