[pLog-svn] r949 - in plog/trunk/js/htmlarea: . docs images lang plugins plugins/CSS plugins/CSS/lang plugins/CharacterMap plugins/CharacterMap/img plugins/CharacterMap/lang plugins/CharacterMap/popups plugins/ContextMenu plugins/ContextMenu/lang plugins/DynamicCSS plugins/DynamicCSS/lang plugins/EnterParagraphs plugins/EnterParagraphs/lang plugins/FullPage plugins/FullPage/lang plugins/FullPage/popups plugins/HtmlTidy plugins/HtmlTidy/img plugins/HtmlTidy/lang plugins/ListType plugins/ListType/lang plugins/SpellChecker plugins/SpellChecker/img plugins/SpellChecker/lang plugins/TableOperations plugins/TableOperations/lang popups

mark at devel.plogworld.net mark at devel.plogworld.net
Sat Feb 5 15:29:38 GMT 2005


Author: mark
Date: 2005-02-05 15:29:38 +0000 (Sat, 05 Feb 2005)
New Revision: 949

Added:
   plog/trunk/js/htmlarea/docs/
   plog/trunk/js/htmlarea/docs/index.html
   plog/trunk/js/htmlarea/docs/license.txt
   plog/trunk/js/htmlarea/docs/reference.html
   plog/trunk/js/htmlarea/docs/release-notes.html
   plog/trunk/js/htmlarea/images/ed_killword.gif
   plog/trunk/js/htmlarea/images/ed_print.gif
   plog/trunk/js/htmlarea/images/ed_rmformat.gif
   plog/trunk/js/htmlarea/lang/ch.js
   plog/trunk/js/htmlarea/plugins/CharacterMap/
   plog/trunk/js/htmlarea/plugins/CharacterMap/character-map.js
   plog/trunk/js/htmlarea/plugins/CharacterMap/img/
   plog/trunk/js/htmlarea/plugins/CharacterMap/img/ed_charmap.gif
   plog/trunk/js/htmlarea/plugins/CharacterMap/lang/
   plog/trunk/js/htmlarea/plugins/CharacterMap/lang/de.js
   plog/trunk/js/htmlarea/plugins/CharacterMap/lang/en.js
   plog/trunk/js/htmlarea/plugins/CharacterMap/popups/
   plog/trunk/js/htmlarea/plugins/CharacterMap/popups/select_character.html
   plog/trunk/js/htmlarea/plugins/ContextMenu/lang/fr.js
   plog/trunk/js/htmlarea/plugins/ContextMenu/lang/he.js
   plog/trunk/js/htmlarea/plugins/DynamicCSS/
   plog/trunk/js/htmlarea/plugins/DynamicCSS/dynamiccss.js
   plog/trunk/js/htmlarea/plugins/DynamicCSS/lang/
   plog/trunk/js/htmlarea/plugins/DynamicCSS/lang/de.js
   plog/trunk/js/htmlarea/plugins/DynamicCSS/lang/en.js
   plog/trunk/js/htmlarea/plugins/DynamicCSS/lang/fr.js
   plog/trunk/js/htmlarea/plugins/EnterParagraphs/
   plog/trunk/js/htmlarea/plugins/EnterParagraphs/enter-paragraphs.js
   plog/trunk/js/htmlarea/plugins/EnterParagraphs/lang/
   plog/trunk/js/htmlarea/plugins/EnterParagraphs/lang/en.js
   plog/trunk/js/htmlarea/plugins/FullPage/lang/de.js
   plog/trunk/js/htmlarea/plugins/FullPage/lang/fr.js
   plog/trunk/js/htmlarea/plugins/FullPage/lang/he.js
   plog/trunk/js/htmlarea/plugins/HtmlTidy/
   plog/trunk/js/htmlarea/plugins/HtmlTidy/README
   plog/trunk/js/htmlarea/plugins/HtmlTidy/html-tidy-config.cfg
   plog/trunk/js/htmlarea/plugins/HtmlTidy/html-tidy-logic.php
   plog/trunk/js/htmlarea/plugins/HtmlTidy/html-tidy.js
   plog/trunk/js/htmlarea/plugins/HtmlTidy/img/
   plog/trunk/js/htmlarea/plugins/HtmlTidy/img/html-tidy.gif
   plog/trunk/js/htmlarea/plugins/HtmlTidy/lang/
   plog/trunk/js/htmlarea/plugins/HtmlTidy/lang/en.js
   plog/trunk/js/htmlarea/plugins/ListType/
   plog/trunk/js/htmlarea/plugins/ListType/lang/
   plog/trunk/js/htmlarea/plugins/ListType/lang/de.js
   plog/trunk/js/htmlarea/plugins/ListType/lang/en.js
   plog/trunk/js/htmlarea/plugins/ListType/list-type.js
   plog/trunk/js/htmlarea/plugins/SpellChecker/img/he-spell-check.gif
   plog/trunk/js/htmlarea/plugins/SpellChecker/lang/he.js
   plog/trunk/js/htmlarea/plugins/SpellChecker/lang/nl.js
   plog/trunk/js/htmlarea/plugins/TableOperations/lang/fr.js
   plog/trunk/js/htmlarea/plugins/TableOperations/lang/he.js
Removed:
   plog/trunk/js/htmlarea/htmlarea-lang-en.js
   plog/trunk/js/htmlarea/license.txt
Modified:
   plog/trunk/js/htmlarea/dialog.js
   plog/trunk/js/htmlarea/htmlarea-plog.js
   plog/trunk/js/htmlarea/htmlarea.css
   plog/trunk/js/htmlarea/htmlarea.js
   plog/trunk/js/htmlarea/images/ed_delete.gif
   plog/trunk/js/htmlarea/images/ed_link.gif
   plog/trunk/js/htmlarea/images/insert_table.gif
   plog/trunk/js/htmlarea/lang/b5.js
   plog/trunk/js/htmlarea/lang/cz.js
   plog/trunk/js/htmlarea/lang/da.js
   plog/trunk/js/htmlarea/lang/de.js
   plog/trunk/js/htmlarea/lang/ee.js
   plog/trunk/js/htmlarea/lang/el.js
   plog/trunk/js/htmlarea/lang/en.js
   plog/trunk/js/htmlarea/lang/es.js
   plog/trunk/js/htmlarea/lang/fi.js
   plog/trunk/js/htmlarea/lang/fr.js
   plog/trunk/js/htmlarea/lang/gb.js
   plog/trunk/js/htmlarea/lang/he.js
   plog/trunk/js/htmlarea/lang/hu.js
   plog/trunk/js/htmlarea/lang/it.js
   plog/trunk/js/htmlarea/lang/ja-euc.js
   plog/trunk/js/htmlarea/lang/ja-jis.js
   plog/trunk/js/htmlarea/lang/ja-sjis.js
   plog/trunk/js/htmlarea/lang/ja-utf8.js
   plog/trunk/js/htmlarea/lang/lt.js
   plog/trunk/js/htmlarea/lang/lv.js
   plog/trunk/js/htmlarea/lang/nb.js
   plog/trunk/js/htmlarea/lang/nl.js
   plog/trunk/js/htmlarea/lang/no.js
   plog/trunk/js/htmlarea/lang/pl.js
   plog/trunk/js/htmlarea/lang/pt_br.js
   plog/trunk/js/htmlarea/lang/ro.js
   plog/trunk/js/htmlarea/lang/ru.js
   plog/trunk/js/htmlarea/lang/se.js
   plog/trunk/js/htmlarea/lang/si.js
   plog/trunk/js/htmlarea/lang/vn.js
   plog/trunk/js/htmlarea/plugins/CSS/css.js
   plog/trunk/js/htmlarea/plugins/CSS/lang/en.js
   plog/trunk/js/htmlarea/plugins/ContextMenu/context-menu.js
   plog/trunk/js/htmlarea/plugins/ContextMenu/lang/de.js
   plog/trunk/js/htmlarea/plugins/ContextMenu/lang/el.js
   plog/trunk/js/htmlarea/plugins/ContextMenu/lang/en.js
   plog/trunk/js/htmlarea/plugins/ContextMenu/lang/nl.js
   plog/trunk/js/htmlarea/plugins/ContextMenu/menu.css
   plog/trunk/js/htmlarea/plugins/FullPage/full-page.js
   plog/trunk/js/htmlarea/plugins/FullPage/lang/en.js
   plog/trunk/js/htmlarea/plugins/FullPage/lang/ro.js
   plog/trunk/js/htmlarea/plugins/FullPage/popups/docprop.html
   plog/trunk/js/htmlarea/plugins/FullPage/test.html
   plog/trunk/js/htmlarea/plugins/SpellChecker/lang/cz.js
   plog/trunk/js/htmlarea/plugins/SpellChecker/lang/da.js
   plog/trunk/js/htmlarea/plugins/SpellChecker/lang/de.js
   plog/trunk/js/htmlarea/plugins/SpellChecker/lang/en.js
   plog/trunk/js/htmlarea/plugins/SpellChecker/lang/hu.js
   plog/trunk/js/htmlarea/plugins/SpellChecker/lang/it.js
   plog/trunk/js/htmlarea/plugins/SpellChecker/lang/ro.js
   plog/trunk/js/htmlarea/plugins/SpellChecker/readme-tech.html
   plog/trunk/js/htmlarea/plugins/SpellChecker/spell-check-logic.cgi
   plog/trunk/js/htmlarea/plugins/SpellChecker/spell-check-style.css
   plog/trunk/js/htmlarea/plugins/SpellChecker/spell-check-ui.html
   plog/trunk/js/htmlarea/plugins/SpellChecker/spell-check-ui.js
   plog/trunk/js/htmlarea/plugins/SpellChecker/spell-checker.js
   plog/trunk/js/htmlarea/plugins/TableOperations/lang/cz.js
   plog/trunk/js/htmlarea/plugins/TableOperations/lang/da.js
   plog/trunk/js/htmlarea/plugins/TableOperations/lang/de.js
   plog/trunk/js/htmlarea/plugins/TableOperations/lang/el.js
   plog/trunk/js/htmlarea/plugins/TableOperations/lang/en.js
   plog/trunk/js/htmlarea/plugins/TableOperations/lang/fi.js
   plog/trunk/js/htmlarea/plugins/TableOperations/lang/hu.js
   plog/trunk/js/htmlarea/plugins/TableOperations/lang/it.js
   plog/trunk/js/htmlarea/plugins/TableOperations/lang/nl.js
   plog/trunk/js/htmlarea/plugins/TableOperations/lang/no.js
   plog/trunk/js/htmlarea/plugins/TableOperations/lang/ro.js
   plog/trunk/js/htmlarea/plugins/TableOperations/table-operations.js
   plog/trunk/js/htmlarea/popupdiv.js
   plog/trunk/js/htmlarea/popups/about.html
   plog/trunk/js/htmlarea/popups/blank.html
   plog/trunk/js/htmlarea/popups/custom2.html
   plog/trunk/js/htmlarea/popups/editor_help.html
   plog/trunk/js/htmlarea/popups/fullscreen.html
   plog/trunk/js/htmlarea/popups/insert_image.html
   plog/trunk/js/htmlarea/popups/insert_table.html
   plog/trunk/js/htmlarea/popups/link.html
   plog/trunk/js/htmlarea/popups/old-fullscreen.html
   plog/trunk/js/htmlarea/popups/old_insert_image.html
   plog/trunk/js/htmlarea/popups/popup.js
   plog/trunk/js/htmlarea/popups/select_color.html
   plog/trunk/js/htmlarea/popupwin.js
Log:
Upgrade to HTMLArea RC3. With the following tweak and plugins:
1. Convert ASCII(160) to ASCII(32)
2. EnterParagraphs Plugins for <p> and <br> in Mozilla and IE
3. Tweak for Source Code Formation

Mark

Modified: plog/trunk/js/htmlarea/dialog.js
===================================================================
--- plog/trunk/js/htmlarea/dialog.js	2005-02-05 13:57:52 UTC (rev 948)
+++ plog/trunk/js/htmlarea/dialog.js	2005-02-05 15:29:38 UTC (rev 949)
@@ -1,63 +1,74 @@
-// Though "Dialog" looks like an object, it isn't really an object.  Instead
-// it's just namespace for protecting global symbols.
-
-function Dialog(url, action, init, scrollbar ) {
-	if (typeof init == "undefined") {
-		init = window;	// pass this window object by default
-	}
-	Dialog._geckoOpenModal(url, action, init, scrollbar );
-};
-
-Dialog._parentEvent = function(ev) {
-	if (Dialog._modal && !Dialog._modal.closed) {
-		Dialog._modal.focus();
-		//setTimeout(function(){Dialog._modal.focus();}, 1);
-		HTMLArea._stopEvent(ev);
-	}
-};
-
-// should be a function, the return handler of the currently opened dialog.
-Dialog._return = null;
-
-// constant, the currently opened dialog
-Dialog._modal = null;
-
-// the dialog will read it's args from this variable
-Dialog._arguments = null;
-
-Dialog._geckoOpenModal = function(url, action, init, scrollbar) {
-	if( scrollbar )
-		wndParams = "toolbar=no,menubar=no,personalbar=no,width=10,height=10,scrollbars=yes,resizable=yes";
-	else
-		wndParams = "toolbar=no,menubar=no,personalbar=no,width=10,height=10,scrollbars=no,resizable=yes";
-		
-	var dlg = window.open(url, "hadialog", wndParams );
-	Dialog._modal = dlg;
-	Dialog._arguments = init;
-
-	// capture some window's events
-	function capwin(w) {
-		HTMLArea._addEvent(w, "click", Dialog._parentEvent);
-		HTMLArea._addEvent(w, "mousedown", Dialog._parentEvent);
-		HTMLArea._addEvent(w, "focus", Dialog._parentEvent);
-	};
-	// release the captured events
-	function relwin(w) {
-		HTMLArea._removeEvent(w, "click", Dialog._parentEvent);
-		HTMLArea._removeEvent(w, "mousedown", Dialog._parentEvent);
-		HTMLArea._removeEvent(w, "focus", Dialog._parentEvent);
-	};
-	capwin(window);
-	// capture other frames
-	for (var i = 0; i < window.frames.length; capwin(window.frames[i++]));
-	// make up a function to be called when the Dialog ends.
-	Dialog._return = function (val) {
-		if (val && action) {
-			action(val);
-		}
-		relwin(window);
-		// capture other frames
-		for (var i = 0; i < window.frames.length; relwin(window.frames[i++]));
-		Dialog._modal = null;
-	};
-};
\ No newline at end of file
+// htmlArea v3.0 - Copyright (c) 2003-2005 dynarch.com
+//                               2002-2003 interactivetools.com, inc.
+// This copyright notice MUST stay intact for use (see license.txt).
+//
+// Portions (c) dynarch.com, 2003-2004
+//
+// 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.
+//   http://dynarch.com/mishoo
+//
+// $Id: dialog.js,v 1.7 2005/01/20 17:49:04 mishoo Exp $
+
+// Though "Dialog" looks like an object, it isn't really an object.  Instead
+// it's just namespace for protecting global symbols.
+
+function Dialog(url, action, init) {
+	if (typeof init == "undefined") {
+		init = window;	// pass this window object by default
+	}
+	Dialog._geckoOpenModal(url, action, init);
+};
+
+Dialog._parentEvent = function(ev) {
+	setTimeout( function() { if (Dialog._modal && !Dialog._modal.closed) { Dialog._modal.focus() } }, 50);
+	if (Dialog._modal && !Dialog._modal.closed) {
+		HTMLArea._stopEvent(ev);
+	}
+};
+
+
+// should be a function, the return handler of the currently opened dialog.
+Dialog._return = null;
+
+// constant, the currently opened dialog
+Dialog._modal = null;
+
+// the dialog will read it's args from this variable
+Dialog._arguments = null;
+
+Dialog._geckoOpenModal = function(url, action, init) {
+	var dlg = window.open(url, "hadialog",
+			      "toolbar=no,menubar=no,personalbar=no,width=10,height=10," +
+			      "scrollbars=no,resizable=yes,modal=yes,dependable=yes");
+	Dialog._modal = dlg;
+	Dialog._arguments = init;
+
+	// capture some window's events
+	function capwin(w) {
+		HTMLArea._addEvent(w, "click", Dialog._parentEvent);
+		HTMLArea._addEvent(w, "mousedown", Dialog._parentEvent);
+		HTMLArea._addEvent(w, "focus", Dialog._parentEvent);
+	};
+	// release the captured events
+	function relwin(w) {
+		HTMLArea._removeEvent(w, "click", Dialog._parentEvent);
+		HTMLArea._removeEvent(w, "mousedown", Dialog._parentEvent);
+		HTMLArea._removeEvent(w, "focus", Dialog._parentEvent);
+	};
+	capwin(window);
+	// capture other frames
+	for (var i = 0; i < window.frames.length; capwin(window.frames[i++]));
+	// make up a function to be called when the Dialog ends.
+	Dialog._return = function (val) {
+		if (val && action) {
+			action(val);
+		}
+		relwin(window);
+		// capture other frames
+		for (var i = 0; i < window.frames.length; relwin(window.frames[i++]));
+		Dialog._modal = null;
+	};
+};

Added: plog/trunk/js/htmlarea/docs/index.html
===================================================================
--- plog/trunk/js/htmlarea/docs/index.html	2005-02-05 13:57:52 UTC (rev 948)
+++ plog/trunk/js/htmlarea/docs/index.html	2005-02-05 15:29:38 UTC (rev 949)
@@ -0,0 +1,190 @@
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 3.2//EN">
+<html>
+  <head>
+    <title>HTMLArea -- the free, customizable online editor</title>
+
+    <style type="text/css">
+      html, body { font-family: georgia,"times new roman",serif; background-color: #fff; color: #000; }
+      .label { text-align: right; padding-right: 0.3em; }
+      .bline { border-bottom: 1px solid #aaa; }
+    </style>
+  </head>
+
+  <body>
+    <div style="float: right; border: 1px solid #aaa; background-color: #eee; padding: 3px; margin-left: 10px; margin-bottom: 10px;">
+      <table cellspacing="0" cellpadding="0" border="0">
+        <tr>
+          <td class="label">Version:</td><td>3.0</td>
+        </tr>
+        <tr>
+          <td class="label">Release:</td><td>RC3 (<a href="release-notes.html">release notes</a>)</td>
+        </tr>
+        <tr>
+          <td class="label bline">Compiled at:</td><td class="bline">Jan , 2005 [23:43] GMT</td>
+        </tr>
+        <tr>
+          <td class="label">SourceForge page:</td><td><a href="http://sf.net/projects/itools-htmlarea/">http://sf.net/projects/itools-htmlarea/</a></td>
+      </table>
+    </div>
+    <h1>HTMLArea -- the free<br/>customizable online editor</h1>
+
+    <p>
+      HTMLArea is a free, customizable online editor.  It works inside your
+      browser.  It uses a non-standard feature implemented in Internet
+      Explorer 5.5 or better for Windows and Mozilla 1.3 or better (any
+      platform), therefore it will only work in one of these browsers.
+    </p>
+
+    <p>
+      HTMLArea is copyright <a
+      href="http://interactivetools.com">InteractiveTools.com</a> and <a
+      href="http://dynarch.com">Dynarch.com</a> and it is
+      released under a BSD-style license.  HTMLArea is created and developed
+      upto version 2.03 by InteractiveTools.com.  Version 3.0 developed by
+      <a href="http://dynarch.com/mishoo/">Mihai Bazon</a> for
+      InteractiveTools.  It contains code sponsored by third-party companies as well.
+      Please see our About Box for details about who sponsored what plugins.
+    </p>
+
+    <h2><a href="examples/">Online demos</a></h2>
+
+    <ul>
+
+      <li><a href="examples/core.html">HTMLArea standard</a> -- contains the core
+        editor.</li>
+
+      <li><a href="examples/table-operations.html">HTMLArea + tables</a> --
+        loads the <tt>TableOperations</tt> plugin which provides some extra
+        editing features for tables.</li>
+
+      <li><a href="examples/spell-checker.html">HTMLArea + spell checher</a>
+        -- loads the <tt>SpellChecker</tt> plugin which provides what its
+        name says: a spell checker.  This one requires additional support on
+        the server-side.</li>
+
+      <li><a href="examples/full-page.html">HTMLArea Full HTML Editor</a> --
+        loads the <tt>FullPage</tt> plugin which allows you to edit a full
+        HTML page, including &lt;title&gt;, &lt;!DOCTYPE...&gt; and some
+        other options.</li>
+
+      <li><a href="examples/context-menu.html">HTMLArea with Context
+          Menu</a> -- this plugin provides a nice and useful context menu.</li>
+
+      <li><a href="examples/fully-loaded.html">HTMLArea fully loaded</a> --
+        all of the above. ;-)</li>
+
+    </ul>
+
+    <h2>Installation</h2>
+
+    <p>
+      Installation is (or should be) easy.  You need to unpack the ZIP file
+      in a directory accessible through your webserver.  Supposing you
+      unpack in your <tt>DocumentRoot</tt> and your <tt>DocumentRoot</tt> is
+      <tt>/var/www/html</tt> as in a standard RedHat installation, you need
+      to acomplish the following steps: (the example is for a Unix-like
+      operating system)
+    </p>
+
+    <pre style="margin-left: 2em"
+>
+cd /var/www/html
+unzip /path/to/archive/HTMLArea-3.0-RC3.zip
+mv HTMLArea-3.0-RC3 htmlarea
+find htmlarea/ -type f -exec chmod 644 {} \;
+find htmlarea/ -type d -exec chmod 755 {} \;
+find htmlarea/ -name "*.cgi" -exec chmod 755 {} \;</pre>
+
+    <p>
+      <strong>Notes.</strong> You may chose to symlink "htmlarea" to "HTMLArea-3.0-RC3", in which case your server needs to be configured to
+      "<tt>FollowSymLinks</tt>".  You need to make sure that *.cgi files are
+      interpreted as CGI scripts.  If you want to use the SpellChecker
+      plugin you need to have a recent version of Perl installed (I
+      recommend 5.8.0) on the server, and the module Text::Aspell, available
+      from CPAN.  More info in "<a
+      href="plugins/SpellChecker/readme-tech.html">plugins/SpellChecker/readme-tech.html</a>".
+    </p>
+
+    <p>About how to setup your pages to use the editor, please read the
+      [outdated yet generally valid] <a
+        href="reference.html">documentation</a>.</p>
+
+    <h2>Status and links</h2>
+
+    <p>HTMLArea has reached version 3.0.  As of this version, it
+      supports:</p>
+
+    <ul>
+
+      <li>Customizable toolbar</li>
+
+      <li>Easy internationalization</li>
+
+      <li>Plugin-based infrastructure</li>
+
+      <li>Delivers W3-compliant HTML (with few exceptions)</li>
+
+      <li>Has a subset of Microsoft Word's keyboard shortcuts</li>
+
+      <li>Full-screen editor</li>
+
+      <li>Advanced table operations (by external plugin
+        "TableOperations")</li>
+
+      <li>Spell checker (by external plugin "SpellChecker")</li>
+
+      <li>probably more... ;-)</li>
+
+    </ul>
+
+    <p>We have a <a
+    href="http://sourceforge.net/projects/itools-htmlarea/">project page</a>
+    at <a href="http://sourceforge.net">SourceForge.net</a>.  There you can
+    also find out <a href="http://sourceforge.net/cvs/?group_id=69750">how
+    to retrieve the code from CVS</a>, or you can <a
+    href="http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/itools-htmlarea">browse
+    the CVS online</a>.  We also have a <a
+    href="http://sourceforge.net/tracker/?atid=525656&group_id=69750&func=browse">bug
+    system</a>, a <a
+    href="http://sourceforge.net/tracker/?atid=525658&group_id=69750&func=browse">patch
+    tracking system</a> and a <a
+    href="http://sourceforge.net/tracker/?atid=525659&group_id=69750&func=browse">feature
+    request page</a>.</p>
+
+    <p>We invite you to say everything you want about HTMLArea <a
+    href="http://www.htmlarea.com/forum/">on the
+    forums</a> at InteractiveTools.com.  There you should also find the
+    latest news.</p>
+
+    <h2>"It doesn't work, what's wrong?"</h2>
+
+    <p>If it doesn't work, you have several options:</p>
+
+    <ul>
+
+      <li>Post a message to the forum.  Describe your problem in as much
+      detail as possible.  Include errors you might find in the JavaScript
+      console (if you are a Mozilla user), or errors displayed by IE (though
+      they're most of the times useless).</li>
+
+      <li>If you're positive that you discovered a bug in HTMLArea then feel
+      free to fill a bug report in our bug system.  If you have the time you
+      should check to see if a similar bug was reported or not; it might be
+      fixed already in the CVS ;-) If you're positive that a similar bug was
+      not yet reported, do fill a bug report and please include as much
+      detail as possible, such as your browser, OS, errors from JavaScript
+      console, etc.</li>
+
+      <li>If you want a new feature to be implemented, post it on the
+      features request and someone will hopefully take care of it.</li>
+
+    </ul>
+
+    <hr />
+<!-- Created: Sun Aug  3 14:11:26 EEST 2003 -->
+<!-- hhmts start --> Last modified: Wed Jul 14 13:20:53 CEST 2004 <!-- hhmts end -->
+<!-- doc-lang: English -->
+  </body>
+</html>
+
+

Added: plog/trunk/js/htmlarea/docs/license.txt
===================================================================
--- plog/trunk/js/htmlarea/docs/license.txt	2005-02-05 13:57:52 UTC (rev 948)
+++ plog/trunk/js/htmlarea/docs/license.txt	2005-02-05 15:29:38 UTC (rev 949)
@@ -0,0 +1,30 @@
+htmlArea License (based on BSD license)
+Copyright (c) 2002-2004, interactivetools.com, inc.
+Copyright (c) 2003-2005 dynarch.com
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+1) Redistributions of source code must retain the above copyright notice,
+   this list of conditions and the following disclaimer.
+
+2) Redistributions in binary form must reproduce the above copyright notice,
+   this list of conditions and the following disclaimer in the documentation
+   and/or other materials provided with the distribution.
+
+3) Neither the name of interactivetools.com, inc. nor the names of its
+   contributors may be used to endorse or promote products derived from this
+   software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.

Added: plog/trunk/js/htmlarea/docs/reference.html
===================================================================
--- plog/trunk/js/htmlarea/docs/reference.html	2005-02-05 13:57:52 UTC (rev 948)
+++ plog/trunk/js/htmlarea/docs/reference.html	2005-02-05 15:29:38 UTC (rev 949)
@@ -0,0 +1,523 @@
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 3.2//EN">
+<html> <head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+<title>HTMLArea-3.0 Reference</title>
+
+<style type="text/css">
+  @import url(htmlarea.css);
+  body { font: 14px verdana,sans-serif; background: #fff; color: #000; }
+  h1, h2 { font-family:tahoma,sans-serif; }
+  h1 { border-bottom: 2px solid #000; }
+  h2 { border-bottom: 1px solid #aaa; }
+  h3, h4 { margin-bottom: 0px; font-family: Georgia,serif; font-style: italic; }
+  h4 { font-size: 90%; margin-left: 1em; }
+  acronym { border-bottom: 1px dotted #063; color: #063; }
+  p { margin-left: 2em; margin-top: 0.3em; }
+  li p { margin-left: 0px; }
+  .abstract { padding: 5px; margin: 0px 10em; font-size: 90%; border: 1px dashed #aaa; background: #eee;}
+  li { margin-left: 2em; }
+  em { color: #042; }
+  a { color: #00f; }
+  a:hover { color: #f00; }
+  a:active { color: #f80; }
+  span.browser { font-weight: bold; color: #864; }
+  .fixme { font-size: 20px; font-weight: bold; color: red; background: #fab;
+padding: 5px; text-align: center; }
+  .code {
+   background: #e4efff; padding: 5px; border: 1px dashed #abc; margin-left: 2em; margin-right: 2em;
+   font-family: fixed,"lucidux mono","andale mono","courier new",monospace;
+  }
+  .note, .warning { font-weight: bold; color: #0a0; font-variant: small-caps; }
+  .warning { color: #a00; }
+
+.string {
+  color: #06c;
+} /* font-lock-string-face */
+.comment {
+  color: #840;
+} /* font-lock-comment-face */
+.variable-name {
+  color: #000;
+} /* font-lock-variable-name-face */
+.type {
+  color: #008;
+  font-weight: bold;
+} /* font-lock-type-face */
+.reference {
+  color: #048;
+} /* font-lock-reference-face */
+.preprocessor {
+  color: #808;
+} /* font-lock-preprocessor-face */
+.keyword {
+  color: #00f;
+  font-weight: bold;
+} /* font-lock-keyword-face */
+.function-name {
+  color: #044;
+} /* font-lock-function-name-face */
+.html-tag {
+  font-weight: bold;
+} /* html-tag-face */
+.html-helper-italic {
+  font-style: italic;
+} /* html-helper-italic-face */
+.html-helper-bold {
+  font-weight: bold;
+} /* html-helper-bold-face */
+
+</style>
+
+<script type="text/javascript">
+  _editor_url = './';
+  _editor_lang = 'en';
+</script>
+<script type="text/javascript" src="htmlarea.js"></script>
+<script type="text/javascript" src="dialog.js"></script>
+<script tyle="text/javascript" src="lang/en.js"></script>
+
+</head>
+
+<body onload="HTMLArea.replace('TA')">
+
+
+<h1>HTMLArea-3.0 Documentation</h1>
+
+<div class="abstract" style="color: red; font-weight: bold">
+
+      This documentation contains valid information, but is outdated in the
+      terms that it does not covers all the features of HTMLArea.  A new
+      documentation project will be started, based on LaTeX.
+
+</div>
+
+
+<h2>Introduction</h2>
+
+<h3>What is HTMLArea?</h3>
+
+<p>HTMLArea is a free <acronym title="What You See Is What You Get"
+>WYSIWYG</acronym> editor replacement for <code>&lt;textarea&gt;</code>
+fields.  By adding a few simple lines of JavaScript code to your web page
+you can replace a regular textarea with a rich text editor that lets your
+users do the following:</p>
+
+<ul>
+  <li>Format text to be bold, italicized, or underlined.</li>
+  <li>Change the face, size, style and color.</li>
+  <li>Left, center, or right-justify paragraphs.</li>
+  <li>Make bulleted or numbered lists.</li>
+  <li>Indent or un-indent paragraphs.</li>
+  <li>Insert a horizontal line.</li>
+  <li>Insert hyperlinks and images.</li>
+  <li>View the raw HTML source of what they're editing.</li>
+  <li>and much more...</li>
+</ul>
+
+<p>Some of the interesting features of HTMLArea that set's it apart from
+other web based WYSIWYG editors are as follows:</p>
+
+<ul>
+  <li>It's lightweight, fast loading and can transform a regular textarea
+  into a rich-text editor with a single line of JavaScript.</li>
+  <li>Generates clean, valid HTML.</li>
+  <li>It degrades gracefully to older or non-supported browsers
+  (they get the original textarea field).</li>
+  <li>It's free and can be incorporated into any free or commercial
+  program.</li>
+  <li>It works with any server-side languages (ASP, PHP, Perl, Java,
+  etc).</li>
+  <li>It's written in JavaScript and can be easily viewed, modified or
+  extended.</li>
+  <li>It remembers entered content when a user navigates away and then hits
+  "back" in their browser.</li>
+  <li>Since it replaces existing textareas it doesn't require a lot of code
+  to add it to your pages (just one line).</li>
+  <li>Did we mention it was free? ;-)</li>
+</ul>
+
+<h3>Is it really free?  What's the catch?</h3>
+
+<p>Yes! It's really free. You can use it, modify it, distribute it with your
+software, or do just about anything you like with it.</p>
+
+<h3>What are the browser requirements?</h3>
+
+<p>HTMLArea requires <span class="browser"><a
+href="http://www.microsoft.com/ie">Internet Explorer</a> &gt;= 5.5</span>
+(Windows only), or <span class="browser"><a
+href="http://mozilla.org">Mozilla</a> &gt;= 1.3-Beta</span> on any platform.
+Any browser based on <a href="http://mozilla.org/newlayout">Gecko</a> will
+also work, provided that Gecko version is at least the one included in
+Mozilla-1.3-Beta (for example, <a
+href="http://galeon.sf.net">Galeon-1.2.8</a>).  However, it degrades
+gracefully to other browsers. They will get a regular textarea field
+instead of a WYSIWYG editor.</p>
+
+<h3>Can I see an example of what it looks like?</h3>
+
+<p>Just make sure you're using one of the browsers mentioned above and see
+below.</p>
+
+<form onsubmit="return false;">
+<textarea id="TA" style="width: 100%; height: 15em;">
+<p>Here is some sample text in textarea that's been transformed with <font
+color="#0000CC"><b>HTMLArea</b></font>.<br />
+You can make things <b>bold</b>, <i>italic</i>, <u>underline</u>.  You can change the
+<font size="3">size</font> and <b><font color="#0000CC">c</font><font color="#00CC00">o</font><font color="#00CCCC">l</font><font color="#CC0000">o</font><font color="#CC00CC">r</font><font color="#CCCC00">s</font><font color="#CCCCCC">!</font></b>
+And lots more...</p>
+
+<p align="center"><font size="4" color="#ff0000"><b><u>Try HTMLArea
+today!</u></b></font><br /></p>
+</textarea>
+</form>
+
+<h3>Where can I find out more info, download the latest version and talk to
+other HTMLArea users?</h3>
+
+<p>You can find out more about HTMLArea and download the latest version on
+the <a href="http://www.htmlarea.com/">HTMLArea
+homepage</a> and you can talk to other HTMLArea users and post any comments
+or suggestions you have in the <a
+href="http://www.htmlarea.com/forum/"
+>HTMLArea forum</a>.</p>
+
+<h2>Keyboard shortcuts</h2>
+
+<p>The editor provides the following key combinations:</p>
+
+<ul>
+  <li>CTRL-A -- select all</li>
+  <li>CTRL-B -- bold</li>
+  <li>CTRL-I -- italic</li>
+  <li>CTRL-U -- underline</li>
+  <li>CTRL-S -- strikethrough</li>
+  <li>CTRL-L -- justify left</li>
+  <li>CTRL-E -- justify center</li>
+  <li>CTRL-R -- justify right</li>
+  <li>CTRL-J -- justify full</li>
+  <li>CTRL-1 .. CTRL-6 -- headings (&lt;h1&gt; .. &lt;h6&gt;)</li>
+  <li>CTRL-0 (zero) -- clean content pasted from Word</li>
+</ul>
+
+<h2>Installation</h2>
+
+<h3>How do I add HTMLArea to my web page?</h3>
+
+<p>It's easy.  First you need to upload HTMLArea files to your website.
+Just follow these steps.</p>
+
+<ol>
+  <li>Download the latest version from the <a
+  href="http://www.htmlarea.com/">htmlArea
+  homepage</a>.</li>
+  <li>Unzip the files onto your local computer (making sure to maintain the
+  directory structure contained in the zip).</li>
+  <li>Create a new folder on your website called /htmlarea/ (make sure it's
+  NOT inside the cgi-bin).</li>
+  <li>Transfer all the HTMLArea files from your local computer into the
+  /htmlarea/ folder on your website.</li>
+  <li>Open the example page /htmlarea/examples/core.html with your browser to make
+  sure everything works.</li>
+</ol>
+
+<p>Once htmlArea is on your website all you need to do is add some
+JavaScript to any pages that you want to add WYSIWYG editors to.  Here's how
+to do that.</p>
+
+<ol>
+
+  <li>Define some global variables.  "_editor_url" has to be the absolute
+  URL where HTMLArea resides within your
+  website; as we discussed, this would be “/htmlarea/”.  "_editor_lang" must
+  be the language code in which you want HTMLArea to appear.  This defaults
+  to "en" (English); for a list of supported languages, please look into
+  the "lang" subdirectory in the distribution.
+  <pre class="code"
+  ><span class="function-name">&lt;</span><span class="html-tag">script</span> <span class="variable-name">type=</span><span class="string">&quot;text/javascript&quot;</span><span class="function-name">&gt;</span>
+   _editor_url = <span class="string">&quot;/htmlarea/&quot;</span>;
+   _editor_lang = <span class="string">&quot;en&quot;</span>;
+<span class="function-name">&lt;</span><span class="html-tag">/script</span><span class="function-name">&gt;</span></pre>
+
+  <li>Include the "htmlarea.js" script:
+  <pre class="code"
+  ><span class="function-name">&lt;</span><span class="html-tag">script</span> <span class="variable-name">type=</span><span class="string">&quot;text/javascript&quot;</span> <span class="variable-name">src=</span><span class="string">&quot;/htmlarea/htmlarea.js&quot;</span><span class="function-name">&gt;</span><span class="paren-face-match">&lt;</span><span class="html-tag">/script</span><span class="paren-face-match">&gt;</span></pre>
+  </li>
+
+  <li><p>If you want to change all your &lt;textarea&gt;-s into
+  HTMLArea-s then you can use the simplest way to create HTMLArea:</p>
+  <pre class="code"
+  ><span class="function-name">&lt;</span><span class="html-tag">script</span> <span class="variable-name">type=</span><span class="string">&quot;text/javascript&quot;</span> <span class="variable-name">defer=</span><span class="string">&quot;1&quot;</span><span class="function-name">&gt;</span>
+    HTMLArea.replaceAll<span class="function-name">()</span>;
+<span class="paren-face-match">&lt;</span><span class="html-tag">/script</span><span class="paren-face-match">&gt;</span></pre>
+  <p><span class="note">Note:</span> you can also add the
+  <code>HTMLArea.replaceAll()</code> code to the <code>onload</code>
+  event handler for the <code>body</code> element, if you find it more appropriate.</p>
+
+  <p>A different approach, if you have more than one textarea and only want
+  to change one of them, is to use <code>HTMLArea.replace("id")</code> --
+  pass the <code>id</code> of your textarea.  Do not use the
+  <code>name</code> attribute anymore, it's not a standard solution!</p>
+
+</ol>
+
+<p>This section applies to HTMLArea-3.0 release candidate 1 or later; prior
+to this version, one needed to include more files; however, now HTMLArea is
+able to include other files too (such as stylesheet, language definition
+file, etc.) so you only need to define the editor path and load
+"htmlarea.js".  Nice, eh? ;-)</p>
+
+<h3>I want to change the editor settings, how do I do that?</h3>
+
+<p>While it's true that all you need is one line of JavaScript to create an
+htmlArea WYSIWYG editor, you can also specify more config settings in the
+code to control how the editor works and looks.  Here's an example of some of
+the available settings:</p>
+
+<pre class="code"
+><span class="keyword">var</span> <span class="variable-name">config</span> = <span class="keyword">new</span> HTMLArea.Config(); <span class="comment">// create a new configuration object
+</span>                                    <span class="comment">// having all the default values
+</span>config.width = '<span class="string">90%</span>';
+config.height = '<span class="string">200px</span>';
+
+<span class="comment">// the following sets a style for the page body (black text on yellow page)
+// and makes all paragraphs be bold by default
+</span>config.pageStyle =
+  '<span class="string">body { background-color: yellow; color: black; font-family: verdana,sans-serif } </span>' +
+  '<span class="string">p { font-width: bold; } </span>';
+
+<span class="comment">// the following replaces the textarea with the given id with a new
+// HTMLArea object having the specified configuration
+</span>HTMLArea.replace('<span class="string">id</span>', config);</pre>
+
+<p><span class="warning">Important:</span> It's recommended that you add
+custom features and configuration to a separate file.  This will ensure you
+that when we release a new official version of HTMLArea you'll have less
+trouble upgrading it.</p>
+
+<h3>How do I customize the toolbar?</h3>
+
+<p>Using the configuration object introduced above allows you to completely
+control what the toolbar contains.  Following is an example of a one-line,
+customized toolbar, much simpler than the default one:</p>
+
+<pre class="code"
+><span class="keyword">var</span> <span class="variable-name">config</span> = <span class="keyword">new</span> HTMLArea.Config();
+config.toolbar = [
+  ['<span class="string">fontname</span>', '<span class="string">space</span>',
+   '<span class="string">fontsize</span>', '<span class="string">space</span>',
+   '<span class="string">formatblock</span>', '<span class="string">space</span>',
+   '<span class="string">bold</span>', '<span class="string">italic</span>', '<span class="string">underline</span>']
+];
+HTMLArea.replace('<span class="string">id</span>', config);</pre>
+
+<p>The toolbar is an Array of Array objects.  Each array in the toolbar
+defines a new line.  The default toolbar looks like this:</p>
+
+<pre class="code"
+>config.toolbar = [
+[ &quot;<span class="string">fontname</span>&quot;, &quot;<span class="string">space</span>&quot;,
+  &quot;<span class="string">fontsize</span>&quot;, &quot;<span class="string">space</span>&quot;,
+  &quot;<span class="string">formatblock</span>&quot;, &quot;<span class="string">space</span>&quot;,
+  &quot;<span class="string">bold</span>&quot;, &quot;<span class="string">italic</span>&quot;, &quot;<span class="string">underline</span>&quot;, &quot;<span class="string">separator</span>&quot;,
+  &quot;<span class="string">strikethrough</span>&quot;, &quot;<span class="string">subscript</span>&quot;, &quot;<span class="string">superscript</span>&quot;, &quot;<span class="string">separator</span>&quot;,
+  &quot;<span class="string">copy</span>&quot;, &quot;<span class="string">cut</span>&quot;, &quot;<span class="string">paste</span>&quot;, &quot;<span class="string">space</span>&quot;, &quot;<span class="string">undo</span>&quot;, &quot;<span class="string">redo</span>&quot; ],
+
+[ &quot;<span class="string">justifyleft</span>&quot;, &quot;<span class="string">justifycenter</span>&quot;, &quot;<span class="string">justifyright</span>&quot;, &quot;<span class="string">justifyfull</span>&quot;, &quot;<span class="string">separator</span>&quot;,
+  &quot;<span class="string">insertorderedlist</span>&quot;, &quot;<span class="string">insertunorderedlist</span>&quot;, &quot;<span class="string">outdent</span>&quot;, &quot;<span class="string">indent</span>&quot;, &quot;<span class="string">separator</span>&quot;,
+  &quot;<span class="string">forecolor</span>&quot;, &quot;<span class="string">hilitecolor</span>&quot;, &quot;<span class="string">textindicator</span>&quot;, &quot;<span class="string">separator</span>&quot;,
+  &quot;<span class="string">inserthorizontalrule</span>&quot;, &quot;<span class="string">createlink</span>&quot;, &quot;<span class="string">insertimage</span>&quot;, &quot;<span class="string">inserttable</span>&quot;, &quot;<span class="string">htmlmode</span>&quot;, &quot;<span class="string">separator</span>&quot;,
+  &quot;<span class="string">popupeditor</span>&quot;, &quot;<span class="string">separator</span>&quot;, &quot;<span class="string">showhelp</span>&quot;, &quot;<span class="string">about</span>&quot; ]
+];</pre>
+
+<p>Except three strings, all others in the examples above need to be defined
+in the <code>config.btnList</code> object (detailed a bit later in this
+document).  The three exceptions are: 'space', 'separator' and 'linebreak'.
+These three have the following meaning, and need not be present in
+<code>btnList</code>:</p>
+
+<ul>
+  <li>'space' -- Inserts a space of 5 pixels (the width is configurable by external
+  <acronym title="Cascading Style Sheets">CSS</acronym>) at the current
+  position in the toolbar.</li>
+  <li>'separator' -- Inserts a small vertical separator, for visually grouping related
+  buttons.</li>
+  <li>'linebreak' -- Starts a new line in the toolbar.  Subsequent controls will be
+  inserted on the new line.</li>
+</ul>
+
+<p><span class="warning">Important:</span> It's recommended that you add
+custom features and configuration to a separate file.  This will ensure you
+that when we release a new official version of HTMLArea you'll have less
+trouble upgrading it.</p>
+
+<h3>How do I create custom buttons?</h3>
+
+<p>By design, the toolbar is easily extensible.  For adding a custom button
+one needs to follow two steps.</p>
+
+<h4 id="regbtn">1. Register the button in <code>config.btnList</code>.</h4>
+
+<p>For each button in the toolbar, HTMLArea needs to know the following
+information:</p>
+<ul>
+  <li>a name for it (we call it the ID of the button);</li>
+  <li>the path to an image to be displayed in the toolbar;</li>
+  <li>a tooltip for it;</li>
+  <li>whether the button is enabled or not in text mode;</li>
+  <li>what to do when the button is clicked;</li>
+</ul>
+<p>You need to provide all this information for registering a new button
+too.  The button ID can be any string identifier and it's used when
+defining the toolbar, as you saw above.  We recommend starting
+it with "my-" so that it won't clash with the standard ID-s (those from
+the default toolbar).</p>
+
+<p class="note">Register button example #1</p>
+
+<pre class="code"
+><span class="comment">// get a default configuration
+</span><span class="keyword">var</span> <span class="variable-name">config</span> = <span class="keyword">new</span> HTMLArea.Config();
+<span class="comment">// register the new button using Config.registerButton.
+// parameters:        button ID,   tooltip,          image,           textMode,
+</span>config.registerButton(&quot;<span class="string">my-hilite</span>&quot;, &quot;<span class="string">Highlight text</span>&quot;, &quot;<span class="string">my-hilite.gif</span>&quot;, <span class="keyword">false</span>,
+<span class="comment">// function that gets called when the button is clicked
+</span>  <span class="keyword">function</span>(editor, id) {
+    editor.surroundHTML('<span class="string">&lt;span class=&quot;hilite&quot;&gt;</span>', '<span class="string">&lt;/span&gt;</span>');
+  }
+);</pre>
+
+<p>An alternate way of calling registerButton is exemplified above.  Though
+the code might be a little bit larger, using this form makes your code more
+maintainable.  It doesn't even needs comments as it's pretty clear.</p>
+
+<p class="note">Register button example #2</p>
+
+<pre class="code"
+><span class="keyword">var</span> <span class="variable-name">config</span> = <span class="keyword">new</span> HTMLArea.Config();
+config.registerButton({
+  id        : &quot;<span class="string">my-hilite</span>&quot;,
+  tooltip   : &quot;<span class="string">Highlight text</span>&quot;,
+  image     : &quot;<span class="string">my-hilite.gif</span>&quot;,
+  textMode  : <span class="keyword">false</span>,
+  action    : <span class="keyword">function</span>(editor, id) {
+                editor.surroundHTML('<span class="string">&lt;span class=&quot;hilite&quot;&gt;</span>', '<span class="string">&lt;/span&gt;</span>');
+              }
+});</pre>
+
+<p>You might notice that the "action" function receives two parameters:
+<b>editor</b> and <b>id</b>.  In the examples above we only used the
+<b>editor</b> parameter.  But it could be helpful for you to understand
+both:</p>
+
+<ul>
+  <li><b>editor</b> is a reference to the HTMLArea object.  Since our entire
+  code now has an <acronym title="Object Oriented Programming">OOP</acronym>-like
+  design, you need to have a reference to
+  the editor object in order to do things with it.  In previous versions of
+  HTMLArea, in order to identify the object an ID was used -- the ID of the
+  HTML element.  In this version ID-s are no longer necessary.</li>
+
+  <li><b>id</b> is the button ID.  Wondering why is this useful?  Well, you
+  could use the same handler function (presuming that it's not an anonymous
+  function like in the examples above) for more buttons.  You can <a
+  href="#btnex">see an example</a> a bit later in this document.</li>
+</ul>
+
+<h4>2. Inserting it into the toolbar</h4>
+
+<p>At this step you need to specify where in the toolbar to insert the
+button, or just create the whole toolbar again as you saw in the previous
+section.  You use the button ID, as shown in the examples of customizing the
+toolbar in the previous section.</p>
+
+<p>For the sake of completion, following there are another examples.</p>
+
+<p class="note">Append your button to the default toolbar</p>
+
+<pre class="code"
+>config.toolbar.push([ &quot;<span class="string">my-hilite</span>&quot; ]);</pre>
+
+<p class="note">Customized toolbar</p>
+
+<pre class="code"
+>config.toolbar = [
+  ['<span class="string">fontname</span>', '<span class="string">space</span>',
+   '<span class="string">fontsize</span>', '<span class="string">space</span>',
+   '<span class="string">formatblock</span>', '<span class="string">space</span>',
+   '<span class="string">separator</span>', '<span class="string">my-hilite</span>', '<span class="string">separator</span>', '<span class="string">space</span>', <span class="comment">// here's your button
+</span>   '<span class="string">bold</span>', '<span class="string">italic</span>', '<span class="string">underline</span>', '<span class="string">space</span>']
+];</pre>
+
+<p><span class="note">Note:</span> in the example above our new button is
+between two vertical separators.  But this is by no means required.  You can
+put it wherever you like.  Once registered in the btnList (<a
+href="#regbtn">step 1</a>) your custom button behaves just like a default
+button.</p>
+
+<p><span class="warning">Important:</span> It's recommended that you add
+custom features and configuration to a separate file.  This will ensure you
+that when we release a new official version of HTMLArea you'll have less
+trouble upgrading it.</p>
+
+<h4 id="btnex">A complete example</h4>
+
+<p>Please note that it is by no means necessary to include the following
+code into the htmlarea.js file.  On the contrary, it might not work there.
+The configuration system is designed such that you can always customize the
+editor <em>from outside files</em>, thus keeping the htmlarea.js file
+intact.  This will make it easy for you to upgrade your HTMLArea when we
+release a new official version.  OK, I promise it's the last time I said
+this. ;)</p>
+
+<pre class="code"
+><span class="comment">// All our custom buttons will call this function when clicked.
+// We use the <b>buttonId</b> parameter to determine what button
+// triggered the call.
+</span><span class="keyword">function</span> <span class="function-name">clickHandler</span>(editor, buttonId) {
+  <span class="keyword">switch</span> (buttonId) {
+    <span class="keyword">case</span> &quot;<span class="string">my-toc</span>&quot;:
+      editor.insertHTML(&quot;<span class="string">&lt;h1&gt;Table Of Contents&lt;/h1&gt;</span>&quot;);
+      <span class="keyword">break</span>;
+    <span class="keyword">case</span> &quot;<span class="string">my-date</span>&quot;:
+      editor.insertHTML((<span class="keyword">new</span> Date()).toString());
+      <span class="keyword">break</span>;
+    <span class="keyword">case</span> &quot;<span class="string">my-bold</span>&quot;:
+      editor.execCommand(&quot;<span class="string">bold</span>&quot;);
+      editor.execCommand(&quot;<span class="string">italic</span>&quot;);
+      <span class="keyword">break</span>;
+    <span class="keyword">case</span> &quot;<span class="string">my-hilite</span>&quot;:
+      editor.surroundHTML(&quot;<span class="string">&lt;span class=\&quot;hilite\&quot;&gt;</span>&quot;, &quot;<span class="string">&lt;/span&gt;</span>&quot;);
+      <span class="keyword">break</span>;
+  }
+};
+
+<span class="comment">// Create a new configuration object
+</span><span class="keyword">var</span> <span class="variable-name">config</span> = <span class="keyword">new</span> HTMLArea.Config();
+
+<span class="comment">// Register our custom buttons
+</span>config.registerButton(&quot;<span class="string">my-toc</span>&quot;,  &quot;<span class="string">Insert TOC</span>&quot;, &quot;<span class="string">my-toc.gif</span>&quot;, <span class="keyword">false</span>, clickHandler);
+config.registerButton(&quot;<span class="string">my-date</span>&quot;, &quot;<span class="string">Insert date/time</span>&quot;, &quot;<span class="string">my-date.gif</span>&quot;, <span class="keyword">false</span>, clickHandler);
+config.registerButton(&quot;<span class="string">my-bold</span>&quot;, &quot;<span class="string">Toggle bold/italic</span>&quot;, &quot;<span class="string">my-bold.gif</span>&quot;, <span class="keyword">false</span>, clickHandler);
+config.registerButton(&quot;<span class="string">my-hilite</span>&quot;, &quot;<span class="string">Hilite selection</span>&quot;, &quot;<span class="string">my-hilite.gif</span>&quot;, <span class="keyword">false</span>, clickHandler);
+
+<span class="comment">// Append the buttons to the default toolbar
+</span>config.toolbar.push([&quot;<span class="string">linebreak</span>&quot;, &quot;<span class="string">my-toc</span>&quot;, &quot;<span class="string">my-date</span>&quot;, &quot;<span class="string">my-bold</span>&quot;, &quot;<span class="string">my-hilite</span>&quot;]);
+
+<span class="comment">// Replace an existing textarea with an HTMLArea object having the above config.
+</span>HTMLArea.replace(&quot;<span class="string">textAreaID</span>&quot;, config);</pre>
+
+
+<hr />
+<address>&copy; <a href="http://interactivetools.com" title="Visit our website"
+>InteractiveTools.com</a> 2002-2004.
+<br />
+© <a href="http://dynarch.com">dynarch.com</a> 2003-2004<br />
+HTMLArea v3.0 developed by <a
+href="http://dynarch.com/mishoo/">Mihai Bazon</a>.
+<br />
+Documentation written by Mihai Bazon.
+</address>
+<!-- hhmts start --> Last modified: Wed Jan 28 12:18:23 EET 2004 <!-- hhmts end -->
+<!-- doc-lang: English -->
+</body> </html>

Added: plog/trunk/js/htmlarea/docs/release-notes.html
===================================================================
--- plog/trunk/js/htmlarea/docs/release-notes.html	2005-02-05 13:57:52 UTC (rev 948)
+++ plog/trunk/js/htmlarea/docs/release-notes.html	2005-02-05 15:29:38 UTC (rev 949)
@@ -0,0 +1,182 @@
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 3.2//EN">
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+    <title>HTMLArea-3.0-RC3 release notes</title>
+    <style>
+      .fixme { color: red; }
+    </style>
+  </head>
+
+  <body>
+
+    <h1>HTMLArea-3.0-RC3 release notes</h1>
+
+    <p>This release was compiled on Jan , 2005 [23:43] GMT.</p>
+
+    <p>Changes since 3.0-RC2b:</p>
+
+    <ul>
+      <li>Restored broken images and re-committed ALL images back to CVS in binary mode.
+      <li>Added error with instructions for when HTMLArea.init() isn't called first.
+      <li>Fixed examples to call HTMLArea.init() first:
+      <ul>
+        <li>2-areas.html
+        <li>character_map.html
+        <li>css.html
+        <li>dynamic_css.html
+        <li>list-type.html
+        <li>remove-font-tags.html
+      </ul>
+      <li>
+    </ul>
+
+
+    <p>Changes since 3.0-Beta:</p>
+
+    <ul>
+      <li>
+        <b>New plugins</b>
+        <ul>
+          <li>
+            ContextMenu plugin (provides a nice context menu with common
+            operations, including table ops, link ops, etc.)
+          </li>
+          <li>
+            CSS plugin (provides an easy way to insert/change CSS classes)
+          </li>
+          <li>
+            FullPage plugin (allows HTMLArea to edit a whole HTML file,
+            not only the content within &lt;body&gt;.)
+          </li>
+        </ul>
+      </li>
+      <li>
+        <b>Changes in the SpellChecker plugin</b>
+        <ul>
+          <li>
+            Many bugfixes: now it works ;-)  Fully Unicode-safe.
+          </li>
+          <li>
+            Speed and bandwidth optimization: reports the list of
+            suggestions only once for each mispelled word; this helps
+            in cases where you have, for instance, the word “HTMLArea”
+            in 10 places all over the document; the list of
+            suggestions for it--which is kind of huge--will only be
+            included <em>once</em>.
+          </li>
+          <li>
+            User interface improvements: the highlighted word will
+            remain in view; in cases where it's normally outside, the
+            window will be scrolled to it.
+          </li>
+          <li>
+            Added a "Revert" button for those that change their minds ;-)
+          </li>
+          <li>
+            Added a "Info" button which reports information about the
+            document, retrieved by the server-side spell checker:
+            total number of words, total number of mispelled words,
+            number of suggestions made, spell check time, etc.  More
+            can be easily added.  <span class="fixme">FIXME: this part
+            is not yet internationalized.</span>
+          </li>
+          <li>
+            The server-side spell checker now uses XML::DOM instead of
+            HTML::Parser, which means that it will be unable to parse
+            “tag-soup” HTML.  It needs valid code.  Usually HTMLArea
+            generates valid code, but on rare occasions it might fail
+            and the spell checker will report a gross error message.
+            This gonna have to be fixed, but instead of making the
+            spell checker accept invalid HTML I prefer to make
+            HTMLArea generate valid code, so changes are to be done in
+            other places ;-)
+          </li>
+        </ul>
+      </li>
+      <li>
+        <b>Changes in the core editor</b>
+        <ul>
+          <li>
+            Easier to setup: you only need to load
+            <tt>htmlarea.js</tt>; other scripts will be loaded
+            automatically.  <a href="reference.html">Documentation</a>
+            and <a href="examples/">examples</a> updated.
+          </li>
+          <li>
+            Better plugin support (they register information about
+            themselves with the editor; can register event handlers for
+            the editor, etc.)
+          </li>
+          <li>
+            New about box; check it out, it's cool ;-)
+          </li>
+          <li>
+            Word cleaner (can be enabled to automatically kill Word crap
+            on paste (see Config.killWordOnPaste); otherwise accessible by
+            pressing CTRL-0 in the editor; a toolbar button will come up
+            soon)
+          </li>
+          <li>
+            Image preview in "insert image" dialog.  Also allows
+            modification of current image, if selected.
+          </li>
+          <li>
+            New "insert link" dialog, allows target and title
+            specification, allows editing links.
+          </li>
+          <li>
+            Implemented support for text direction (left-to-right or
+            right-to-left).
+          </li>
+          <li>
+            Lots of bug fixes!  ... and more, I guess ;-) an
+            automatically generated <a href="ChangeLog">change log</a>
+            is now available.
+          </li>
+        </ul>
+      </li>
+    </ul>
+
+    <p>I don't have the power to go through the <a
+href="http://sourceforge.net/tracker/?atid=525656&group_id=69750&func=browse">bug
+system</a> at SourceForge
+    now.  Some of the bugs reported there may be fixed; I'll update
+    their status, some other time.  If you reported bugs there and now
+    find them to be fixed, please let me know.</p>
+
+    <h2>3.0-Beta</h2>
+
+    <p>Changes since 3.0-Alpha:</p>
+
+    <ul>
+
+      <li>Performance improvements.</li>
+
+      <li>Many bugs fixed.</li>
+
+      <li>Plugin infrastructure.</li>
+
+      <li>TableOperations plugin.</li>
+
+      <li>SpellChecker plugin.</li>
+
+      <li>Status bar.</li>
+
+      <li>API for registering custom buttons and drop-down boxes in the
+        toolbar.</li>
+
+      <li>Toolbar can contain text labels.</li>
+
+      <li>Cut, copy, paste, undo, redo buttons.</li>
+
+    </ul>
+    <hr />
+    <address><a href="http://dynarch.com/mishoo/">Mihai Bazon</a></address>
+<!-- Created: Sun Aug  3 16:55:08 EEST 2003 -->
+<!-- hhmts start --> Last modified: Wed Mar 31 19:18:26 EEST 2004 <!-- hhmts end -->
+<!-- doc-lang: English -->
+  </body>
+</html>
+
+

Deleted: plog/trunk/js/htmlarea/htmlarea-lang-en.js
===================================================================
--- plog/trunk/js/htmlarea/htmlarea-lang-en.js	2005-02-05 13:57:52 UTC (rev 948)
+++ plog/trunk/js/htmlarea/htmlarea-lang-en.js	2005-02-05 15:29:38 UTC (rev 949)
@@ -1,63 +0,0 @@
-// I18N constants
-
-// LANG: "en", ENCODING: UTF-8 | ISO-8859-1
-// Author: Mihai Bazon, http://dynarch.com/mishoo
-
-// 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: "en",
-
-	tooltips: {
-		bold:           "Bold",
-		italic:         "Italic",
-		underline:      "Underline",
-		strikethrough:  "Strikethrough",
-		subscript:      "Subscript",
-		superscript:    "Superscript",
-		justifyleft:    "Justify Left",
-		justifycenter:  "Justify Center",
-		justifyright:   "Justify Right",
-		justifyfull:    "Justify Full",
-		orderedlist:    "Ordered List",
-		unorderedlist:  "Bulleted List",
-		outdent:        "Decrease Indent",
-		indent:         "Increase Indent",
-		forecolor:      "Font Color",
-		hilitecolor:    "Background Color",
-		horizontalrule: "Horizontal Rule",
-		createlink:     "Insert Web Link",
-		insertimage:    "Insert Image",
-		inserttable:    "Insert Table",
-		htmlmode:       "Toggle HTML Source",
-		popupeditor:    "Enlarge Editor",
-		about:          "About this editor",
-		showhelp:       "Help using editor",
-		textindicator:  "Current style",
-		undo:           "Undoes your last action",
-		redo:           "Redoes your last action",
-		cut:            "Cut selection",
-		copy:           "Copy selection",
-		paste:          "Paste from clipboard"
-	},
-
-	buttons: {
-		"ok":           "OK",
-		"cancel":       "Cancel"
-	},
-
-	msg: {
-		"Path":         "Path",
-		"TEXT_MODE":    "You are in TEXT MODE.  Use the [<>] button to switch back to WYSIWYG."
-	}
-};

Modified: plog/trunk/js/htmlarea/htmlarea-plog.js
===================================================================
--- plog/trunk/js/htmlarea/htmlarea-plog.js	2005-02-05 13:57:52 UTC (rev 948)
+++ plog/trunk/js/htmlarea/htmlarea-plog.js	2005-02-05 15:29:38 UTC (rev 949)
@@ -4,24 +4,63 @@
  * change needed, do NOT modify htmlarea.js in any way, it'll make things easier for us
  * when a new version comes out!
  */
- 
- 
+
 HTMLArea.prototype._plogPopupDialog = function(url, action, init) {
     Dialog(url, action, init, true);
 };
 
-var config = new HTMLArea.Config();
+// load the plugins that we will use
+HTMLArea.loadPlugin("EnterParagraphs");
 
-// Register the 'insert resource' button
-config.registerButton({
-    id: "insertresource",
-    tooltip: "Insert resource",
-    image: "js/htmlarea/images/ed_resource.gif",
-    textMode: false,
-    action: insertResource});
+var postTextEditor = null;
+var postExtendedTextEditor = null;
 
-// the method that will insert a resource
-//HTMLArea.prototype._insertResource = function(editor, id) {
+// this function will get called at body.onload
+function initEditor() {
+
+    var config = new HTMLArea.Config();
+    
+    // Register the 'insert resource' button
+    config.registerButton({
+        id: "insertresource",
+        tooltip: "Insert Resource",
+        image: "js/htmlarea/images/ed_resource.gif",
+        textMode: false,
+        action: insertResource});
+
+    // add our new icon in a place better suited for this task...		
+    config.toolbar = [
+    	[ "fontsize", "space","space",
+    	  "bold", "italic", "underline", "strikethrough", "separator",
+    	  "justifyleft", "justifycenter", "justifyright", "justifyfull", "separator",
+    	  "orderedlist", "unorderedlist", "separator",
+    	  "createlink", "insertimage", "insertresource", "htmlmode" ]
+    ];    
+
+    // Create postText Editor
+    postTextEditor = new HTMLArea("postText", config);
+    postTextEditor.registerPlugin(EnterParagraphs);
+
+    // Generate postText Editor
+    setTimeout(function() {
+        postTextEditor.generate();
+    }, 500);    
+
+    // Create postExtendedText Editor
+    postExtendedTextEditor = new HTMLArea("postExtendedText", config);
+    postExtendedTextEditor.registerPlugin(EnterParagraphs);
+
+    // Generate postExtendedText Editor
+    setTimeout(function() {
+        postExtendedTextEditor.generate();
+    }, 500);
+    //---------------------------------------------------------------------
+    
+    return false;
+};
+
+// The method that will insert a resource
+// HTMLArea.prototype._insertResource = function(editor, id) {
 function insertResource(editor, id) {
 	//var editor = this;	// for nested functions
 	editor._plogPopupDialog("admin.php?op=resourceList&mode=1", function(param) {
@@ -34,12 +73,5 @@
 	}, null);
 };
 
-// add our new icon in a place better suited for this task...		
-config.toolbar = [
-	[ "fontsize", "space",
-	  "space",
-	  "bold", "italic", "underline", "strikethrough",
-	  "justifyleft", "justifycenter", "justifyright", "justifyfull", "separator",
-	  "insertorderedlist", "insertunorderedlist", "separator",
-	  "createlink", "insertimage", "insertresource", "htmlmode", ]
-];
\ No newline at end of file
+HTMLArea.init();
+HTMLArea.onload = initEditor;
\ No newline at end of file

Modified: plog/trunk/js/htmlarea/htmlarea.css
===================================================================
--- plog/trunk/js/htmlarea/htmlarea.css	2005-02-05 13:57:52 UTC (rev 948)
+++ plog/trunk/js/htmlarea/htmlarea.css	2005-02-05 15:29:38 UTC (rev 949)
@@ -1,180 +1,180 @@
-.htmlarea { background: #fff; }
-
-.htmlarea .toolbar {
-  cursor: default;
-  background: ButtonFace;
-  padding: 1px 1px 2px 1px;
-  border: 1px solid;
-  border-color: ButtonHighlight ButtonShadow ButtonShadow ButtonHighlight;
-}
-.htmlarea .toolbar table { font-family: tahoma,verdana,sans-serif; font-size: 11px; }
-.htmlarea .toolbar img { border: none; }
-.htmlarea .toolbar .label { padding: 0px 3px; }
-
-.htmlarea .toolbar .button {
-  background: ButtonFace;
-  color: ButtonText;
-  border: 1px solid ButtonFace;
-  padding: 1px;
-  margin: 0px;
-  width: 18px;
-  height: 18px;
-}
-.htmlarea .toolbar .buttonHover {
-  border: 1px solid;
-  border-color: ButtonHighlight ButtonShadow ButtonShadow ButtonHighlight;
-}
-.htmlarea .toolbar .buttonActive, .htmlarea .toolbar .buttonPressed {
-  padding: 2px 0px 0px 2px;
-  border: 1px solid;
-  border-color: ButtonShadow ButtonHighlight ButtonHighlight ButtonShadow;
-}
-.htmlarea .toolbar .buttonPressed {
-  background: ButtonHighlight;
-}
-.htmlarea .toolbar .indicator {
-  padding: 0px 3px;
-  overflow: hidden;
-  width: 20px;
-  text-align: center;
-  cursor: default;
-  border: 1px solid ButtonShadow;
-}
-
-.htmlarea .toolbar .buttonDisabled img {
-  filter: alpha(opacity = 25);
-  -moz-opacity: 0.25;
-}
-
-.htmlarea .toolbar .separator {
-  position: relative;
-  margin: 3px;
-  border-left: 1px solid ButtonShadow;
-  border-right: 1px solid ButtonHighlight;
-  width: 0px;
-  height: 16px;
-  padding: 0px;
-}
-
-.htmlarea .toolbar .space { width: 5px; }
-
-.htmlarea .toolbar select { font: 11px Tahoma,Verdana,sans-serif; }
-
-.htmlarea .toolbar select,
-.htmlarea .toolbar select:hover,
-.htmlarea .toolbar select:active { background: FieldFace; color: ButtonText; }
-
-.htmlarea .statusBar {
-  border: 1px solid;
-  border-color: ButtonShadow ButtonHighlight ButtonHighlight ButtonShadow;
-  padding: 2px 4px;
-  background-color: ButtonFace;
-  color: ButtonText;
-  font: 11px Tahoma,Verdana,sans-serif;
-}
-
-.htmlarea .statusBar .statusBarTree a {
-  padding: 2px 5px;
-  color: #00f;
-}
-
-.htmlarea .statusBar .statusBarTree a:visited { color: #00f; }
-.htmlarea .statusBar .statusBarTree a:hover {
-  background-color: Highlight;
-  color: HighlightText;
-  padding: 1px 4px;
-  border: 1px solid HighlightText;
-}
-
-
-/* Hidden DIV popup dialogs (PopupDiv) */
-
-.dialog {
-  color: ButtonText;
-  background: ButtonFace;
-}
-
-.dialog .content { padding: 2px; }
-
-.dialog, .dialog button, .dialog input, .dialog select, .dialog textarea, .dialog table {
-  font: 11px Tahoma,Verdana,sans-serif;
-}
-
-.dialog table { border-collapse: collapse; }
-
-.dialog .title {
-  background: #008;
-  color: #ff8;
-  border-bottom: 1px solid #000;
-  padding: 1px 0px 2px 5px;
-  font-size: 12px;
-  font-weight: bold;
-  cursor: default;
-}
-
-.dialog .title .button {
-  float: right;
-  border: 1px solid #66a;
-  padding: 0px 1px 0px 2px;
-  margin-right: 1px;
-  color: #fff;
-  text-align: center;
-}
-
-.dialog .title .button-hilite { border-color: #88f; background: #44c; }
-
-.dialog button {
-  width: 5em;
-  padding: 0px;
-}
-
-.dialog .buttonColor {
-  padding: 1px;
-  cursor: default;
-  border: 1px solid;
-  border-color: ButtonHighlight ButtonShadow ButtonShadow ButtonHighlight;
-}
-
-.dialog .buttonColor-hilite {
-  border-color: #000;
-}
-
-.dialog .buttonColor .chooser, .dialog .buttonColor .nocolor {
-  height: 0.6em;
-  border: 1px solid;
-  padding: 0px 1em;
-  border-color: ButtonShadow ButtonHighlight ButtonHighlight ButtonShadow;
-}
-
-.dialog .buttonColor .nocolor { padding: 0px; }
-.dialog .buttonColor .nocolor-hilite { background-color: #fff; color: #f00; }
-
-.dialog .label { text-align: right; width: 6em; }
-.dialog .value input { width: 100%; }
-.dialog .buttons { text-align: right; padding: 2px 4px 0px 4px; }
-
-.dialog legend { font-weight: bold; }
-.dialog fieldset table { margin: 2px 0px; }
-
-.popupdiv {
-  border: 2px solid;
-  border-color: ButtonHighlight ButtonShadow ButtonShadow ButtonHighlight;
-}
-
-.popupwin {
-  padding: 0px;
-  margin: 0px;
-}
-
-.popupwin .title {
-  background: #fff;
-  color: #000;
-  font-weight: bold;
-  font-size: 120%;
-  padding: 3px 10px;
-  margin-bottom: 10px;
-  border-bottom: 1px solid black;
-  letter-spacing: 2px;
-}
-
-form { margin: 0px; border: none; }
+.htmlarea { background: #fff; }
+
+.htmlarea .toolbar {
+  cursor: default;
+  background: ButtonFace;
+  padding: 3px;
+  border: 1px solid;
+  border-color: ButtonHighlight ButtonShadow ButtonShadow ButtonHighlight;
+}
+.htmlarea .toolbar table { font-family: tahoma,verdana,sans-serif; font-size: 11px; }
+.htmlarea .toolbar img { border: none; }
+.htmlarea .toolbar .label { padding: 0px 3px; }
+
+.htmlarea .toolbar .button {
+  background: ButtonFace;
+  color: ButtonText;
+  border: 1px solid ButtonFace;
+  padding: 1px;
+  margin: 0px;
+  width: 18px;
+  height: 18px;
+}
+.htmlarea .toolbar .buttonHover {
+  border: 1px solid;
+  border-color: ButtonHighlight ButtonShadow ButtonShadow ButtonHighlight;
+}
+.htmlarea .toolbar .buttonActive, .htmlarea .toolbar .buttonPressed {
+  padding: 2px 0px 0px 2px;
+  border: 1px solid;
+  border-color: ButtonShadow ButtonHighlight ButtonHighlight ButtonShadow;
+}
+.htmlarea .toolbar .buttonPressed {
+  background: ButtonHighlight;
+}
+.htmlarea .toolbar .indicator {
+  padding: 0px 3px;
+  overflow: hidden;
+  width: 20px;
+  text-align: center;
+  cursor: default;
+  border: 1px solid ButtonShadow;
+}
+
+.htmlarea .toolbar .buttonDisabled img {
+  filter: gray() alpha(opacity = 25);
+  -moz-opacity: 0.25;
+}
+
+.htmlarea .toolbar .separator {
+  position: relative;
+  margin: 3px;
+  border-left: 1px solid ButtonShadow;
+  border-right: 1px solid ButtonHighlight;
+  width: 0px;
+  height: 16px;
+  padding: 0px;
+}
+
+.htmlarea .toolbar .space { width: 5px; }
+
+.htmlarea .toolbar select { font: 11px Tahoma,Verdana,sans-serif; }
+
+.htmlarea .toolbar select,
+.htmlarea .toolbar select:hover,
+.htmlarea .toolbar select:active { background: FieldFace; color: ButtonText; }
+
+.htmlarea .statusBar {
+  border: 1px solid;
+  border-color: ButtonShadow ButtonHighlight ButtonHighlight ButtonShadow;
+  padding: 2px 4px;
+  background-color: ButtonFace;
+  color: ButtonText;
+  font: 11px Tahoma,Verdana,sans-serif;
+}
+
+.htmlarea .statusBar .statusBarTree a {
+  padding: 2px 5px;
+  color: #00f;
+}
+
+.htmlarea .statusBar .statusBarTree a:visited { color: #00f; }
+.htmlarea .statusBar .statusBarTree a:hover {
+  background-color: Highlight;
+  color: HighlightText;
+  padding: 1px 4px;
+  border: 1px solid HighlightText;
+}
+
+
+/* Hidden DIV popup dialogs (PopupDiv) */
+
+.dialog {
+  color: ButtonText;
+  background: ButtonFace;
+}
+
+.dialog .content { padding: 2px; }
+
+.dialog, .dialog button, .dialog input, .dialog select, .dialog textarea, .dialog table {
+  font: 11px Tahoma,Verdana,sans-serif;
+}
+
+.dialog table { border-collapse: collapse; }
+
+.dialog .title {
+  background: #008;
+  color: #ff8;
+  border-bottom: 1px solid #000;
+  padding: 1px 0px 2px 5px;
+  font-size: 12px;
+  font-weight: bold;
+  cursor: default;
+}
+
+.dialog .title .button {
+  float: right;
+  border: 1px solid #66a;
+  padding: 0px 1px 0px 2px;
+  margin-right: 1px;
+  color: #fff;
+  text-align: center;
+}
+
+.dialog .title .button-hilite { border-color: #88f; background: #44c; }
+
+.dialog button {
+  width: 5em;
+  padding: 0px;
+}
+
+.dialog .buttonColor {
+  padding: 1px;
+  cursor: default;
+  border: 1px solid;
+  border-color: ButtonHighlight ButtonShadow ButtonShadow ButtonHighlight;
+}
+
+.dialog .buttonColor-hilite {
+  border-color: #000;
+}
+
+.dialog .buttonColor .chooser, .dialog .buttonColor .nocolor {
+  height: 0.6em;
+  border: 1px solid;
+  padding: 0px 1em;
+  border-color: ButtonShadow ButtonHighlight ButtonHighlight ButtonShadow;
+}
+
+.dialog .buttonColor .nocolor { padding: 0px; }
+.dialog .buttonColor .nocolor-hilite { background-color: #fff; color: #f00; }
+
+.dialog .label { text-align: right; width: 6em; }
+.dialog .value input { width: 100%; }
+.dialog .buttons { text-align: right; padding: 2px 4px 0px 4px; }
+
+.dialog legend { font-weight: bold; }
+.dialog fieldset table { margin: 2px 0px; }
+
+.popupdiv {
+  border: 2px solid;
+  border-color: ButtonHighlight ButtonShadow ButtonShadow ButtonHighlight;
+}
+
+.popupwin {
+  padding: 0px;
+  margin: 0px;
+}
+
+.popupwin .title {
+  background: #fff;
+  color: #000;
+  font-weight: bold;
+  font-size: 120%;
+  padding: 3px 10px;
+  margin-bottom: 10px;
+  border-bottom: 1px solid black;
+  letter-spacing: 2px;
+}
+
+form { margin: 0px; border: none; }

Modified: plog/trunk/js/htmlarea/htmlarea.js
===================================================================
--- plog/trunk/js/htmlarea/htmlarea.js	2005-02-05 13:57:52 UTC (rev 948)
+++ plog/trunk/js/htmlarea/htmlarea.js	2005-02-05 15:29:38 UTC (rev 949)
@@ -1,2182 +1,2653 @@
-// htmlArea v3.0 - Copyright (c) 2002-2004 interactivetools.com, inc.
-// This copyright notice MUST stay intact for use (see license.txt).
-//
-// Portions (c) dynarch.com, 2003-2004
-//
-// 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.
-//   http://dynarch.com/mishoo
-//
-// $Id: htmlarea.js,v 1.59 2004/02/09 09:38:47 mishoo Exp $
-
-var _editor_url = "js/htmlarea";
-
-if (typeof _editor_url == "string") {
-	// Leave exactly one backslash at the end of _editor_url
-	_editor_url = _editor_url.replace(/\x2f*$/, '/');
-} else {
-	alert("WARNING: _editor_url is not set!  You should set this variable to the editor files path; it should preferably be an absolute path, like in '/htmlarea', but it can be relative if you prefer.  Further we will try to load the editor files correctly but we'll probably fail.");
-	_editor_url = '';
-}
-
-// make sure we have a language
-if (typeof _editor_lang == "string") {
-	_editor_lang = _editor_lang.toLowerCase();
-} else {
-	_editor_lang = "en";
-}
-
-// Creates a new HTMLArea object.  Tries to replace the textarea with the given
-// ID with it.
-function HTMLArea(textarea, config) {
-	if (HTMLArea.checkSupportedBrowser()) {
-		if (typeof config == "undefined") {
-			this.config = new HTMLArea.Config();
-		} else {
-			this.config = config;
-		}
-		this._htmlArea = null;
-		this._textArea = textarea;
-		this._editMode = "wysiwyg";
-		this.plugins = {};
-		this._timerToolbar = null;
-		this._timerUndo = null;
-		this._undoQueue = new Array(this.config.undoSteps);
-		this._undoPos = -1;
-		this._customUndo = false;
-		this._mdoc = document; // cache the document, we need it in plugins
-		this.doctype = '';
-	}
-};
-
-// load some scripts
-(function() {
-	var scripts = HTMLArea._scripts = [ _editor_url + "htmlarea.js",
-					    _editor_url + "dialog.js",
-					    _editor_url + "popupwin.js",
-					    _editor_url + "lang/" + _editor_lang + ".js" ];
-	var head = document.getElementsByTagName("head")[0];
-	// start from 1, htmlarea.js is already loaded
-	for (var i = 1; i < scripts.length; ++i) {
-		var script = document.createElement("script");
-		script.src = scripts[i];
-		head.appendChild(script);
-	}
-})();
-
-// cache some regexps
-HTMLArea.RE_tagName = /(<\/|<)\s*([^ \t\n>]+)/ig;
-HTMLArea.RE_doctype = /(<!doctype((.|\n)*?)>)\n?/i;
-HTMLArea.RE_head    = /<head>((.|\n)*?)<\/head>/i;
-HTMLArea.RE_body    = /<body>((.|\n)*?)<\/body>/i;
-
-HTMLArea.Config = function () {
-	this.version = "3.0";
-
-	this.width = "auto";
-	this.height = "auto";
-
-	// enable creation of a status bar?
-	this.statusBar = true;
-
-	// maximum size of the undo queue
-	this.undoSteps = 20;
-
-	// the time interval at which undo samples are taken
-	this.undoTimeout = 500;	// 1/2 sec.
-
-	// the next parameter specifies whether the toolbar should be included
-	// in the size or not.
-	this.sizeIncludesToolbar = true;
-
-	// if true then HTMLArea will retrieve the full HTML, starting with the
-	// <HTML> tag.
-	this.fullPage = false;
-
-	// style included in the iframe document
-	this.pageStyle = "";
-
-	// set to true if you want Word code to be cleaned upon Paste
-	this.killWordOnPaste = false;
-
-	// BaseURL included in the iframe document
-	this.baseURL = document.baseURI || document.URL;
-	if (this.baseURL && this.baseURL.match(/(.*)\/([^\/]+)/))
-		this.baseURL = RegExp.$1 + "/";
-
-	// URL-s
-	this.imgURL = "images/";
-	this.popupURL = "popups/";
-
-	/** CUSTOMIZING THE TOOLBAR
-	 * -------------------------
-	 *
-	 * It is recommended that you customize the toolbar contents in an
-	 * external file (i.e. the one calling HTMLArea) and leave this one
-	 * unchanged.  That's because when we (InteractiveTools.com) release a
-	 * new official version, it's less likely that you will have problems
-	 * upgrading HTMLArea.
-	 */
-	this.toolbar = [
-		[ "fontname", "space",
-		  "fontsize", "space",
-		  "formatblock", "space",
-		  "bold", "italic", "underline", "strikethrough", "separator",
-		  "subscript", "superscript", "separator",
-		  "copy", "cut", "paste", "space", "undo", "redo" ],
-
-		[ "justifyleft", "justifycenter", "justifyright", "justifyfull", "separator",
-		  "lefttoright", "righttoleft", "separator",
-		  "insertorderedlist", "insertunorderedlist", "outdent", "indent", "separator",
-		  "forecolor", "hilitecolor", "separator",
-		  "inserthorizontalrule", "createlink", "insertimage", "inserttable", "htmlmode", "separator",
-		  "popupeditor", "separator", "showhelp", "about" ]
-	];
-
-	this.fontname = {
-		"Arial":	   'arial,helvetica,sans-serif',
-		"Courier New":	   'courier new,courier,monospace',
-		"Georgia":	   'georgia,times new roman,times,serif',
-		"Tahoma":	   'tahoma,arial,helvetica,sans-serif',
-		"Times New Roman": 'times new roman,times,serif',
-		"Verdana":	   'verdana,arial,helvetica,sans-serif',
-		"impact":	   'impact',
-		"WingDings":	   'wingdings'
-	};
-
-	this.fontsize = {
-		"1 (8 pt)":  "1",
-		"2 (10 pt)": "2",
-		"3 (12 pt)": "3",
-		"4 (14 pt)": "4",
-		"5 (18 pt)": "5",
-		"6 (24 pt)": "6",
-		"7 (36 pt)": "7"
-	};
-
-	this.formatblock = {
-		"Heading 1": "h1",
-		"Heading 2": "h2",
-		"Heading 3": "h3",
-		"Heading 4": "h4",
-		"Heading 5": "h5",
-		"Heading 6": "h6",
-		"Normal": "p",
-		"Address": "address",
-		"Formatted": "pre"
-	};
-
-	this.customSelects = {};
-
-	function cut_copy_paste(e, cmd, obj) {
-		e.execCommand(cmd);
-	};
-
-	// ADDING CUSTOM BUTTONS: please read below!
-	// format of the btnList elements is "ID: [ ToolTip, Icon, Enabled in text mode?, ACTION ]"
-	//    - ID: unique ID for the button.  If the button calls document.execCommand
-	//	    it's wise to give it the same name as the called command.
-	//    - ACTION: function that gets called when the button is clicked.
-	//              it has the following prototype:
-	//                 function(editor, buttonName)
-	//              - editor is the HTMLArea object that triggered the call
-	//              - buttonName is the ID of the clicked button
-	//              These 2 parameters makes it possible for you to use the same
-	//              handler for more HTMLArea objects or for more different buttons.
-	//    - ToolTip: default tooltip, for cases when it is not defined in the -lang- file (HTMLArea.I18N)
-	//    - Icon: path to an icon image file for the button (TODO: use one image for all buttons!)
-	//    - Enabled in text mode: if false the button gets disabled for text-only mode; otherwise enabled all the time.
-	this.btnList = {
-		bold: [ "Bold", "ed_format_bold.gif", false, function(e) {e.execCommand("bold");} ],
-		italic: [ "Italic", "ed_format_italic.gif", false, function(e) {e.execCommand("italic");} ],
-		underline: [ "Underline", "ed_format_underline.gif", false, function(e) {e.execCommand("underline");} ],
-		strikethrough: [ "Strikethrough", "ed_format_strike.gif", false, function(e) {e.execCommand("strikethrough");} ],
-		subscript: [ "Subscript", "ed_format_sub.gif", false, function(e) {e.execCommand("subscript");} ],
-		superscript: [ "Superscript", "ed_format_sup.gif", false, function(e) {e.execCommand("superscript");} ],
-		justifyleft: [ "Justify Left", "ed_align_left.gif", false, function(e) {e.execCommand("justifyleft");} ],
-		justifycenter: [ "Justify Center", "ed_align_center.gif", false, function(e) {e.execCommand("justifycenter");} ],
-		justifyright: [ "Justify Right", "ed_align_right.gif", false, function(e) {e.execCommand("justifyright");} ],
-		justifyfull: [ "Justify Full", "ed_align_justify.gif", false, function(e) {e.execCommand("justifyfull");} ],
-		insertorderedlist: [ "Ordered List", "ed_list_num.gif", false, function(e) {e.execCommand("insertorderedlist");} ],
-		insertunorderedlist: [ "Bulleted List", "ed_list_bullet.gif", false, function(e) {e.execCommand("insertunorderedlist");} ],
-		outdent: [ "Decrease Indent", "ed_indent_less.gif", false, function(e) {e.execCommand("outdent");} ],
-		indent: [ "Increase Indent", "ed_indent_more.gif", false, function(e) {e.execCommand("indent");} ],
-		forecolor: [ "Font Color", "ed_color_fg.gif", false, function(e) {e.execCommand("forecolor");} ],
-		hilitecolor: [ "Background Color", "ed_color_bg.gif", false, function(e) {e.execCommand("hilitecolor");} ],
-		inserthorizontalrule: [ "Horizontal Rule", "ed_hr.gif", false, function(e) {e.execCommand("inserthorizontalrule");} ],
-		createlink: [ "Insert Web Link", "ed_link.gif", false, function(e) {e.execCommand("createlink", true);} ],
-		insertimage: [ "Insert/Modify Image", "ed_image.gif", false, function(e) {e.execCommand("insertimage");} ],
-		inserttable: [ "Insert Table", "insert_table.gif", false, function(e) {e.execCommand("inserttable");} ],
-		htmlmode: [ "Toggle HTML Source", "ed_html.gif", true, function(e) {e.execCommand("htmlmode");} ],
-		popupeditor: [ "Enlarge Editor", "fullscreen_maximize.gif", true, function(e) {e.execCommand("popupeditor");} ],
-		about: [ "About this editor", "ed_about.gif", true, function(e) {e.execCommand("about");} ],
-		showhelp: [ "Help using editor", "ed_help.gif", true, function(e) {e.execCommand("showhelp");} ],
-		undo: [ "Undoes your last action", "ed_undo.gif", false, function(e) {e.execCommand("undo");} ],
-		redo: [ "Redoes your last action", "ed_redo.gif", false, function(e) {e.execCommand("redo");} ],
-		cut: [ "Cut selection", "ed_cut.gif", false, cut_copy_paste ],
-		copy: [ "Copy selection", "ed_copy.gif", false, cut_copy_paste ],
-		paste: [ "Paste from clipboard", "ed_paste.gif", false, cut_copy_paste ],
-		lefttoright: [ "Direction left to right", "ed_left_to_right.gif", false, function(e) {e.execCommand("lefttoright");} ],
-		righttoleft: [ "Direction right to left", "ed_right_to_left.gif", false, function(e) {e.execCommand("righttoleft");} ]
-	};
-	/* ADDING CUSTOM BUTTONS
-	 * ---------------------
-	 *
-	 * It is recommended that you add the custom buttons in an external
-	 * file and leave this one unchanged.  That's because when we
-	 * (InteractiveTools.com) release a new official version, it's less
-	 * likely that you will have problems upgrading HTMLArea.
-	 *
-	 * Example on how to add a custom button when you construct the HTMLArea:
-	 *
-	 *   var editor = new HTMLArea("your_text_area_id");
-	 *   var cfg = editor.config; // this is the default configuration
-	 *   cfg.btnList["my-hilite"] =
-	 *	[ function(editor) { editor.surroundHTML('<span style="background:yellow">', '</span>'); }, // action
-	 *	  "Highlight selection", // tooltip
-	 *	  "my_hilite.gif", // image
-	 *	  false // disabled in text mode
-	 *	];
-	 *   cfg.toolbar.push(["linebreak", "my-hilite"]); // add the new button to the toolbar
-	 *
-	 * An alternate (also more convenient and recommended) way to
-	 * accomplish this is to use the registerButton function below.
-	 */
-	// initialize tooltips from the I18N module and generate correct image path
-	for (var i in this.btnList) {
-		var btn = this.btnList[i];
-		btn[1] = _editor_url + this.imgURL + btn[1];
-		if (typeof HTMLArea.I18N.tooltips[i] != "undefined") {
-			btn[0] = HTMLArea.I18N.tooltips[i];
-		}
-	}
-};
-
-/** Helper function: register a new button with the configuration.  It can be
- * called with all 5 arguments, or with only one (first one).  When called with
- * only one argument it must be an object with the following properties: id,
- * tooltip, image, textMode, action.  Examples:
- *
- * 1. config.registerButton("my-hilite", "Hilite text", "my-hilite.gif", false, function(editor) {...});
- * 2. config.registerButton({
- *      id       : "my-hilite",      // the ID of your button
- *      tooltip  : "Hilite text",    // the tooltip
- *      image    : "my-hilite.gif",  // image to be displayed in the toolbar
- *      textMode : false,            // disabled in text mode
- *      action   : function(editor) { // called when the button is clicked
- *                   editor.surroundHTML('<span class="hilite">', '</span>');
- *                 },
- *      context  : "p"               // will be disabled if outside a <p> element
- *    });
- */
-HTMLArea.Config.prototype.registerButton = function(id, tooltip, image, textMode, action, context) {
-	var the_id;
-	if (typeof id == "string") {
-		the_id = id;
-	} else if (typeof id == "object") {
-		the_id = id.id;
-	} else {
-		alert("ERROR [HTMLArea.Config::registerButton]:\ninvalid arguments");
-		return false;
-	}
-	// check for existing id
-	if (typeof this.customSelects[the_id] != "undefined") {
-		// alert("WARNING [HTMLArea.Config::registerDropdown]:\nA dropdown with the same ID already exists.");
-	}
-	if (typeof this.btnList[the_id] != "undefined") {
-		// alert("WARNING [HTMLArea.Config::registerDropdown]:\nA button with the same ID already exists.");
-	}
-	switch (typeof id) {
-	    case "string": this.btnList[id] = [ tooltip, image, textMode, action, context ]; break;
-	    case "object": this.btnList[id.id] = [ id.tooltip, id.image, id.textMode, id.action, id.context ]; break;
-	}
-};
-
-/** The following helper function registers a dropdown box with the editor
- * configuration.  You still have to add it to the toolbar, same as with the
- * buttons.  Call it like this:
- *
- * FIXME: add example
- */
-HTMLArea.Config.prototype.registerDropdown = function(object) {
-	// check for existing id
-	if (typeof this.customSelects[object.id] != "undefined") {
-		// alert("WARNING [HTMLArea.Config::registerDropdown]:\nA dropdown with the same ID already exists.");
-	}
-	if (typeof this.btnList[object.id] != "undefined") {
-		// alert("WARNING [HTMLArea.Config::registerDropdown]:\nA button with the same ID already exists.");
-	}
-	this.customSelects[object.id] = object;
-};
-
-/** Call this function to remove some buttons/drop-down boxes from the toolbar.
- * Pass as the only parameter a string containing button/drop-down names
- * delimited by spaces.  Note that the string should also begin with a space
- * and end with a space.  Example:
- *
- *   config.hideSomeButtons(" fontname fontsize textindicator ");
- *
- * It's useful because it's easier to remove stuff from the defaul toolbar than
- * create a brand new toolbar ;-)
- */
-HTMLArea.Config.prototype.hideSomeButtons = function(remove) {
-	var toolbar = this.toolbar;
-	for (var i in toolbar) {
-		var line = toolbar[i];
-		for (var j = line.length; --j >= 0; ) {
-			if (remove.indexOf(" " + line[j] + " ") >= 0) {
-				var len = 1;
-				if (/separator|space/.test(line[j + 1])) {
-					len = 2;
-				}
-				line.splice(j, len);
-			}
-		}
-	}
-};
-
-/** Helper function: replace all TEXTAREA-s in the document with HTMLArea-s. */
-HTMLArea.replaceAll = function(config) {
-	var tas = document.getElementsByTagName("textarea");
-	for (var i = tas.length; i > 0; (new HTMLArea(tas[--i], config)).generate());
-};
-
-/** Helper function: replaces the TEXTAREA with the given ID with HTMLArea. */
-HTMLArea.replace = function(id, config) {
-	var ta = HTMLArea.getElementById("textarea", id);
-	return ta ? (new HTMLArea(ta, config)).generate() : null;
-};
-
-// Creates the toolbar and appends it to the _htmlarea
-HTMLArea.prototype._createToolbar = function () {
-	var editor = this;	// to access this in nested functions
-
-	var toolbar = document.createElement("div");
-	this._toolbar = toolbar;
-	toolbar.className = "toolbar";
-	toolbar.unselectable = "1";
-	var tb_row = null;
-	var tb_objects = new Object();
-	this._toolbarObjects = tb_objects;
-
-	// creates a new line in the toolbar
-	function newLine() {
-		var table = document.createElement("table");
-		table.border = "0px";
-		table.cellSpacing = "0px";
-		table.cellPadding = "0px";
-		toolbar.appendChild(table);
-		// TBODY is required for IE, otherwise you don't see anything
-		// in the TABLE.
-		var tb_body = document.createElement("tbody");
-		table.appendChild(tb_body);
-		tb_row = document.createElement("tr");
-		tb_body.appendChild(tb_row);
-	}; // END of function: newLine
-	// init first line
-	newLine();
-
-	// updates the state of a toolbar element.  This function is member of
-	// a toolbar element object (unnamed objects created by createButton or
-	// createSelect functions below).
-	function setButtonStatus(id, newval) {
-		var oldval = this[id];
-		var el = this.element;
-		if (oldval != newval) {
-			switch (id) {
-			    case "enabled":
-				if (newval) {
-					HTMLArea._removeClass(el, "buttonDisabled");
-					el.disabled = false;
-				} else {
-					HTMLArea._addClass(el, "buttonDisabled");
-					el.disabled = true;
-				}
-				break;
-			    case "active":
-				if (newval) {
-					HTMLArea._addClass(el, "buttonPressed");
-				} else {
-					HTMLArea._removeClass(el, "buttonPressed");
-				}
-				break;
-			}
-			this[id] = newval;
-		}
-	}; // END of function: setButtonStatus
-
-	// this function will handle creation of combo boxes.  Receives as
-	// parameter the name of a button as defined in the toolBar config.
-	// This function is called from createButton, above, if the given "txt"
-	// doesn't match a button.
-	function createSelect(txt) {
-		var options = null;
-		var el = null;
-		var cmd = null;
-		var customSelects = editor.config.customSelects;
-		var context = null;
-		switch (txt) {
-		    case "fontsize":
-		    case "fontname":
-		    case "formatblock":
-			// the following line retrieves the correct
-			// configuration option because the variable name
-			// inside the Config object is named the same as the
-			// button/select in the toolbar.  For instance, if txt
-			// == "formatblock" we retrieve config.formatblock (or
-			// a different way to write it in JS is
-			// config["formatblock"].
-			options = editor.config[txt];
-			cmd = txt;
-			break;
-		    default:
-			// try to fetch it from the list of registered selects
-			cmd = txt;
-			var dropdown = customSelects[cmd];
-			if (typeof dropdown != "undefined") {
-				options = dropdown.options;
-				context = dropdown.context;
-			} else {
-				alert("ERROR [createSelect]:\nCan't find the requested dropdown definition");
-			}
-			break;
-		}
-		if (options) {
-			el = document.createElement("select");
-			var obj = {
-				name	: txt, // field name
-				element : el,	// the UI element (SELECT)
-				enabled : true, // is it enabled?
-				text	: false, // enabled in text mode?
-				cmd	: cmd, // command ID
-				state	: setButtonStatus, // for changing state
-				context : context
-			};
-			tb_objects[txt] = obj;
-			for (var i in options) {
-				var op = document.createElement("option");
-				op.appendChild(document.createTextNode(i));
-				op.value = options[i];
-				el.appendChild(op);
-			}
-			HTMLArea._addEvent(el, "change", function () {
-				editor._comboSelected(el, txt);
-			});
-		}
-		return el;
-	}; // END of function: createSelect
-
-	// appends a new button to toolbar
-	function createButton(txt) {
-		// the element that will be created
-		var el = null;
-		var btn = null;
-		switch (txt) {
-		    case "separator":
-			el = document.createElement("div");
-			el.className = "separator";
-			break;
-		    case "space":
-			el = document.createElement("div");
-			el.className = "space";
-			break;
-		    case "linebreak":
-			newLine();
-			return false;
-		    case "textindicator":
-			el = document.createElement("div");
-			el.appendChild(document.createTextNode("A"));
-			el.className = "indicator";
-			el.title = HTMLArea.I18N.tooltips.textindicator;
-			var obj = {
-				name	: txt, // the button name (i.e. 'bold')
-				element : el, // the UI element (DIV)
-				enabled : true, // is it enabled?
-				active	: false, // is it pressed?
-				text	: false, // enabled in text mode?
-				cmd	: "textindicator", // the command ID
-				state	: setButtonStatus // for changing state
-			};
-			tb_objects[txt] = obj;
-			break;
-		    default:
-			btn = editor.config.btnList[txt];
-		}
-		if (!el && btn) {
-			el = document.createElement("div");
-			el.title = btn[0];
-			el.className = "button";
-			// let's just pretend we have a button object, and
-			// assign all the needed information to it.
-			var obj = {
-				name	: txt, // the button name (i.e. 'bold')
-				element : el, // the UI element (DIV)
-				enabled : true, // is it enabled?
-				active	: false, // is it pressed?
-				text	: btn[2], // enabled in text mode?
-				cmd	: btn[3], // the command ID
-				state	: setButtonStatus, // for changing state
-				context : btn[4] || null // enabled in a certain context?
-			};
-			tb_objects[txt] = obj;
-			// handlers to emulate nice flat toolbar buttons
-			HTMLArea._addEvent(el, "mouseover", function () {
-				if (obj.enabled) {
-					HTMLArea._addClass(el, "buttonHover");
-				}
-			});
-			HTMLArea._addEvent(el, "mouseout", function () {
-				if (obj.enabled) with (HTMLArea) {
-					_removeClass(el, "buttonHover");
-					_removeClass(el, "buttonActive");
-					(obj.active) && _addClass(el, "buttonPressed");
-				}
-			});
-			HTMLArea._addEvent(el, "mousedown", function (ev) {
-				if (obj.enabled) with (HTMLArea) {
-					_addClass(el, "buttonActive");
-					_removeClass(el, "buttonPressed");
-					_stopEvent(is_ie ? window.event : ev);
-				}
-			});
-			// when clicked, do the following:
-			HTMLArea._addEvent(el, "click", function (ev) {
-				if (obj.enabled) with (HTMLArea) {
-					_removeClass(el, "buttonActive");
-					_removeClass(el, "buttonHover");
-					obj.cmd(editor, obj.name, obj);
-					_stopEvent(is_ie ? window.event : ev);
-				}
-			});
-			var img = document.createElement("img");
-			img.src = btn[1];
-			img.style.width = "18px";
-			img.style.height = "18px";
-			el.appendChild(img);
-		} else if (!el) {
-			el = createSelect(txt);
-		}
-		if (el) {
-			var tb_cell = document.createElement("td");
-			tb_row.appendChild(tb_cell);
-			tb_cell.appendChild(el);
-		} else {
-			alert("FIXME: Unknown toolbar item: " + txt);
-		}
-		return el;
-	};
-
-	var first = true;
-	for (var i in this.config.toolbar) {
-		if (!first) {
-			createButton("linebreak");
-		} else {
-			first = false;
-		}
-		var group = this.config.toolbar[i];
-		for (var j in group) {
-			var code = group[j];
-			if (/^([IT])\[(.*?)\]/.test(code)) {
-				// special case, create text label
-				var l7ed = RegExp.$1 == "I"; // localized?
-				var label = RegExp.$2;
-				if (l7ed) {
-					label = HTMLArea.I18N.custom[label];
-				}
-				var tb_cell = document.createElement("td");
-				tb_row.appendChild(tb_cell);
-				tb_cell.className = "label";
-				tb_cell.innerHTML = label;
-			} else {
-				createButton(code);
-			}
-		}
-	}
-
-	this._htmlArea.appendChild(toolbar);
-};
-
-HTMLArea.prototype._createStatusBar = function() {
-	var statusbar = document.createElement("div");
-	statusbar.className = "statusBar";
-	this._htmlArea.appendChild(statusbar);
-	this._statusBar = statusbar;
-	// statusbar.appendChild(document.createTextNode(HTMLArea.I18N.msg["Path"] + ": "));
-	// creates a holder for the path view
-	div = document.createElement("span");
-	div.className = "statusBarTree";
-	div.innerHTML = HTMLArea.I18N.msg["Path"] + ": ";
-	this._statusBarTree = div;
-	this._statusBar.appendChild(div);
-	if (!this.config.statusBar) {
-		// disable it...
-		statusbar.style.display = "none";
-	}
-};
-
-// Creates the HTMLArea object and replaces the textarea with it.
-HTMLArea.prototype.generate = function () {
-	var editor = this;	// we'll need "this" in some nested functions
-	// get the textarea
-	var textarea = this._textArea;
-	if (typeof textarea == "string") {
-		// it's not element but ID
-		this._textArea = textarea = HTMLArea.getElementById("textarea", textarea);
-	}
-	this._ta_size = {
-		w: textarea.offsetWidth,
-		h: textarea.offsetHeight
-	};
-	textarea.style.display = "none";
-
-	// create the editor framework
-	var htmlarea = document.createElement("div");
-	htmlarea.className = "htmlarea";
-	this._htmlArea = htmlarea;
-
-	// insert the editor before the textarea.
-	textarea.parentNode.insertBefore(htmlarea, textarea);
-
-	if (textarea.form) {
-		// we have a form, on submit get the HTMLArea content and
-		// update original textarea.
-		var f = textarea.form;
-		if (typeof f.onsubmit == "function") {
-			var funcref = f.onsubmit;
-			if (typeof f.__msh_prevOnSubmit == "undefined") {
-				f.__msh_prevOnSubmit = [];
-			}
-			f.__msh_prevOnSubmit.push(funcref);
-		}
-		f.onsubmit = function() {
-			editor._textArea.value = editor.getHTML();
-			var a = this.__msh_prevOnSubmit;
-			// call previous submit methods if they were there.
-			if (typeof a != "undefined") {
-				for (var i in a) {
-					a[i]();
-				}
-			}
-		};
-	}
-
-	// add a handler for the "back/forward" case -- on body.unload we save
-	// the HTML content into the original textarea.
-	window.onunload = function() {
-		editor._textArea.value = editor.getHTML();
-	};
-
-	// creates & appends the toolbar
-	this._createToolbar();
-
-	// create the IFRAME
-	var iframe = document.createElement("iframe");
-	htmlarea.appendChild(iframe);
-
-	this._iframe = iframe;
-
-	// creates & appends the status bar, if the case
-	this._createStatusBar();
-
-	// remove the default border as it keeps us from computing correctly
-	// the sizes.  (somebody tell me why doesn't this work in IE)
-
-	if (!HTMLArea.is_ie) {
-		iframe.style.borderWidth = "1px";
-	// iframe.frameBorder = "1";
-	// iframe.marginHeight = "0";
-	// iframe.marginWidth = "0";
-	}
-
-	// size the IFRAME according to user's prefs or initial textarea
-	var height = (this.config.height == "auto" ? (this._ta_size.h + "px") : this.config.height);
-	height = parseInt(height);
-	var width = (this.config.width == "auto" ? (this._ta_size.w + "px") : this.config.width);
-	width = parseInt(width);
-
-	if (!HTMLArea.is_ie) {
-		height -= 2;
-		width -= 2;
-	}
-
-	iframe.style.width = width + "px";
-	if (this.config.sizeIncludesToolbar) {
-		// substract toolbar height
-		height -= this._toolbar.offsetHeight;
-		height -= this._statusBar.offsetHeight;
-	}
-	if (height < 0) {
-		height = 0;
-	}
-	iframe.style.height = height + "px";
-
-	// the editor including the toolbar now have the same size as the
-	// original textarea.. which means that we need to reduce that a bit.
-	textarea.style.width = iframe.style.width;
- 	textarea.style.height = iframe.style.height;
-
-	// IMPORTANT: we have to allow Mozilla a short time to recognize the
-	// new frame.  Otherwise we get a stupid exception.
-	function initIframe() {
-		var doc = editor._iframe.contentWindow.document;
-		if (!doc) {
-			// Try again..
-			// FIXME: don't know what else to do here.  Normally
-			// we'll never reach this point.
-			if (HTMLArea.is_gecko) {
-				setTimeout(initIframe, 100);
-				return false;
-			} else {
-				alert("ERROR: IFRAME can't be initialized.");
-			}
-		}
-		if (HTMLArea.is_gecko) {
-			// enable editable mode for Mozilla
-			doc.designMode = "on";
-		}
-		editor._doc = doc;
-		if (!editor.config.fullPage) {
-			doc.open();
-			var html = "<html>\n";
-			html += "<head>\n";
-			if (editor.config.baseURL)
-				html += '<base href="' + editor.config.baseURL + '" />';
-			html += "<style> html,body { border: 0px; } " +
-				editor.config.pageStyle + "</style>\n";
-			html += "</head>\n";
-			html += "<body>\n";
-			html += editor._textArea.value;
-			html += "</body>\n";
-			html += "</html>";
-			doc.write(html);
-			doc.close();
-		} else {
-			var html = editor._textArea.value;
-			if (html.match(HTMLArea.RE_doctype)) {
-				editor.setDoctype(RegExp.$1);
-				html = html.replace(HTMLArea.RE_doctype, "");
-			}
-			doc.open();
-			doc.write(html);
-			doc.close();
-		}
-
-		if (HTMLArea.is_ie) {
-			// enable editable mode for IE.	 For some reason this
-			// doesn't work if done in the same place as for Gecko
-			// (above).
-			doc.body.contentEditable = true;
-		}
-
-		editor.focusEditor();
-		// intercept some events; for updating the toolbar & keyboard handlers
-		HTMLArea._addEvents
-			(doc, ["keydown", "keypress", "mousedown", "mouseup", "drag"],
-			 function (event) {
-				 return editor._editorEvent(HTMLArea.is_ie ? editor._iframe.contentWindow.event : event);
-			 });
-
-		// check if any plugins have registered refresh handlers
-		for (var i in editor.plugins) {
-			var plugin = editor.plugins[i].instance;
-			if (typeof plugin.onGenerate == "function")
-				plugin.onGenerate();
-		}
-
-		setTimeout(function() {
-			editor.updateToolbar();
-		}, 250);
-
-		if (typeof editor.onGenerate == "function")
-			editor.onGenerate();
-	};
-	setTimeout(initIframe, 100);
-};
-
-// Switches editor mode; parameter can be "textmode" or "wysiwyg".  If no
-// parameter was passed this function toggles between modes.
-HTMLArea.prototype.setMode = function(mode) {
-	if (typeof mode == "undefined") {
-		mode = ((this._editMode == "textmode") ? "wysiwyg" : "textmode");
-	}
-	switch (mode) {
-	    case "textmode":
-		this._textArea.value = this.getHTML();
-		this._iframe.style.display = "none";
-		this._textArea.style.display = "block";
-		if (this.config.statusBar) {
-			this._statusBar.innerHTML = HTMLArea.I18N.msg["TEXT_MODE"];
-		}
-		break;
-	    case "wysiwyg":
-		if (HTMLArea.is_gecko) {
-			// disable design mode before changing innerHTML
-			try {
-				this._doc.designMode = "off";
-			} catch(e) {};
-		}
-		if (!this.config.fullPage)
-			this._doc.body.innerHTML = this.getHTML();
-		else
-			this.setFullHTML(this.getHTML());
-		this._iframe.style.display = "block";
-		this._textArea.style.display = "none";
-		if (HTMLArea.is_gecko) {
-			// we need to refresh that info for Moz-1.3a
-			try {
-				this._doc.designMode = "on";
-			} catch(e) {};
-		}
-		if (this.config.statusBar) {
-			this._statusBar.innerHTML = '';
-			this._statusBar.appendChild(document.createTextNode(HTMLArea.I18N.msg["Path"] + ": "));
-			this._statusBar.appendChild(this._statusBarTree);
-		}
-		break;
-	    default:
-		alert("Mode <" + mode + "> not defined!");
-		return false;
-	}
-	this._editMode = mode;
-	this.focusEditor();
-};
-
-HTMLArea.prototype.setFullHTML = function(html) {
-	var save_multiline = RegExp.multiline;
-	RegExp.multiline = true;
-	if (html.match(HTMLArea.RE_doctype)) {
-		this.setDoctype(RegExp.$1);
-		html = html.replace(HTMLArea.RE_doctype, "");
-	}
-	RegExp.multiline = save_multiline;
-	if (!HTMLArea.is_ie) {
-		if (html.match(HTMLArea.RE_head))
-			this._doc.getElementsByTagName("head")[0].innerHTML = RegExp.$1;
-		if (html.match(HTMLArea.RE_body))
-			this._doc.getElementsByTagName("body")[0].innerHTML = RegExp.$1;
-	} else {
-		var html_re = /<html>((.|\n)*?)<\/html>/i;
-		html = html.replace(html_re, "$1");
-		this._doc.open();
-		this._doc.write(html);
-		this._doc.close();
-		this._doc.body.contentEditable = true;
-		return true;
-	}
-};
-
-/***************************************************
- *  Category: PLUGINS
- ***************************************************/
-
-// this is the variant of the function above where the plugin arguments are
-// already packed in an array.  Externally, it should be only used in the
-// full-screen editor code, in order to initialize plugins with the same
-// parameters as in the opener window.
-HTMLArea.prototype.registerPlugin2 = function(plugin, args) {
-	if (typeof plugin == "string")
-		plugin = eval(plugin);
-	var obj = new plugin(this, args);
-	if (obj) {
-		var clone = {};
-		var info = plugin._pluginInfo;
-		for (var i in info)
-			clone[i] = info[i];
-		clone.instance = obj;
-		clone.args = args;
-		this.plugins[plugin._pluginInfo.name] = clone;
-	} else
-		alert("Can't register plugin " + plugin.toString() + ".");
-};
-
-// Create the specified plugin and register it with this HTMLArea
-HTMLArea.prototype.registerPlugin = function() {
-	var plugin = arguments[0];
-	var args = [];
-	for (var i = 1; i < arguments.length; ++i)
-		args.push(arguments[i]);
-	this.registerPlugin2(plugin, args);
-};
-
-// static function that loads the required plugin and lang file, based on the
-// language loaded already for HTMLArea.  You better make sure that the plugin
-// _has_ that language, otherwise shit might happen ;-)
-HTMLArea.loadPlugin = function(pluginName) {
-	var dir = _editor_url + "plugins/" + pluginName;
-	var plugin = pluginName.replace(/([a-z])([A-Z])([a-z])/g,
-					function (str, l1, l2, l3) {
-						return l1 + "-" + l2.toLowerCase() + l3;
-					}).toLowerCase() + ".js";
-	var plugin_file = dir + "/" + plugin;
-	var plugin_lang = dir + "/lang/" + HTMLArea.I18N.lang + ".js";
-	HTMLArea._scripts.push(plugin_file, plugin_lang);
-	document.write("<script type='text/javascript' src='" + plugin_file + "'></script>");
-	document.write("<script type='text/javascript' src='" + plugin_lang + "'></script>");
-};
-
-HTMLArea.loadStyle = function(style, plugin) {
-	var url = _editor_url || '';
-	if (typeof plugin != "undefined") {
-		url += "plugins/" + plugin + "/";
-	}
-	url += style;
-	document.write("<style type='text/css'>@import url(" + url + ");</style>");
-};
-HTMLArea.loadStyle("htmlarea.css");
-
-/***************************************************
- *  Category: EDITOR UTILITIES
- ***************************************************/
-
-// The following function is a slight variation of the word cleaner code posted
-// by Weeezl (user @ InteractiveTools forums).
-HTMLArea.prototype._wordClean = function() {
-	var D = this.getInnerHTML();
-	if (D.indexOf('class=Mso') >= 0) {
-
-		// make one line
-		D = D.replace(/\r\n/g, ' ').
-			replace(/\n/g, ' ').
-			replace(/\r/g, ' ').
-			replace(/\&nbsp\;/g,' ');
-
-		// keep tags, strip attributes
-		D = D.replace(/ class=[^\s|>]*/gi,'').
-			//replace(/<p [^>]*TEXT-ALIGN: justify[^>]*>/gi,'<p align="justify">').
-			replace(/ style=\"[^>]*\"/gi,'').
-			replace(/ align=[^\s|>]*/gi,'');
-
-		//clean up tags
-		D = D.replace(/<b [^>]*>/gi,'<b>').
-			replace(/<i [^>]*>/gi,'<i>').
-			replace(/<li [^>]*>/gi,'<li>').
-			replace(/<ul [^>]*>/gi,'<ul>');
-
-		// replace outdated tags
-		D = D.replace(/<b>/gi,'<strong>').
-			replace(/<\/b>/gi,'</strong>');
-
-		// mozilla doesn't like <em> tags
-		D = D.replace(/<em>/gi,'<i>').
-			replace(/<\/em>/gi,'</i>');
-
-		// kill unwanted tags
-		D = D.replace(/<\?xml:[^>]*>/g, '').       // Word xml
-			replace(/<\/?st1:[^>]*>/g,'').     // Word SmartTags
-			replace(/<\/?[a-z]\:[^>]*>/g,'').  // All other funny Word non-HTML stuff
-			replace(/<\/?font[^>]*>/gi,'').    // Disable if you want to keep font formatting
-			replace(/<\/?span[^>]*>/gi,' ').
-			replace(/<\/?div[^>]*>/gi,' ').
-			replace(/<\/?pre[^>]*>/gi,' ').
-			replace(/<\/?h[1-6][^>]*>/gi,' ');
-
-		//remove empty tags
-		//D = D.replace(/<strong><\/strong>/gi,'').
-		//replace(/<i><\/i>/gi,'').
-		//replace(/<P[^>]*><\/P>/gi,'');
-
-		// nuke double tags
-		oldlen = D.length + 1;
-		while(oldlen > D.length) {
-			oldlen = D.length;
-			// join us now and free the tags, we'll be free hackers, we'll be free... ;-)
-			D = D.replace(/<([a-z][a-z]*)> *<\/\1>/gi,' ').
-				replace(/<([a-z][a-z]*)> *<([a-z][^>]*)> *<\/\1>/gi,'<$2>');
-		}
-		D = D.replace(/<([a-z][a-z]*)><\1>/gi,'<$1>').
-			replace(/<\/([a-z][a-z]*)><\/\1>/gi,'<\/$1>');
-
-		// nuke double spaces
-		D = D.replace(/  */gi,' ');
-
-		this.setHTML(D);
-		this.updateToolbar();
-	}
-};
-
-HTMLArea.prototype.forceRedraw = function() {
-	this._doc.body.style.visibility = "hidden";
-	this._doc.body.style.visibility = "visible";
-	// this._doc.body.innerHTML = this.getInnerHTML();
-};
-
-// focuses the iframe window.  returns a reference to the editor document.
-HTMLArea.prototype.focusEditor = function() {
-	switch (this._editMode) {
-	    case "wysiwyg" : this._iframe.contentWindow.focus(); break;
-	    case "textmode": this._textArea.focus(); break;
-	    default	   : alert("ERROR: mode " + this._editMode + " is not defined");
-	}
-	return this._doc;
-};
-
-// takes a snapshot of the current text (for undo)
-HTMLArea.prototype._undoTakeSnapshot = function() {
-	++this._undoPos;
-	if (this._undoPos >= this.config.undoSteps) {
-		// remove the first element
-		this._undoQueue.shift();
-		--this._undoPos;
-	}
-	// use the fasted method (getInnerHTML);
-	var take = true;
-	var txt = this.getInnerHTML();
-	if (this._undoPos > 0)
-		take = (this._undoQueue[this._undoPos - 1] != txt);
-	if (take) {
-		this._undoQueue[this._undoPos] = txt;
-	} else {
-		this._undoPos--;
-	}
-};
-
-HTMLArea.prototype.undo = function() {
-	if (this._undoPos > 0) {
-		var txt = this._undoQueue[--this._undoPos];
-		if (txt) this.setHTML(txt);
-		else ++this._undoPos;
-	}
-};
-
-HTMLArea.prototype.redo = function() {
-	if (this._undoPos < this._undoQueue.length - 1) {
-		var txt = this._undoQueue[++this._undoPos];
-		if (txt) this.setHTML(txt);
-		else --this._undoPos;
-	}
-};
-
-// updates enabled/disable/active state of the toolbar elements
-HTMLArea.prototype.updateToolbar = function(noStatus) {
-	var doc = this._doc;
-	var text = (this._editMode == "textmode");
-	var ancestors = null;
-	if (!text) {
-		ancestors = this.getAllAncestors();
-		if (this.config.statusBar && !noStatus) {
-			this._statusBarTree.innerHTML = HTMLArea.I18N.msg["Path"] + ": "; // clear
-			for (var i = ancestors.length; --i >= 0;) {
-				var el = ancestors[i];
-				if (!el) {
-					// hell knows why we get here; this
-					// could be a classic example of why
-					// it's good to check for conditions
-					// that are impossible to happen ;-)
-					continue;
-				}
-				var a = document.createElement("a");
-				a.href = "#";
-				a.el = el;
-				a.editor = this;
-				a.onclick = function() {
-					this.blur();
-					this.editor.selectNodeContents(this.el);
-					this.editor.updateToolbar(true);
-					return false;
-				};
-				a.oncontextmenu = function() {
-					// TODO: add context menu here
-					this.blur();
-					var info = "Inline style:\n\n";
-					info += this.el.style.cssText.split(/;\s*/).join(";\n");
-					alert(info);
-					return false;
-				};
-				var txt = el.tagName.toLowerCase();
-				a.title = el.style.cssText;
-				if (el.id) {
-					txt += "#" + el.id;
-				}
-				if (el.className) {
-					txt += "." + el.className;
-				}
-				a.appendChild(document.createTextNode(txt));
-				this._statusBarTree.appendChild(a);
-				if (i != 0) {
-					this._statusBarTree.appendChild(document.createTextNode(String.fromCharCode(0xbb)));
-				}
-			}
-		}
-	}
-	for (var i in this._toolbarObjects) {
-		var btn = this._toolbarObjects[i];
-		var cmd = i;
-		var inContext = true;
-		if (btn.context && !text) {
-			inContext = false;
-			var context = btn.context;
-			var attrs = [];
-			if (/(.*)\[(.*?)\]/.test(context)) {
-				context = RegExp.$1;
-				attrs = RegExp.$2.split(",");
-			}
-			context = context.toLowerCase();
-			var match = (context == "*");
-			for (var k in ancestors) {
-				if (!ancestors[k]) {
-					// the impossible really happens.
-					continue;
-				}
-				if (match || (ancestors[k].tagName.toLowerCase() == context)) {
-					inContext = true;
-					for (var ka in attrs) {
-						if (!eval("ancestors[k]." + attrs[ka])) {
-							inContext = false;
-							break;
-						}
-					}
-					if (inContext) {
-						break;
-					}
-				}
-			}
-		}
-		btn.state("enabled", (!text || btn.text) && inContext);
-		if (typeof cmd == "function") {
-			continue;
-		}
-		// look-it-up in the custom dropdown boxes
-		var dropdown = this.config.customSelects[cmd];
-		if ((!text || btn.text) && (typeof dropdown != "undefined")) {
-			dropdown.refresh(this);
-			continue;
-		}
-		switch (cmd) {
-		    case "fontname":
-		    case "fontsize":
-		    case "formatblock":
-			if (!text) try {
-				var value = ("" + doc.queryCommandValue(cmd)).toLowerCase();
-				if (!value) {
-					// FIXME: what do we do here?
-					break;
-				}
-				// HACK -- retrieve the config option for this
-				// combo box.  We rely on the fact that the
-				// variable in config has the same name as
-				// button name in the toolbar.
-				var options = this.config[cmd];
-				var k = 0;
-				// btn.element.selectedIndex = 0;
-				for (var j in options) {
-					// FIXME: the following line is scary.
-					if ((j.toLowerCase() == value) ||
-					    (options[j].substr(0, value.length).toLowerCase() == value)) {
-						btn.element.selectedIndex = k;
-						break;
-					}
-					++k;
-				}
-			} catch(e) {};
-			break;
-		    case "textindicator":
-			if (!text) {
-				try {with (btn.element.style) {
-					backgroundColor = HTMLArea._makeColor(
-						doc.queryCommandValue(HTMLArea.is_ie ? "backcolor" : "hilitecolor"));
-					if (/transparent/i.test(backgroundColor)) {
-						// Mozilla
-						backgroundColor = HTMLArea._makeColor(doc.queryCommandValue("backcolor"));
-					}
-					color = HTMLArea._makeColor(doc.queryCommandValue("forecolor"));
-					fontFamily = doc.queryCommandValue("fontname");
-					fontWeight = doc.queryCommandState("bold") ? "bold" : "normal";
-					fontStyle = doc.queryCommandState("italic") ? "italic" : "normal";
-				}} catch (e) {
-					// alert(e + "\n\n" + cmd);
-				}
-			}
-			break;
-		    case "htmlmode": btn.state("active", text); break;
-		    case "lefttoright":
-		    case "righttoleft":
-			var el = this.getParentElement();
-			while (el && !HTMLArea.isBlockElement(el))
-				el = el.parentNode;
-			if (el)
-				btn.state("active", (el.style.direction == ((cmd == "righttoleft") ? "rtl" : "ltr")));
-			break;
-		    default:
-			try {
-				btn.state("active", (!text && doc.queryCommandState(cmd)));
-			} catch (e) {}
-		}
-	}
-	// take undo snapshots
-	if (this._customUndo && !this._timerUndo) {
-		this._undoTakeSnapshot();
-		var editor = this;
-		this._timerUndo = setTimeout(function() {
-			editor._timerUndo = null;
-		}, this.config.undoTimeout);
-	}
-	// check if any plugins have registered refresh handlers
-	for (var i in this.plugins) {
-		var plugin = this.plugins[i].instance;
-		if (typeof plugin.onUpdateToolbar == "function")
-			plugin.onUpdateToolbar();
-	}
-};
-
-/** Returns a node after which we can insert other nodes, in the current
- * selection.  The selection is removed.  It splits a text node, if needed.
- */
-HTMLArea.prototype.insertNodeAtSelection = function(toBeInserted) {
-	if (!HTMLArea.is_ie) {
-		var sel = this._getSelection();
-		var range = this._createRange(sel);
-		// remove the current selection
-		sel.removeAllRanges();
-		range.deleteContents();
-		var node = range.startContainer;
-		var pos = range.startOffset;
-		switch (node.nodeType) {
-		    case 3: // Node.TEXT_NODE
-			// we have to split it at the caret position.
-			if (toBeInserted.nodeType == 3) {
-				// do optimized insertion
-				node.insertData(pos, toBeInserted.data);
-				range = this._createRange();
-				range.setEnd(node, pos + toBeInserted.length);
-				range.setStart(node, pos + toBeInserted.length);
-				sel.addRange(range);
-			} else {
-				node = node.splitText(pos);
-				var selnode = toBeInserted;
-				if (toBeInserted.nodeType == 11 /* Node.DOCUMENT_FRAGMENT_NODE */) {
-					selnode = selnode.firstChild;
-				}
-				node.parentNode.insertBefore(toBeInserted, node);
-				this.selectNodeContents(selnode);
-				this.updateToolbar();
-			}
-			break;
-		    case 1: // Node.ELEMENT_NODE
-			var selnode = toBeInserted;
-			if (toBeInserted.nodeType == 11 /* Node.DOCUMENT_FRAGMENT_NODE */) {
-				selnode = selnode.firstChild;
-			}
-			node.insertBefore(toBeInserted, node.childNodes[pos]);
-			this.selectNodeContents(selnode);
-			this.updateToolbar();
-			break;
-		}
-	} else {
-		return null;	// this function not yet used for IE <FIXME>
-	}
-};
-
-// Returns the deepest node that contains both endpoints of the selection.
-HTMLArea.prototype.getParentElement = function() {
-	var sel = this._getSelection();
-	var range = this._createRange(sel);
-	if (HTMLArea.is_ie) {
-		switch (sel.type) {
-		    case "Text":
-		    case "None":
-			// It seems that even for selection of type "None",
-			// there _is_ a parent element and it's value is not
-			// only correct, but very important to us.  MSIE is
-			// certainly the buggiest browser in the world and I
-			// wonder, God, how can Earth stand it?
-			return range.parentElement();
-		    case "Control":
-			return range.item(0);
-		    default:
-			return this._doc.body;
-		}
-	} else try {
-		var p = range.commonAncestorContainer;
-		if (!range.collapsed && range.startContainer == range.endContainer &&
-		    range.startOffset - range.endOffset <= 1 && range.startContainer.hasChildNodes())
-			p = range.startContainer.childNodes[range.startOffset];
-		/*
-		alert(range.startContainer + ":" + range.startOffset + "\n" +
-		      range.endContainer + ":" + range.endOffset);
-		*/
-		while (p.nodeType == 3) {
-			p = p.parentNode;
-		}
-		return p;
-	} catch (e) {
-		return null;
-	}
-};
-
-// Returns an array with all the ancestor nodes of the selection.
-HTMLArea.prototype.getAllAncestors = function() {
-	var p = this.getParentElement();
-	var a = [];
-	while (p && (p.nodeType == 1) && (p.tagName.toLowerCase() != 'body')) {
-		a.push(p);
-		p = p.parentNode;
-	}
-	a.push(this._doc.body);
-	return a;
-};
-
-// Selects the contents inside the given node
-HTMLArea.prototype.selectNodeContents = function(node, pos) {
-	this.focusEditor();
-	this.forceRedraw();
-	var range;
-	var collapsed = (typeof pos != "undefined");
-	if (HTMLArea.is_ie) {
-		range = this._doc.body.createTextRange();
-		range.moveToElementText(node);
-		(collapsed) && range.collapse(pos);
-		range.select();
-	} else {
-		var sel = this._getSelection();
-		range = this._doc.createRange();
-		range.selectNodeContents(node);
-		(collapsed) && range.collapse(pos);
-		sel.removeAllRanges();
-		sel.addRange(range);
-	}
-};
-
-/** Call this function to insert HTML code at the current position.  It deletes
- * the selection, if any.
- */
-HTMLArea.prototype.insertHTML = function(html) {
-	var sel = this._getSelection();
-	var range = this._createRange(sel);
-	if (HTMLArea.is_ie) {
-		range.pasteHTML(html);
-	} else {
-		// construct a new document fragment with the given HTML
-		var fragment = this._doc.createDocumentFragment();
-		var div = this._doc.createElement("div");
-		div.innerHTML = html;
-		while (div.firstChild) {
-			// the following call also removes the node from div
-			fragment.appendChild(div.firstChild);
-		}
-		// this also removes the selection
-		var node = this.insertNodeAtSelection(fragment);
-	}
-};
-
-/**
- *  Call this function to surround the existing HTML code in the selection with
- *  your tags.  FIXME: buggy!  This function will be deprecated "soon".
- */
-HTMLArea.prototype.surroundHTML = function(startTag, endTag) {
-	var html = this.getSelectedHTML();
-	// the following also deletes the selection
-	this.insertHTML(startTag + html + endTag);
-};
-
-/// Retrieve the selected block
-HTMLArea.prototype.getSelectedHTML = function() {
-	var sel = this._getSelection();
-	var range = this._createRange(sel);
-	var existing = null;
-	if (HTMLArea.is_ie) {
-		existing = range.htmlText;
-	} else {
-		existing = HTMLArea.getHTML(range.cloneContents(), false, this);
-	}
-	return existing;
-};
-
-/// Return true if we have some selection
-HTMLArea.prototype.hasSelectedText = function() {
-	// FIXME: come _on_ mishoo, you can do better than this ;-)
-	return this.getSelectedHTML() != '';
-};
-
-HTMLArea.prototype._createLink = function(link) {
-	var editor = this;
-	var outparam = null;
-	if (typeof link == "undefined") {
-		link = this.getParentElement();
-		if (link && !/^a$/i.test(link.tagName))
-			link = null;
-	}
-	if (link) outparam = {
-		f_href   : HTMLArea.is_ie ? editor.stripBaseURL(link.href) : link.getAttribute("href"),
-		f_title  : link.title,
-		f_target : link.target
-	};
-	this._popupDialog("link.html", function(param) {
-		if (!param)
-			return false;
-		var a = link;
-		if (!a) {
-			editor._doc.execCommand("createlink", false, param.f_href);
-			a = editor.getParentElement();
-			var sel = editor._getSelection();
-			var range = editor._createRange(sel);
-			if (!HTMLArea.is_ie) {
-				a = range.startContainer;
-				if (!/^a$/i.test(a.tagName))
-					a = a.nextSibling;
-			}
-		} else a.href = param.f_href.trim();
-		if (!/^a$/i.test(a.tagName))
-			return false;
-		a.target = param.f_target.trim();
-		a.title = param.f_title.trim();
-		editor.selectNodeContents(a);
-		editor.updateToolbar();
-	}, outparam);
-};
-
-// Called when the user clicks on "InsertImage" button.  If an image is already
-// there, it will just modify it's properties.
-HTMLArea.prototype._insertImage = function(image) {
-	var editor = this;	// for nested functions
-	var outparam = null;
-	if (typeof image == "undefined") {
-		image = this.getParentElement();
-		if (image && !/^img$/i.test(image.tagName))
-			image = null;
-	}
-	if (image) outparam = {
-		//OSCAR: we shouldn't convert images into relateive urls!!!
-		f_url    : HTMLArea.is_ie ? image.src : image.getAttribute("src"),
-		f_alt    : image.alt,
-		f_border : image.border,
-		f_align  : image.align,
-		f_vert   : image.vspace,
-		f_horiz  : image.hspace
-	};
-	this._popupDialog("insert_image.html", function(param) {
-		if (!param) {	// user must have pressed Cancel
-			return false;
-		}
-		var img = image;
-		if (!img) {
-			var sel = editor._getSelection();
-			var range = editor._createRange(sel);
-			editor._doc.execCommand("insertimage", false, param.f_url);
-			if (HTMLArea.is_ie) {
-				img = range.parentElement();
-				// wonder if this works...
-				if (img.tagName.toLowerCase() != "img") {
-					img = img.previousSibling;
-				}
-			} else {
-				img = range.startContainer.previousSibling;
-			}
-		} else {
-			img.src = param.f_url;
-		}
-		for (field in param) {
-			var value = param[field];
-			switch (field) {
-			    case "f_alt"    : img.alt	 = value; break;
-			    case "f_border" : img.border = parseInt(value || "0"); break;
-			    case "f_align"  : img.align	 = value; break;
-			    case "f_vert"   : img.vspace = parseInt(value || "0"); break;
-			    case "f_horiz"  : img.hspace = parseInt(value || "0"); break;
-			}
-		}
-	}, outparam);
-};
-
-// Called when the user clicks the Insert Table button
-HTMLArea.prototype._insertTable = function() {
-	var sel = this._getSelection();
-	var range = this._createRange(sel);
-	var editor = this;	// for nested functions
-	this._popupDialog("insert_table.html", function(param) {
-		if (!param) {	// user must have pressed Cancel
-			return false;
-		}
-		var doc = editor._doc;
-		// create the table element
-		var table = doc.createElement("table");
-		// assign the given arguments
-		for (var field in param) {
-			var value = param[field];
-			if (!value) {
-				continue;
-			}
-			switch (field) {
-			    case "f_width"   : table.style.width = value + param["f_unit"]; break;
-			    case "f_align"   : table.align	 = value; break;
-			    case "f_border"  : table.border	 = parseInt(value); break;
-			    case "f_spacing" : table.cellspacing = parseInt(value); break;
-			    case "f_padding" : table.cellpadding = parseInt(value); break;
-			}
-		}
-		var tbody = doc.createElement("tbody");
-		table.appendChild(tbody);
-		for (var i = 0; i < param["f_rows"]; ++i) {
-			var tr = doc.createElement("tr");
-			tbody.appendChild(tr);
-			for (var j = 0; j < param["f_cols"]; ++j) {
-				var td = doc.createElement("td");
-				tr.appendChild(td);
-				// Mozilla likes to see something inside the cell.
-				(HTMLArea.is_gecko) && td.appendChild(doc.createElement("br"));
-			}
-		}
-		if (HTMLArea.is_ie) {
-			range.pasteHTML(table.outerHTML);
-		} else {
-			// insert the table
-			editor.insertNodeAtSelection(table);
-		}
-		return true;
-	}, null);
-};
-
-/***************************************************
- *  Category: EVENT HANDLERS
- ***************************************************/
-
-// el is reference to the SELECT object
-// txt is the name of the select field, as in config.toolbar
-HTMLArea.prototype._comboSelected = function(el, txt) {
-	this.focusEditor();
-	var value = el.options[el.selectedIndex].value;
-	switch (txt) {
-	    case "fontname":
-	    case "fontsize": this.execCommand(txt, false, value); break;
-	    case "formatblock":
-		(HTMLArea.is_ie) && (value = "<" + value + ">");
-		this.execCommand(txt, false, value);
-		break;
-	    default:
-		// try to look it up in the registered dropdowns
-		var dropdown = this.config.customSelects[txt];
-		if (typeof dropdown != "undefined") {
-			dropdown.action(this);
-		} else {
-			alert("FIXME: combo box " + txt + " not implemented");
-		}
-	}
-};
-
-// the execCommand function (intercepts some commands and replaces them with
-// our own implementation)
-HTMLArea.prototype.execCommand = function(cmdID, UI, param) {
-	var editor = this;	// for nested functions
-	this.focusEditor();
-	cmdID = cmdID.toLowerCase();
-	switch (cmdID) {
-	    case "htmlmode" : this.setMode(); break;
-	    case "hilitecolor":
-		(HTMLArea.is_ie) && (cmdID = "backcolor");
-	    case "forecolor":
-		this._popupDialog("select_color.html", function(color) {
-			if (color) { // selection not canceled
-				editor._doc.execCommand(cmdID, false, "#" + color);
-			}
-		}, HTMLArea._colorToRgb(this._doc.queryCommandValue(cmdID)));
-		break;
-	    case "createlink":
-		this._createLink();
-		break;
-	    case "popupeditor":
-		// this object will be passed to the newly opened window
-		HTMLArea._object = this;
-		if (HTMLArea.is_ie) {
-			//if (confirm(HTMLArea.I18N.msg["IE-sucks-full-screen"]))
-			{
-				window.open(this.popupURL("fullscreen.html"), "ha_fullscreen",
-					    "toolbar=no,location=no,directories=no,status=no,menubar=no," +
-					    "scrollbars=no,resizable=yes,width=640,height=480");
-			}
-		} else {
-			window.open(this.popupURL("fullscreen.html"), "ha_fullscreen",
-				    "toolbar=no,menubar=no,personalbar=no,width=640,height=480," +
-				    "scrollbars=no,resizable=yes");
-		}
-		break;
-	    case "undo":
-	    case "redo":
-		if (this._customUndo)
-			this[cmdID]();
-		else
-			this._doc.execCommand(cmdID, UI, param);
-		break;
-	    case "inserttable": this._insertTable(); break;
-	    case "insertimage": this._insertImage(); break;
-	    case "about"    : this._popupDialog("about.html", null, this); break;
-	    case "showhelp" : window.open(_editor_url + "reference.html", "ha_help"); break;
-
-	    case "killword": this._wordClean(); break;
-
-	    case "cut":
-	    case "copy":
-	    case "paste":
-		try {
-			if (this.config.killWordOnPaste)
-				this._wordClean();
-			this._doc.execCommand(cmdID, UI, param);
-		} catch (e) {
-			if (HTMLArea.is_gecko) {
-				if (confirm("Unprivileged scripts cannot access Cut/Copy/Paste programatically " +
-					    "for security reasons.  Click OK to see a technical note at mozilla.org " +
-					    "which shows you how to allow a script to access the clipboard."))
-					window.open("http://mozilla.org/editor/midasdemo/securityprefs.html");
-			}
-		}
-		break;
-	    case "lefttoright":
-	    case "righttoleft":
-		var dir = (cmdID == "righttoleft") ? "rtl" : "ltr";
-		var el = this.getParentElement();
-		while (el && !HTMLArea.isBlockElement(el))
-			el = el.parentNode;
-		if (el) {
-			if (el.style.direction == dir)
-				el.style.direction = "";
-			else
-				el.style.direction = dir;
-		}
-		break;
-	    default: this._doc.execCommand(cmdID, UI, param);
-	}
-	this.updateToolbar();
-	return false;
-};
-
-/** A generic event handler for things that happen in the IFRAME's document.
- * This function also handles key bindings. */
-HTMLArea.prototype._editorEvent = function(ev) {
-	var editor = this;
-	var keyEvent = (HTMLArea.is_ie && ev.type == "keydown") || (ev.type == "keypress");
-	if (keyEvent) {
-		for (var i in editor.plugins) {
-			var plugin = editor.plugins[i].instance;
-			if (typeof plugin.onKeyPress == "function") plugin.onKeyPress(ev);
-		}
-	}
-	if (keyEvent && ev.ctrlKey) {
-		var sel = null;
-		var range = null;
-		var key = String.fromCharCode(HTMLArea.is_ie ? ev.keyCode : ev.charCode).toLowerCase();
-		var cmd = null;
-		var value = null;
-		switch (key) {
-		    case 'a':
-			if (!HTMLArea.is_ie) {
-				// KEY select all
-				sel = this._getSelection();
-				sel.removeAllRanges();
-				range = this._createRange();
-				range.selectNodeContents(this._doc.body);
-				sel.addRange(range);
-				HTMLArea._stopEvent(ev);
-			}
-			break;
-
-			// simple key commands follow
-
-		    case 'b': cmd = "bold"; break;
-		    case 'i': cmd = "italic"; break;
-		    case 'u': cmd = "underline"; break;
-		    case 's': cmd = "strikethrough"; break;
-		    case 'l': cmd = "justifyleft"; break;
-		    case 'e': cmd = "justifycenter"; break;
-		    case 'r': cmd = "justifyright"; break;
-		    case 'j': cmd = "justifyfull"; break;
-		    case 'z': cmd = "undo"; break;
-		    case 'y': cmd = "redo"; break;
-		    case 'v': cmd = "paste"; break;
-
-		    case '0': cmd = "killword"; break;
-
-			// headings
-		    case '1':
-		    case '2':
-		    case '3':
-		    case '4':
-		    case '5':
-		    case '6':
-			cmd = "formatblock";
-			value = "h" + key;
-			if (HTMLArea.is_ie) {
-				value = "<" + value + ">";
-			}
-			break;
-		}
-		if (cmd) {
-			// execute simple command
-			this.execCommand(cmd, false, value);
-			HTMLArea._stopEvent(ev);
-		}
-	}
-	/*
-	else if (keyEvent) {
-		// other keys here
-		switch (ev.keyCode) {
-		    case 13: // KEY enter
-			// if (HTMLArea.is_ie) {
-			this.insertHTML("<br />");
-			HTMLArea._stopEvent(ev);
-			// }
-			break;
-		}
-	}
-	*/
-	// update the toolbar state after some time
-	if (editor._timerToolbar) {
-		clearTimeout(editor._timerToolbar);
-	}
-	editor._timerToolbar = setTimeout(function() {
-		editor.updateToolbar();
-		editor._timerToolbar = null;
-	}, 50);
-};
-
-// retrieve the HTML
-HTMLArea.prototype.getHTML = function() {
-	switch (this._editMode) {
-	    case "wysiwyg"  :
-		if (!this.config.fullPage) {
-			return HTMLArea.getHTML(this._doc.body, false, this);
-		} else
-			return this.doctype + "\n" + HTMLArea.getHTML(this._doc.documentElement, true, this);
-	    case "textmode" : return this._textArea.value;
-	    default	    : alert("Mode <" + mode + "> not defined!");
-	}
-	return false;
-};
-
-// retrieve the HTML (fastest version, but uses innerHTML)
-HTMLArea.prototype.getInnerHTML = function() {
-	switch (this._editMode) {
-	    case "wysiwyg"  :
-		if (!this.config.fullPage)
-			return this._doc.body.innerHTML;
-		else
-			return this.doctype + "\n" + this._doc.documentElement.innerHTML;
-	    case "textmode" : return this._textArea.value;
-	    default	    : alert("Mode <" + mode + "> not defined!");
-	}
-	return false;
-};
-
-// completely change the HTML inside
-HTMLArea.prototype.setHTML = function(html) {
-	switch (this._editMode) {
-	    case "wysiwyg"  :
-		if (!this.config.fullPage)
-			this._doc.body.innerHTML = html;
-		else
-			// this._doc.documentElement.innerHTML = html;
-			this._doc.body.innerHTML = html;
-		break;
-	    case "textmode" : this._textArea.value = html; break;
-	    default	    : alert("Mode <" + mode + "> not defined!");
-	}
-	return false;
-};
-
-// sets the given doctype (useful when config.fullPage is true)
-HTMLArea.prototype.setDoctype = function(doctype) {
-	this.doctype = doctype;
-};
-
-/***************************************************
- *  Category: UTILITY FUNCTIONS
- ***************************************************/
-
-// browser identification
-
-HTMLArea.agt = navigator.userAgent.toLowerCase();
-HTMLArea.is_ie	   = ((HTMLArea.agt.indexOf("msie") != -1) && (HTMLArea.agt.indexOf("opera") == -1));
-HTMLArea.is_opera  = (HTMLArea.agt.indexOf("opera") != -1);
-HTMLArea.is_mac	   = (HTMLArea.agt.indexOf("mac") != -1);
-HTMLArea.is_mac_ie = (HTMLArea.is_ie && HTMLArea.is_mac);
-HTMLArea.is_win_ie = (HTMLArea.is_ie && !HTMLArea.is_mac);
-HTMLArea.is_gecko  = (navigator.product == "Gecko");
-
-// variable used to pass the object to the popup editor window.
-HTMLArea._object = null;
-
-// function that returns a clone of the given object
-HTMLArea.cloneObject = function(obj) {
-	var newObj = new Object;
-
-	// check for array objects
-	if (obj.constructor.toString().indexOf("function Array(") == 1) {
-		newObj = obj.constructor();
-	}
-
-	// check for function objects (as usual, IE is fucked up)
-	if (obj.constructor.toString().indexOf("function Function(") == 1) {
-		newObj = obj; // just copy reference to it
-	} else for (var n in obj) {
-		var node = obj[n];
-		if (typeof node == 'object') { newObj[n] = HTMLArea.cloneObject(node); }
-		else                         { newObj[n] = node; }
-	}
-
-	return newObj;
-};
-
-// FIXME!!! this should return false for IE < 5.5
-HTMLArea.checkSupportedBrowser = function() {
-	if (HTMLArea.is_gecko) {
-		if (navigator.productSub < 20021201) {
-			alert("You need at least Mozilla-1.3 Alpha.\n" +
-			      "Sorry, your Gecko is not supported.");
-			return false;
-		}
-		if (navigator.productSub < 20030210) {
-			alert("Mozilla < 1.3 Beta is not supported!\n" +
-			      "I'll try, though, but it might not work.");
-		}
-	}
-	return HTMLArea.is_gecko || HTMLArea.is_ie;
-};
-
-// selection & ranges
-
-// returns the current selection object
-HTMLArea.prototype._getSelection = function() {
-	if (HTMLArea.is_ie) {
-		return this._doc.selection;
-	} else {
-		return this._iframe.contentWindow.getSelection();
-	}
-};
-
-// returns a range for the current selection
-HTMLArea.prototype._createRange = function(sel) {
-	if (HTMLArea.is_ie) {
-		return sel.createRange();
-	} else {
-		this.focusEditor();
-		if (typeof sel != "undefined") {
-			try {
-				return sel.getRangeAt(0);
-			} catch(e) {
-				return this._doc.createRange();
-			}
-		} else {
-			return this._doc.createRange();
-		}
-	}
-};
-
-// event handling
-
-HTMLArea._addEvent = function(el, evname, func) {
-	if (HTMLArea.is_ie) {
-		el.attachEvent("on" + evname, func);
-	} else {
-		el.addEventListener(evname, func, true);
-	}
-};
-
-HTMLArea._addEvents = function(el, evs, func) {
-	for (var i in evs) {
-		HTMLArea._addEvent(el, evs[i], func);
-	}
-};
-
-HTMLArea._removeEvent = function(el, evname, func) {
-	if (HTMLArea.is_ie) {
-		el.detachEvent("on" + evname, func);
-	} else {
-		el.removeEventListener(evname, func, true);
-	}
-};
-
-HTMLArea._removeEvents = function(el, evs, func) {
-	for (var i in evs) {
-		HTMLArea._removeEvent(el, evs[i], func);
-	}
-};
-
-HTMLArea._stopEvent = function(ev) {
-	if (HTMLArea.is_ie) {
-		ev.cancelBubble = true;
-		ev.returnValue = false;
-	} else {
-		ev.preventDefault();
-		ev.stopPropagation();
-	}
-};
-
-HTMLArea._removeClass = function(el, className) {
-	if (!(el && el.className)) {
-		return;
-	}
-	var cls = el.className.split(" ");
-	var ar = new Array();
-	for (var i = cls.length; i > 0;) {
-		if (cls[--i] != className) {
-			ar[ar.length] = cls[i];
-		}
-	}
-	el.className = ar.join(" ");
-};
-
-HTMLArea._addClass = function(el, className) {
-	// remove the class first, if already there
-	HTMLArea._removeClass(el, className);
-	el.className += " " + className;
-};
-
-HTMLArea._hasClass = function(el, className) {
-	if (!(el && el.className)) {
-		return false;
-	}
-	var cls = el.className.split(" ");
-	for (var i = cls.length; i > 0;) {
-		if (cls[--i] == className) {
-			return true;
-		}
-	}
-	return false;
-};
-
-HTMLArea.isBlockElement = function(el) {
-	var blockTags = " body form textarea fieldset ul ol dl li div " +
-		"p h1 h2 h3 h4 h5 h6 quote pre table thead " +
-		"tbody tfoot tr td iframe address ";
-	return (blockTags.indexOf(" " + el.tagName.toLowerCase() + " ") != -1);
-};
-
-HTMLArea.needsClosingTag = function(el) {
-	var closingTags = " head script style div span tr td tbody table em strong font a title ";
-	return (closingTags.indexOf(" " + el.tagName.toLowerCase() + " ") != -1);
-};
-
-// performs HTML encoding of some given string
-HTMLArea.htmlEncode = function(str) {
-	// we don't need regexp for that, but.. so be it for now.
-	str = str.replace(/&/ig, "&amp;");
-	str = str.replace(/</ig, "&lt;");
-	str = str.replace(/>/ig, "&gt;");
-    // Fix the multi-spaces converted to 160 error. we need to convert them back to space again.
-	str = str.replace(/\xA0/g, " ");
-	str = str.replace(/\x22/ig, "&quot;");
-	// \x22 means '"' -- we use hex reprezentation so that we don't disturb
-	// JS compressors (well, at least mine fails.. ;)
-	return str;
-};
-
-// Retrieves the HTML code from the given node.	 This is a replacement for
-// getting innerHTML, using standard DOM calls.
-HTMLArea.getHTML = function(root, outputRoot, editor) {
-	var html = "";
-	switch (root.nodeType) {
-	    case 1: // Node.ELEMENT_NODE
-	    case 11: // Node.DOCUMENT_FRAGMENT_NODE
-		var closed;
-		var i;
-		var root_tag = (root.nodeType == 1) ? root.tagName.toLowerCase() : '';
-		if (HTMLArea.is_ie && root_tag == "head") {
-			if (outputRoot)
-				html += "<head>";
-			// lowercasize
-			var save_multiline = RegExp.multiline;
-			RegExp.multiline = true;
-			var txt = root.innerHTML.replace(HTMLArea.RE_tagName, function(str, p1, p2) {
-				return p1 + p2.toLowerCase();
-			});
-			RegExp.multiline = save_multiline;
-			html += txt;
-			if (outputRoot)
-				html += "</head>";
-			break;
-		} else if (outputRoot) {
-			closed = (!(root.hasChildNodes() || HTMLArea.needsClosingTag(root)));
-			html = "<" + root.tagName.toLowerCase();
-			var attrs = root.attributes;
-			for (i = 0; i < attrs.length; ++i) {
-				var a = attrs.item(i);
-				if (!a.specified) {
-					continue;
-				}
-				var name = a.nodeName.toLowerCase();
-				if (/_moz|contenteditable|_msh/.test(name)) {
-					// avoid certain attributes
-					continue;
-				}
-				var value;
-				if (name != "style") {
-					// IE5.5 reports 25 when cellSpacing is
-					// 1; other values might be doomed too.
-					// For this reason we extract the
-					// values directly from the root node.
-					// I'm starting to HATE JavaScript
-					// development.  Browser differences
-					// suck.
-					//
-					// Using Gecko the values of href and src are converted to absolute links
-					// unless we get them using nodeValue()
-					if (typeof root[a.nodeName] != "undefined" && name != "href" && name != "src") {
-						value = root[a.nodeName];
-					} else {
-						value = a.nodeValue;
-						// IE seems not willing to return the original values - it converts to absolute
-						// links using a.nodeValue, a.value, a.stringValue, root.getAttribute("href")
-						// So we have to strip the baseurl manually -/
-						//if (HTMLArea.is_ie && (name == "href" || name == "src")) {
-						//OSCAR: images shouldn't be turned into relative paths!!
-						if (HTMLArea.is_ie && (name == "href")) {
-							value = editor.stripBaseURL(value);
-						}
-					}
-				} else { // IE fails to put style in attributes list
-					// FIXME: cssText reported by IE is UPPERCASE
-					value = root.style.cssText;
-				}
-				if (/(_moz|^$)/.test(value)) {
-					// Mozilla reports some special tags
-					// here; we don't need them.
-					continue;
-				}
-				html += " " + name + '="' + value + '"';
-			}
-			html += closed ? " />" : ">";
-		}
-		for (i = root.firstChild; i; i = i.nextSibling) {
-			html += HTMLArea.getHTML(i, true, editor);
-		}
-		if (outputRoot && !closed) {
-			html += "</" + root.tagName.toLowerCase() + ">";
-		}
-		break;
-	    case 3: // Node.TEXT_NODE
-		// If a text node is alone in an element and all spaces, replace it with an non breaking one
-		// This partially undoes the damage done by moz, which translates '&nbsp;'s into spaces in the data element
-		if ( !root.previousSibling && !root.nextSibling && root.data.match(/^\s*$/i) ) html = '&nbsp;';
-		else html = HTMLArea.htmlEncode(root.data);
-		break;
-	    case 8: // Node.COMMENT_NODE
-		html = "<!--" + root.data + "-->";
-		break;		// skip comments, for now.
-	}
-	return html;
-};
-
-HTMLArea.prototype.stripBaseURL = function(string) {
-	var baseurl = this.config.baseURL;
-
-	// strip to last directory in case baseurl points to a file
-	baseurl = baseurl.replace(/[^\/]+$/, '');
-	var basere = new RegExp(baseurl);
-	string = string.replace(basere, "");
-
-	// strip host-part of URL which is added by MSIE to links relative to server root
-	baseurl = baseurl.replace(/^(https?:\/\/[^\/]+)(.*)$/, '$1');
-	basere = new RegExp(baseurl);
-	return string.replace(basere, "");
-};
-
-String.prototype.trim = function() {
-	a = this.replace(/^\s+/, '');
-	return a.replace(/\s+$/, '');
-};
-
-// creates a rgb-style color from a number
-HTMLArea._makeColor = function(v) {
-	if (typeof v != "number") {
-		// already in rgb (hopefully); IE doesn't get here.
-		return v;
-	}
-	// IE sends number; convert to rgb.
-	var r = v & 0xFF;
-	var g = (v >> 8) & 0xFF;
-	var b = (v >> 16) & 0xFF;
-	return "rgb(" + r + "," + g + "," + b + ")";
-};
-
-// returns hexadecimal color representation from a number or a rgb-style color.
-HTMLArea._colorToRgb = function(v) {
-	if (!v)
-		return '';
-
-	// returns the hex representation of one byte (2 digits)
-	function hex(d) {
-		return (d < 16) ? ("0" + d.toString(16)) : d.toString(16);
-	};
-
-	if (typeof v == "number") {
-		// we're talking to IE here
-		var r = v & 0xFF;
-		var g = (v >> 8) & 0xFF;
-		var b = (v >> 16) & 0xFF;
-		return "#" + hex(r) + hex(g) + hex(b);
-	}
-
-	if (v.substr(0, 3) == "rgb") {
-		// in rgb(...) form -- Mozilla
-		var re = /rgb\s*\(\s*([0-9]+)\s*,\s*([0-9]+)\s*,\s*([0-9]+)\s*\)/;
-		if (v.match(re)) {
-			var r = parseInt(RegExp.$1);
-			var g = parseInt(RegExp.$2);
-			var b = parseInt(RegExp.$3);
-			return "#" + hex(r) + hex(g) + hex(b);
-		}
-		// doesn't match RE?!  maybe uses percentages or float numbers
-		// -- FIXME: not yet implemented.
-		return null;
-	}
-
-	if (v.substr(0, 1) == "#") {
-		// already hex rgb (hopefully :D )
-		return v;
-	}
-
-	// if everything else fails ;)
-	return null;
-};
-
-// modal dialogs for Mozilla (for IE we're using the showModalDialog() call).
-
-// receives an URL to the popup dialog and a function that receives one value;
-// this function will get called after the dialog is closed, with the return
-// value of the dialog.
-HTMLArea.prototype._popupDialog = function(url, action, init) {
-	Dialog(this.popupURL(url), action, init);
-};
-
-// paths
-
-HTMLArea.prototype.imgURL = function(file, plugin) {
-	if (typeof plugin == "undefined")
-		return _editor_url + file;
-	else
-		return _editor_url + "plugins/" + plugin + "/img/" + file;
-};
-
-HTMLArea.prototype.popupURL = function(file) {
-	var url = "";
-	if (file.match(/^plugin:\/\/(.*?)\/(.*)/)) {
-		var plugin = RegExp.$1;
-		var popup = RegExp.$2;
-		if (!/\.html$/.test(popup))
-			popup += ".html";
-		url = _editor_url + "plugins/" + plugin + "/popups/" + popup;
-	} else
-		url = _editor_url + this.config.popupURL + file;
-	return url;
-};
-
-/**
- * FIX: Internet Explorer returns an item having the _name_ equal to the given
- * id, even if it's not having any id.  This way it can return a different form
- * field even if it's not a textarea.  This workarounds the problem by
- * specifically looking to search only elements having a certain tag name.
- */
-HTMLArea.getElementById = function(tag, id) {
-	var el, i, objs = document.getElementsByTagName(tag);
-	for (i = objs.length; --i >= 0 && (el = objs[i]);)
-		if (el.id == id)
-			return el;
-	return null;
-};
-
-
-
-// EOF
-// Local variables: //
-// c-basic-offset:8 //
-// indent-tabs-mode:t //
-// End: //
+// htmlArea v3.0 - Copyright (c) 2003-2005 dynarch.com
+//                               2002-2003 interactivetools.com, inc.
+// This copyright 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.
+//   http://dynarch.com/mishoo/
+//
+// $Id: htmlarea.js,v 1.96 2005/01/20 17:49:04 mishoo Exp $
+
+// -------------------------------------------------------------
+// PLOG HTMLAREA TWEAK
+// Changed by: Mark Wu
+// Date: 2005/02/05
+// Purpose: Base URL and Language setting for pLog
+// -------------------------------------------------------------
+var _editor_url = "js/htmlarea";
+var _editor_lang = "en";
+// -------------------------------------------------------------
+
+if (typeof _editor_url == "string") {
+	// Leave exactly one backslash at the end of _editor_url
+	_editor_url = _editor_url.replace(/\x2f*$/, '/');
+} else {
+	alert("WARNING: _editor_url is not set!  You should set this variable to the editor files path; it should preferably be an absolute path, like in '/htmlarea/', but it can be relative if you prefer.  Further we will try to load the editor files correctly but we'll probably fail.");
+	_editor_url = '';
+}
+
+// make sure we have a language
+if (typeof _editor_lang == "string") {
+	_editor_lang = _editor_lang.toLowerCase();
+} else {
+	_editor_lang = "en";
+}
+
+// browser identification
+HTMLArea.agt = navigator.userAgent.toLowerCase();
+HTMLArea.is_ie	   = ((HTMLArea.agt.indexOf("msie") != -1) && (HTMLArea.agt.indexOf("opera") == -1));
+HTMLArea.is_opera  = (HTMLArea.agt.indexOf("opera") != -1);
+HTMLArea.is_mac	   = (HTMLArea.agt.indexOf("mac") != -1);
+HTMLArea.is_mac_ie = (HTMLArea.is_ie && HTMLArea.is_mac);
+HTMLArea.is_win_ie = (HTMLArea.is_ie && !HTMLArea.is_mac);
+HTMLArea.is_gecko  = (navigator.product == "Gecko");
+
+// Creates a new HTMLArea object.  Tries to replace the textarea with the given
+// ID with it.
+function HTMLArea(textarea, config) {
+        if (!HTMLArea._init_called) {
+	 alert("Error: You must called HTMLArea.init() first.  Like this:\n\n" +
+	       "HTMLArea.init();\n" +
+	       "HTMLArea.onload = function() {\n" +
+	       "  var editor = new HTMLArea('editor');\n" +
+	       "  editor.generate();\n" +
+	       "};\n");
+	  return;
+	}
+
+	if (HTMLArea.checkSupportedBrowser()) {
+		if (typeof config == "undefined") {
+			this.config = new HTMLArea.Config();
+		} else {
+			this.config = config;
+		}
+		this._htmlArea = null;
+		this._textArea = textarea;
+		this._editMode = "wysiwyg";
+		this.plugins = {};
+		this._timerToolbar = null;
+		this._timerUndo = null;
+		this._undoQueue = new Array(this.config.undoSteps);
+		this._undoPos = -1;
+		this._customUndo = false;
+		this._mdoc = document; // cache the document, we need it in plugins
+		this.doctype = '';
+	}
+};
+
+HTMLArea.onload = function(){};
+HTMLArea._scripts = [];
+HTMLArea.loadScript = function(url, plugin) {
+	if (plugin)
+		url = HTMLArea.getPluginDir(plugin) + '/' + url;
+	this._scripts.push(url);
+};
+
+HTMLArea.init = function() {
+	var head = document.getElementsByTagName("head")[0];
+	var current = 0;
+	var savetitle = document.title;
+	var evt = HTMLArea.is_ie ? "onreadystatechange" : "onload";
+	function loadNextScript() {
+		if (current > 0 && HTMLArea.is_ie &&
+		    !/loaded|complete/.test(window.event.srcElement.readyState))
+			return;
+		if (current < HTMLArea._scripts.length) {
+			var url = HTMLArea._scripts[current++];
+			document.title = "[HTMLArea: loading script " + current + "/" + HTMLArea._scripts.length + "]";
+			var script = document.createElement("script");
+			script.type = "text/javascript";
+			script.src = url;
+			script[evt] = loadNextScript;
+			head.appendChild(script);
+		} else {
+			document.title = savetitle;
+                        HTMLArea._init_called = 1;
+			HTMLArea.onload();
+		}
+	};
+	loadNextScript();
+
+};
+
+HTMLArea.loadScript(_editor_url + "dialog.js");
+HTMLArea.loadScript(_editor_url + "popupwin.js");
+HTMLArea.loadScript(_editor_url + "lang/" + _editor_lang + ".js");
+
+// cache some regexps
+HTMLArea.RE_tagName = /(<\/|<)\s*([^ \t\n>]+)/ig;
+HTMLArea.RE_doctype = /(<!doctype((.|\n)*?)>)\n?/i;
+HTMLArea.RE_head    = /<head>((.|\n)*?)<\/head>/i;
+HTMLArea.RE_body    = /<body>((.|\n)*?)<\/body>/i;
+
+HTMLArea.Config = function () {
+	this.version = "3.0";
+
+	this.width = "auto";
+	this.height = "auto";
+
+	// enable creation of a status bar?
+	this.statusBar = true;
+
+	// intercept ^V and use the HTMLArea paste command
+	// If false, then passes ^V through to browser editor widget
+	this.htmlareaPaste = false;
+
+	// maximum size of the undo queue
+	this.undoSteps = 20;
+
+	// the time interval at which undo samples are taken
+	this.undoTimeout = 500;	// 1/2 sec.
+
+	// the next parameter specifies whether the toolbar should be included
+	// in the size or not.
+	this.sizeIncludesToolbar = true;
+
+	// if true then HTMLArea will retrieve the full HTML, starting with the
+	// <HTML> tag.
+	this.fullPage = false;
+
+	// style included in the iframe document
+	this.pageStyle = "";
+
+	// set to true if you want Word code to be cleaned upon Paste
+	this.killWordOnPaste = true;
+
+	// enable the 'Target' field in the Make Link dialog
+	this.makeLinkShowsTarget = true;
+
+	// BaseURL included in the iframe document
+	this.baseURL = document.baseURI || document.URL;
+	if (this.baseURL && this.baseURL.match(/(.*)\/([^\/]+)/))
+		this.baseURL = RegExp.$1 + "/";
+
+	// URL-s
+	this.imgURL = "images/";
+	this.popupURL = "popups/";
+
+	// remove tags (these have to be a regexp, or null if this functionality is not desired)
+	this.htmlRemoveTags = null;
+
+	/** CUSTOMIZING THE TOOLBAR
+	 * -------------------------
+	 *
+	 * It is recommended that you customize the toolbar contents in an
+	 * external file (i.e. the one calling HTMLArea) and leave this one
+	 * unchanged.  That's because when we (InteractiveTools.com) release a
+	 * new official version, it's less likely that you will have problems
+	 * upgrading HTMLArea.
+	 */
+	this.toolbar = [
+		[ "fontname", "space",
+		  "fontsize", "space",
+		  "formatblock", "space",
+		  "bold", "italic", "underline", "strikethrough", "separator",
+		  "subscript", "superscript", "separator",
+		  "copy", "cut", "paste", "space", "undo", "redo", "space", "removeformat", "killword" ],
+
+		[ "justifyleft", "justifycenter", "justifyright", "justifyfull", "separator",
+		  "lefttoright", "righttoleft", "separator",
+		  "orderedlist", "unorderedlist", "outdent", "indent", "separator",
+		  "forecolor", "hilitecolor", "separator",
+		  "inserthorizontalrule", "createlink", "insertimage", "inserttable", "htmlmode", "separator",
+		  "popupeditor", "separator", "showhelp", "about" ]
+	];
+
+	this.fontname = {
+		"&mdash; font &mdash;":         '',
+		"Arial":	   'arial,helvetica,sans-serif',
+		"Courier New":	   'courier new,courier,monospace',
+		"Georgia":	   'georgia,times new roman,times,serif',
+		"Tahoma":	   'tahoma,arial,helvetica,sans-serif',
+		"Times New Roman": 'times new roman,times,serif',
+		"Verdana":	   'verdana,arial,helvetica,sans-serif',
+		"impact":	   'impact',
+		"WingDings":	   'wingdings'
+	};
+
+	this.fontsize = {
+		"&mdash; size &mdash;"  : "",
+		"1 (8 pt)" : "1",
+		"2 (10 pt)": "2",
+		"3 (12 pt)": "3",
+		"4 (14 pt)": "4",
+		"5 (18 pt)": "5",
+		"6 (24 pt)": "6",
+		"7 (36 pt)": "7"
+	};
+
+	this.formatblock = {
+		"&mdash; format &mdash;"  : "",
+		"Heading 1": "h1",
+		"Heading 2": "h2",
+		"Heading 3": "h3",
+		"Heading 4": "h4",
+		"Heading 5": "h5",
+		"Heading 6": "h6",
+		"Normal"   : "p",
+		"Address"  : "address",
+		"Formatted": "pre"
+	};
+
+	this.customSelects = {};
+
+	function cut_copy_paste(e, cmd, obj) {
+		e.execCommand(cmd);
+	};
+
+	this.debug = true;
+
+	// ADDING CUSTOM BUTTONS: please read below!
+	// format of the btnList elements is "ID: [ ToolTip, Icon, Enabled in text mode?, ACTION ]"
+	//    - ID: unique ID for the button.  If the button calls document.execCommand
+	//	    it's wise to give it the same name as the called command.
+	//    - ACTION: function that gets called when the button is clicked.
+	//              it has the following prototype:
+	//                 function(editor, buttonName)
+	//              - editor is the HTMLArea object that triggered the call
+	//              - buttonName is the ID of the clicked button
+	//              These 2 parameters makes it possible for you to use the same
+	//              handler for more HTMLArea objects or for more different buttons.
+	//    - ToolTip: default tooltip, for cases when it is not defined in the -lang- file (HTMLArea.I18N)
+	//    - Icon: path to an icon image file for the button (TODO: use one image for all buttons!)
+	//    - Enabled in text mode: if false the button gets disabled for text-only mode; otherwise enabled all the time.
+	this.btnList = {
+		bold: [ "Bold", "ed_format_bold.gif", false, function(e) {e.execCommand("bold");} ],
+		italic: [ "Italic", "ed_format_italic.gif", false, function(e) {e.execCommand("italic");} ],
+		underline: [ "Underline", "ed_format_underline.gif", false, function(e) {e.execCommand("underline");} ],
+		strikethrough: [ "Strikethrough", "ed_format_strike.gif", false, function(e) {e.execCommand("strikethrough");} ],
+		subscript: [ "Subscript", "ed_format_sub.gif", false, function(e) {e.execCommand("subscript");} ],
+		superscript: [ "Superscript", "ed_format_sup.gif", false, function(e) {e.execCommand("superscript");} ],
+		justifyleft: [ "Justify Left", "ed_align_left.gif", false, function(e) {e.execCommand("justifyleft");} ],
+		justifycenter: [ "Justify Center", "ed_align_center.gif", false, function(e) {e.execCommand("justifycenter");} ],
+		justifyright: [ "Justify Right", "ed_align_right.gif", false, function(e) {e.execCommand("justifyright");} ],
+		justifyfull: [ "Justify Full", "ed_align_justify.gif", false, function(e) {e.execCommand("justifyfull");} ],
+		orderedlist: [ "Ordered List", "ed_list_num.gif", false, function(e) {e.execCommand("insertorderedlist");} ],
+		unorderedlist: [ "Bulleted List", "ed_list_bullet.gif", false, function(e) {e.execCommand("insertunorderedlist");} ],
+		outdent: [ "Decrease Indent", "ed_indent_less.gif", false, function(e) {e.execCommand("outdent");} ],
+		indent: [ "Increase Indent", "ed_indent_more.gif", false, function(e) {e.execCommand("indent");} ],
+		forecolor: [ "Font Color", "ed_color_fg.gif", false, function(e) {e.execCommand("forecolor");} ],
+		hilitecolor: [ "Background Color", "ed_color_bg.gif", false, function(e) {e.execCommand("hilitecolor");} ],
+		inserthorizontalrule: [ "Horizontal Rule", "ed_hr.gif", false, function(e) {e.execCommand("inserthorizontalrule");} ],
+		createlink: [ "Insert Web Link", "ed_link.gif", false, function(e) {e.execCommand("createlink", true);} ],
+		insertimage: [ "Insert/Modify Image", "ed_image.gif", false, function(e) {e.execCommand("insertimage");} ],
+		inserttable: [ "Insert Table", "insert_table.gif", false, function(e) {e.execCommand("inserttable");} ],
+		htmlmode: [ "Toggle HTML Source", "ed_html.gif", true, function(e) {e.execCommand("htmlmode");} ],
+		popupeditor: [ "Enlarge Editor", "fullscreen_maximize.gif", true, function(e) {e.execCommand("popupeditor");} ],
+		about: [ "About this editor", "ed_about.gif", true, function(e) {e.execCommand("about");} ],
+		showhelp: [ "Help using editor", "ed_help.gif", true, function(e) {e.execCommand("showhelp");} ],
+		undo: [ "Undoes your last action", "ed_undo.gif", false, function(e) {e.execCommand("undo");} ],
+		redo: [ "Redoes your last action", "ed_redo.gif", false, function(e) {e.execCommand("redo");} ],
+		cut: [ "Cut selection", "ed_cut.gif", false, cut_copy_paste ],
+		copy: [ "Copy selection", "ed_copy.gif", false, cut_copy_paste ],
+		paste: [ "Paste from clipboard", "ed_paste.gif", false, cut_copy_paste ],
+		lefttoright: [ "Direction left to right", "ed_left_to_right.gif", false, function(e) {e.execCommand("lefttoright");} ],
+		righttoleft: [ "Direction right to left", "ed_right_to_left.gif", false, function(e) {e.execCommand("righttoleft");} ],
+		removeformat: [ "Remove formatting", "ed_rmformat.gif", false, function(e) {e.execCommand("removeformat");} ],
+		print: [ "Print document", "ed_print.gif", false, function(e) {e._iframe.contentWindow.print();} ],
+		killword: [ "Clear MSOffice tags", "ed_killword.gif", false, function(e) {e.execCommand("killword");} ]
+	};
+	/* ADDING CUSTOM BUTTONS
+	 * ---------------------
+	 *
+	 * It is recommended that you add the custom buttons in an external
+	 * file and leave this one unchanged.  That's because when we
+	 * (InteractiveTools.com) release a new official version, it's less
+	 * likely that you will have problems upgrading HTMLArea.
+	 *
+	 * Example on how to add a custom button when you construct the HTMLArea:
+	 *
+	 *   var editor = new HTMLArea("your_text_area_id");
+	 *   var cfg = editor.config; // this is the default configuration
+	 *   cfg.btnList["my-hilite"] =
+	 *	[ function(editor) { editor.surroundHTML('<span style="background:yellow">', '</span>'); }, // action
+	 *	  "Highlight selection", // tooltip
+	 *	  "my_hilite.gif", // image
+	 *	  false // disabled in text mode
+	 *	];
+	 *   cfg.toolbar.push(["linebreak", "my-hilite"]); // add the new button to the toolbar
+	 *
+	 * An alternate (also more convenient and recommended) way to
+	 * accomplish this is to use the registerButton function below.
+	 */
+	// initialize tooltips from the I18N module and generate correct image path
+	for (var i in this.btnList) {
+		var btn = this.btnList[i];
+		btn[1] = _editor_url + this.imgURL + btn[1];
+		if (typeof HTMLArea.I18N.tooltips[i] != "undefined") {
+			btn[0] = HTMLArea.I18N.tooltips[i];
+		}
+	}
+};
+
+/** Helper function: register a new button with the configuration.  It can be
+ * called with all 5 arguments, or with only one (first one).  When called with
+ * only one argument it must be an object with the following properties: id,
+ * tooltip, image, textMode, action.  Examples:
+ *
+ * 1. config.registerButton("my-hilite", "Hilite text", "my-hilite.gif", false, function(editor) {...});
+ * 2. config.registerButton({
+ *      id       : "my-hilite",      // the ID of your button
+ *      tooltip  : "Hilite text",    // the tooltip
+ *      image    : "my-hilite.gif",  // image to be displayed in the toolbar
+ *      textMode : false,            // disabled in text mode
+ *      action   : function(editor) { // called when the button is clicked
+ *                   editor.surroundHTML('<span class="hilite">', '</span>');
+ *                 },
+ *      context  : "p"               // will be disabled if outside a <p> element
+ *    });
+ */
+HTMLArea.Config.prototype.registerButton = function(id, tooltip, image, textMode, action, context) {
+	var the_id;
+	if (typeof id == "string") {
+		the_id = id;
+	} else if (typeof id == "object") {
+		the_id = id.id;
+	} else {
+		alert("ERROR [HTMLArea.Config::registerButton]:\ninvalid arguments");
+		return false;
+	}
+	// check for existing id
+	if (typeof this.customSelects[the_id] != "undefined") {
+		// alert("WARNING [HTMLArea.Config::registerDropdown]:\nA dropdown with the same ID already exists.");
+	}
+	if (typeof this.btnList[the_id] != "undefined") {
+		// alert("WARNING [HTMLArea.Config::registerDropdown]:\nA button with the same ID already exists.");
+	}
+	switch (typeof id) {
+	    case "string": this.btnList[id] = [ tooltip, image, textMode, action, context ]; break;
+	    case "object": this.btnList[id.id] = [ id.tooltip, id.image, id.textMode, id.action, id.context ]; break;
+	}
+};
+
+/** The following helper function registers a dropdown box with the editor
+ * configuration.  You still have to add it to the toolbar, same as with the
+ * buttons.  Call it like this:
+ *
+ * FIXME: add example
+ */
+HTMLArea.Config.prototype.registerDropdown = function(object) {
+	// check for existing id
+	if (typeof this.customSelects[object.id] != "undefined") {
+		// alert("WARNING [HTMLArea.Config::registerDropdown]:\nA dropdown with the same ID already exists.");
+	}
+	if (typeof this.btnList[object.id] != "undefined") {
+		// alert("WARNING [HTMLArea.Config::registerDropdown]:\nA button with the same ID already exists.");
+	}
+	this.customSelects[object.id] = object;
+};
+
+/** Call this function to remove some buttons/drop-down boxes from the toolbar.
+ * Pass as the only parameter a string containing button/drop-down names
+ * delimited by spaces.  Note that the string should also begin with a space
+ * and end with a space.  Example:
+ *
+ *   config.hideSomeButtons(" fontname fontsize textindicator ");
+ *
+ * It's useful because it's easier to remove stuff from the defaul toolbar than
+ * create a brand new toolbar ;-)
+ */
+HTMLArea.Config.prototype.hideSomeButtons = function(remove) {
+	var toolbar = this.toolbar;
+	for (var i = toolbar.length; --i >= 0;) {
+		var line = toolbar[i];
+		for (var j = line.length; --j >= 0; ) {
+			if (remove.indexOf(" " + line[j] + " ") >= 0) {
+				var len = 1;
+				if (/separator|space/.test(line[j + 1])) {
+					len = 2;
+				}
+				line.splice(j, len);
+			}
+		}
+	}
+};
+
+/** Helper function: replace all TEXTAREA-s in the document with HTMLArea-s. */
+HTMLArea.replaceAll = function(config) {
+	var tas = document.getElementsByTagName("textarea");
+	for (var i = tas.length; i > 0; (new HTMLArea(tas[--i], config)).generate());
+};
+
+/** Helper function: replaces the TEXTAREA with the given ID with HTMLArea. */
+HTMLArea.replace = function(id, config) {
+	var ta = HTMLArea.getElementById("textarea", id);
+	return ta ? (new HTMLArea(ta, config)).generate() : null;
+};
+
+// Creates the toolbar and appends it to the _htmlarea
+HTMLArea.prototype._createToolbar = function () {
+	var editor = this;	// to access this in nested functions
+
+	var toolbar = document.createElement("div");
+	this._toolbar = toolbar;
+	toolbar.className = "toolbar";
+	toolbar.unselectable = "1";
+	var tb_row = null;
+	var tb_objects = new Object();
+	this._toolbarObjects = tb_objects;
+
+	// creates a new line in the toolbar
+	function newLine() {
+		var table = document.createElement("table");
+		table.border = "0px";
+		table.cellSpacing = "0px";
+		table.cellPadding = "0px";
+		toolbar.appendChild(table);
+		// TBODY is required for IE, otherwise you don't see anything
+		// in the TABLE.
+		var tb_body = document.createElement("tbody");
+		table.appendChild(tb_body);
+		tb_row = document.createElement("tr");
+		tb_body.appendChild(tb_row);
+	}; // END of function: newLine
+	// init first line
+	newLine();
+
+	// updates the state of a toolbar element.  This function is member of
+	// a toolbar element object (unnamed objects created by createButton or
+	// createSelect functions below).
+	function setButtonStatus(id, newval) {
+		var oldval = this[id];
+		var el = this.element;
+		if (oldval != newval) {
+			switch (id) {
+			    case "enabled":
+				if (newval) {
+					HTMLArea._removeClass(el, "buttonDisabled");
+					el.disabled = false;
+				} else {
+					HTMLArea._addClass(el, "buttonDisabled");
+					el.disabled = true;
+				}
+				break;
+			    case "active":
+				if (newval) {
+					HTMLArea._addClass(el, "buttonPressed");
+				} else {
+					HTMLArea._removeClass(el, "buttonPressed");
+				}
+				break;
+			}
+			this[id] = newval;
+		}
+	}; // END of function: setButtonStatus
+
+	// this function will handle creation of combo boxes.  Receives as
+	// parameter the name of a button as defined in the toolBar config.
+	// This function is called from createButton, above, if the given "txt"
+	// doesn't match a button.
+	function createSelect(txt) {
+		var options = null;
+		var el = null;
+		var cmd = null;
+		var customSelects = editor.config.customSelects;
+		var context = null;
+		var tooltip = "";
+		switch (txt) {
+		    case "fontsize":
+		    case "fontname":
+		    case "formatblock":
+			// the following line retrieves the correct
+			// configuration option because the variable name
+			// inside the Config object is named the same as the
+			// button/select in the toolbar.  For instance, if txt
+			// == "formatblock" we retrieve config.formatblock (or
+			// a different way to write it in JS is
+			// config["formatblock"].
+			options = editor.config[txt];
+			cmd = txt;
+			break;
+		    default:
+			// try to fetch it from the list of registered selects
+			cmd = txt;
+			var dropdown = customSelects[cmd];
+			if (typeof dropdown != "undefined") {
+				options = dropdown.options;
+				context = dropdown.context;
+				if (typeof dropdown.tooltip != "undefined") {
+					tooltip = dropdown.tooltip;
+				}
+			} else {
+				alert("ERROR [createSelect]:\nCan't find the requested dropdown definition");
+			}
+			break;
+		}
+		if (options) {
+			el = document.createElement("select");
+			el.title = tooltip;
+			var obj = {
+				name	: txt, // field name
+				element : el,	// the UI element (SELECT)
+				enabled : true, // is it enabled?
+				text	: false, // enabled in text mode?
+				cmd	: cmd, // command ID
+				state	: setButtonStatus, // for changing state
+				context : context
+			};
+			tb_objects[txt] = obj;
+			for (var i in options) {
+				var op = document.createElement("option");
+				op.innerHTML = i;
+				op.value = options[i];
+				el.appendChild(op);
+			}
+			HTMLArea._addEvent(el, "change", function () {
+				editor._comboSelected(el, txt);
+			});
+		}
+		return el;
+	}; // END of function: createSelect
+
+	// appends a new button to toolbar
+	function createButton(txt) {
+		// the element that will be created
+		var el = null;
+		var btn = null;
+		switch (txt) {
+		    case "separator":
+			el = document.createElement("div");
+			el.className = "separator";
+			break;
+		    case "space":
+			el = document.createElement("div");
+			el.className = "space";
+			break;
+		    case "linebreak":
+			newLine();
+			return false;
+		    case "textindicator":
+			el = document.createElement("div");
+			el.appendChild(document.createTextNode("A"));
+			el.className = "indicator";
+			el.title = HTMLArea.I18N.tooltips.textindicator;
+			var obj = {
+				name	: txt, // the button name (i.e. 'bold')
+				element : el, // the UI element (DIV)
+				enabled : true, // is it enabled?
+				active	: false, // is it pressed?
+				text	: false, // enabled in text mode?
+				cmd	: "textindicator", // the command ID
+				state	: setButtonStatus // for changing state
+			};
+			tb_objects[txt] = obj;
+			break;
+		    default:
+			btn = editor.config.btnList[txt];
+		}
+		if (!el && btn) {
+			el = document.createElement("div");
+			el.title = btn[0];
+			el.className = "button";
+			// let's just pretend we have a button object, and
+			// assign all the needed information to it.
+			var obj = {
+				name	: txt, // the button name (i.e. 'bold')
+				element : el, // the UI element (DIV)
+				enabled : true, // is it enabled?
+				active	: false, // is it pressed?
+				text	: btn[2], // enabled in text mode?
+				cmd	: btn[3], // the command ID
+				state	: setButtonStatus, // for changing state
+				context : btn[4] || null // enabled in a certain context?
+			};
+			tb_objects[txt] = obj;
+			// handlers to emulate nice flat toolbar buttons
+			HTMLArea._addEvent(el, "mouseover", function () {
+				if (obj.enabled) {
+					HTMLArea._addClass(el, "buttonHover");
+				}
+			});
+			HTMLArea._addEvent(el, "mouseout", function () {
+				if (obj.enabled) with (HTMLArea) {
+					_removeClass(el, "buttonHover");
+					_removeClass(el, "buttonActive");
+					(obj.active) && _addClass(el, "buttonPressed");
+				}
+			});
+			HTMLArea._addEvent(el, "mousedown", function (ev) {
+				if (obj.enabled) with (HTMLArea) {
+					_addClass(el, "buttonActive");
+					_removeClass(el, "buttonPressed");
+					_stopEvent(is_ie ? window.event : ev);
+				}
+			});
+			// when clicked, do the following:
+			HTMLArea._addEvent(el, "click", function (ev) {
+				if (obj.enabled) with (HTMLArea) {
+					_removeClass(el, "buttonActive");
+					_removeClass(el, "buttonHover");
+					obj.cmd(editor, obj.name, obj);
+					_stopEvent(is_ie ? window.event : ev);
+				}
+			});
+			var img = document.createElement("img");
+			img.src = btn[1];
+			img.style.width = "18px";
+			img.style.height = "18px";
+			el.appendChild(img);
+		} else if (!el) {
+			el = createSelect(txt);
+		}
+		if (el) {
+			var tb_cell = document.createElement("td");
+			tb_row.appendChild(tb_cell);
+			tb_cell.appendChild(el);
+		} else {
+			alert("FIXME: Unknown toolbar item: " + txt);
+		}
+		return el;
+	};
+
+	var first = true;
+	for (var i = 0; i < this.config.toolbar.length; ++i) {
+		if (!first) {
+			createButton("linebreak");
+		} else {
+			first = false;
+		}
+		var group = this.config.toolbar[i];
+		for (var j = 0; j < group.length; ++j) {
+			var code = group[j];
+			if (/^([IT])\[(.*?)\]/.test(code)) {
+				// special case, create text label
+				var l7ed = RegExp.$1 == "I"; // localized?
+				var label = RegExp.$2;
+				if (l7ed) {
+					label = HTMLArea.I18N.custom[label];
+				}
+				var tb_cell = document.createElement("td");
+				tb_row.appendChild(tb_cell);
+				tb_cell.className = "label";
+				tb_cell.innerHTML = label;
+			} else {
+				createButton(code);
+			}
+		}
+	}
+
+	this._htmlArea.appendChild(toolbar);
+};
+
+HTMLArea.prototype._createStatusBar = function() {
+	var statusbar = document.createElement("div");
+	statusbar.className = "statusBar";
+	this._htmlArea.appendChild(statusbar);
+	this._statusBar = statusbar;
+	// statusbar.appendChild(document.createTextNode(HTMLArea.I18N.msg["Path"] + ": "));
+	// creates a holder for the path view
+	div = document.createElement("span");
+	div.className = "statusBarTree";
+	div.innerHTML = HTMLArea.I18N.msg["Path"] + ": ";
+	this._statusBarTree = div;
+	this._statusBar.appendChild(div);
+	if (!this.config.statusBar) {
+		// disable it...
+		statusbar.style.display = "none";
+	}
+};
+
+// Creates the HTMLArea object and replaces the textarea with it.
+HTMLArea.prototype.generate = function () {
+	var editor = this;	// we'll need "this" in some nested functions
+	// get the textarea
+	var textarea = this._textArea;
+	if (typeof textarea == "string") {
+		// it's not element but ID
+		this._textArea = textarea = HTMLArea.getElementById("textarea", textarea);
+	}
+	this._ta_size = {
+		w: textarea.offsetWidth,
+		h: textarea.offsetHeight
+	};
+	textarea.style.display = "none";
+
+	// create the editor framework
+	var htmlarea = document.createElement("div");
+	htmlarea.className = "htmlarea";
+	this._htmlArea = htmlarea;
+
+	// insert the editor before the textarea.
+	textarea.parentNode.insertBefore(htmlarea, textarea);
+
+	if (textarea.form) {
+		// we have a form, on submit get the HTMLArea content and
+		// update original textarea.
+		var f = textarea.form;
+		if (typeof f.onsubmit == "function") {
+			var funcref = f.onsubmit;
+			if (typeof f.__msh_prevOnSubmit == "undefined") {
+				f.__msh_prevOnSubmit = [];
+			}
+			f.__msh_prevOnSubmit.push(funcref);
+		}
+		f.onsubmit = function() {
+			editor._textArea.value = editor.getHTML();
+			var a = this.__msh_prevOnSubmit;
+			// call previous submit methods if they were there.
+			if (typeof a != "undefined") {
+				for (var i = a.length; --i >= 0;) {
+					a[i]();
+				}
+			}
+		};
+		if (typeof f.onreset == "function") {
+			var funcref = f.onreset;
+			if (typeof f.__msh_prevOnReset == "undefined") {
+				f.__msh_prevOnReset = [];
+			}
+			f.__msh_prevOnReset.push(funcref);
+		}
+		f.onreset = function() {
+			editor.setHTML(editor._textArea.value);
+			editor.updateToolbar();
+			var a = this.__msh_prevOnReset;
+			// call previous reset methods if they were there.
+			if (typeof a != "undefined") {
+				for (var i = a.length; --i >= 0;) {
+					a[i]();
+				}
+			}
+		};
+	}
+
+	// add a handler for the "back/forward" case -- on body.unload we save
+	// the HTML content into the original textarea.
+	try {
+		window.onunload = function() {
+			editor._textArea.value = editor.getHTML();
+		};
+	} catch(e) {};
+
+	// creates & appends the toolbar
+	this._createToolbar();
+
+	// create the IFRAME
+	var iframe = document.createElement("iframe");
+
+	// workaround for the HTTPS problem
+	// iframe.setAttribute("src", "javascript:void(0);");
+	iframe.src = _editor_url + "popups/blank.html";
+
+	htmlarea.appendChild(iframe);
+
+	this._iframe = iframe;
+
+	// creates & appends the status bar, if the case
+	this._createStatusBar();
+
+	// remove the default border as it keeps us from computing correctly
+	// the sizes.  (somebody tell me why doesn't this work in IE)
+
+	if (!HTMLArea.is_ie) {
+		iframe.style.borderWidth = "1px";
+	// iframe.frameBorder = "1";
+	// iframe.marginHeight = "0";
+	// iframe.marginWidth = "0";
+	}
+
+	// size the IFRAME according to user's prefs or initial textarea
+	var height = (this.config.height == "auto" ? (this._ta_size.h + "px") : this.config.height);
+	height = parseInt(height);
+	var width = (this.config.width == "auto" ? (this._ta_size.w + "px") : this.config.width);
+	width = parseInt(width);
+
+	if (!HTMLArea.is_ie) {
+		height -= 2;
+		width -= 2;
+	}
+
+	iframe.style.width = width + "px";
+	if (this.config.sizeIncludesToolbar) {
+		// substract toolbar height
+		height -= this._toolbar.offsetHeight;
+		height -= this._statusBar.offsetHeight;
+	}
+	if (height < 0) {
+		height = 0;
+	}
+	iframe.style.height = height + "px";
+
+	// the editor including the toolbar now have the same size as the
+	// original textarea.. which means that we need to reduce that a bit.
+	textarea.style.width = iframe.style.width;
+ 	textarea.style.height = iframe.style.height;
+
+	// IMPORTANT: we have to allow Mozilla a short time to recognize the
+	// new frame.  Otherwise we get a stupid exception.
+	function initIframe() {
+		var doc = editor._iframe.contentWindow.document;
+		if (!doc) {
+			// Try again..
+			// FIXME: don't know what else to do here.  Normally
+			// we'll never reach this point.
+			if (HTMLArea.is_gecko) {
+				setTimeout(initIframe, 100);
+				return false;
+			} else {
+				alert("ERROR: IFRAME can't be initialized.");
+			}
+		}
+		if (HTMLArea.is_gecko) {
+			// enable editable mode for Mozilla
+			doc.designMode = "on";
+		}
+		editor._doc = doc;
+		if (!editor.config.fullPage) {
+			doc.open();
+			var html = "<html>\n";
+			html += "<head>\n";
+			if (editor.config.baseURL)
+				html += '<base href="' + editor.config.baseURL + '" />';
+			html += "<style>" + editor.config.pageStyle +
+				" html,body { border: 0px; }</style>\n";
+			html += "</head>\n";
+			html += "<body>\n";
+			html += editor._textArea.value;
+			html += "</body>\n";
+			html += "</html>";
+			doc.write(html);
+			doc.close();
+		} else {
+			var html = editor._textArea.value;
+			if (html.match(HTMLArea.RE_doctype)) {
+				editor.setDoctype(RegExp.$1);
+				html = html.replace(HTMLArea.RE_doctype, "");
+			}
+			doc.open();
+			doc.write(html);
+			doc.close();
+		}
+
+		if (HTMLArea.is_ie) {
+			// enable editable mode for IE.	 For some reason this
+			// doesn't work if done in the same place as for Gecko
+			// (above).
+			doc.body.contentEditable = true;
+		}
+
+		editor.focusEditor();
+		// intercept some events; for updating the toolbar & keyboard handlers
+		HTMLArea._addEvents
+			(doc, ["keydown", "keypress", "mousedown", "mouseup", "drag"],
+			 function (event) {
+				 return editor._editorEvent(HTMLArea.is_ie ? editor._iframe.contentWindow.event : event);
+			 });
+
+		// check if any plugins have registered refresh handlers
+		for (var i in editor.plugins) {
+			var plugin = editor.plugins[i].instance;
+			if (typeof plugin.onGenerate == "function")
+				plugin.onGenerate();
+			if (typeof plugin.onGenerateOnce == "function") {
+				plugin.onGenerateOnce();
+				plugin.onGenerateOnce = null;
+			}
+		}
+
+		setTimeout(function() {
+			editor.updateToolbar();
+		}, 250);
+
+		if (typeof editor.onGenerate == "function")
+			editor.onGenerate();
+	};
+	setTimeout(initIframe, 100);
+	return this;
+};
+
+// Switches editor mode; parameter can be "textmode" or "wysiwyg".  If no
+// parameter was passed this function toggles between modes.
+HTMLArea.prototype.setMode = function(mode) {
+	if (typeof mode == "undefined") {
+		mode = ((this._editMode == "textmode") ? "wysiwyg" : "textmode");
+	}
+	switch (mode) {
+	    case "textmode":
+
+	    // -------------------------------------------------------------
+	    // PLOG HTMLAREA TWEAK
+	    // Changed by: Mark Wu
+	    // Date: 2005/02/05
+	    // Purpose: Change for preserve the HTML source code format
+	    // -------------------------------------------------------------
+		this._textArea.value = insertCRLF(this.getHTML());
+		// this._textArea.value = this.getHTML();
+		// -------------------------------------------------------------
+
+		this._iframe.style.display = "none";
+		this._textArea.style.display = "block";
+		if (this.config.statusBar) {
+			this._statusBar.innerHTML = HTMLArea.I18N.msg["TEXT_MODE"];
+		}
+		break;
+	    case "wysiwyg":
+		if (HTMLArea.is_gecko) {
+			// disable design mode before changing innerHTML
+			try {
+				this._doc.designMode = "off";
+			} catch(e) {};
+		}
+		if (!this.config.fullPage)
+			this._doc.body.innerHTML = this.getHTML();
+		else
+			this.setFullHTML(this.getHTML());
+		this._iframe.style.display = "block";
+		this._textArea.style.display = "none";
+		if (HTMLArea.is_gecko) {
+			// we need to refresh that info for Moz-1.3a
+			try {
+				this._doc.designMode = "on";
+			} catch(e) {};
+		}
+		if (this.config.statusBar) {
+			this._statusBar.innerHTML = '';
+			// this._statusBar.appendChild(document.createTextNode(HTMLArea.I18N.msg["Path"] + ": "));
+			this._statusBar.appendChild(this._statusBarTree);
+		}
+		break;
+	    default:
+		alert("Mode <" + mode + "> not defined!");
+		return false;
+	}
+	this._editMode = mode;
+	this.focusEditor();
+
+	for (var i in this.plugins) {
+		var plugin = this.plugins[i].instance;
+		if (typeof plugin.onMode == "function") plugin.onMode(mode);
+	}
+};
+
+HTMLArea.prototype.setFullHTML = function(html) {
+	var save_multiline = RegExp.multiline;
+	RegExp.multiline = true;
+	if (html.match(HTMLArea.RE_doctype)) {
+		this.setDoctype(RegExp.$1);
+		html = html.replace(HTMLArea.RE_doctype, "");
+	}
+	RegExp.multiline = save_multiline;
+	if (!HTMLArea.is_ie) {
+		if (html.match(HTMLArea.RE_head))
+			this._doc.getElementsByTagName("head")[0].innerHTML = RegExp.$1;
+		if (html.match(HTMLArea.RE_body))
+			this._doc.getElementsByTagName("body")[0].innerHTML = RegExp.$1;
+	} else {
+		var html_re = /<html>((.|\n)*?)<\/html>/i;
+		html = html.replace(html_re, "$1");
+		this._doc.open();
+		this._doc.write(html);
+		this._doc.close();
+		this._doc.body.contentEditable = true;
+		return true;
+	}
+};
+
+/***************************************************
+ *  Category: PLUGINS
+ ***************************************************/
+
+// Create the specified plugin and register it with this HTMLArea
+HTMLArea.prototype.registerPlugin = function() {
+	var plugin = arguments[0];
+	var args = [];
+	for (var i = 1; i < arguments.length; ++i)
+		args.push(arguments[i]);
+	this.registerPlugin2(plugin, args);
+};
+
+// this is the variant of the function above where the plugin arguments are
+// already packed in an array.  Externally, it should be only used in the
+// full-screen editor code, in order to initialize plugins with the same
+// parameters as in the opener window.
+HTMLArea.prototype.registerPlugin2 = function(plugin, args) {
+	if (typeof plugin == "string")
+		plugin = eval(plugin);
+	if (typeof plugin == "undefined") {
+		/* FIXME: This should never happen. But why does it do? */
+		return false;
+	}
+	var obj = new plugin(this, args);
+	if (obj) {
+		var clone = {};
+		var info = plugin._pluginInfo;
+		for (var i in info)
+			clone[i] = info[i];
+		clone.instance = obj;
+		clone.args = args;
+		this.plugins[plugin._pluginInfo.name] = clone;
+	} else
+		alert("Can't register plugin " + plugin.toString() + ".");
+};
+
+// static function that loads the required plugin and lang file, based on the
+// language loaded already for HTMLArea.  You better make sure that the plugin
+// _has_ that language, otherwise shit might happen ;-)
+HTMLArea.getPluginDir = function(pluginName) {
+	return _editor_url + "plugins/" + pluginName;
+};
+
+HTMLArea.loadPlugin = function(pluginName) {
+	var dir = this.getPluginDir(pluginName);
+	var plugin = pluginName.replace(/([a-z])([A-Z])([a-z])/g,
+					function (str, l1, l2, l3) {
+						return l1 + "-" + l2.toLowerCase() + l3;
+					}).toLowerCase() + ".js";
+	var plugin_file = dir + "/" + plugin;
+	var plugin_lang = dir + "/lang/" + _editor_lang + ".js";
+	//document.write("<script type='text/javascript' src='" + plugin_file + "'></script>");
+	//document.write("<script type='text/javascript' src='" + plugin_lang + "'></script>");
+	this.loadScript(plugin_file);
+	this.loadScript(plugin_lang);
+};
+
+HTMLArea.loadStyle = function(style, plugin) {
+	var url = _editor_url || '';
+	if (typeof plugin != "undefined") {
+		url += "plugins/" + plugin + "/";
+	}
+	url += style;
+	if (/^\//.test(style))
+		url = style;
+	var head = document.getElementsByTagName("head")[0];
+	var link = document.createElement("link");
+	link.rel = "stylesheet";
+	link.href = url;
+	head.appendChild(link);
+	//document.write("<style type='text/css'>@import url(" + url + ");</style>");
+};
+HTMLArea.loadStyle(typeof _editor_css == "string" ? _editor_css : "htmlarea.css");
+
+/***************************************************
+ *  Category: EDITOR UTILITIES
+ ***************************************************/
+
+HTMLArea.prototype.debugTree = function() {
+	var ta = document.createElement("textarea");
+	ta.style.width = "100%";
+	ta.style.height = "20em";
+	ta.value = "";
+	function debug(indent, str) {
+		for (; --indent >= 0;)
+			ta.value += " ";
+		ta.value += str + "\n";
+	};
+	function _dt(root, level) {
+		var tag = root.tagName.toLowerCase(), i;
+		var ns = HTMLArea.is_ie ? root.scopeName : root.prefix;
+		debug(level, "- " + tag + " [" + ns + "]");
+		for (i = root.firstChild; i; i = i.nextSibling)
+			if (i.nodeType == 1)
+				_dt(i, level + 2);
+	};
+	_dt(this._doc.body, 0);
+	document.body.appendChild(ta);
+};
+
+HTMLArea.getInnerText = function(el) {
+	var txt = '', i;
+	for (i = el.firstChild; i; i = i.nextSibling) {
+		if (i.nodeType == 3)
+			txt += i.data;
+		else if (i.nodeType == 1)
+			txt += HTMLArea.getInnerText(i);
+	}
+	return txt;
+};
+
+HTMLArea.prototype._wordClean = function() {
+	var
+		editor = this,
+		stats = {
+			empty_tags : 0,
+			mso_class  : 0,
+			mso_style  : 0,
+			mso_xmlel  : 0,
+			orig_len   : this._doc.body.innerHTML.length,
+			T          : (new Date()).getTime()
+		},
+		stats_txt = {
+			empty_tags : "Empty tags removed: ",
+			mso_class  : "MSO class names removed: ",
+			mso_style  : "MSO inline style removed: ",
+			mso_xmlel  : "MSO XML elements stripped: "
+		};
+	function showStats() {
+		var txt = "HTMLArea word cleaner stats: \n\n";
+		for (var i in stats)
+			if (stats_txt[i])
+				txt += stats_txt[i] + stats[i] + "\n";
+		txt += "\nInitial document length: " + stats.orig_len + "\n";
+		txt += "Final document length: " + editor._doc.body.innerHTML.length + "\n";
+		txt += "Clean-up took " + (((new Date()).getTime() - stats.T) / 1000) + " seconds";
+		alert(txt);
+	};
+	function clearClass(node) {
+		var newc = node.className.replace(/(^|\s)mso.*?(\s|$)/ig, ' ');
+		if (newc != node.className) {
+			node.className = newc;
+			if (!/\S/.test(node.className)) {
+				node.removeAttribute("className");
+				++stats.mso_class;
+			}
+		}
+	};
+	function clearStyle(node) {
+ 		var declarations = node.style.cssText.split(/\s*;\s*/);
+		for (var i = declarations.length; --i >= 0;)
+			if (/^mso|^tab-stops/i.test(declarations[i]) ||
+			    /^margin\s*:\s*0..\s+0..\s+0../i.test(declarations[i])) {
+				++stats.mso_style;
+				declarations.splice(i, 1);
+			}
+		node.style.cssText = declarations.join("; ");
+	};
+	function stripTag(el) {
+		if (HTMLArea.is_ie)
+			el.outerHTML = HTMLArea.htmlEncode(el.innerText);
+		else {
+			var txt = document.createTextNode(HTMLArea.getInnerText(el));
+			el.parentNode.insertBefore(txt, el);
+			el.parentNode.removeChild(el);
+		}
+		++stats.mso_xmlel;
+	};
+	function checkEmpty(el) {
+		if (/^(a|span|b|strong|i|em|font)$/i.test(el.tagName) &&
+		    !el.firstChild) {
+			el.parentNode.removeChild(el);
+			++stats.empty_tags;
+		}
+	};
+	function parseTree(root) {
+		var tag = root.tagName.toLowerCase(), i, next;
+		if ((HTMLArea.is_ie && root.scopeName != 'HTML') || (!HTMLArea.is_ie && /:/.test(tag))) {
+			stripTag(root);
+			return false;
+		} else {
+			clearClass(root);
+			clearStyle(root);
+			for (i = root.firstChild; i; i = next) {
+				next = i.nextSibling;
+				if (i.nodeType == 1 && parseTree(i))
+					checkEmpty(i);
+			}
+		}
+		return true;
+	};
+	parseTree(this._doc.body);
+	// showStats();
+	// this.debugTree();
+	// this.setHTML(this.getHTML());
+	// this.setHTML(this.getInnerHTML());
+	// this.forceRedraw();
+	this.updateToolbar();
+};
+
+HTMLArea.prototype.forceRedraw = function() {
+	this._doc.body.style.visibility = "hidden";
+	this._doc.body.style.visibility = "visible";
+	// this._doc.body.innerHTML = this.getInnerHTML();
+};
+
+// focuses the iframe window.  returns a reference to the editor document.
+HTMLArea.prototype.focusEditor = function() {
+	switch (this._editMode) {
+	    // notice the try { ... } catch block to avoid some rare exceptions in FireFox
+	    // (perhaps also in other Gecko browsers). Manual focus by user is required in
+        // case of an error. Somebody has an idea?
+	    case "wysiwyg" : try { this._iframe.contentWindow.focus() } catch (e) {} break;
+	    case "textmode": try { this._textArea.focus() } catch (e) {} break;
+	    default	   : alert("ERROR: mode " + this._editMode + " is not defined");
+	}
+	return this._doc;
+};
+
+// takes a snapshot of the current text (for undo)
+HTMLArea.prototype._undoTakeSnapshot = function() {
+	++this._undoPos;
+	if (this._undoPos >= this.config.undoSteps) {
+		// remove the first element
+		this._undoQueue.shift();
+		--this._undoPos;
+	}
+	// use the fasted method (getInnerHTML);
+	var take = true;
+	var txt = this.getInnerHTML();
+	if (this._undoPos > 0)
+		take = (this._undoQueue[this._undoPos - 1] != txt);
+	if (take) {
+		this._undoQueue[this._undoPos] = txt;
+	} else {
+		this._undoPos--;
+	}
+};
+
+HTMLArea.prototype.undo = function() {
+	if (this._undoPos > 0) {
+		var txt = this._undoQueue[--this._undoPos];
+		if (txt) this.setHTML(txt);
+		else ++this._undoPos;
+	}
+};
+
+HTMLArea.prototype.redo = function() {
+	if (this._undoPos < this._undoQueue.length - 1) {
+		var txt = this._undoQueue[++this._undoPos];
+		if (txt) this.setHTML(txt);
+		else --this._undoPos;
+	}
+};
+
+// updates enabled/disable/active state of the toolbar elements
+HTMLArea.prototype.updateToolbar = function(noStatus) {
+	var doc = this._doc;
+	var text = (this._editMode == "textmode");
+	var ancestors = null;
+	if (!text) {
+		ancestors = this.getAllAncestors();
+		if (this.config.statusBar && !noStatus) {
+			this._statusBarTree.innerHTML = HTMLArea.I18N.msg["Path"] + ": "; // clear
+			for (var i = ancestors.length; --i >= 0;) {
+				var el = ancestors[i];
+				if (!el) {
+					// hell knows why we get here; this
+					// could be a classic example of why
+					// it's good to check for conditions
+					// that are impossible to happen ;-)
+					continue;
+				}
+				var a = document.createElement("a");
+				a.href = "#";
+				a.el = el;
+				a.editor = this;
+				a.onclick = function() {
+					this.blur();
+					this.editor.selectNodeContents(this.el);
+					this.editor.updateToolbar(true);
+					return false;
+				};
+				a.oncontextmenu = function() {
+					// TODO: add context menu here
+					this.blur();
+					var info = "Inline style:\n\n";
+					info += this.el.style.cssText.split(/;\s*/).join(";\n");
+					alert(info);
+					return false;
+				};
+				var txt = el.tagName.toLowerCase();
+				a.title = el.style.cssText;
+				if (el.id) {
+					txt += "#" + el.id;
+				}
+				if (el.className) {
+					txt += "." + el.className;
+				}
+				a.appendChild(document.createTextNode(txt));
+				this._statusBarTree.appendChild(a);
+				if (i != 0) {
+					this._statusBarTree.appendChild(document.createTextNode(String.fromCharCode(0xbb)));
+				}
+			}
+		}
+	}
+
+	for (var i in this._toolbarObjects) {
+		var btn = this._toolbarObjects[i];
+		var cmd = i;
+		var inContext = true;
+		if (btn.context && !text) {
+			inContext = false;
+			var context = btn.context;
+			var attrs = [];
+			if (/(.*)\[(.*?)\]/.test(context)) {
+				context = RegExp.$1;
+				attrs = RegExp.$2.split(",");
+			}
+			context = context.toLowerCase();
+			var match = (context == "*");
+			for (var k = 0; k < ancestors.length; ++k) {
+				if (!ancestors[k]) {
+					// the impossible really happens.
+					continue;
+				}
+				if (match || (ancestors[k].tagName.toLowerCase() == context)) {
+					inContext = true;
+					for (var ka = 0; ka < attrs.length; ++ka) {
+						if (!eval("ancestors[k]." + attrs[ka])) {
+							inContext = false;
+							break;
+						}
+					}
+					if (inContext) {
+						break;
+					}
+				}
+			}
+		}
+		btn.state("enabled", (!text || btn.text) && inContext);
+		if (typeof cmd == "function") {
+			continue;
+		}
+		// look-it-up in the custom dropdown boxes
+		var dropdown = this.config.customSelects[cmd];
+		if ((!text || btn.text) && (typeof dropdown != "undefined")) {
+			dropdown.refresh(this);
+			continue;
+		}
+		switch (cmd) {
+		    case "fontname":
+		    case "fontsize":
+		    case "formatblock":
+			if (!text) try {
+				var value = ("" + doc.queryCommandValue(cmd)).toLowerCase();
+				if (!value) {
+					btn.element.selectedIndex = 0;
+					break;
+				}
+				// HACK -- retrieve the config option for this
+				// combo box.  We rely on the fact that the
+				// variable in config has the same name as
+				// button name in the toolbar.
+				var options = this.config[cmd];
+				var k = 0;
+				for (var j in options) {
+					// FIXME: the following line is scary.
+					if ((j.toLowerCase() == value) ||
+					    (options[j].substr(0, value.length).toLowerCase() == value)) {
+						btn.element.selectedIndex = k;
+						throw "ok";
+					}
+					++k;
+				}
+				btn.element.selectedIndex = 0;
+			} catch(e) {};
+			break;
+		    case "textindicator":
+			if (!text) {
+				try {with (btn.element.style) {
+					backgroundColor = HTMLArea._makeColor(
+						doc.queryCommandValue(HTMLArea.is_ie ? "backcolor" : "hilitecolor"));
+					if (/transparent/i.test(backgroundColor)) {
+						// Mozilla
+						backgroundColor = HTMLArea._makeColor(doc.queryCommandValue("backcolor"));
+					}
+					color = HTMLArea._makeColor(doc.queryCommandValue("forecolor"));
+					fontFamily = doc.queryCommandValue("fontname");
+					fontWeight = doc.queryCommandState("bold") ? "bold" : "normal";
+					fontStyle = doc.queryCommandState("italic") ? "italic" : "normal";
+				}} catch (e) {
+					// alert(e + "\n\n" + cmd);
+				}
+			}
+			break;
+		    case "htmlmode": btn.state("active", text); break;
+		    case "lefttoright":
+		    case "righttoleft":
+			var el = this.getParentElement();
+			while (el && !HTMLArea.isBlockElement(el))
+				el = el.parentNode;
+			if (el)
+				btn.state("active", (el.style.direction == ((cmd == "righttoleft") ? "rtl" : "ltr")));
+			break;
+		    default:
+			cmd = cmd.replace(/(un)?orderedlist/i, "insert$1orderedlist");
+			try {
+				btn.state("active", (!text && doc.queryCommandState(cmd)));
+			} catch (e) {}
+		}
+	}
+	// take undo snapshots
+	if (this._customUndo && !this._timerUndo) {
+		this._undoTakeSnapshot();
+		var editor = this;
+		this._timerUndo = setTimeout(function() {
+			editor._timerUndo = null;
+		}, this.config.undoTimeout);
+	}
+
+	// check if any plugins have registered refresh handlers
+	for (var i in this.plugins) {
+		var plugin = this.plugins[i].instance;
+		if (typeof plugin.onUpdateToolbar == "function")
+			plugin.onUpdateToolbar();
+	}
+};
+
+/** Returns a node after which we can insert other nodes, in the current
+ * selection.  The selection is removed.  It splits a text node, if needed.
+ */
+HTMLArea.prototype.insertNodeAtSelection = function(toBeInserted) {
+	if (!HTMLArea.is_ie) {
+		var sel = this._getSelection();
+		var range = this._createRange(sel);
+		// remove the current selection
+		sel.removeAllRanges();
+		range.deleteContents();
+		var node = range.startContainer;
+		var pos = range.startOffset;
+		switch (node.nodeType) {
+		    case 3: // Node.TEXT_NODE
+			// we have to split it at the caret position.
+			if (toBeInserted.nodeType == 3) {
+				// do optimized insertion
+				node.insertData(pos, toBeInserted.data);
+				range = this._createRange();
+				range.setEnd(node, pos + toBeInserted.length);
+				range.setStart(node, pos + toBeInserted.length);
+				sel.addRange(range);
+			} else {
+				node = node.splitText(pos);
+				var selnode = toBeInserted;
+				if (toBeInserted.nodeType == 11 /* Node.DOCUMENT_FRAGMENT_NODE */) {
+					selnode = selnode.firstChild;
+				}
+				node.parentNode.insertBefore(toBeInserted, node);
+				this.selectNodeContents(selnode);
+				this.updateToolbar();
+			}
+			break;
+		    case 1: // Node.ELEMENT_NODE
+			var selnode = toBeInserted;
+			if (toBeInserted.nodeType == 11 /* Node.DOCUMENT_FRAGMENT_NODE */) {
+				selnode = selnode.firstChild;
+			}
+			node.insertBefore(toBeInserted, node.childNodes[pos]);
+			this.selectNodeContents(selnode);
+			this.updateToolbar();
+			break;
+		}
+	} else {
+		return null;	// this function not yet used for IE <FIXME>
+	}
+};
+
+// Returns the deepest node that contains both endpoints of the selection.
+HTMLArea.prototype.getParentElement = function() {
+	var sel = this._getSelection();
+	var range = this._createRange(sel);
+	if (HTMLArea.is_ie) {
+		switch (sel.type) {
+		    case "Text":
+		    case "None":
+			// It seems that even for selection of type "None",
+			// there _is_ a parent element and it's value is not
+			// only correct, but very important to us.  MSIE is
+			// certainly the buggiest browser in the world and I
+			// wonder, God, how can Earth stand it?
+			return range.parentElement();
+		    case "Control":
+			return range.item(0);
+		    default:
+			return this._doc.body;
+		}
+	} else try {
+		var p = range.commonAncestorContainer;
+		if (!range.collapsed && range.startContainer == range.endContainer &&
+		    range.startOffset - range.endOffset <= 1 && range.startContainer.hasChildNodes())
+			p = range.startContainer.childNodes[range.startOffset];
+		/*
+		alert(range.startContainer + ":" + range.startOffset + "\n" +
+		      range.endContainer + ":" + range.endOffset);
+		*/
+		while (p.nodeType == 3) {
+			p = p.parentNode;
+		}
+		return p;
+	} catch (e) {
+		return null;
+	}
+};
+
+// Returns an array with all the ancestor nodes of the selection.
+HTMLArea.prototype.getAllAncestors = function() {
+	var p = this.getParentElement();
+	var a = [];
+	while (p && (p.nodeType == 1) && (p.tagName.toLowerCase() != 'body')) {
+		a.push(p);
+		p = p.parentNode;
+	}
+	a.push(this._doc.body);
+	return a;
+};
+
+// Selects the contents inside the given node
+HTMLArea.prototype.selectNodeContents = function(node, pos) {
+	this.focusEditor();
+	this.forceRedraw();
+	var range;
+	var collapsed = (typeof pos != "undefined");
+	if (HTMLArea.is_ie) {
+		range = this._doc.body.createTextRange();
+		range.moveToElementText(node);
+		(collapsed) && range.collapse(pos);
+		range.select();
+	} else {
+		var sel = this._getSelection();
+		range = this._doc.createRange();
+		range.selectNodeContents(node);
+		(collapsed) && range.collapse(pos);
+		sel.removeAllRanges();
+		sel.addRange(range);
+	}
+};
+
+/** Call this function to insert HTML code at the current position.  It deletes
+ * the selection, if any.
+ */
+HTMLArea.prototype.insertHTML = function(html) {
+	var sel = this._getSelection();
+	var range = this._createRange(sel);
+	if (HTMLArea.is_ie) {
+		range.pasteHTML(html);
+	} else {
+		// construct a new document fragment with the given HTML
+		var fragment = this._doc.createDocumentFragment();
+		var div = this._doc.createElement("div");
+		div.innerHTML = html;
+		while (div.firstChild) {
+			// the following call also removes the node from div
+			fragment.appendChild(div.firstChild);
+		}
+		// this also removes the selection
+		var node = this.insertNodeAtSelection(fragment);
+	}
+};
+
+/**
+ *  Call this function to surround the existing HTML code in the selection with
+ *  your tags.  FIXME: buggy!  This function will be deprecated "soon".
+ */
+HTMLArea.prototype.surroundHTML = function(startTag, endTag) {
+	var html = this.getSelectedHTML();
+	// the following also deletes the selection
+	this.insertHTML(startTag + html + endTag);
+};
+
+/// Retrieve the selected block
+HTMLArea.prototype.getSelectedHTML = function() {
+	var sel = this._getSelection();
+	var range = this._createRange(sel);
+	var existing = null;
+	if (HTMLArea.is_ie) {
+		existing = range.htmlText;
+	} else {
+		existing = HTMLArea.getHTML(range.cloneContents(), false, this);
+	}
+	return existing;
+};
+
+/// Return true if we have some selection
+HTMLArea.prototype.hasSelectedText = function() {
+	// FIXME: come _on_ mishoo, you can do better than this ;-)
+	return this.getSelectedHTML() != '';
+};
+
+HTMLArea.prototype._createLink = function(link) {
+	var editor = this;
+	var outparam = null;
+	if (typeof link == "undefined") {
+		link = this.getParentElement();
+		if (link) {
+			if (/^img$/i.test(link.tagName))
+				link = link.parentNode;
+			if (!/^a$/i.test(link.tagName))
+				link = null;
+		}
+	}
+	if (!link) {
+		var sel = editor._getSelection();
+		var range = editor._createRange(sel);
+		var compare = 0;
+		if (HTMLArea.is_ie) {
+			compare = range.compareEndPoints("StartToEnd", range);
+		} else {
+			compare = range.compareBoundaryPoints(range.START_TO_END, range);
+		}
+		if (compare == 0) {
+			alert("You need to select some text before creating a link");
+			return;
+		}
+		outparam = {
+			f_href : '',
+			f_title : '',
+			f_target : '',
+			f_usetarget : editor.config.makeLinkShowsTarget
+		};
+	} else
+		outparam = {
+			f_href   : HTMLArea.is_ie ? editor.stripBaseURL(link.href) : link.getAttribute("href"),
+			f_title  : link.title,
+			f_target : link.target,
+			f_usetarget : editor.config.makeLinkShowsTarget
+		};
+	this._popupDialog("link.html", function(param) {
+		if (!param)
+			return false;
+		var a = link;
+		if (!a) try {
+			editor._doc.execCommand("createlink", false, param.f_href);
+			a = editor.getParentElement();
+			var sel = editor._getSelection();
+			var range = editor._createRange(sel);
+			if (!HTMLArea.is_ie) {
+				a = range.startContainer;
+				if (!/^a$/i.test(a.tagName)) {
+					a = a.nextSibling;
+					if (a == null)
+						a = range.startContainer.parentNode;
+				}
+			}
+		} catch(e) {}
+		else {
+			var href = param.f_href.trim();
+			editor.selectNodeContents(a);
+			if (href == "") {
+				editor._doc.execCommand("unlink", false, null);
+				editor.updateToolbar();
+				return false;
+			}
+			else {
+				a.href = href;
+			}
+		}
+		if (!(a && /^a$/i.test(a.tagName)))
+			return false;
+		a.target = param.f_target.trim();
+		a.title = param.f_title.trim();
+		editor.selectNodeContents(a);
+		editor.updateToolbar();
+	}, outparam);
+};
+
+// Called when the user clicks on "InsertImage" button.  If an image is already
+// there, it will just modify it's properties.
+HTMLArea.prototype._insertImage = function(image) {
+	var editor = this;	// for nested functions
+	var outparam = null;
+	if (typeof image == "undefined") {
+		image = this.getParentElement();
+		if (image && !/^img$/i.test(image.tagName))
+			image = null;
+	}
+	if (image) outparam = {
+		f_base   : editor.config.baseURL,
+		f_url    : HTMLArea.is_ie ? editor.stripBaseURL(image.src) : image.getAttribute("src"),
+		f_alt    : image.alt,
+		f_border : image.border,
+		f_align  : image.align,
+		f_vert   : image.vspace,
+		f_horiz  : image.hspace
+	};
+	this._popupDialog("insert_image.html", function(param) {
+		if (!param) {	// user must have pressed Cancel
+			return false;
+		}
+		var img = image;
+		if (!img) {
+			var sel = editor._getSelection();
+			var range = editor._createRange(sel);
+			editor._doc.execCommand("insertimage", false, param.f_url);
+			if (HTMLArea.is_ie) {
+				img = range.parentElement();
+				// wonder if this works...
+				if (img.tagName.toLowerCase() != "img") {
+					img = img.previousSibling;
+				}
+			} else {
+				img = range.startContainer.previousSibling;
+			}
+		} else {
+			img.src = param.f_url;
+		}
+
+		for (var field in param) {
+			var value = param[field];
+			switch (field) {
+			    case "f_alt"    : img.alt	 = value; break;
+			    case "f_border" : img.border = parseInt(value || "0"); break;
+			    case "f_align"  : img.align	 = value; break;
+			    case "f_vert"   : img.vspace = parseInt(value || "0"); break;
+			    case "f_horiz"  : img.hspace = parseInt(value || "0"); break;
+			}
+		}
+	}, outparam);
+};
+
+// Called when the user clicks the Insert Table button
+HTMLArea.prototype._insertTable = function() {
+	var sel = this._getSelection();
+	var range = this._createRange(sel);
+	var editor = this;	// for nested functions
+	this._popupDialog("insert_table.html", function(param) {
+		if (!param) {	// user must have pressed Cancel
+			return false;
+		}
+		var doc = editor._doc;
+		// create the table element
+		var table = doc.createElement("table");
+		// assign the given arguments
+
+		for (var field in param) {
+			var value = param[field];
+			if (!value) {
+				continue;
+			}
+			switch (field) {
+			    case "f_width"   : table.style.width = value + param["f_unit"]; break;
+			    case "f_align"   : table.align	 = value; break;
+			    case "f_border"  : table.border	 = parseInt(value); break;
+			    case "f_spacing" : table.cellSpacing = parseInt(value); break;
+			    case "f_padding" : table.cellPadding = parseInt(value); break;
+			}
+		}
+		var cellwidth = 0;
+		if (param.f_fixed)
+			cellwidth = Math.floor(100 / parseInt(param.f_cols));
+		var tbody = doc.createElement("tbody");
+		table.appendChild(tbody);
+		for (var i = 0; i < param["f_rows"]; ++i) {
+			var tr = doc.createElement("tr");
+			tbody.appendChild(tr);
+			for (var j = 0; j < param["f_cols"]; ++j) {
+				var td = doc.createElement("td");
+				if (cellwidth)
+					td.style.width = cellwidth + "%";
+				tr.appendChild(td);
+				// Mozilla likes to see something inside the cell.
+				(HTMLArea.is_gecko) && td.appendChild(doc.createElement("br"));
+			}
+		}
+		if (HTMLArea.is_ie) {
+			range.pasteHTML(table.outerHTML);
+		} else {
+			// insert the table
+			editor.insertNodeAtSelection(table);
+		}
+		return true;
+	}, null);
+};
+
+/***************************************************
+ *  Category: EVENT HANDLERS
+ ***************************************************/
+
+// el is reference to the SELECT object
+// txt is the name of the select field, as in config.toolbar
+HTMLArea.prototype._comboSelected = function(el, txt) {
+	this.focusEditor();
+	var value = el.options[el.selectedIndex].value;
+	switch (txt) {
+	    case "fontname":
+	    case "fontsize": this.execCommand(txt, false, value); break;
+	    case "formatblock":
+		(HTMLArea.is_ie) && (value = "<" + value + ">");
+		this.execCommand(txt, false, value);
+		break;
+	    default:
+		// try to look it up in the registered dropdowns
+		var dropdown = this.config.customSelects[txt];
+		if (typeof dropdown != "undefined") {
+			dropdown.action(this);
+		} else {
+			alert("FIXME: combo box " + txt + " not implemented");
+		}
+	}
+};
+
+// the execCommand function (intercepts some commands and replaces them with
+// our own implementation)
+HTMLArea.prototype.execCommand = function(cmdID, UI, param) {
+	var editor = this;	// for nested functions
+	this.focusEditor();
+	cmdID = cmdID.toLowerCase();
+	if (HTMLArea.is_gecko) try { this._doc.execCommand('useCSS', false, true); } catch (e) {};
+	switch (cmdID) {
+	    case "htmlmode" : this.setMode(); break;
+	    case "hilitecolor":
+		(HTMLArea.is_ie) && (cmdID = "backcolor");
+	    case "forecolor":
+		this._popupDialog("select_color.html", function(color) {
+			if (color) { // selection not canceled
+				editor._doc.execCommand(cmdID, false, "#" + color);
+			}
+		}, HTMLArea._colorToRgb(this._doc.queryCommandValue(cmdID)));
+		break;
+	    case "createlink":
+		this._createLink();
+		break;
+	    case "popupeditor":
+		// this object will be passed to the newly opened window
+		HTMLArea._object = this;
+		if (HTMLArea.is_ie) {
+			//if (confirm(HTMLArea.I18N.msg["IE-sucks-full-screen"]))
+			{
+				window.open(this.popupURL("fullscreen.html"), "ha_fullscreen",
+					    "toolbar=no,location=no,directories=no,status=no,menubar=no," +
+					    "scrollbars=no,resizable=yes,width=640,height=480");
+			}
+		} else {
+			window.open(this.popupURL("fullscreen.html"), "ha_fullscreen",
+				    "toolbar=no,menubar=no,personalbar=no,width=640,height=480," +
+				    "scrollbars=no,resizable=yes");
+		}
+		break;
+	    case "undo":
+	    case "redo":
+		if (this._customUndo)
+			this[cmdID]();
+		else
+			this._doc.execCommand(cmdID, UI, param);
+		break;
+	    case "inserttable": this._insertTable(); break;
+	    case "insertimage": this._insertImage(); break;
+	    case "about"    : this._popupDialog("about.html", null, this); break;
+	    case "showhelp" : window.open(_editor_url + "reference.html", "ha_help"); break;
+
+	    case "killword": this._wordClean(); break;
+
+	    case "cut":
+	    case "copy":
+	    case "paste":
+		try {
+			this._doc.execCommand(cmdID, UI, param);
+			if (this.config.killWordOnPaste)
+				this._wordClean();
+		} catch (e) {
+			if (HTMLArea.is_gecko) {
+				if (typeof HTMLArea.I18N.msg["Moz-Clipboard"] == "undefined") {
+					HTMLArea.I18N.msg["Moz-Clipboard"] =
+						"Unprivileged scripts cannot access Cut/Copy/Paste programatically " +
+						"for security reasons.  Click OK to see a technical note at mozilla.org " +
+						"which shows you how to allow a script to access the clipboard.\n\n" +
+						"[FIXME: please translate this message in your language definition file.]";
+				}
+				if (confirm(HTMLArea.I18N.msg["Moz-Clipboard"]))
+					window.open("http://mozilla.org/editor/midasdemo/securityprefs.html");
+			}
+		}
+		break;
+	    case "lefttoright":
+	    case "righttoleft":
+		var dir = (cmdID == "righttoleft") ? "rtl" : "ltr";
+		var el = this.getParentElement();
+		while (el && !HTMLArea.isBlockElement(el))
+			el = el.parentNode;
+		if (el) {
+			if (el.style.direction == dir)
+				el.style.direction = "";
+			else
+				el.style.direction = dir;
+		}
+		break;
+	    default: try { this._doc.execCommand(cmdID, UI, param); }
+		catch(e) { if (this.config.debug) { alert(e + "\n\nby execCommand(" + cmdID + ");"); } }
+	}
+	this.updateToolbar();
+	return false;
+};
+
+/** A generic event handler for things that happen in the IFRAME's document.
+ * This function also handles key bindings. */
+HTMLArea.prototype._editorEvent = function(ev) {
+	var editor = this;
+	var keyEvent = (HTMLArea.is_ie && ev.type == "keydown") || (!HTMLArea.is_ie && ev.type == "keypress");
+
+	if (keyEvent)
+		for (var i in editor.plugins) {
+			var plugin = editor.plugins[i].instance;
+			if (typeof plugin.onKeyPress == "function")
+				if (plugin.onKeyPress(ev))
+					return false;
+		}
+	if (keyEvent && ev.ctrlKey && !ev.altKey) {
+		var sel = null;
+		var range = null;
+		var key = String.fromCharCode(HTMLArea.is_ie ? ev.keyCode : ev.charCode).toLowerCase();
+		var cmd = null;
+		var value = null;
+		switch (key) {
+		    case 'a':
+			if (!HTMLArea.is_ie) {
+				// KEY select all
+				sel = this._getSelection();
+				sel.removeAllRanges();
+				range = this._createRange();
+				range.selectNodeContents(this._doc.body);
+				sel.addRange(range);
+				HTMLArea._stopEvent(ev);
+			}
+			break;
+
+			// simple key commands follow
+
+		    case 'b': cmd = "bold"; break;
+		    case 'i': cmd = "italic"; break;
+		    case 'u': cmd = "underline"; break;
+		    case 's': cmd = "strikethrough"; break;
+		    case 'l': cmd = "justifyleft"; break;
+		    case 'e': cmd = "justifycenter"; break;
+		    case 'r': cmd = "justifyright"; break;
+		    case 'j': cmd = "justifyfull"; break;
+		    case 'z': cmd = "undo"; break;
+		    case 'y': cmd = "redo"; break;
+		    case 'v': if (HTMLArea.is_ie || editor.config.htmlareaPaste) { cmd = "paste"; } break;
+		    case 'n': cmd = "formatblock"; value = HTMLArea.is_ie ? "<p>" : "p"; break;
+
+		    case '0': cmd = "killword"; break;
+
+			// headings
+		    case '1':
+		    case '2':
+		    case '3':
+		    case '4':
+		    case '5':
+		    case '6':
+			cmd = "formatblock";
+			value = "h" + key;
+			if (HTMLArea.is_ie)
+				value = "<" + value + ">";
+			break;
+		}
+		if (cmd) {
+			// execute simple command
+			this.execCommand(cmd, false, value);
+			HTMLArea._stopEvent(ev);
+		}
+	}
+	else if (keyEvent) {
+		// other keys here
+		switch (ev.keyCode) {
+		    case 13: // KEY enter
+			if (HTMLArea.is_gecko && !ev.shiftKey) {
+				this.dom_checkInsertP();
+				HTMLArea._stopEvent(ev);
+			}
+			break;
+		    case 8: // KEY backspace
+		    case 46: // KEY delete
+			if (HTMLArea.is_gecko && !ev.shiftKey) {
+				if (this.dom_checkBackspace())
+					HTMLArea._stopEvent(ev);
+			} else if (HTMLArea.is_ie) {
+				if (this.ie_checkBackspace())
+					HTMLArea._stopEvent(ev);
+			}
+			break;
+		}
+	}
+
+	// update the toolbar state after some time
+	if (editor._timerToolbar) {
+		clearTimeout(editor._timerToolbar);
+	}
+	editor._timerToolbar = setTimeout(function() {
+		editor.updateToolbar();
+		editor._timerToolbar = null;
+	}, 50);
+};
+
+HTMLArea.prototype.scrollToCaret = function() {
+	var
+		e = this.getParentElement(),
+		w = this._iframe.contentWindow,
+		h = w.innerHeight || w.height,
+		d = this._doc,
+		t = d.documentElement.scrollTop || d.body.scrollTop;
+	if (typeof h == "undefined")
+		return false;
+	if (e.offsetTop > h + t)
+		w.scrollTo(e.offsetLeft, e.offsetTop - h + e.offsetHeight);
+};
+
+HTMLArea.prototype.convertNode = function(el, newTagName) {
+	var newel = this._doc.createElement(newTagName), p = el.parentNode;
+	while (el.firstChild)
+		newel.appendChild(el.firstChild);
+	p.insertBefore(newel, el);
+	p.removeChild(el);
+	return newel;
+};
+
+HTMLArea.prototype.ie_checkBackspace = function() {
+	var sel = this._getSelection();
+	var range = this._createRange(sel);
+	var r2 = range.duplicate();
+	r2.moveStart("character", -1);
+	var a = r2.parentElement();
+	if (a != range.parentElement() &&
+	    /^a$/i.test(a.tagName)) {
+		r2.collapse(true);
+		r2.moveEnd("character", 1);
+		r2.pasteHTML('');
+		r2.select();
+		return true;
+	}
+};
+
+HTMLArea.prototype.dom_checkBackspace = function() {
+	var self = this;
+	setTimeout(function() {
+		var sel = self._getSelection();
+		var range = self._createRange(sel);
+		var SC = range.startContainer;
+		var SO = range.startOffset;
+		var EC = range.endContainer;
+		var EO = range.endOffset;
+		var newr = SC.nextSibling;
+		if (SC.nodeType == 3)
+			SC = SC.parentNode;
+		if (!/\S/.test(SC.tagName)) {
+			var p = document.createElement("p");
+			while (SC.firstChild)
+				p.appendChild(SC.firstChild);
+			SC.parentNode.insertBefore(p, SC);
+			SC.parentNode.removeChild(SC);
+			var r = range.cloneRange();
+			r.setStartBefore(newr);
+			r.setEndAfter(newr);
+			r.extractContents();
+			sel.removeAllRanges();
+			sel.addRange(r);
+		}
+	}, 10);
+};
+
+HTMLArea.prototype.dom_checkInsertP = function() {
+	var i, SC, left, right, r2,
+		sel   = this._getSelection(),
+		r     = this._createRange(sel),
+		p     = this.getAllAncestors(),
+		block = null,
+		doc   = this._doc,
+		body  = doc.body;
+
+	for (i = 0; i < p.length; ++i)
+		if (HTMLArea.isBlockElement(p[i]) && !/body|html/i.test(p[i].tagName)) {
+			block = p[i];
+			break;
+		}
+
+	if (!r.collapsed)
+		r.deleteContents();
+	sel.removeAllRanges();
+	SC = r.startContainer;
+
+	if (!block) {
+		left = SC;
+		for (i = SC; i && i != body && !HTMLArea.isBlockElement(i); i = HTMLArea.getPrevNode(i))
+			left = i;
+		right = SC;
+		for (i = SC; i && i != body && !HTMLArea.isBlockElement(i); i = HTMLArea.getNextNode(i))
+			right = i;
+		if (left != body && right != body) {
+			r2 = r.cloneRange();
+			r2.setStartBefore(left);
+			r2.surroundContents(block = doc.createElement("p"));
+			if (!/\S/.test(HTMLArea.getInnerText(block)))
+				block.innerHTML = "<br />";
+			block.normalize();
+			r.setEndAfter(right);
+			r.surroundContents(block = doc.createElement("p"));
+			if (!/\S/.test(HTMLArea.getInnerText(block)))
+				block.innerHTML = "<br />";
+			block.normalize();
+		} else {
+			r = doc.createRange();
+			r.setStart(body, 0);
+			r.setEnd(body, 0);
+			r.insertNode(block = doc.createElement("p"));
+			block.innerHTML = "<br />";
+		}
+		r.selectNodeContents(block);
+	} else {
+		r.setEndAfter(block);
+		var df = r.extractContents(), left_empty = false;
+		if (!/\S/.test(block.innerHTML)) {
+			block.innerHTML = "<br />";
+			left_empty = true;
+		}
+		p = df.firstChild;
+		if (p) {
+			if (!/\S/.test(HTMLArea.getInnerText(p))) {
+ 				if (/^h[1-6]$/i.test(p.tagName))
+ 					p = this.convertNode(p, "p");
+				p.innerHTML = "<br />";
+			}
+			if (/^li$/i.test(p.tagName) && left_empty && !block.nextSibling) {
+				left = block.parentNode;
+				left.removeChild(block);
+				r.setEndAfter(left);
+				r.collapse(false);
+				p = this.convertNode(p, /^[uo]l$/i.test(left.parentNode.tagName) ? "li" : "p");
+			}
+			r.insertNode(df);
+			r.selectNodeContents(p);
+		}
+	}
+	r.collapse(true);
+	sel.addRange(r);
+	this.forceRedraw();
+	this.scrollToCaret();
+};
+
+// retrieve the HTML
+HTMLArea.prototype.getHTML = function() {
+	switch (this._editMode) {
+	    case "wysiwyg"  :
+		if (!this.config.fullPage) {
+			return HTMLArea.getHTML(this._doc.body, false, this);
+		} else
+			return this.doctype + "\n" + HTMLArea.getHTML(this._doc.documentElement, true, this);
+	    case "textmode" : return this._textArea.value;
+	    default	    : alert("Mode <" + mode + "> not defined!");
+	}
+	return false;
+};
+
+// retrieve the HTML (fastest version, but uses innerHTML)
+HTMLArea.prototype.getInnerHTML = function() {
+	switch (this._editMode) {
+	    case "wysiwyg"  :
+		if (!this.config.fullPage)
+			return this._doc.body.innerHTML;
+		else
+			return this.doctype + "\n" + this._doc.documentElement.innerHTML;
+	    case "textmode" : return this._textArea.value;
+	    default	    : alert("Mode <" + mode + "> not defined!");
+	}
+	return false;
+};
+
+// completely change the HTML inside
+HTMLArea.prototype.setHTML = function(html) {
+	switch (this._editMode) {
+	    case "wysiwyg"  :
+		if (!this.config.fullPage)
+			this._doc.body.innerHTML = html;
+		else
+			// this._doc.documentElement.innerHTML = html;
+			this._doc.body.innerHTML = html;
+		break;
+	    case "textmode" : this._textArea.value = html; break;
+	    default	    : alert("Mode <" + mode + "> not defined!");
+	}
+	return false;
+};
+
+// sets the given doctype (useful when config.fullPage is true)
+HTMLArea.prototype.setDoctype = function(doctype) {
+	this.doctype = doctype;
+};
+
+/***************************************************
+ *  Category: UTILITY FUNCTIONS
+ ***************************************************/
+
+// variable used to pass the object to the popup editor window.
+HTMLArea._object = null;
+
+// function that returns a clone of the given object
+HTMLArea.cloneObject = function(obj) {
+	if (!obj) return null;
+	var newObj = new Object;
+
+	// check for array objects
+	if (obj.constructor.toString().indexOf("function Array(") == 1) {
+		newObj = obj.constructor();
+	}
+
+	// check for function objects (as usual, IE is fucked up)
+	if (obj.constructor.toString().indexOf("function Function(") == 1) {
+		newObj = obj; // just copy reference to it
+	} else for (var n in obj) {
+		var node = obj[n];
+		if (typeof node == 'object') { newObj[n] = HTMLArea.cloneObject(node); }
+		else                         { newObj[n] = node; }
+	}
+
+	return newObj;
+};
+
+// FIXME!!! this should return false for IE < 5.5
+HTMLArea.checkSupportedBrowser = function() {
+	if (HTMLArea.is_gecko) {
+		if (navigator.productSub < 20021201) {
+			alert("You need at least Mozilla-1.3 Alpha.\n" +
+			      "Sorry, your Gecko is not supported.");
+			return false;
+		}
+		if (navigator.productSub < 20030210) {
+			alert("Mozilla < 1.3 Beta is not supported!\n" +
+			      "I'll try, though, but it might not work.");
+		}
+	}
+	return HTMLArea.is_gecko || HTMLArea.is_ie;
+};
+
+// selection & ranges
+
+// returns the current selection object
+HTMLArea.prototype._getSelection = function() {
+	if (HTMLArea.is_ie) {
+		return this._doc.selection;
+	} else {
+		return this._iframe.contentWindow.getSelection();
+	}
+};
+
+// returns a range for the current selection
+HTMLArea.prototype._createRange = function(sel) {
+	if (HTMLArea.is_ie) {
+		return sel.createRange();
+	} else {
+		this.focusEditor();
+		if (typeof sel != "undefined") {
+			try {
+				return sel.getRangeAt(0);
+			} catch(e) {
+				return this._doc.createRange();
+			}
+		} else {
+			return this._doc.createRange();
+		}
+	}
+};
+
+// event handling
+
+HTMLArea._addEvent = function(el, evname, func) {
+	if (HTMLArea.is_ie) {
+		el.attachEvent("on" + evname, func);
+	} else {
+		el.addEventListener(evname, func, true);
+	}
+};
+
+HTMLArea._addEvents = function(el, evs, func) {
+	for (var i = evs.length; --i >= 0;) {
+		HTMLArea._addEvent(el, evs[i], func);
+	}
+};
+
+HTMLArea._removeEvent = function(el, evname, func) {
+	if (HTMLArea.is_ie) {
+		el.detachEvent("on" + evname, func);
+	} else {
+		el.removeEventListener(evname, func, true);
+	}
+};
+
+HTMLArea._removeEvents = function(el, evs, func) {
+	for (var i = evs.length; --i >= 0;) {
+		HTMLArea._removeEvent(el, evs[i], func);
+	}
+};
+
+HTMLArea._stopEvent = function(ev) {
+	if (HTMLArea.is_ie) {
+		ev.cancelBubble = true;
+		ev.returnValue = false;
+	} else {
+		ev.preventDefault();
+		ev.stopPropagation();
+	}
+};
+
+HTMLArea._removeClass = function(el, className) {
+	if (!(el && el.className)) {
+		return;
+	}
+	var cls = el.className.split(" ");
+	var ar = new Array();
+	for (var i = cls.length; i > 0;) {
+		if (cls[--i] != className) {
+			ar[ar.length] = cls[i];
+		}
+	}
+	el.className = ar.join(" ");
+};
+
+HTMLArea._addClass = function(el, className) {
+	// remove the class first, if already there
+	HTMLArea._removeClass(el, className);
+	el.className += " " + className;
+};
+
+HTMLArea._hasClass = function(el, className) {
+	if (!(el && el.className)) {
+		return false;
+	}
+	var cls = el.className.split(" ");
+	for (var i = cls.length; i > 0;) {
+		if (cls[--i] == className) {
+			return true;
+		}
+	}
+	return false;
+};
+
+HTMLArea._blockTags = " body form textarea fieldset ul ol dl li div " +
+"p h1 h2 h3 h4 h5 h6 quote pre table thead " +
+"tbody tfoot tr td iframe address ";
+HTMLArea.isBlockElement = function(el) {
+	return el && el.nodeType == 1 && (HTMLArea._blockTags.indexOf(" " + el.tagName.toLowerCase() + " ") != -1);
+};
+
+HTMLArea._closingTags = " head script style div span tr td tbody table em strong b i code cite dfn abbr acronym font a title ";
+HTMLArea.needsClosingTag = function(el) {
+	return el && el.nodeType == 1 && (HTMLArea._closingTags.indexOf(" " + el.tagName.toLowerCase() + " ") != -1);
+};
+
+// performs HTML encoding of some given string
+HTMLArea.htmlEncode = function(str) {
+	// we don't need regexp for that, but.. so be it for now.
+	str = str.replace(/&/ig, "&amp;");
+	str = str.replace(/</ig, "&lt;");
+	str = str.replace(/>/ig, "&gt;");
+
+    // -------------------------------------------------------------
+    // PLOG HTMLAREA TWEAK
+    // Changed by: Mark Wu
+    // Date: 2005/02/05
+    // Purpose: Fix the multi-spaces converted to ASCII(160) errors. 
+    //          We need to convert them back to space ASCII(32) again.
+    // -------------------------------------------------------------
+	str = str.replace(/\xA0/g, " ");
+    // -------------------------------------------------------------	
+	
+	str = str.replace(/\x22/ig, "&quot;");
+	// \x22 means '"' -- we use hex reprezentation so that we don't disturb
+	// JS compressors (well, at least mine fails.. ;)
+	return str;
+};
+
+// Retrieves the HTML code from the given node.	 This is a replacement for
+// getting innerHTML, using standard DOM calls.
+// Wrapper catch a Mozilla-Exception with non well formed html source code
+HTMLArea.getHTML = function(root, outputRoot, editor){
+    try{
+        return HTMLArea.getHTMLWrapper(root,outputRoot,editor);
+    }
+    catch(e){
+        alert('Your Document is not well formed. Check JavaScript console for details.');
+        return editor._iframe.contentWindow.document.body.innerHTML;
+    }
+}
+
+HTMLArea.getHTMLWrapper = function(root, outputRoot, editor) {
+	var html = "";
+	switch (root.nodeType) {
+	    case 1: // Node.ELEMENT_NODE
+	    case 11: // Node.DOCUMENT_FRAGMENT_NODE
+		var closed;
+		var i;
+		var root_tag = (root.nodeType == 1) ? root.tagName.toLowerCase() : '';
+		if (root_tag == 'br' && !root.nextSibling)
+			break;
+		if (outputRoot)
+			outputRoot = !(editor.config.htmlRemoveTags && editor.config.htmlRemoveTags.test(root_tag));
+		if (HTMLArea.is_ie && root_tag == "head") {
+			if (outputRoot)
+				html += "<head>";
+			// lowercasize
+			var save_multiline = RegExp.multiline;
+			RegExp.multiline = true;
+			var txt = root.innerHTML.replace(HTMLArea.RE_tagName, function(str, p1, p2) {
+				return p1 + p2.toLowerCase();
+			});
+			RegExp.multiline = save_multiline;
+			html += txt;
+			if (outputRoot)
+				html += "</head>";
+			break;
+		} else if (outputRoot) {
+			closed = (!(root.hasChildNodes() || HTMLArea.needsClosingTag(root)));
+			html = "<" + root.tagName.toLowerCase();
+			var attrs = root.attributes;
+			for (i = 0; i < attrs.length; ++i) {
+				var a = attrs.item(i);
+				if (!a.specified) {
+					continue;
+				}
+				var name = a.nodeName.toLowerCase();
+				if (/_moz_editor_bogus_node/.test(name)) {
+					html = "";
+					break;
+				}
+				if (/_moz|contenteditable|_msh/.test(name)) {
+					// avoid certain attributes
+					continue;
+				}
+				var value;
+				if (name != "style") {
+					// IE5.5 reports 25 when cellSpacing is
+					// 1; other values might be doomed too.
+					// For this reason we extract the
+					// values directly from the root node.
+					// I'm starting to HATE JavaScript
+					// development.  Browser differences
+					// suck.
+					//
+					// Using Gecko the values of href and src are converted to absolute links
+					// unless we get them using nodeValue()
+					if (typeof root[a.nodeName] != "undefined" && name != "href" && name != "src" && !/^on/.test(name)) {
+						value = root[a.nodeName];
+					} else {
+						value = a.nodeValue;
+						// IE seems not willing to return the original values - it converts to absolute
+						// links using a.nodeValue, a.value, a.stringValue, root.getAttribute("href")
+						// So we have to strip the baseurl manually :-/
+						if (HTMLArea.is_ie && (name == "href" || name == "src")) {
+							value = editor.stripBaseURL(value);
+						}
+					}
+				} else { // IE fails to put style in attributes list
+					// FIXME: cssText reported by IE is UPPERCASE
+					value = root.style.cssText;
+				}
+				if (/(_moz|^$)/.test(value)) {
+					// Mozilla reports some special tags
+					// here; we don't need them.
+					continue;
+				}
+				html += " " + name + '="' + value + '"';
+			}
+			if (html != "") {
+				html += closed ? " />" : ">";
+			}
+		}
+		for (i = root.firstChild; i; i = i.nextSibling) {
+			html += HTMLArea.getHTMLWrapper(i, true, editor);
+		}
+		if (outputRoot && !closed) {
+			html += "</" + root.tagName.toLowerCase() + ">";
+		}
+		break;
+	    case 3: // Node.TEXT_NODE
+		// If a text node is alone in an element and all spaces, replace it with an non breaking one
+		// This partially undoes the damage done by moz, which translates '&nbsp;'s into spaces in the data element
+		/* if ( !root.previousSibling && !root.nextSibling && root.data.match(/^\s*$/i) ) html = '&nbsp;';
+		   else */
+		html = /^script|style$/i.test(root.parentNode.tagName) ? root.data : HTMLArea.htmlEncode(root.data);
+		break;
+	    case 4: // Node.CDATA_SECTION_NODE
+		// FIXME: it seems we never get here, but I believe we should..
+		//        maybe a browser problem?--CDATA sections are converted to plain text nodes and normalized
+		// CDATA sections should go "as is" without further encoding
+		html = "<![CDATA[" + root.data + "]]>";
+		break;
+	    case 8: // Node.COMMENT_NODE
+		html = "<!--" + root.data + "-->";
+		break;		// skip comments, for now.
+	}
+	return html;
+};
+
+HTMLArea.getPrevNode = function(node) {
+	if (!node)                return null;
+	if (node.previousSibling) return node.previousSibling;
+	if (node.parentNode)      return node.parentNode;
+	return null;
+};
+
+HTMLArea.getNextNode = function(node) {
+	if (!node)            return null;
+	if (node.nextSibling) return node.nextSibling;
+	if (node.parentNode)  return node.parentNode;
+	return null;
+};
+
+HTMLArea.prototype.stripBaseURL = function(string) {
+	var baseurl = this.config.baseURL;
+
+	// strip to last directory in case baseurl points to a file
+	baseurl = baseurl.replace(/[^\/]+$/, '');
+	var basere = new RegExp(baseurl);
+	string = string.replace(basere, "");
+
+	// strip host-part of URL which is added by MSIE to links relative to server root
+	baseurl = baseurl.replace(/^(https?:\/\/[^\/]+)(.*)$/, '$1');
+	basere = new RegExp(baseurl);
+	return string.replace(basere, "");
+};
+
+String.prototype.trim = function() {
+	return this.replace(/^\s+/, '').replace(/\s+$/, '');
+};
+
+// creates a rgb-style color from a number
+HTMLArea._makeColor = function(v) {
+	if (typeof v != "number") {
+		// already in rgb (hopefully); IE doesn't get here.
+		return v;
+	}
+	// IE sends number; convert to rgb.
+	var r = v & 0xFF;
+	var g = (v >> 8) & 0xFF;
+	var b = (v >> 16) & 0xFF;
+	return "rgb(" + r + "," + g + "," + b + ")";
+};
+
+// returns hexadecimal color representation from a number or a rgb-style color.
+HTMLArea._colorToRgb = function(v) {
+	if (!v)
+		return '';
+
+	// returns the hex representation of one byte (2 digits)
+	function hex(d) {
+		return (d < 16) ? ("0" + d.toString(16)) : d.toString(16);
+	};
+
+	if (typeof v == "number") {
+		// we're talking to IE here
+		var r = v & 0xFF;
+		var g = (v >> 8) & 0xFF;
+		var b = (v >> 16) & 0xFF;
+		return "#" + hex(r) + hex(g) + hex(b);
+	}
+
+	if (v.substr(0, 3) == "rgb") {
+		// in rgb(...) form -- Mozilla
+		var re = /rgb\s*\(\s*([0-9]+)\s*,\s*([0-9]+)\s*,\s*([0-9]+)\s*\)/;
+		if (v.match(re)) {
+			var r = parseInt(RegExp.$1);
+			var g = parseInt(RegExp.$2);
+			var b = parseInt(RegExp.$3);
+			return "#" + hex(r) + hex(g) + hex(b);
+		}
+		// doesn't match RE?!  maybe uses percentages or float numbers
+		// -- FIXME: not yet implemented.
+		return null;
+	}
+
+	if (v.substr(0, 1) == "#") {
+		// already hex rgb (hopefully :D )
+		return v;
+	}
+
+	// if everything else fails ;)
+	return null;
+};
+
+// modal dialogs for Mozilla (for IE we're using the showModalDialog() call).
+
+// receives an URL to the popup dialog and a function that receives one value;
+// this function will get called after the dialog is closed, with the return
+// value of the dialog.
+HTMLArea.prototype._popupDialog = function(url, action, init) {
+	Dialog(this.popupURL(url), action, init);
+};
+
+// paths
+
+HTMLArea.prototype.imgURL = function(file, plugin) {
+	if (typeof plugin == "undefined")
+		return _editor_url + file;
+	else
+		return _editor_url + "plugins/" + plugin + "/img/" + file;
+};
+
+HTMLArea.prototype.popupURL = function(file) {
+	var url = "";
+	if (file.match(/^plugin:\/\/(.*?)\/(.*)/)) {
+		var plugin = RegExp.$1;
+		var popup = RegExp.$2;
+		if (!/\.html$/.test(popup))
+			popup += ".html";
+		url = _editor_url + "plugins/" + plugin + "/popups/" + popup;
+	} else
+		url = _editor_url + this.config.popupURL + file;
+	return url;
+};
+
+/**
+ * FIX: Internet Explorer returns an item having the _name_ equal to the given
+ * id, even if it's not having any id.  This way it can return a different form
+ * field even if it's not a textarea.  This workarounds the problem by
+ * specifically looking to search only elements having a certain tag name.
+ */
+HTMLArea.getElementById = function(tag, id) {
+	var el, i, objs = document.getElementsByTagName(tag);
+	for (i = objs.length; --i >= 0 && (el = objs[i]);)
+		if (el.id == id)
+			return el;
+	return null;
+};
+
+// -------------------------------------------------------------
+// PLOG HTMLAREA TWEAK
+// Added by: Mark Wu
+// Original by: einSTein
+// Date: 2005/02/05
+// Purpose: Add a CR/LF after some HTML Tag
+// Come From: http://www.htmlarea.com/forum/htmlArea_3_(beta)_C4/htmlArea_v3.0_-_Beta_Release_F14/html_output_is_one_*really*_long_line!_P17404/
+// -------------------------------------------------------------
+function insertCRLF( txt ) { 
+ 
+    txt = txt.replace(/<br \/>([^\n])/g,"<br \/>\n$1"); 
+    txt = txt.replace(/<tr>([^\n])/g,"<tr>\n$1"); 
+    txt = txt.replace(/<\/h1>([^\n])/g,"<\/h1>\n$1"); 
+    txt = txt.replace(/<\/h2>([^\n])/g,"<\/h2>\n$1"); 
+    txt = txt.replace(/<\/h3>([^\n])/g,"<\/h3>\n$1"); 
+    txt = txt.replace(/<\/h4>([^\n])/g,"<\/h4>\n$1"); 
+    txt = txt.replace(/<\/h5>([^\n])/g,"<\/h5>\n$1"); 
+    txt = txt.replace(/<\/h6>([^\n])/g,"<\/h6>\n$1"); 
+    txt = txt.replace(/<\/tr>([^\n])/g,"<\/tr>\n$1"); 
+    txt = txt.replace(/<td>([^\n])/g,"<td>\n$1"); 
+    txt = txt.replace(/<\/td>([^\n])/g,"<\/td>\n$1"); 
+    txt = txt.replace(/<\/li>([^\n])/g,"<\/li>\n$1"); 
+    txt = txt.replace(/<\/p>([^\n])/g,"<\/p>\n$1"); 
+    txt = txt.replace(/<p \/>([^\n])/g,"<p \/>\n$1"); 
+
+    return txt; 
+};
+// -------------------------------------------------------------
+
+// EOF
+// Local variables: //
+// c-basic-offset:8 //
+// indent-tabs-mode:t //
+// End: //

Modified: plog/trunk/js/htmlarea/images/ed_delete.gif
===================================================================
(Binary files differ)

Added: plog/trunk/js/htmlarea/images/ed_killword.gif
===================================================================
(Binary files differ)


Property changes on: plog/trunk/js/htmlarea/images/ed_killword.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Modified: plog/trunk/js/htmlarea/images/ed_link.gif
===================================================================
(Binary files differ)

Added: plog/trunk/js/htmlarea/images/ed_print.gif
===================================================================
(Binary files differ)


Property changes on: plog/trunk/js/htmlarea/images/ed_print.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: plog/trunk/js/htmlarea/images/ed_rmformat.gif
===================================================================
(Binary files differ)


Property changes on: plog/trunk/js/htmlarea/images/ed_rmformat.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Modified: plog/trunk/js/htmlarea/images/insert_table.gif
===================================================================
(Binary files differ)

Modified: plog/trunk/js/htmlarea/lang/b5.js
===================================================================
--- plog/trunk/js/htmlarea/lang/b5.js	2005-02-05 13:57:52 UTC (rev 948)
+++ plog/trunk/js/htmlarea/lang/b5.js	2005-02-05 15:29:38 UTC (rev 949)
@@ -1,36 +1,36 @@
-// I18N constants -- Chinese Big-5
-// by Dave Lo -- dlo at interactivetools.com
-HTMLArea.I18N = {
-
-	// the following should be the filename without .js extension
-	// it will be used for automatically load plugin language.
-	lang: "b5",
-
-	tooltips: {
-		bold:           "²ÊÅé",
-		italic:         "±×Åé",
-		underline:      "©³½u",
-		strikethrough:  "§R°£½u",
-		subscript:      "¤U¼Ð",
-		superscript:    "¤W¼Ð",
-		justifyleft:    "¦ì¸m¾a¥ª",
-		justifycenter:  "¦ì¸m©~¤¤",
-		justifyright:   "¦ì¸m¾a¥k",
-		justifyfull:    "¦ì¸m¥ª¥k¥­µ¥",
-		orderedlist:    "¶¶§Ç²M³æ",
-		unorderedlist:  "µL§Ç²M³æ",
-		outdent:        "´î¤p¦æ«eªÅ¥Õ",
-		indent:         "¥[¼e¦æ«eªÅ¥Õ",
-		forecolor:      "¤å¦rÃC¦â",
-		backcolor:      "­I´ºÃC¦â",
-		horizontalrule: "¤ô¥­½u",
-		createlink:     "´¡¤J³sµ²",
-		insertimage:    "´¡¤J¹Ï§Î",
-		inserttable:    "´¡¤Jªí®æ",
-		htmlmode:       "¤Á´«HTML­ì©l½X",
-		popupeditor:    "©ñ¤j",
-		about:          "Ãö©ó HTMLArea",
-		help:           "»¡©ú",
-		textindicator:  "¦rÅé¨Ò¤l"
-	}
-};
+// I18N constants -- Chinese Big-5
+// by Dave Lo -- dlo at interactivetools.com
+HTMLArea.I18N = {
+
+	// the following should be the filename without .js extension
+	// it will be used for automatically load plugin language.
+	lang: "b5",
+
+	tooltips: {
+		bold:           "²ÊÅé",
+		italic:         "±×Åé",
+		underline:      "©³½u",
+		strikethrough:  "§R°£½u",
+		subscript:      "¤U¼Ð",
+		superscript:    "¤W¼Ð",
+		justifyleft:    "¦ì¸m¾a¥ª",
+		justifycenter:  "¦ì¸m©~¤¤",
+		justifyright:   "¦ì¸m¾a¥k",
+		justifyfull:    "¦ì¸m¥ª¥k¥­µ¥",
+		orderedlist:    "¶¶§Ç²M³æ",
+		unorderedlist:  "µL§Ç²M³æ",
+		outdent:        "´î¤p¦æ«eªÅ¥Õ",
+		indent:         "¥[¼e¦æ«eªÅ¥Õ",
+		forecolor:      "¤å¦rÃC¦â",
+		backcolor:      "­I´ºÃC¦â",
+		horizontalrule: "¤ô¥­½u",
+		createlink:     "´¡¤J³sµ²",
+		insertimage:    "´¡¤J¹Ï§Î",
+		inserttable:    "´¡¤Jªí®æ",
+		htmlmode:       "¤Á´«HTML­ì©l½X",
+		popupeditor:    "©ñ¤j",
+		about:          "Ãö©ó HTMLArea",
+		help:           "»¡©ú",
+		textindicator:  "¦rÅé¨Ò¤l"
+	}
+};

Added: plog/trunk/js/htmlarea/lang/ch.js
===================================================================
--- plog/trunk/js/htmlarea/lang/ch.js	2005-02-05 13:57:52 UTC (rev 948)
+++ plog/trunk/js/htmlarea/lang/ch.js	2005-02-05 15:29:38 UTC (rev 949)
@@ -0,0 +1,83 @@
+// I18N constants
+
+// LANG: "ch", ENCODING: UTF-8
+// Samuel Stone, http://stonemicro.com/
+
+HTMLArea.I18N = {
+
+	// the following should be the filename without .js extension
+	// it will be used for automatically load plugin language.
+	lang: "ch",
+
+	tooltips: {
+		bold:           "ç²—é«”",
+		italic:         "斜體",
+		underline:      "底線",
+		strikethrough:  "刪線",
+		subscript:      "下標",
+		superscript:    "上標",
+		justifyleft:    "靠左",
+		justifycenter:  "居中",
+		justifyright:   "靠右",
+		justifyfull:    "整齊",
+		orderedlist:    "順序清單",
+		unorderedlist:  "無序清單",
+		outdent:        "伸排",
+		indent:         "縮排",
+		forecolor:      "文字顏色",
+		backcolor:      "背景顏色",
+		horizontalrule: "水平線",
+		createlink:     "插入連結",
+		insertimage:    "插入圖像",
+		inserttable:    "插入表格",
+		htmlmode:       "切換HTML原始碼",
+		popupeditor:    "伸出編輯系統",
+		about:          "關於 HTMLArea",
+		help:           "說明",
+		textindicator:  "字體例子",
+		undo:           "回原",
+		redo:           "重来",
+		cut:            "剪制选项",
+		copy:           "复制选项",
+		paste:          "贴上",
+		lefttoright:    "从左到右",
+		righttoleft:    "从右到左"
+	},
+
+	buttons: {
+		"ok":           "好",
+		"cancel":       "取消"
+	},
+
+	msg: {
+		"Path":         "途徑",
+		"TEXT_MODE":    "你在用純字編輯方式.  用 [<>] 按鈕轉回 所見即所得 編輯方式.",
+
+		"IE-sucks-full-screen" :
+		// translate here
+		"整頁式在Internet Explorer 上常出問題, " +
+		"因為這是 Internet Explorer 的無名問題,我們無法解決。" +
+		"你可能看見一些垃圾,或遇到其他問題。" +
+		"我們已警告了你. 如果要轉到 正頁式 請按 好.",
+
+		"Moz-Clipboard" :
+		"Unprivileged scripts cannot access Cut/Copy/Paste programatically " +
+		"for security reasons.  Click OK to see a technical note at mozilla.org " +
+		"which shows you how to allow a script to access the clipboard."
+	},
+
+	dialogs: {
+		"Cancel"                                            : "取消",
+		"Insert/Modify Link"                                : "插入/改寫連結",
+		"New window (_blank)"                               : "新窗户(_blank)",
+		"None (use implicit)"                               : "ç„¡(use implicit)",
+		"OK"                                                : "好",
+		"Other"                                             : "其他",
+		"Same frame (_self)"                                : "本匡 (_self)",
+		"Target:"                                           : "目標匡:",
+		"Title (tooltip):"                                  : "主題 (tooltip):",
+		"Top frame (_top)"                                  : "上匡 (_top)",
+		"URL:"                                              : "網址:",
+		"You must enter the URL where this link points to"  : "你必須輸入你要连结的網址"
+	}
+};

Modified: plog/trunk/js/htmlarea/lang/cz.js
===================================================================
--- plog/trunk/js/htmlarea/lang/cz.js	2005-02-05 13:57:52 UTC (rev 948)
+++ plog/trunk/js/htmlarea/lang/cz.js	2005-02-05 15:29:38 UTC (rev 949)
@@ -1,63 +1,63 @@
-// I18N constants
-
-// LANG: "cz", ENCODING: UTF-8 | ISO-8859-2
-// Author: Jiri Löw, <jirilow at 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.)
-
-HTMLArea.I18N = {
-
-	// the following should be the filename without .js extension
-	// it will be used for automatically load plugin language.
-	lang: "cz",
-
-	tooltips: {
-		bold:           "Tučně",
-		italic:         "Kurzíva",
-		underline:      "Podtržení",
-		strikethrough:  "Přeškrtnutí",
-		subscript:      "Dolní index",
-		superscript:    "Horní index",
-		justifyleft:    "Zarovnat doleva",
-		justifycenter:  "Na střed",
-		justifyright:   "Zarovnat doprava",
-		justifyfull:    "Zarovnat do stran",
-		orderedlist:    "Seznam",
-		unorderedlist:  "Odrážky",
-		outdent:        "Předsadit",
-		indent:         "Odsadit",
-		forecolor:      "Barva písma",
-		hilitecolor:    "Barva pozadí",
-		horizontalrule: "Vodorovná čára",
-		createlink:     "Vložit odkaz",
-		insertimage:    "Vložit obrázek",
-		inserttable:    "Vložit tabulku",
-		htmlmode:       "Přepnout HTML",
-		popupeditor:    "Nové okno editoru",
-		about:          "O této aplikaci",
-		showhelp:       "Nápověda aplikace",
-		textindicator:  "Zvolený styl",
-		undo:           "Vrátí poslední akci",
-		redo:           "Opakuje poslední akci",
-		cut:            "Vyjmout",
-		copy:           "Kopírovat",
-		paste:          "Vložit"
-	},
-
-	buttons: {
-		"ok":           "OK",
-		"cancel":       "Zrušit"
-	},
-
-	msg: {
-		"Path":         "Cesta",
-		"TEXT_MODE":    "Jste v TEXTOVÉM REŽIMU.  Použijte tlačítko [<>] pro přepnutí do WYSIWIG."
-	}
-};
+// I18N constants
+
+// LANG: "cz", ENCODING: UTF-8 | ISO-8859-2
+// Author: Jiri Löw, <jirilow at 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.)
+
+HTMLArea.I18N = {
+
+	// the following should be the filename without .js extension
+	// it will be used for automatically load plugin language.
+	lang: "cz",
+
+	tooltips: {
+		bold:           "Tučně",
+		italic:         "Kurzíva",
+		underline:      "Podtržení",
+		strikethrough:  "Přeškrtnutí",
+		subscript:      "Dolní index",
+		superscript:    "Horní index",
+		justifyleft:    "Zarovnat doleva",
+		justifycenter:  "Na střed",
+		justifyright:   "Zarovnat doprava",
+		justifyfull:    "Zarovnat do stran",
+		orderedlist:    "Seznam",
+		unorderedlist:  "Odrážky",
+		outdent:        "Předsadit",
+		indent:         "Odsadit",
+		forecolor:      "Barva písma",
+		hilitecolor:    "Barva pozadí",
+		horizontalrule: "Vodorovná čára",
+		createlink:     "Vložit odkaz",
+		insertimage:    "Vložit obrázek",
+		inserttable:    "Vložit tabulku",
+		htmlmode:       "Přepnout HTML",
+		popupeditor:    "Nové okno editoru",
+		about:          "O této aplikaci",
+		showhelp:       "Nápověda aplikace",
+		textindicator:  "Zvolený styl",
+		undo:           "Vrátí poslední akci",
+		redo:           "Opakuje poslední akci",
+		cut:            "Vyjmout",
+		copy:           "Kopírovat",
+		paste:          "Vložit"
+	},
+
+	buttons: {
+		"ok":           "OK",
+		"cancel":       "Zrušit"
+	},
+
+	msg: {
+		"Path":         "Cesta",
+		"TEXT_MODE":    "Jste v TEXTOVÉM REŽIMU.  Použijte tlačítko [<>] pro přepnutí do WYSIWIG."
+	}
+};

Modified: plog/trunk/js/htmlarea/lang/da.js
===================================================================
--- plog/trunk/js/htmlarea/lang/da.js	2005-02-05 13:57:52 UTC (rev 948)
+++ plog/trunk/js/htmlarea/lang/da.js	2005-02-05 15:29:38 UTC (rev 949)
@@ -1,38 +1,38 @@
-// danish version for htmlArea v3.0 - Alpha Release
-// - translated by rene<rene at laerke.net>
-// term´s and licenses are equal to htmlarea!
-
-HTMLArea.I18N = {
-
-	// the following should be the filename without .js extension
-	// it will be used for automatically load plugin language.
-	lang: "da",
-
-	tooltips: {
-		bold:           "Fed",
-		italic:         "Kursiv",
-		underline:      "Understregning",
-		strikethrough:  "Overstregning ",
-		subscript:      "Sænket skrift",
-		superscript:    "Hævet skrift",
-		justifyleft:    "Venstrejuster",
-		justifycenter:  "Centrer",
-		justifyright:   "Højrejuster",
-		justifyfull:    "Lige margener",
-		orderedlist:    "Opstilling med tal",
-		unorderedlist:  "Opstilling med punkttegn",
-		outdent:        "Formindsk indrykning",
-		indent:         "Forøg indrykning",
-		forecolor:      "Skriftfarve",
-		backcolor:      "Baggrundsfarve",
-		horizontalrule: "Horisontal linie",
-		createlink:     "Indsæt hyperlink",
-		insertimage:    "Indsæt billede",
-		inserttable:    "Indsæt tabel",
-		htmlmode:       "HTML visning",
-		popupeditor:    "Vis editor i popup",
-		about:          "Om htmlarea",
-		help:           "Hjælp",
-		textindicator:  "Anvendt stil"
-	}
-};
+// danish version for htmlArea v3.0 - Alpha Release
+// - translated by rene<rene at laerke.net>
+// term´s and licenses are equal to htmlarea!
+
+HTMLArea.I18N = {
+
+	// the following should be the filename without .js extension
+	// it will be used for automatically load plugin language.
+	lang: "da",
+
+	tooltips: {
+		bold:           "Fed",
+		italic:         "Kursiv",
+		underline:      "Understregning",
+		strikethrough:  "Overstregning ",
+		subscript:      "Sænket skrift",
+		superscript:    "Hævet skrift",
+		justifyleft:    "Venstrejuster",
+		justifycenter:  "Centrer",
+		justifyright:   "Højrejuster",
+		justifyfull:    "Lige margener",
+		orderedlist:    "Opstilling med tal",
+		unorderedlist:  "Opstilling med punkttegn",
+		outdent:        "Formindsk indrykning",
+		indent:         "Forøg indrykning",
+		forecolor:      "Skriftfarve",
+		backcolor:      "Baggrundsfarve",
+		horizontalrule: "Horisontal linie",
+		createlink:     "Indsæt hyperlink",
+		insertimage:    "Indsæt billede",
+		inserttable:    "Indsæt tabel",
+		htmlmode:       "HTML visning",
+		popupeditor:    "Vis editor i popup",
+		about:          "Om htmlarea",
+		help:           "Hjælp",
+		textindicator:  "Anvendt stil"
+	}
+};

Modified: plog/trunk/js/htmlarea/lang/de.js
===================================================================
--- plog/trunk/js/htmlarea/lang/de.js	2005-02-05 13:57:52 UTC (rev 948)
+++ plog/trunk/js/htmlarea/lang/de.js	2005-02-05 15:29:38 UTC (rev 949)
@@ -1,54 +1,80 @@
-// german version for htmlArea v3.0 - Alpha Release
-// - translated by AtK<atk at chello.at>
-// term´s and licenses are equal to htmlarea!
-// translation improved by broxx<broxx at broxx.com>
-
-HTMLArea.I18N = {
-
-	// the following should be the filename without .js extension
-	// it will be used for automatically load plugin language.
-	lang: "de",
-
-	tooltips: {
-		bold:           "Fett",
-		italic:         "Kursiv",
-		underline:      "Unterstrichen",
-		strikethrough:  "Durchgestrichen",
-		subscript:      "Hochgestellt",
-		superscript:    "Tiefgestellt",
-		justifyleft:    "Links ausrichten",
-		justifycenter:  "Zentrieren",
-		justifyright:   "Rechts ausrichten",
-		justifyfull:    "Blocksatz",
-		orderedlist:    "Nummerierung",
-		unorderedlist:  "Aufzaehlungszeichen",
-		outdent:        "Einzug verkleinern",
-		indent:         "Einzug vergrössern",
-		forecolor:      "Text Farbe",
-		hilitecolor:    "Hintergrund Farbe",
-		horizontalrule: "Horizontale Linie",
-		createlink:     "Hyperlink einfuegen",
-		insertimage:    "Bild einfuegen",
-		inserttable:    "Tabelle einfuegen",
-		htmlmode:       "HTML Modus",
-		popupeditor:    "Editor im Popup öffnen",
-		about:          "Ueber HtmlArea",
-		showhelp:       "Hilfe",
-		textindicator:  "derzeitiger Stil",
-		undo:           "Rueckgaengig",
-		redo:           "Wiederholen",
-		cut:            "Ausschneiden",
-		copy:           "Kopieren",
-		paste:          "Einfuegen"
-	},
-  
- buttons: {
-		"ok":           "OK",
-		"cancel":       "Abbrechen"
-	},
-
-	msg: {
-		"Path":         "Pfad",
-		"TEXT_MODE":    "Du befindest dich im HTML Modus.  Benuetze die [<>] Schaltflaeche um in den WYSIWIG-Modus zu wechseln."
-	}
-};
+// I18N constants
+
+// LANG: "de", ENCODING: ISO-8859-1 for the german umlaut!
+
+HTMLArea.I18N = {
+
+	// the following should be the filename without .js extension
+	// it will be used for automatically load plugin language.
+	lang: "de",
+
+	tooltips: {
+		bold:           "Fett",
+		italic:         "Kursiv",
+		underline:      "Unterstrichen",
+		strikethrough:  "Durchgestrichen",
+		subscript:      "Hochgestellt",
+		superscript:    "Tiefgestellt",
+        justifyleft:            "Linksbündig",
+        justifycenter:          "Zentriert",
+        justifyright:           "Rechtsbündig",
+		justifyfull:    "Blocksatz",
+        orderedlist:      "Nummerierung",
+        unorderedlist:    "Aufzählungszeichen",
+		outdent:        "Einzug verkleinern",
+        indent:                 "Einzug vergrößern",
+        forecolor:              "Schriftfarbe",
+        backcolor:              "Hindergrundfarbe",
+        hilitecolor:            "Hintergrundfarbe",
+		horizontalrule: "Horizontale Linie",
+        inserthorizontalrule:   "Horizontale Linie",
+        createlink:             "Hyperlink einfügen",
+        insertimage:            "Bild einfügen",
+        inserttable:            "Tabelle einfügen",
+		htmlmode:       "HTML Modus",
+		popupeditor:    "Editor im Popup öffnen",
+        about:                  "Über htmlarea",
+        help:                   "Hilfe",
+		showhelp:       "Hilfe",
+        textindicator:          "Derzeitiger Stil",
+        undo:                   "Rückgängig",
+		redo:           "Wiederholen",
+		cut:            "Ausschneiden",
+		copy:           "Kopieren",
+        paste:                  "Einfügen aus der Zwischenablage",
+        lefttoright:            "Textrichtung von Links nach Rechts",
+        righttoleft:            "Textrichtung von Rechts nach Links",
+        removeformat:            "Formatierung entfernen"
+	},
+  
+ buttons: {
+		"ok":           "OK",
+		"cancel":       "Abbrechen"
+	},
+
+	msg: {
+		"Path":         "Pfad",
+        "TEXT_MODE":            "Sie sind im Text-Modus. Benutzen Sie den [<>] Knopf um in den visuellen Modus (WYSIWIG) zu gelangen.",
+
+        "Moz-Clipboard" :
+        "Aus Sicherheitsgründen dürfen Skripte normalerweise nicht programmtechnisch auf " +
+        "Ausschneiden/Kopieren/Einfügen zugreifen. Bitte klicken Sie OK um die technische " +
+        "Erläuterung auf mozilla.org zu öffnen, in der erklärt wird, wie einem Skript Zugriff " +
+        "gewährt werden kann."
+    },
+    
+    dialogs: {
+        "OK":                   "OK",
+        "Cancel":               "Abbrechen",
+        "Insert/Modify Link":   "Verknüpfung hinzufügen/ändern",
+        "None (use implicit)":  "k.A. (implizit)",
+        "New window (_blank)":  "Neues Fenster (_blank)",
+        "Same frame (_self)":   "Selber Rahmen (_self)",
+        "Top frame (_top)":     "Oberster Rahmen (_top)",
+        "Other":                "Anderes",
+        "Target:":              "Ziel:",
+        "Title (tooltip):":     "Titel (Tooltip):",
+        "URL:":                 "URL:",
+        "You must enter the URL where this link points to": "Sie müssen eine Ziel-URL angeben für die Verknüpfung angeben"
+	}
+};

Modified: plog/trunk/js/htmlarea/lang/ee.js
===================================================================
--- plog/trunk/js/htmlarea/lang/ee.js	2005-02-05 13:57:52 UTC (rev 948)
+++ plog/trunk/js/htmlarea/lang/ee.js	2005-02-05 15:29:38 UTC (rev 949)
@@ -1,63 +1,63 @@
-// I18N constants
-
-// LANG: "ee", ENCODING: UTF-8 | ISO-8859-1
-// Author: Martin Raie, <albertvill at hot.ee>
-
-// 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: "ee",
-
-	tooltips: {
-		bold:           "Paks",
-		italic:         "Kursiiv",
-		underline:      "Allakriipsutatud",
-		strikethrough:  "Läbikriipsutatud",
-		subscript:      "Allindeks",
-		superscript:    "Ülaindeks",
-		justifyleft:    "Joonda vasakule",
-		justifycenter:  "Joonda keskele",
-		justifyright:   "Joonda paremale",
-		justifyfull:    "Rööpjoonda",
-		insertorderedlist:    "Nummerdus",
-		insertunorderedlist:  "Täpploend",
-		outdent:        "Vähenda taanet",
-		indent:         "Suurenda taanet",
-		forecolor:      "Fondi värv",
-		hilitecolor:    "Tausta värv",
-		inserthorizontalrule: "Horisontaaljoon",
-		createlink:     "Lisa viit",
-		insertimage:    "Lisa pilt",
-		inserttable:    "Lisa tabel",
-		htmlmode:       "HTML/tavaline vaade",
-		popupeditor:    "Suurenda toimeti aken",
-		about:          "Teave toimeti kohta",
-		showhelp:       "Spikker",
-		textindicator:  "Kirjastiil",
-		undo:           "Võta tagasi",
-		redo:           "Tee uuesti",
-		cut:            "Lõika",
-		copy:           "Kopeeri",
-		paste:          "Kleebi"
-	},
-
-	buttons: {
-		"ok":           "OK",
-		"cancel":       "Loobu"
-	},
-
-	msg: {
-		"Path":         "Path",
-		"TEXT_MODE":    "Sa oled tekstireziimis.  Kasuta nuppu [<>] lülitamaks tagasi WYSIWIG reziimi."
-	}
-};
+// I18N constants
+
+// LANG: "ee", ENCODING: UTF-8 | ISO-8859-1
+// Author: Martin Raie, <albertvill at hot.ee>
+
+// 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: "ee",
+
+	tooltips: {
+		bold:           "Paks",
+		italic:         "Kursiiv",
+		underline:      "Allakriipsutatud",
+		strikethrough:  "Läbikriipsutatud",
+		subscript:      "Allindeks",
+		superscript:    "Ülaindeks",
+		justifyleft:    "Joonda vasakule",
+		justifycenter:  "Joonda keskele",
+		justifyright:   "Joonda paremale",
+		justifyfull:    "Rööpjoonda",
+		orderedlist:    "Nummerdus",
+		unorderedlist:  "Täpploend",
+		outdent:        "Vähenda taanet",
+		indent:         "Suurenda taanet",
+		forecolor:      "Fondi värv",
+		hilitecolor:    "Tausta värv",
+		inserthorizontalrule: "Horisontaaljoon",
+		createlink:     "Lisa viit",
+		insertimage:    "Lisa pilt",
+		inserttable:    "Lisa tabel",
+		htmlmode:       "HTML/tavaline vaade",
+		popupeditor:    "Suurenda toimeti aken",
+		about:          "Teave toimeti kohta",
+		showhelp:       "Spikker",
+		textindicator:  "Kirjastiil",
+		undo:           "Võta tagasi",
+		redo:           "Tee uuesti",
+		cut:            "Lõika",
+		copy:           "Kopeeri",
+		paste:          "Kleebi"
+	},
+
+	buttons: {
+		"ok":           "OK",
+		"cancel":       "Loobu"
+	},
+
+	msg: {
+		"Path":         "Path",
+		"TEXT_MODE":    "Sa oled tekstireziimis.  Kasuta nuppu [<>] lülitamaks tagasi WYSIWIG reziimi."
+	}
+};

Modified: plog/trunk/js/htmlarea/lang/el.js
===================================================================
--- plog/trunk/js/htmlarea/lang/el.js	2005-02-05 13:57:52 UTC (rev 948)
+++ plog/trunk/js/htmlarea/lang/el.js	2005-02-05 15:29:38 UTC (rev 949)
@@ -1,75 +1,75 @@
-// I18N constants
-
-// LANG: "el", ENCODING: UTF-8 | ISO-8859-7
-// Author: Dimitris Glezos, dimitris at glezos.com
-
-HTMLArea.I18N = {
-
-	// the following should be the filename without .js extension
-	// it will be used for automatically load plugin language.
-	lang: "el",
-
-	tooltips: {
-		bold:           "Έντονα",
-		italic:         "Πλάγια",
-		underline:      "Υπογραμμισμένα",
-		strikethrough:  "Διαγραμμένα",
-		subscript:      "Δείκτης",
-		superscript:    "Δείκτης",
-		justifyleft:    "Στοίχιση Αριστερά",
-		justifycenter:  "Στοίχιση Κέντρο",
-		justifyright:   "Στοίχιση Δεξιά",
-		justifyfull:    "Πλήρης Στοίχιση",
-		orderedlist:    "Αρίθμηση",
-		unorderedlist:  "Κουκκίδες",
-		outdent:        "Μείωση Εσοχής",
-		indent:         "Αύξηση Εσοχής",
-		forecolor:      "Χρώμα Γραμματοσειράς",
-		hilitecolor:    "Χρώμα Φόντου",
-		horizontalrule: "Οριζόντια Γραμμή",
-		createlink:     "Εισαγωγή Συνδέσμου",
-		insertimage:    "Εισαγωγή/Τροποποίηση Εικόνας",
-		inserttable:    "Εισαγωγή Πίνακα",
-		htmlmode:       "Εναλλαγή σε/από HTML",
-		popupeditor:    "Μεγένθυνση επεξεργαστή",
-		about:          "Πληροφορίες",
-		showhelp:       "Βοήθεια",
-		textindicator:  "Παρών στυλ",
-		undo:           "Αναίρεση τελευταίας ενέργειας",
-		redo:           "Επαναφορά από αναίρεση",
-		cut:            "Αποκοπή",
-		copy:           "Αντιγραφή",
-		paste:          "Επικόλληση",
-        lefttoright:    "Κατεύθυνση αριστερά προς δεξιά",
-        righttoleft:    "Κατεύθυνση από δεξιά προς τα αριστερά"
-	},
-
-	buttons: {
-		"ok":           "OK",
-		"cancel":       "Ακύρωση"
-	},
-
-	msg: {
-		"Path":         "Διαδρομή",
-		"TEXT_MODE":    "Είστε σε TEXT MODE.  Χρησιμοποιήστε το κουμπί [<>] για να επανέρθετε στο WYSIWIG.",
-
-       "IE-sucks-full-screen":	"Η κατάσταση πλήρης οθόνης έχει προβλήματα με τον Internet Explorer, " +
-       							"λόγω σφαλμάτων στον ίδιο τον browser.  Αν το σύστημα σας είναι Windows 9x " +
-       							"μπορεί και να χρειαστείτε reboot. Αν είστε σίγουροι, πατήστε ΟΚ."
-       },
-
-       dialogs: {
-               "Cancel"                                            : "Ακύρωση",
-               "Insert/Modify Link"                                : "Εισαγωγή/Τροποποίηση σύνδεσμου",
-               "New window (_blank)"                               : "Νέο παράθυρο (_blank)",
-               "None (use implicit)"                               : "Κανένα (χρήση απόλυτου)",
-               "OK"                                                : "Εντάξει",
-               "Other"                                             : "Αλλο",
-               "Same frame (_self)"                                : "Ίδιο frame (_self)",
-               "Target:"                                           : "Target:",
-               "Title (tooltip):"                                  : "Τίτλος (tooltip):",
-               "Top frame (_top)"                                  : "Πάνω frame (_top)",
-               "URL:"                                              : "URL:",
-               "You must enter the URL where this link points to"  : "Πρέπει να εισάγετε το URL που οδηγεί αυτός ο σύνδεσμος"
-       }
-};
+// I18N constants
+
+// LANG: "el", ENCODING: UTF-8 | ISO-8859-7
+// Author: Dimitris Glezos, dimitris at glezos.com
+
+HTMLArea.I18N = {
+
+	// the following should be the filename without .js extension
+	// it will be used for automatically load plugin language.
+	lang: "el",
+
+	tooltips: {
+		bold:           "Έντονα",
+		italic:         "Πλάγια",
+		underline:      "Υπογραμμισμένα",
+		strikethrough:  "Διαγραμμένα",
+		subscript:      "Δείκτης",
+		superscript:    "Δείκτης",
+		justifyleft:    "Στοίχιση Αριστερά",
+		justifycenter:  "Στοίχιση Κέντρο",
+		justifyright:   "Στοίχιση Δεξιά",
+		justifyfull:    "Πλήρης Στοίχιση",
+		orderedlist:    "Αρίθμηση",
+		unorderedlist:  "Κουκκίδες",
+		outdent:        "Μείωση Εσοχής",
+		indent:         "Αύξηση Εσοχής",
+		forecolor:      "Χρώμα Γραμματοσειράς",
+		hilitecolor:    "Χρώμα Φόντου",
+		horizontalrule: "Οριζόντια Γραμμή",
+		createlink:     "Εισαγωγή Συνδέσμου",
+		insertimage:    "Εισαγωγή/Τροποποίηση Εικόνας",
+		inserttable:    "Εισαγωγή Πίνακα",
+		htmlmode:       "Εναλλαγή σε/από HTML",
+		popupeditor:    "Μεγένθυνση επεξεργαστή",
+		about:          "Πληροφορίες",
+		showhelp:       "Βοήθεια",
+		textindicator:  "Παρών στυλ",
+		undo:           "Αναίρεση τελευταίας ενέργειας",
+		redo:           "Επαναφορά από αναίρεση",
+		cut:            "Αποκοπή",
+		copy:           "Αντιγραφή",
+		paste:          "Επικόλληση",
+        lefttoright:    "Κατεύθυνση αριστερά προς δεξιά",
+        righttoleft:    "Κατεύθυνση από δεξιά προς τα αριστερά"
+	},
+
+	buttons: {
+		"ok":           "OK",
+		"cancel":       "Ακύρωση"
+	},
+
+	msg: {
+		"Path":         "Διαδρομή",
+		"TEXT_MODE":    "Είστε σε TEXT MODE.  Χρησιμοποιήστε το κουμπί [<>] για να επανέρθετε στο WYSIWIG.",
+
+       "IE-sucks-full-screen":	"Η κατάσταση πλήρης οθόνης έχει προβλήματα με τον Internet Explorer, " +
+       							"λόγω σφαλμάτων στον ίδιο τον browser.  Αν το σύστημα σας είναι Windows 9x " +
+       							"μπορεί και να χρειαστείτε reboot. Αν είστε σίγουροι, πατήστε ΟΚ."
+       },
+
+       dialogs: {
+               "Cancel"                                            : "Ακύρωση",
+               "Insert/Modify Link"                                : "Εισαγωγή/Τροποποίηση σύνδεσμου",
+               "New window (_blank)"                               : "Νέο παράθυρο (_blank)",
+               "None (use implicit)"                               : "Κανένα (χρήση απόλυτου)",
+               "OK"                                                : "Εντάξει",
+               "Other"                                             : "Αλλο",
+               "Same frame (_self)"                                : "Ίδιο frame (_self)",
+               "Target:"                                           : "Target:",
+               "Title (tooltip):"                                  : "Τίτλος (tooltip):",
+               "Top frame (_top)"                                  : "Πάνω frame (_top)",
+               "URL:"                                              : "URL:",
+               "You must enter the URL where this link points to"  : "Πρέπει να εισάγετε το URL που οδηγεί αυτός ο σύνδεσμος"
+       }
+};

Modified: plog/trunk/js/htmlarea/lang/en.js
===================================================================
--- plog/trunk/js/htmlarea/lang/en.js	2005-02-05 13:57:52 UTC (rev 948)
+++ plog/trunk/js/htmlarea/lang/en.js	2005-02-05 15:29:38 UTC (rev 949)
@@ -1,88 +1,147 @@
-// I18N constants
-
-// LANG: "en", ENCODING: UTF-8 | ISO-8859-1
-// Author: Mihai Bazon, http://dynarch.com/mishoo
-
-// 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: "en",
-
-	tooltips: {
-		bold:           "Bold",
-		italic:         "Italic",
-		underline:      "Underline",
-		strikethrough:  "Strikethrough",
-		subscript:      "Subscript",
-		superscript:    "Superscript",
-		justifyleft:    "Justify Left",
-		justifycenter:  "Justify Center",
-		justifyright:   "Justify Right",
-		justifyfull:    "Justify Full",
-		orderedlist:    "Ordered List",
-		unorderedlist:  "Bulleted List",
-		outdent:        "Decrease Indent",
-		indent:         "Increase Indent",
-		forecolor:      "Font Color",
-		hilitecolor:    "Background Color",
-		horizontalrule: "Horizontal Rule",
-		createlink:     "Insert Web Link",
-		insertimage:    "Insert/Modify Image",
-		inserttable:    "Insert Table",
-		htmlmode:       "Toggle HTML Source",
-		popupeditor:    "Enlarge Editor",
-		about:          "About this editor",
-		showhelp:       "Help using editor",
-		textindicator:  "Current style",
-		undo:           "Undoes your last action",
-		redo:           "Redoes your last action",
-		cut:            "Cut selection",
-		copy:           "Copy selection",
-		paste:          "Paste from clipboard",
-		lefttoright:    "Direction left to right",
-		righttoleft:    "Direction right to left"
-	},
-
-	buttons: {
-		"ok":           "OK",
-		"cancel":       "Cancel"
-	},
-
-	msg: {
-		"Path":         "Path",
-		"TEXT_MODE":    "You are in TEXT MODE.  Use the [<>] button to switch back to WYSIWYG.",
-
-		"IE-sucks-full-screen" :
-		// translate here
-		"The full screen mode is known to cause problems with Internet Explorer, " +
-		"due to browser bugs that we weren't able to workaround.  You might experience garbage " +
-		"display, lack of editor functions and/or random browser crashes.  If your system is Windows 9x " +
-		"it's very likely that you'll get a 'General Protection Fault' and need to reboot.\n\n" +
-		"You have been warned.  Please press OK if you still want to try the full screen editor."
-	},
-
-	dialogs: {
-		"Cancel"                                            : "Cancel",
-		"Insert/Modify Link"                                : "Insert/Modify Link",
-		"New window (_blank)"                               : "New window (_blank)",
-		"None (use implicit)"                               : "None (use implicit)",
-		"OK"                                                : "OK",
-		"Other"                                             : "Other",
-		"Same frame (_self)"                                : "Same frame (_self)",
-		"Target:"                                           : "Target:",
-		"Title (tooltip):"                                  : "Title (tooltip):",
-		"Top frame (_top)"                                  : "Top frame (_top)",
-		"URL:"                                              : "URL:",
-		"You must enter the URL where this link points to"  : "You must enter the URL where this link points to"
-	}
-};
+// I18N constants
+
+// LANG: "en", ENCODING: UTF-8 | ISO-8859-1
+// Author: Mihai Bazon, http://dynarch.com/mishoo
+
+// 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: "en",
+
+	tooltips: {
+		bold:           "Bold",
+		italic:         "Italic",
+		underline:      "Underline",
+		strikethrough:  "Strikethrough",
+		subscript:      "Subscript",
+		superscript:    "Superscript",
+		justifyleft:    "Justify Left",
+		justifycenter:  "Justify Center",
+		justifyright:   "Justify Right",
+		justifyfull:    "Justify Full",
+		orderedlist:    "Ordered List",
+		unorderedlist:  "Bulleted List",
+		outdent:        "Decrease Indent",
+		indent:         "Increase Indent",
+		forecolor:      "Font Color",
+		hilitecolor:    "Background Color",
+		horizontalrule: "Horizontal Rule",
+		createlink:     "Insert Web Link",
+		insertimage:    "Insert/Modify Image",
+		inserttable:    "Insert Table",
+		htmlmode:       "Toggle HTML Source",
+		popupeditor:    "Enlarge Editor",
+		about:          "About this editor",
+		showhelp:       "Help using editor",
+		textindicator:  "Current style",
+		undo:           "Undoes your last action",
+		redo:           "Redoes your last action",
+		cut:            "Cut selection",
+		copy:           "Copy selection",
+		paste:          "Paste from clipboard",
+		lefttoright:    "Direction left to right",
+		righttoleft:    "Direction right to left",
+		removeformat:   "Remove formatting",
+		print:          "Print document",
+		killword:       "Clear MSOffice tags"
+	},
+
+	buttons: {
+		"ok":           "OK",
+		"cancel":       "Cancel"
+	},
+
+	msg: {
+		"Path":         "Path",
+		"TEXT_MODE":    "You are in TEXT MODE.  Use the [<>] button to switch back to WYSIWYG.",
+
+		"IE-sucks-full-screen" :
+		// translate here
+		"The full screen mode is known to cause problems with Internet Explorer, " +
+		"due to browser bugs that we weren't able to workaround.  You might experience garbage " +
+		"display, lack of editor functions and/or random browser crashes.  If your system is Windows 9x " +
+		"it's very likely that you'll get a 'General Protection Fault' and need to reboot.\n\n" +
+		"You have been warned.  Please press OK if you still want to try the full screen editor.",
+
+		"Moz-Clipboard" :
+		"Unprivileged scripts cannot access Cut/Copy/Paste programatically " +
+		"for security reasons.  Click OK to see a technical note at mozilla.org " +
+		"which shows you how to allow a script to access the clipboard."
+	},
+
+	dialogs: {
+		// Common
+		"OK"                                                : "OK",
+		"Cancel"                                            : "Cancel",
+
+		"Alignment:"                                        : "Alignment:",
+		"Not set"                                           : "Not set",
+		"Left"                                              : "Left",
+		"Right"                                             : "Right",
+		"Texttop"                                           : "Texttop",
+		"Absmiddle"                                         : "Absmiddle",
+		"Baseline"                                          : "Baseline",
+		"Absbottom"                                         : "Absbottom",
+		"Bottom"                                            : "Bottom",
+		"Middle"                                            : "Middle",
+		"Top"                                               : "Top",
+
+		"Layout"                                            : "Layout",
+		"Spacing"                                           : "Spacing",
+		"Horizontal:"                                       : "Horizontal:",
+		"Horizontal padding"                                : "Horizontal padding",
+		"Vertical:"                                         : "Vertical:",
+		"Vertical padding"                                  : "Vertical padding",
+		"Border thickness:"                                 : "Border thickness:",
+		"Leave empty for no border"                         : "Leave empty for no border",
+
+		// Insert Link
+		"Insert/Modify Link"                                : "Insert/Modify Link",
+		"None (use implicit)"                               : "None (use implicit)",
+		"New window (_blank)"                               : "New window (_blank)",
+		"Same frame (_self)"                                : "Same frame (_self)",
+		"Top frame (_top)"                                  : "Top frame (_top)",
+		"Other"                                             : "Other",
+		"Target:"                                           : "Target:",
+		"Title (tooltip):"                                  : "Title (tooltip):",
+		"URL:"                                              : "URL:",
+		"You must enter the URL where this link points to"  : "You must enter the URL where this link points to",
+		// Insert Table
+		"Insert Table"                                      : "Insert Table",
+		"Rows:"                                             : "Rows:",
+		"Number of rows"                                    : "Number of rows",
+		"Cols:"                                             : "Cols:",
+		"Number of columns"                                 : "Number of columns",
+		"Width:"                                            : "Width:",
+		"Width of the table"                                : "Width of the table",
+		"Percent"                                           : "Percent",
+		"Pixels"                                            : "Pixels",
+		"Em"                                                : "Em",
+		"Width unit"                                        : "Width unit",
+		"Positioning of this table"                         : "Positioning of this table",
+		"Cell spacing:"                                     : "Cell spacing:",
+		"Space between adjacent cells"                      : "Space between adjacent cells",
+		"Cell padding:"                                     : "Cell padding:",
+		"Space between content and border in cell"          : "Space between content and border in cell",
+		// Insert Image
+		"Insert Image"                                      : "Insert Image",
+		"Image URL:"                                        : "Image URL:",
+		"Enter the image URL here"                          : "Enter the image URL here",
+		"Preview"                                           : "Preview",
+		"Preview the image in a new window"                 : "Preview the image in a new window",
+		"Alternate text:"                                   : "Alternate text:",
+		"For browsers that don't support images"            : "For browsers that don't support images",
+		"Positioning of this image"                         : "Positioning of this image",
+		"Image Preview:"                                    : "Image Preview:"
+	}
+};

Modified: plog/trunk/js/htmlarea/lang/es.js
===================================================================
--- plog/trunk/js/htmlarea/lang/es.js	2005-02-05 13:57:52 UTC (rev 948)
+++ plog/trunk/js/htmlarea/lang/es.js	2005-02-05 15:29:38 UTC (rev 949)
@@ -1,51 +1,51 @@
-// I18N constants
-
-HTMLArea.I18N = {
-
-	// the following should be the filename without .js extension
-	// it will be used for automatically load plugin language.
-	lang: "es",
-
-	tooltips: {
-		bold:           "Negrita",
-		italic:         "Cursiva",
-		underline:      "Subrayado",
-		strikethrough:  "Tachado",
-		subscript:      "Subíndice",
-		superscript:    "Superíndice",
-		justifyleft:    "Alinear a la Izquierda",
-		justifycenter:  "Centrar",
-		justifyright:   "Alinear a la Derecha",
-		justifyfull:    "Justificar",
-		insertorderedlist:    "Lista Ordenada",
-		insertunorderedlist:  "Lista No Ordenada",
-		outdent:        "Aumentar Sangría",
-		indent:         "Disminuir Sangría",
-		forecolor:      "Color del Texto",
-		hilitecolor:    "Color del Fondo",
-		inserthorizontalrule: "Línea Horizontal",
-		createlink:     "Insertar Enlace",
-		insertimage:    "Insertar Imagen",
-		inserttable:    "Insertar Tabla",
-		htmlmode:       "Ver Documento en HTML",
-		popupeditor:    "Ampliar Editor",
-		about:          "Acerca del Editor",
-		showhelp:       "Ayuda",
-		textindicator:  "Estilo Actual",
-		undo:           "Deshacer",
-		redo:           "Rehacer",
-		cut:            "Cortar selección",
-		copy:           "Copiar selección",
-		paste:          "Pegar desde el portapapeles"
-	},
-
-	buttons: {
-		"ok":           "Aceptar",
-		"cancel":       "Cancelar"
-	},
-
-	msg: {
-		"Path":         "Ruta",
-		"TEXT_MODE":    "Esta en modo TEXTO. Use el boton [<>] para cambiar a WYSIWIG",
-	}
-};
+// I18N constants
+
+HTMLArea.I18N = {
+
+	// the following should be the filename without .js extension
+	// it will be used for automatically load plugin language.
+	lang: "es",
+
+	tooltips: {
+		bold:           "Negrita",
+		italic:         "Cursiva",
+		underline:      "Subrayado",
+		strikethrough:  "Tachado",
+		subscript:      "Subíndice",
+		superscript:    "Superíndice",
+		justifyleft:    "Alinear a la Izquierda",
+		justifycenter:  "Centrar",
+		justifyright:   "Alinear a la Derecha",
+		justifyfull:    "Justificar",
+		orderedlist:    "Lista Ordenada",
+		unorderedlist:  "Lista No Ordenada",
+		outdent:        "Aumentar Sangría",
+		indent:         "Disminuir Sangría",
+		forecolor:      "Color del Texto",
+		hilitecolor:    "Color del Fondo",
+		inserthorizontalrule: "Línea Horizontal",
+		createlink:     "Insertar Enlace",
+		insertimage:    "Insertar Imagen",
+		inserttable:    "Insertar Tabla",
+		htmlmode:       "Ver Documento en HTML",
+		popupeditor:    "Ampliar Editor",
+		about:          "Acerca del Editor",
+		showhelp:       "Ayuda",
+		textindicator:  "Estilo Actual",
+		undo:           "Deshacer",
+		redo:           "Rehacer",
+		cut:            "Cortar selección",
+		copy:           "Copiar selección",
+		paste:          "Pegar desde el portapapeles"
+	},
+
+	buttons: {
+		"ok":           "Aceptar",
+		"cancel":       "Cancelar"
+	},
+
+	msg: {
+		"Path":         "Ruta",
+		"TEXT_MODE":    "Esta en modo TEXTO. Use el boton [<>] para cambiar a WYSIWIG",
+	}
+};

Modified: plog/trunk/js/htmlarea/lang/fi.js
===================================================================
--- plog/trunk/js/htmlarea/lang/fi.js	2005-02-05 13:57:52 UTC (rev 948)
+++ plog/trunk/js/htmlarea/lang/fi.js	2005-02-05 15:29:38 UTC (rev 949)
@@ -1,46 +1,46 @@
-// I18N constants
-
-HTMLArea.I18N = {
-
-	// the following should be the filename without .js extension
-	// it will be used for automatically load plugin language.
-	lang: "en",
-
-	tooltips: {
-		bold:           	"Lihavoitu",
-		italic:         	"Kursivoitu",
-		underline:      	"Alleviivattu",
-		strikethrough:  	"Yliviivattu",
-		subscript:      	"Alaindeksi",
-		superscript:    	"Yläindeksi",
-		justifyleft:    	"Tasaa vasemmat reunat",
-		justifycenter:  	"Keskitä",
-		justifyright:   	"Tasaa oikeat reunat",
-		justifyfull:    	"Tasaa molemmat reunat",
-		insertorderedlist: 	"Numerointi",
-		insertunorderedlist: 	"Luettelomerkit",
-		outdent:        	"Lisää sisennystä",
-		indent:         	"Pienennä sisennystä",
-		forecolor:      	"Fontin väri",
-		hilitecolor:    	"Taustaväri",
-		inserthorizontalrule: 	"Vaakaviiva",
-		createlink:     	"Lisää Linkki",
-		insertimage:    	"Lisää Kuva",
-		inserttable:    	"Lisää Taulu",
-		htmlmode:       	"HTML Lähdekoodi vs WYSIWYG",
-		popupeditor:    	"Suurenna Editori",
-		about:          	"Tietoja Editorista",
-		showhelp:           	"Näytä Ohje",
-		textindicator:  	"Nykyinen tyyli",
-		undo:           	"Peruuta viimeinen toiminto",
-		redo:           	"Palauta viimeinen toiminto",
-		cut:            	"Leikkaa maalattu",
-		copy:           	"Kopioi maalattu",
-		paste:          	"Liitä leikepyödältä"
-	},
-
-	buttons: {
-		"ok":           	"Hyväksy",
-		"cancel":       	"Peruuta"
-	}
-};
+// I18N constants
+
+HTMLArea.I18N = {
+
+	// the following should be the filename without .js extension
+	// it will be used for automatically load plugin language.
+	lang: "en",
+
+	tooltips: {
+		bold:           	"Lihavoitu",
+		italic:         	"Kursivoitu",
+		underline:      	"Alleviivattu",
+		strikethrough:  	"Yliviivattu",
+		subscript:      	"Alaindeksi",
+		superscript:    	"Yläindeksi",
+		justifyleft:    	"Tasaa vasemmat reunat",
+		justifycenter:  	"Keskitä",
+		justifyright:   	"Tasaa oikeat reunat",
+		justifyfull:    	"Tasaa molemmat reunat",
+		orderedlist: 	"Numerointi",
+		unorderedlist: 	"Luettelomerkit",
+		outdent:        	"Lisää sisennystä",
+		indent:         	"Pienennä sisennystä",
+		forecolor:      	"Fontin väri",
+		hilitecolor:    	"Taustaväri",
+		inserthorizontalrule: 	"Vaakaviiva",
+		createlink:     	"Lisää Linkki",
+		insertimage:    	"Lisää Kuva",
+		inserttable:    	"Lisää Taulu",
+		htmlmode:       	"HTML Lähdekoodi vs WYSIWYG",
+		popupeditor:    	"Suurenna Editori",
+		about:          	"Tietoja Editorista",
+		showhelp:           	"Näytä Ohje",
+		textindicator:  	"Nykyinen tyyli",
+		undo:           	"Peruuta viimeinen toiminto",
+		redo:           	"Palauta viimeinen toiminto",
+		cut:            	"Leikkaa maalattu",
+		copy:           	"Kopioi maalattu",
+		paste:          	"Liitä leikepyödältä"
+	},
+
+	buttons: {
+		"ok":           	"Hyväksy",
+		"cancel":       	"Peruuta"
+	}
+};

Modified: plog/trunk/js/htmlarea/lang/fr.js
===================================================================
--- plog/trunk/js/htmlarea/lang/fr.js	2005-02-05 13:57:52 UTC (rev 948)
+++ plog/trunk/js/htmlarea/lang/fr.js	2005-02-05 15:29:38 UTC (rev 949)
@@ -1,61 +1,97 @@
-// I18N constants
-// Author: Jonathan Ernst, <Jonathan.Ernst at NetOxygen.ch>
-
-// 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: "fr",
-
-	tooltips: {
-		bold:           "Gras",
-		italic:         "Italique",
-		underline:      "Souligné",
-		strikethrough:  "Barré",
-		subscript:      "Subscript",
-		superscript:    "Superscript",
-		justifyleft:    "Aligné à gauche",
-		justifycenter:  "Centré",
-		justifyright:   "Aligné à droite",
-		justifyfull:    "Justifié",
-		orderedlist:    "Numérotation",
-		unorderedlist:  "Puces",
-		outdent:        "Augmenter le retrait",
-		indent:         "Diminuer le retrait",
-		forecolor:      "Couleur du texte",
-		hilitecolor:    "Couleur du fond",
-		horizontalrule: "Ligne horizontale",
-		createlink:     "Insérer un lien",
-		insertimage:    "Insérer une image",
-		inserttable:    "Insérer un tableau",
-		htmlmode:       "Passer au code source HTML",
-		popupeditor:    "Agrandir l'éditeur",
-		about:          "A propos de cet éditeur",
-		showhelp:       "Aide sur l'éditeur",
-		textindicator:  "Style courant",
-		undo:           "Annule la dernière action",
-		redo:           "Refait la dernière action",
-		cut:            "Coupe la sélection",
-		copy:           "Copie la sélection",
-		paste:          "Colle depuis le presse papiers"
-	},
-
-	buttons: {
-		"ok":           "OK",
-		"cancel":       "Annuler"
-	},
-
-	msg: {
-		"Path":         "Chemin",
-		"TEXT_MODE":    "Vous êtes en mode texte.  Utilisez le bouton [<>] pour revenir au mode WYSIWIG."
-	}
-};
+// I18N constants
+
+// LANG: "fr", ENCODING: UTF-8 | ISO-8859-1
+// Author: Simon Richard, s.rich at sympatico.ca
+
+// 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.)
+
+// All technical terms used in this document are the ones approved
+// by the Office québécois de la langue française.
+// Tous les termes techniques utilisés dans ce document sont ceux
+// approuvés par l'Office québécois de la langue française.
+// http://www.oqlf.gouv.qc.ca/
+
+HTMLArea.I18N = {
+
+	// the following should be the filename without .js extension
+	// it will be used for automatically load plugin language.
+	lang: "fr",
+
+	tooltips: {
+		bold:           "Gras",
+		italic:         "Italique",
+		underline:      "Souligné",
+		strikethrough:  "Barré",
+		subscript:      "Indice",
+		superscript:    "Exposant",
+		justifyleft:    "Aligné à gauche",
+		justifycenter:  "Centré",
+		justifyright:   "Aligné à droite",
+		justifyfull:    "Justifier",
+		orderedlist:    "Numérotation",
+		unorderedlist:  "Puces",
+		outdent:        "Diminuer le retrait",
+		indent:         "Augmenter le retrait",
+		forecolor:      "Couleur de police",
+		hilitecolor:    "Surlignage",
+		horizontalrule: "Ligne horizontale",
+		createlink:     "Insérer un hyperlien",
+		insertimage:    "Insérer/Modifier une image",
+		inserttable:    "Insérer un tableau",
+		htmlmode:       "Passer au code source",
+		popupeditor:    "Agrandir l'éditeur",
+		about:          "À propos de cet éditeur",
+		showhelp:       "Aide sur l'éditeur",
+		textindicator:  "Style courant",
+		undo:           "Annuler la dernière action",
+		redo:           "Répéter la dernière action",
+		cut:            "Couper la sélection",
+		copy:           "Copier la sélection",
+		paste:          "Coller depuis le presse-papier",
+		lefttoright:    "Direction de gauche à droite",
+		righttoleft:    "Direction de droite à gauche"
+	},
+
+	buttons: {
+		"ok":           "OK",
+		"cancel":       "Annuler"
+	},
+
+	msg: {
+		"Path":         "Chemin",
+		"TEXT_MODE":    "Vous êtes en MODE TEXTE.  Appuyez sur le bouton [<>] pour retourner au mode tel-tel.",
+
+		"IE-sucks-full-screen" :
+		// translate here
+		"Le mode plein écran peut causer des problèmes sous Internet Explorer, " +
+		"ceci dû à des bogues du navigateur qui ont été impossible à contourner.  " +
+		"Les différents symptômes peuvent être un affichage déficient, le manque de " +
+		"fonctions dans l'éditeur et/ou pannes aléatoires du navigateur.  Si votre " +
+		"système est Windows 9x, il est possible que vous subissiez une erreur de type " +
+		"«General Protection Fault» et que vous ayez à redémarrer votre ordinateur." +
+		"\n\nConsidérez-vous comme ayant été avisé.  Appuyez sur OK si vous désirez tout " +
+		"de même essayer le mode plein écran de l'éditeur."
+	},
+
+	dialogs: {
+		"Cancel"                                            : "Annuler",
+		"Insert/Modify Link"                                : "Insérer/Modifier Lien",
+		"New window (_blank)"                               : "Nouvelle fenêtre (_blank)",
+		"None (use implicit)"                               : "Aucun (par défaut)",
+		"OK"                                                : "OK",
+		"Other"                                             : "Autre",
+		"Same frame (_self)"                                : "Même cadre (_self)",
+		"Target:"                                           : "Cible:",
+		"Title (tooltip):"                                  : "Titre (infobulle):",
+		"Top frame (_top)"                                  : "Cadre du haut (_top)",
+		"URL:"                                              : "Adresse Web:",
+		"You must enter the URL where this link points to"  : "Vous devez entrer l'adresse Web du lien"
+	}
+};

Modified: plog/trunk/js/htmlarea/lang/gb.js
===================================================================
--- plog/trunk/js/htmlarea/lang/gb.js	2005-02-05 13:57:52 UTC (rev 948)
+++ plog/trunk/js/htmlarea/lang/gb.js	2005-02-05 15:29:38 UTC (rev 949)
@@ -1,36 +1,36 @@
-// I18N constants -- Chinese GB
-// by Dave Lo -- dlo at interactivetools.com
-HTMLArea.I18N = {
-
-	// the following should be the filename without .js extension
-	// it will be used for automatically load plugin language.
-	lang: "gb",
-
-	tooltips: {
-		bold:           "´ÖÌå",
-		italic:         "бÌå",
-		underline:      "µ×Ïß",
-		strikethrough:  "ɾ³ýÏß",
-		subscript:      "챐",
-		superscript:    "Éϱê",
-		justifyleft:    "λÖÿ¿×ó",
-		justifycenter:  "λÖþÓÖÐ",
-		justifyright:   "λÖÿ¿ÓÒ",
-		justifyfull:    "λÖÃ×óÓÒƽµÈ",
-		orderedlist:    "˳ÐòÇåµ¥",
-		unorderedlist:  "ÎÞÐòÇåµ¥",
-		outdent:        "¼õСÐÐÇ°¿Õ°×",
-		indent:         "¼Ó¿íÐÐÇ°¿Õ°×",
-		forecolor:      "ÎÄ×ÖÑÕÉ«",
-		backcolor:      "±³¾°ÑÕÉ«",
-		horizontalrule: "ˮƽÏß",
-		createlink:     "²åÈëÁ¬½á",
-		insertimage:    "²åÈëͼÐÎ",
-		inserttable:    "²åÈë±í¸ñ",
-		htmlmode:       "Çл»HTMLԭʼÂë",
-		popupeditor:    "·Å´ó",
-		about:          "¹Øì¶ HTMLArea",
-		help:           "˵Ã÷",
-		textindicator:  "×ÖÌåÀý×Ó"
-	}
-};
+// I18N constants -- Chinese GB
+// by Dave Lo -- dlo at interactivetools.com
+HTMLArea.I18N = {
+
+	// the following should be the filename without .js extension
+	// it will be used for automatically load plugin language.
+	lang: "gb",
+
+	tooltips: {
+		bold:           "´ÖÌå",
+		italic:         "бÌå",
+		underline:      "µ×Ïß",
+		strikethrough:  "ɾ³ýÏß",
+		subscript:      "챐",
+		superscript:    "Éϱê",
+		justifyleft:    "λÖÿ¿×ó",
+		justifycenter:  "λÖþÓÖÐ",
+		justifyright:   "λÖÿ¿ÓÒ",
+		justifyfull:    "λÖÃ×óÓÒƽµÈ",
+		orderedlist:    "˳ÐòÇåµ¥",
+		unorderedlist:  "ÎÞÐòÇåµ¥",
+		outdent:        "¼õСÐÐÇ°¿Õ°×",
+		indent:         "¼Ó¿íÐÐÇ°¿Õ°×",
+		forecolor:      "ÎÄ×ÖÑÕÉ«",
+		backcolor:      "±³¾°ÑÕÉ«",
+		horizontalrule: "ˮƽÏß",
+		createlink:     "²åÈëÁ¬½á",
+		insertimage:    "²åÈëͼÐÎ",
+		inserttable:    "²åÈë±í¸ñ",
+		htmlmode:       "Çл»HTMLԭʼÂë",
+		popupeditor:    "·Å´ó",
+		about:          "¹Øì¶ HTMLArea",
+		help:           "˵Ã÷",
+		textindicator:  "×ÖÌåÀý×Ó"
+	}
+};

Modified: plog/trunk/js/htmlarea/lang/he.js
===================================================================
--- plog/trunk/js/htmlarea/lang/he.js	2005-02-05 13:57:52 UTC (rev 948)
+++ plog/trunk/js/htmlarea/lang/he.js	2005-02-05 15:29:38 UTC (rev 949)
@@ -1,63 +1,89 @@
-// I18N constants
-
-// LANG: "he", ENCODING: UTF-8
-// Author: Liron Newman, <plastish at ultinet.org>
-
-// 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: "he",
-
-	tooltips: {
-		bold:           "מודגש",
-		italic:         "נטוי",
-		underline:      "קו תחתי",
-		strikethrough:  "קו אמצע",
-		subscript:      "כתב עילי",
-		superscript:    "כתב תחתי",
-		justifyleft:    " ישור לשמאל",
-		justifycenter:  "ישור למרכז",
-		justifyright:   "ישור לימין",
-		justifyfull:    "יישור לשורה מלאה",
-		orderedlist:    "רשימה ממוספרת",
-		unorderedlist:  "רשימה לא ממוספרת",
-		outdent:        "הקטן כניסה",
-		indent:         "הגדל כניסה",
-		forecolor:      "צבע גופן",
-		hilitecolor:    "צבע רקע",
-		horizontalrule: "קו אנכי",
-		createlink:     "הכנס היפר-קישור",
-		insertimage:    "הכנס תמונה",
-		inserttable:    "הכנס טבלה",
-		htmlmode:       "שנה מצב קוד HTML",
-		popupeditor:    "הגדל את העורך",
-		about:          "אודות עורך זה",
-		showhelp:       "עזרה לשימוש בעורך",
-		textindicator:  "סגנון נוכחי",
-		undo:           "מבטל את פעולתך האחרונה",
-		redo:           "מבצע מחדש את הפעולה האחרונה שביטלת",
-		cut:            "גזור בחירה",
-		copy:           "העתק בחירה",
-		paste:          "הדבק מהלוח"
-	},
-
-	buttons: {
-		"ok":           "OK",
-		"cancel":       "ביטול"
-	},
-
-	msg: {
-		"Path":         "נתיב עיצוב",
-		"TEXT_MODE":    "אתה במצב טקסט נקי (קוד). השתמש בכפתור [<>] כדי לחזור למצב WYSIWYG (תצוגת עיצוב)."
-	}
-};
+// I18N constants
+
+// LANG: "he", ENCODING: UTF-8
+// Author: Liron Newman, http://www.eesh.net, <plastish at ultinet dot org>
+
+// 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: "he",
+
+	tooltips: {
+		bold:           "מודגש",
+		italic:         "נטוי",
+		underline:      "קו תחתי",
+		strikethrough:  "קו אמצע",
+		subscript:      "כתב עילי",
+		superscript:    "כתב תחתי",
+		justifyleft:    " ישור לשמאל",
+		justifycenter:  "ישור למרכז",
+		justifyright:   "ישור לימין",
+		justifyfull:    "ישור לשורה מלאה",
+		orderedlist:    "רשימה ממוספרת",
+		unorderedlist:  "רשימה לא ממוספרת",
+		outdent:        "הקטן כניסה",
+		indent:         "הגדל כניסה",
+		forecolor:      "צבע גופן",
+		hilitecolor:    "צבע רקע",
+		horizontalrule: "קו אנכי",
+		createlink:     "הכנס היפר-קישור",
+		insertimage:    "הכנס/שנה תמונה",
+		inserttable:    "הכנס טבלה",
+		htmlmode:       "שנה מצב קוד HTML",
+		popupeditor:    "הגדל את העורך",
+		about:          "אודות עורך זה",
+		showhelp:       "עזרה לשימוש בעורך",
+		textindicator:  "סגנון נוכחי",
+		undo:           "מבטל את פעולתך האחרונה",
+		redo:           "מבצע מחדש את הפעולה האחרונה שביטלת",
+		cut:            "גזור בחירה",
+		copy:           "העתק בחירה",
+		paste:          "הדבק מהלוח",
+		lefttoright:    "כיוון משמאל לימין",
+		righttoleft:    "כיוון מימין לשמאל"
+	},
+
+	buttons: {
+		"ok":           "אישור",
+		"cancel":       "ביטול"
+	},
+
+	msg: {
+		"Path":         "נתיב עיצוב",
+		"TEXT_MODE":    "אתה במצב טקסט נקי (קוד). השתמש בכפתור [<>] כדי לחזור למצב WYSIWYG (תצוגת עיצוב).",
+
+		"IE-sucks-full-screen" :
+		// translate here
+		"מצב מסך מלא יוצר בעיות בדפדפן Internet Explorer, " +
+		"עקב באגים בדפדפן לא יכולנו לפתור את זה.  את/ה עלול/ה לחוות תצוגת זבל,  " +
+		"בעיות בתפקוד העורך ו/או קריסה של הדפדפן.  אם המערכת שלך היא Windows 9x " +
+		"סביר להניח שתקבל/י 'General Protection Fault' ותאלצ/י לאתחל את המחשב.\n\n" +
+		"ראה/י הוזהרת.  אנא לחץ/י אישור אם את/ה עדיין רוצה לנסות את העורך במסך מלא."
+	},
+
+	dialogs: {
+		"Cancel"                                            : "ביטול",
+		"Insert/Modify Link"                                : "הוסף/שנה קישור",
+		"New window (_blank)"                               : "חלון חדש (_blank)",
+		"None (use implicit)"                               : "ללא (השתמש ב-frame הקיים)",
+		"OK"                                                : "OK",
+		"Other"                                             : "אחר",
+		"Same frame (_self)"                                : "אותו frame (_self)",
+		"Target:"                                           : "יעד:",
+		"Title (tooltip):"                                  : "כותרת (tooltip):",
+		"Top frame (_top)"                                  : "Frame עליון (_top)",
+		"URL:"                                              : "URL:",
+		"You must enter the URL where this link points to"  : "חובה לכתוב URL שאליו קישור זה מצביע"
+
+	}
+};

Modified: plog/trunk/js/htmlarea/lang/hu.js
===================================================================
--- plog/trunk/js/htmlarea/lang/hu.js	2005-02-05 13:57:52 UTC (rev 948)
+++ plog/trunk/js/htmlarea/lang/hu.js	2005-02-05 15:29:38 UTC (rev 949)
@@ -1,63 +1,90 @@
-// I18N constants
-
-// LANG: "hu", ENCODING: UTF-8
-// Author: Miklós Somogyi, <somogyine at 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"
-	}
-};
+// I18N constants
+
+// LANG: "hu", ENCODING: UTF-8
+// Author: Miklós Somogyi, <somogyine at 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",
+		lefttoright:    "Irány balról jobbra",
+		righttoleft:    "Irány jobbról balra"
+	},
+
+	buttons: {
+		"ok":           "Rendben",
+		"cancel":       "Mégsem"
+	},
+
+	msg: {
+		"Path":         "Hierarchia",
+		"TEXT_MODE":    "Forrás mód. Visszaváltás [<>] gomb",
+
+		"IE-sucks-full-screen" :
+		// translate here
+		"A teljesképrenyős szerkesztés hibát okozhat Internet Explorer használata esetén, " +
+		"ez a böngésző a hibája, amit nem tudunk kikerülni. Szemetet észlelhet a képrenyőn, " +
+		"illetve néhány funkció hiányozhat és/vagy véletlenszerűen lefagyhat a böngésző. " +
+		"Windows 9x operaciós futtatása esetén elég valószínű, hogy 'General Protection Fault' " +
+		"hibát okoz és újra kell indítania a számítógépet.\n\n" +
+		"Figyelmeztettük.  Kérjük nyomja meg a Rendben gombot, ha mégis szeretné megnyitni a " +
+		"szerkesztőt külön ablakban."
+	},
+
+	dialogs: {
+		"Cancel"                                            : "Mégsem",
+		"Insert/Modify Link"                                : "Hivatkozás Beszúrása/Módosítása",
+		"New window (_blank)"                               : "Új ablak (_blank)",
+		"None (use implicit)"                               : "Nincs (use implicit)",
+		"OK"                                                : "OK",
+		"Other"                                             : "Más",
+		"Same frame (_self)"                                : "Ugyanabba a keretbe (_self)",
+		"Target:"                                           : "Cél:",
+		"Title (tooltip):"                                  : "Cím (tooltip):",
+		"Top frame (_top)"                                  : "Felső keret (_top)",
+		"URL:"                                              : "URL:",
+		"You must enter the URL where this link points to"  : "Be kell írnia az URL-t, ahova a hivatkozás mutasson"
+	}
+};

Modified: plog/trunk/js/htmlarea/lang/it.js
===================================================================
--- plog/trunk/js/htmlarea/lang/it.js	2005-02-05 13:57:52 UTC (rev 948)
+++ plog/trunk/js/htmlarea/lang/it.js	2005-02-05 15:29:38 UTC (rev 949)
@@ -1,54 +1,79 @@
-// I18N constants
-
-// LANG: "it", ENCODING: UTF-8 | ISO-8859-1
-// Author: Fabio Rotondo <fabio at rotondo.it>
-
-HTMLArea.I18N = {
-
-	// the following should be the filename without .js extension
-	// it will be used for automatically load plugin language.
-	lang: "it",
-
-	tooltips: {
-		bold:           "Grassetto",
-		italic:         "Italico",
-		underline:      "Sottolineato",
-		strikethrough:  "Barrato",
-		subscript:      "Pedice",
-		superscript:    "Apice",
-		justifyleft:    "Giustifica a Sinistra",
-		justifycenter:  "Giustifica in Centro",
-		justifyright:   "Giustifica a Destra",
-		justifyfull:    "Giustifica Completamente",
-		orderedlist:    "Lista Ordinata",
-		unorderedlist:  "Lista Puntata",
-		outdent:        "Decrementa Indentazione",
-		indent:         "Incrementa Indentazione",
-		forecolor:      "Colore del Carattere",
-		hilitecolor:    "Colore di Sfondo",
-		horizontalrule: "Linea Orizzontale",
-		createlink:     "Inserisci un Link",
-		insertimage:    "Inserisci un'Immagine",
-		inserttable:    "Inserisci una Tabella",
-		htmlmode:       "Attiva il codice HTML",
-		popupeditor:    "Allarga l'editor",
-		about:          "Info sull'editor",
-		showhelp:       "Aiuto sull'editor",
-		textindicator:  "Stile Attuale",
-		undo:           "Elimina l'ultima modifica",
-		redo:           "Ripristina l'ultima modifica",
-		cut:            "Taglia l'area selezionata",
-		copy:           "Copia l'area selezionata",
-		paste:          "Incolla dalla memoria"
-	},
-
-	buttons: {
-		"ok":           "OK",
-		"cancel":       "Annulla"
-	},
-
-	msg: {
-		"Path":         "Percorso",
-		"TEXT_MODE":    "Sei in MODALITA' TESTO. Usa il bottone [<>] per tornare alla modalità WYSIWYG."
-	}
-};
+// I18N constants
+
+// LANG: "it", ENCODING: UTF-8 | ISO-8859-1
+// Author: Fabio Rotondo <fabio at rotondo.it>
+// Update for 3.0 rc1: Giovanni Premuda <gpremuda at softwerk.it>
+
+HTMLArea.I18N = {
+
+        // the following should be the filename without .js extension
+        // it will be used for automatically load plugin language.
+        lang: "it",
+
+        tooltips: {
+                bold:           "Grassetto",
+                italic:         "Corsivo",
+                underline:      "Sottolineato",
+                strikethrough:  "Barrato",
+                subscript:      "Pedice",
+                superscript:    "Apice",
+                justifyleft:    "Allinea a sinistra",
+                justifycenter:  "Allinea in centro",
+                justifyright:   "Allinea a destra",
+                justifyfull:    "Giustifica",
+                insertorderedlist:    "Lista ordinata",
+                insertunorderedlist:  "Lista puntata",
+                outdent:        "Decrementa indentazione",
+                indent:         "Incrementa indentazione",
+                forecolor:      "Colore del carattere",
+                hilitecolor:    "Colore di sfondo",
+                inserthorizontalrule: "Linea orizzontale",
+                createlink:     "Inserisci un link",
+                insertimage:    "Inserisci un'immagine",
+                inserttable:    "Inserisci una tabella",
+                htmlmode:       "Visualizzazione HTML",
+                popupeditor:    "Editor a pieno schermo",
+                about:          "Info sull'editor",
+                showhelp:       "Aiuto sull'editor",
+                textindicator:  "Stile corrente",
+                undo:           "Annulla",
+                redo:           "Ripristina",
+                cut:            "Taglia",
+                copy:           "Copia",
+                paste:          "Incolla",
+                lefttoright:    "Scrivi da sinistra a destra",
+                righttoleft:    "Scrivi da destra a sinistra"
+        },
+
+        buttons: {
+                "ok":           "OK",
+                "cancel":       "Annulla"
+        },
+
+        msg: {
+                "Path":         "Percorso",
+                "TEXT_MODE":    "Sei in MODALITA' TESTO. Usa il bottone [<>] per tornare alla modalità WYSIWYG.",
+                "IE-sucks-full-screen" :
+                // translate here
+                "The full screen mode is known to cause problems with Internet Explorer, " +
+                "due to browser bugs that we weren't able to workaround.  You might experience garbage " +
+                "display, lack of editor functions and/or random browser crashes.  If your system is Windows 9x " +
+                "it's very likely that you'll get a 'General Protection Fault' and need to reboot.\n\n" +
+                "You have been warned.  Please press OK if you still want to try the full screen editor."
+        },
+
+        dialogs: {
+                "Annulla"                                            : "Cancel",
+                "Inserisci/modifica Link"                                : "Insert/Modify Link",
+                "Nuova finestra (_blank)"                               : "New window (_blank)",
+                "Nessuno (usa predefinito)"                               : "None (use implicit)",
+                "OK"                                                : "OK",
+                "Altro"                                             : "Other",
+                "Stessa finestra (_self)"                                : "Same frame (_self)",
+                "Target:"                                           : "Target:",
+                "Title (suggerimento):"                                  : "Title (tooltip):",
+                "Frame principale (_top)"                                  : "Top frame (_top)",
+                "URL:"                                              : "URL:",
+                "You must enter the URL where this link points to"  : "Devi inserire un indirizzo per questo link"
+        }
+};

Modified: plog/trunk/js/htmlarea/lang/ja-euc.js
===================================================================
--- plog/trunk/js/htmlarea/lang/ja-euc.js	2005-02-05 13:57:52 UTC (rev 948)
+++ plog/trunk/js/htmlarea/lang/ja-euc.js	2005-02-05 15:29:38 UTC (rev 949)
@@ -1,37 +1,37 @@
-// I18N constants -- Japanese EUC
-// by Manabu Onoue -- tmocsys at tmocsys.com
-
-HTMLArea.I18N = {
-
-	// the following should be the filename without .js extension
-	// it will be used for automatically load plugin language.
-	lang: "ja-euc",
-
-	tooltips: {
-		bold:           "ÂÀ»ú",
-		italic:         "¼ÐÂÎ",
-		underline:      "²¼Àþ",
-		strikethrough:  "ÂǤÁ¾Ã¤·Àþ",
-		subscript:      "²¼ÉÕ¤­Åº¤¨»ú",
-		superscript:    "¾åÉÕ¤­Åº¤¨»ú",
-		justifyleft:    "º¸´ó¤»",
-		justifycenter:  "Ãæ±û´ó¤»",
-		justifyright:   "±¦´ó¤»",
-		justifyfull:    "¶ÑÅù³äÉÕ",
-		orderedlist:    "ÈÖ¹æÉÕ¤­²Õ¾ò½ñ¤­",
-		unorderedlist:  "µ­¹æÉÕ¤­²Õ¾ò½ñ¤­",
-		outdent:        "¥¤¥ó¥Ç¥ó¥È²ò½ü",
-		indent:         "¥¤¥ó¥Ç¥ó¥ÈÀßÄê",
-		forecolor:      "ʸ»ú¿§",
-		backcolor:      "ÇØ·Ê¿§",
-		horizontalrule: "¿åÊ¿Àþ",
-		createlink:     "¥ê¥ó¥¯ºîÀ®",
-		insertimage:    "²èÁüÁÞÆþ",
-		inserttable:    "¥Æ¡¼¥Ö¥ëÁÞÆþ",
-		htmlmode:       "HTMLɽ¼¨ÀÚÂØ",
-		popupeditor:    "¥¨¥Ç¥£¥¿³ÈÂç",
-		about:          "¥Ð¡¼¥¸¥ç¥ó¾ðÊó",
-		help:           "¥Ø¥ë¥×",
-		textindicator:  "¸½ºß¤Î¥¹¥¿¥¤¥ë"
-	}
-};
+// I18N constants -- Japanese EUC
+// by Manabu Onoue -- tmocsys at tmocsys.com
+
+HTMLArea.I18N = {
+
+	// the following should be the filename without .js extension
+	// it will be used for automatically load plugin language.
+	lang: "ja-euc",
+
+	tooltips: {
+		bold:           "ÂÀ»ú",
+		italic:         "¼ÐÂÎ",
+		underline:      "²¼Àþ",
+		strikethrough:  "ÂǤÁ¾Ã¤·Àþ",
+		subscript:      "²¼ÉÕ¤­Åº¤¨»ú",
+		superscript:    "¾åÉÕ¤­Åº¤¨»ú",
+		justifyleft:    "º¸´ó¤»",
+		justifycenter:  "Ãæ±û´ó¤»",
+		justifyright:   "±¦´ó¤»",
+		justifyfull:    "¶ÑÅù³äÉÕ",
+		orderedlist:    "ÈÖ¹æÉÕ¤­²Õ¾ò½ñ¤­",
+		unorderedlist:  "µ­¹æÉÕ¤­²Õ¾ò½ñ¤­",
+		outdent:        "¥¤¥ó¥Ç¥ó¥È²ò½ü",
+		indent:         "¥¤¥ó¥Ç¥ó¥ÈÀßÄê",
+		forecolor:      "ʸ»ú¿§",
+		backcolor:      "ÇØ·Ê¿§",
+		horizontalrule: "¿åÊ¿Àþ",
+		createlink:     "¥ê¥ó¥¯ºîÀ®",
+		insertimage:    "²èÁüÁÞÆþ",
+		inserttable:    "¥Æ¡¼¥Ö¥ëÁÞÆþ",
+		htmlmode:       "HTMLɽ¼¨ÀÚÂØ",
+		popupeditor:    "¥¨¥Ç¥£¥¿³ÈÂç",
+		about:          "¥Ð¡¼¥¸¥ç¥ó¾ðÊó",
+		help:           "¥Ø¥ë¥×",
+		textindicator:  "¸½ºß¤Î¥¹¥¿¥¤¥ë"
+	}
+};

Modified: plog/trunk/js/htmlarea/lang/ja-jis.js
===================================================================
--- plog/trunk/js/htmlarea/lang/ja-jis.js	2005-02-05 13:57:52 UTC (rev 948)
+++ plog/trunk/js/htmlarea/lang/ja-jis.js	2005-02-05 15:29:38 UTC (rev 949)
@@ -1,37 +1,37 @@
-// I18N constants -- Japanese JIS
-// by Manabu Onoue -- tmocsys at tmocsys.com
-
-HTMLArea.I18N = {
-
-	// the following should be the filename without .js extension
-	// it will be used for automatically load plugin language.
-	lang: "ja-jis",
-
-	tooltips: {
-		bold:           "$BB@;z(B",
-		italic:         "$B<PBN(B",
-		underline:      "$B2<@~(B",
-		strikethrough:  "$BBG$A>C$7@~(B",
-		subscript:      "$B2<IU$-E:$(;z(B",
-		superscript:    "$B>eIU$-E:$(;z(B",
-		justifyleft:    "$B:84s$;(B",
-		justifycenter:  "$BCf1{4s$;(B",
-		justifyright:   "$B1&4s$;(B",
-		justifyfull:    "$B6QEy3dIU(B",
-		orderedlist:    "$BHV9fIU$-2U>r=q$-(B",
-		unorderedlist:  "$B5-9fIU$-2U>r=q$-(B",
-		outdent:        "$B%$%s%G%s%H2r=|(B",
-		indent:         "$B%$%s%G%s%H at _Dj(B",
-		forecolor:      "$BJ8;z?'(B",
-		backcolor:      "$BGX7J?'(B",
-		horizontalrule: "$B?eJ?@~(B",
-		createlink:     "$B%j%s%/:n at .(B",
-		insertimage:    "$B2hA|A^F~(B",
-		inserttable:    "$B%F!<%V%kA^F~(B",
-		htmlmode:       "HTML$BI=<(@ZBX(B",
-		popupeditor:    "$B%(%G%#%?3HBg(B",
-		about:          "$B%P!<%8%g%s>pJs(B",
-		help:           "$B%X%k%W(B",
-		textindicator:  "$B8=:_$N%9%?%$%k(B"
-	}
-};
+// I18N constants -- Japanese JIS
+// by Manabu Onoue -- tmocsys at tmocsys.com
+
+HTMLArea.I18N = {
+
+	// the following should be the filename without .js extension
+	// it will be used for automatically load plugin language.
+	lang: "ja-jis",
+
+	tooltips: {
+		bold:           "$BB@;z(B",
+		italic:         "$B<PBN(B",
+		underline:      "$B2<@~(B",
+		strikethrough:  "$BBG$A>C$7@~(B",
+		subscript:      "$B2<IU$-E:$(;z(B",
+		superscript:    "$B>eIU$-E:$(;z(B",
+		justifyleft:    "$B:84s$;(B",
+		justifycenter:  "$BCf1{4s$;(B",
+		justifyright:   "$B1&4s$;(B",
+		justifyfull:    "$B6QEy3dIU(B",
+		orderedlist:    "$BHV9fIU$-2U>r=q$-(B",
+		unorderedlist:  "$B5-9fIU$-2U>r=q$-(B",
+		outdent:        "$B%$%s%G%s%H2r=|(B",
+		indent:         "$B%$%s%G%s%H at _Dj(B",
+		forecolor:      "$BJ8;z?'(B",
+		backcolor:      "$BGX7J?'(B",
+		horizontalrule: "$B?eJ?@~(B",
+		createlink:     "$B%j%s%/:n at .(B",
+		insertimage:    "$B2hA|A^F~(B",
+		inserttable:    "$B%F!<%V%kA^F~(B",
+		htmlmode:       "HTML$BI=<(@ZBX(B",
+		popupeditor:    "$B%(%G%#%?3HBg(B",
+		about:          "$B%P!<%8%g%s>pJs(B",
+		help:           "$B%X%k%W(B",
+		textindicator:  "$B8=:_$N%9%?%$%k(B"
+	}
+};

Modified: plog/trunk/js/htmlarea/lang/ja-sjis.js
===================================================================
--- plog/trunk/js/htmlarea/lang/ja-sjis.js	2005-02-05 13:57:52 UTC (rev 948)
+++ plog/trunk/js/htmlarea/lang/ja-sjis.js	2005-02-05 15:29:38 UTC (rev 949)
@@ -1,37 +1,37 @@
-// I18N constants -- Japanese Shift-JIS
-// by Manabu Onoue -- tmocsys at tmocsys.com
-
-HTMLArea.I18N = {
-
-	// the following should be the filename without .js extension
-	// it will be used for automatically load plugin language.
-	lang: "ja-sjis",
-
-	tooltips: {
-		bold:           "‘¾Žš",
-		italic:         "ŽÎ‘Ì",
-		underline:      "‰ºü",
-		strikethrough:  "‘Å‚¿Á‚µü",
-		subscript:      "‰º•t‚«“Y‚¦Žš",
-		superscript:    "ã•t‚«“Y‚¦Žš",
-		justifyleft:    "¶Šñ‚¹",
-		justifycenter:  "’†‰›Šñ‚¹",
-		justifyright:   "‰EŠñ‚¹",
-		justifyfull:    "‹Ï“™Š„•t",
-		orderedlist:    "”ԍ†•t‚«‰Óð‘‚«",
-		unorderedlist:  "‹L†•t‚«‰Óð‘‚«",
-		outdent:        "ƒCƒ“ƒfƒ“ƒg‰ðœ",
-		indent:         "ƒCƒ“ƒfƒ“ƒgÝ’è",
-		forecolor:      "•¶ŽšF",
-		backcolor:      "”wŒiF",
-		horizontalrule: "…•½ü",
-		createlink:     "ƒŠƒ“ƒNì¬",
-		insertimage:    "‰æ‘œ‘}“ü",
-		inserttable:    "ƒe[ƒuƒ‹‘}“ü",
-		htmlmode:       "HTML•\Ž¦Ø‘Ö",
-		popupeditor:    "ƒGƒfƒBƒ^Šg‘å",
-		about:          "ƒo[ƒWƒ‡ƒ“î•ñ",
-		help:           "ƒwƒ‹ƒv",
-		textindicator:  "Œ»Ý‚̃Xƒ^ƒCƒ‹"
-	}
-};
+// I18N constants -- Japanese Shift-JIS
+// by Manabu Onoue -- tmocsys at tmocsys.com
+
+HTMLArea.I18N = {
+
+	// the following should be the filename without .js extension
+	// it will be used for automatically load plugin language.
+	lang: "ja-sjis",
+
+	tooltips: {
+		bold:           "‘¾Žš",
+		italic:         "ŽÎ‘Ì",
+		underline:      "‰ºü",
+		strikethrough:  "‘Å‚¿Á‚µü",
+		subscript:      "‰º•t‚«“Y‚¦Žš",
+		superscript:    "ã•t‚«“Y‚¦Žš",
+		justifyleft:    "¶Šñ‚¹",
+		justifycenter:  "’†‰›Šñ‚¹",
+		justifyright:   "‰EŠñ‚¹",
+		justifyfull:    "‹Ï“™Š„•t",
+		orderedlist:    "”ԍ†•t‚«‰Óð‘‚«",
+		unorderedlist:  "‹L†•t‚«‰Óð‘‚«",
+		outdent:        "ƒCƒ“ƒfƒ“ƒg‰ðœ",
+		indent:         "ƒCƒ“ƒfƒ“ƒgÝ’è",
+		forecolor:      "•¶ŽšF",
+		backcolor:      "”wŒiF",
+		horizontalrule: "…•½ü",
+		createlink:     "ƒŠƒ“ƒNì¬",
+		insertimage:    "‰æ‘œ‘}“ü",
+		inserttable:    "ƒe[ƒuƒ‹‘}“ü",
+		htmlmode:       "HTML•\Ž¦Ø‘Ö",
+		popupeditor:    "ƒGƒfƒBƒ^Šg‘å",
+		about:          "ƒo[ƒWƒ‡ƒ“î•ñ",
+		help:           "ƒwƒ‹ƒv",
+		textindicator:  "Œ»Ý‚̃Xƒ^ƒCƒ‹"
+	}
+};

Modified: plog/trunk/js/htmlarea/lang/ja-utf8.js
===================================================================
--- plog/trunk/js/htmlarea/lang/ja-utf8.js	2005-02-05 13:57:52 UTC (rev 948)
+++ plog/trunk/js/htmlarea/lang/ja-utf8.js	2005-02-05 15:29:38 UTC (rev 949)
@@ -1,37 +1,37 @@
-// I18N constants -- Japanese UTF-8
-// by Manabu Onoue -- tmocsys at tmocsys.com
-
-HTMLArea.I18N = {
-
-	// the following should be the filename without .js extension
-	// it will be used for automatically load plugin language.
-	lang: "ja-utf8",
-
-	tooltips: {
-		bold:           "太字",
-		italic:         "斜体",
-		underline:      "下線",
-		strikethrough:  "打ち消し線",
-		subscript:      "下付き添え字",
-		superscript:    "上付き添え字",
-		justifyleft:    "左寄せ",
-		justifycenter:  "中央寄せ",
-		justifyright:   "右寄せ",
-		justifyfull:    "均等割付",
-		orderedlist:    "番号付き箇条書き",
-		unorderedlist:  "記号付き箇条書き",
-		outdent:        "インデント解除",
-		indent:         "インデント設定",
-		forecolor:      "文字色",
-		backcolor:      "背景色",
-		horizontalrule: "水平線",
-		createlink:     "リンク作成",
-		insertimage:    "画像挿入",
-		inserttable:    "テーブル挿入",
-		htmlmode:       "HTML表示切替",
-		popupeditor:    "エディタ拡大",
-		about:          "バージョン情報",
-		help:           "ヘルプ",
-		textindicator:  "現在のスタイル"
-	}
-};
+// I18N constants -- Japanese UTF-8
+// by Manabu Onoue -- tmocsys at tmocsys.com
+
+HTMLArea.I18N = {
+
+	// the following should be the filename without .js extension
+	// it will be used for automatically load plugin language.
+	lang: "ja-utf8",
+
+	tooltips: {
+		bold:           "太字",
+		italic:         "斜体",
+		underline:      "下線",
+		strikethrough:  "打ち消し線",
+		subscript:      "下付き添え字",
+		superscript:    "上付き添え字",
+		justifyleft:    "左寄せ",
+		justifycenter:  "中央寄せ",
+		justifyright:   "右寄せ",
+		justifyfull:    "均等割付",
+		orderedlist:    "番号付き箇条書き",
+		unorderedlist:  "記号付き箇条書き",
+		outdent:        "インデント解除",
+		indent:         "インデント設定",
+		forecolor:      "文字色",
+		backcolor:      "背景色",
+		horizontalrule: "水平線",
+		createlink:     "リンク作成",
+		insertimage:    "画像挿入",
+		inserttable:    "テーブル挿入",
+		htmlmode:       "HTML表示切替",
+		popupeditor:    "エディタ拡大",
+		about:          "バージョン情報",
+		help:           "ヘルプ",
+		textindicator:  "現在のスタイル"
+	}
+};

Modified: plog/trunk/js/htmlarea/lang/lt.js
===================================================================
--- plog/trunk/js/htmlarea/lang/lt.js	2005-02-05 13:57:52 UTC (rev 948)
+++ plog/trunk/js/htmlarea/lang/lt.js	2005-02-05 15:29:38 UTC (rev 949)
@@ -1,55 +1,77 @@
-// I18N constants
-
-// LANG: "lt", ENCODING: UTF-8
-// Author: Jaroslav Šatkevič, <jaro at akl.lt>
-
-
-HTMLArea.I18N = {
-
-	// the following should be the filename without .js extension
-	// it will be used for automatically load plugin language.
-	lang: "lt",
-
-	tooltips: {
-		bold:           "Paryškinti",
-		italic:         "Kursyvas",
-		underline:      "Pabraukti",
-		strikethrough:  "Perbraukti",
-		subscript:      "Apatinis indeksas",
-		superscript:    "Viršutinis indeksas",
-		justifyleft:    "Lygiavimas pagal kairÄ™",
-		justifycenter:  "Lygiavimas pagal centrÄ…",
-		justifyright:   "Lygiavimas pagal dešinę",
-		justifyfull:    "Lygiuoti pastraipÄ…",
-		orderedlist:    "Numeruotas sąrašas",
-		unorderedlist:  "Suženklintas sąrašas",
-		outdent:        "Sumažinti paraštę",
-		indent:         "Padidinti paraštę",
-		forecolor:      "Å rifto spalva",
-		hilitecolor:    "Fono spalva",
-		horizontalrule: "Horizontali linija",
-		createlink:     "Įterpti nuorodą",
-		insertimage:    "Įterpti paveiksliuką",
-		inserttable:    "Įterpti lentelę",
-		htmlmode:       "Perjungti į HTML/WYSIWYG",
-		popupeditor:    "IÅ¡plÄ—stas redagavimo ekranas/Enlarge Editor",
-		about:          "Apie redaktorių",
-		showhelp:       "Pagalba naudojant redaktorių",
-		textindicator:  "Dabartinis stilius",
-		undo:           "Atšaukia paskutini jūsų veiksmą",
-		redo:           "Pakartoja paskutinį atšauktą jūsų veiksmą",
-		cut:            "IÅ¡kirpti",
-		copy:           "Kopijuoti",
-		paste:          "Įterpti"
-	},
-
-	buttons: {
-		"ok":           "OK",
-		"cancel":       "Atšaukti"
-	},
-
-	msg: {
-		"Path":         "Kelias",
-		"TEXT_MODE":    "Jūs esete teksto režime.  Naudokite [<>] mygtuką grįžimui į WYSIWYG."
-	}
-};
+// I18N constants
+
+// LANG: "lt", ENCODING: UTF-8
+// Author: Jaroslav Šatkevič, <jaro at akl.lt>
+
+HTMLArea.I18N = {
+
+	// the following should be the filename without .js extension
+	// it will be used for automatically load plugin language.
+	lang: "en",
+
+	tooltips: {
+		bold:           "Paryškinti",
+		italic:         "Kursyvas",
+		underline:      "Pabraukti",
+		strikethrough:  "Perbraukti",
+		subscript:      "Apatinis indeksas",
+		superscript:    "Viršutinis indeksas",
+		justifyleft:    "Lygiavimas pagal kairÄ™",
+		justifycenter:  "Lygiavimas pagal centrÄ…",
+		justifyright:   "Lygiavimas pagal dešinę",
+		justifyfull:    "Lygiuoti pastraipÄ…",
+		orderedlist:    "Numeruotas sąrašas",
+		unorderedlist:  "Suženklintas sąrašas",
+		outdent:        "Sumažinti paraštę",
+		indent:         "Padidinti paraštę",
+		forecolor:      "Å rifto spalva",
+		hilitecolor:    "Fono spalva",
+		horizontalrule: "Horizontali linija",
+		createlink:     "Įterpti nuorodą",
+		insertimage:    "Įterpti paveiksliuką",
+		inserttable:    "Įterpti lentelę",
+		htmlmode:       "Perjungti į HTML/WYSIWYG",
+		popupeditor:    "IÅ¡plÄ—stas redagavimo ekranas/Enlarge Editor",
+		about:          "Apie redaktorių",
+		showhelp:       "Pagalba naudojant redaktorių",
+		textindicator:  "Dabartinis stilius",
+		undo:           "Atšaukia paskutini jūsų veiksmą",
+		redo:           "Pakartoja paskutinį atšauktą jūsų veiksmą",
+		cut:            "IÅ¡kirpti",
+		copy:           "Kopijuoti",
+		paste:          "Įterpti"
+},
+
+	buttons: {
+		"ok":           "OK",
+		"cancel":       "Atšaukti"
+	},
+
+	msg: {
+		"Path":         "Kelias",
+		"TEXT_MODE":    "Jūs esete teksto režime.  Naudokite [<>] mygtuką grįžimui į WYSIWYG.",
+
+		"IE-sucks-full-screen" :
+		// translate here
+		"The full screen mode is known to cause problems with Internet Explorer, " +
+		"due to browser bugs that we weren't able to workaround.  You might experience garbage " +
+		"display, lack of editor functions and/or random browser crashes.  If your system is Windows 9x " +
+		"it's very likely that you'll get a 'General Protection Fault' and need to reboot.\n\n" +
+		"You have been warned.  Please press OK if you still want to try the full screen editor."
+	},
+
+	dialogs: {
+		"Cancel"                                            : "Atšaukti",
+		"Insert/Modify Link"                                : "IdÄ—ti/Modifikuoti",
+		"New window (_blank)"                               : "Naujas langas (_blank)",
+		"None (use implicit)"                               : "None (use implicit)",
+		"OK"                                                : "OK",
+		"Other"                                             : "Kitas",
+		"Same frame (_self)"                                : "Same frame (_self)",
+		"Target:"                                           : "Target:",
+		"Title (tooltip):"                                  : "Pavadinimas (tooltip):",
+		"Top frame (_top)"                                  : "Top frame (_top)",
+		"URL:"                                              : "URL:",
+		"You must enter the URL where this link points to"  : "Jus privalote nurodyti URL į kuri rodo šitą nuoroda"
+	}
+};

Modified: plog/trunk/js/htmlarea/lang/lv.js
===================================================================
--- plog/trunk/js/htmlarea/lang/lv.js	2005-02-05 13:57:52 UTC (rev 948)
+++ plog/trunk/js/htmlarea/lang/lv.js	2005-02-05 15:29:38 UTC (rev 949)
@@ -1,55 +1,55 @@
-// I18N constants
-
-// LANG: "lv", ENCODING: UTF-8 | ISO-8859-1
-// Author: Mihai Bazon, http://dynarch.com/mishoo
-// Translated by: Janis Klavins, <janis.klavins at devia.lv>
-
-HTMLArea.I18N = {
-
-	// the following should be the filename without .js extension
-	// it will be used for automatically load plugin language.
-	lang: "lv",
-
-	tooltips: {
-		bold:           "Trekniem burtiem",
-		italic:         "Kursîvâ",
-		underline:      "Pasvîtrots",
-		strikethrough:  "Pârsvîtrots",
-		subscript:      "Novietot zem rindas",
-		superscript:    "Novietot virs rindas",
-		justifyleft:    "Izlîdzinât pa kreisi",
-		justifycenter:  "Izlîdzinât centrâ",
-		justifyright:   "Izlîdzinât pa labi",
-		justifyfull:    "Izlîdzinât pa visu lapu",
-		orderedlist:    "Numurçts saraksts",
-		unorderedlist:  "Saraksts",
-		outdent:        "Samazinât atkâpi",
-		indent:         "Palielinât atkâpi",
-		forecolor:      "Burtu krâsa",
-		hilitecolor:    "Fona krâsa",
-		horizontalrule: "Horizontâla atdalîtâjsvîtra",
-		createlink:     "Ievietot hipersaiti",
-		insertimage:    "Ievietot attçlu",
-		inserttable:    "Ievietot tabulu",
-		htmlmode:       "Skatît HTML kodu",
-		popupeditor:    "Palielinât Rediìçtâju",
-		about:          "Par ðo rediìçtâju",
-		showhelp:       "Rediìçtâja palîgs",
-		textindicator:  "Patreizçjais stils",
-		undo:           "Atcelt pçdçjo darbîbu",
-		redo:           "Atkârtot pçdçjo darbîbu",
-		cut:            "Izgriezt iezîmçto",
-		copy:           "Kopçt iezîmçto",
-		paste:          "Ievietot iezîmçto"
-	},
-
-	buttons: {
-		"ok":           "Labi",
-		"cancel":       "Atcelt"
-	},
-
-	msg: {
-		"Path":         "Ceïð",
-		"TEXT_MODE":    "Jûs patlaban darbojaties TEKSTA REÞÎMÂ. Lai pârietu atpakaï uz GRAFISKO REÞÎMU (WYSIWIG), lietojiet [<>] pogu."
-	}
-};
+// I18N constants
+
+// LANG: "lv", ENCODING: UTF-8 | ISO-8859-1
+// Author: Mihai Bazon, http://dynarch.com/mishoo
+// Translated by: Janis Klavins, <janis.klavins at devia.lv>
+
+HTMLArea.I18N = {
+
+	// the following should be the filename without .js extension
+	// it will be used for automatically load plugin language.
+	lang: "lv",
+
+	tooltips: {
+		bold:           "Trekniem burtiem",
+		italic:         "Kursîvâ",
+		underline:      "Pasvîtrots",
+		strikethrough:  "Pârsvîtrots",
+		subscript:      "Novietot zem rindas",
+		superscript:    "Novietot virs rindas",
+		justifyleft:    "Izlîdzinât pa kreisi",
+		justifycenter:  "Izlîdzinât centrâ",
+		justifyright:   "Izlîdzinât pa labi",
+		justifyfull:    "Izlîdzinât pa visu lapu",
+		orderedlist:    "Numurçts saraksts",
+		unorderedlist:  "Saraksts",
+		outdent:        "Samazinât atkâpi",
+		indent:         "Palielinât atkâpi",
+		forecolor:      "Burtu krâsa",
+		hilitecolor:    "Fona krâsa",
+		horizontalrule: "Horizontâla atdalîtâjsvîtra",
+		createlink:     "Ievietot hipersaiti",
+		insertimage:    "Ievietot attçlu",
+		inserttable:    "Ievietot tabulu",
+		htmlmode:       "Skatît HTML kodu",
+		popupeditor:    "Palielinât Rediìçtâju",
+		about:          "Par ðo rediìçtâju",
+		showhelp:       "Rediìçtâja palîgs",
+		textindicator:  "Patreizçjais stils",
+		undo:           "Atcelt pçdçjo darbîbu",
+		redo:           "Atkârtot pçdçjo darbîbu",
+		cut:            "Izgriezt iezîmçto",
+		copy:           "Kopçt iezîmçto",
+		paste:          "Ievietot iezîmçto"
+	},
+
+	buttons: {
+		"ok":           "Labi",
+		"cancel":       "Atcelt"
+	},
+
+	msg: {
+		"Path":         "Ceïð",
+		"TEXT_MODE":    "Jûs patlaban darbojaties TEKSTA REÞÎMÂ. Lai pârietu atpakaï uz GRAFISKO REÞÎMU (WYSIWIG), lietojiet [<>] pogu."
+	}
+};

Modified: plog/trunk/js/htmlarea/lang/nb.js
===================================================================
--- plog/trunk/js/htmlarea/lang/nb.js	2005-02-05 13:57:52 UTC (rev 948)
+++ plog/trunk/js/htmlarea/lang/nb.js	2005-02-05 15:29:38 UTC (rev 949)
@@ -1,36 +1,36 @@
-// I18N constants
-
-HTMLArea.I18N = {
-
-	// the following should be the filename without .js extension
-	// it will be used for automatically load plugin language.
-	lang: "nb",
-
-	tooltips: {
-		bold:           "Fet",
-		italic:         "Kursiv",
-		underline:      "Understreket",
-		strikethrough:  "Gjennomstreket",
-		subscript:      "Senket",
-		superscript:    "Hevet",
-		justifyleft:    "Venstrejuster",
-		justifycenter:  "Midtjuster",
-		justifyright:   "Høyrejuster",
-		justifyfull:    "Blokkjuster",
-		orderedlist:    "Nummerert liste",
-		unorderedlist:  "Punktmerket liste",
-		outdent:        "Øke innrykk",
-		indent:         "Reduser innrykk",
-		forecolor:      "Skriftfarge",
-		backcolor:      "Bakgrunnsfarge",
-		horizontalrule: "Horisontal linje",
-		createlink:     "Sett inn lenke",
-		insertimage:    "Sett inn bilde",
-		inserttable:    "Sett inn tabell",
-		htmlmode:       "Vis HTML kode",
-		popupeditor:    "Forstørr redigeringsvindu",
-		about:          "Om..",
-		help:           "Hjelp",
-		textindicator:  "Gjeldende stil"
-	}
-};
+// I18N constants
+
+HTMLArea.I18N = {
+
+	// the following should be the filename without .js extension
+	// it will be used for automatically load plugin language.
+	lang: "nb",
+
+	tooltips: {
+		bold:           "Fet",
+		italic:         "Kursiv",
+		underline:      "Understreket",
+		strikethrough:  "Gjennomstreket",
+		subscript:      "Senket",
+		superscript:    "Hevet",
+		justifyleft:    "Venstrejuster",
+		justifycenter:  "Midtjuster",
+		justifyright:   "Høyrejuster",
+		justifyfull:    "Blokkjuster",
+		orderedlist:    "Nummerert liste",
+		unorderedlist:  "Punktmerket liste",
+		outdent:        "Øke innrykk",
+		indent:         "Reduser innrykk",
+		forecolor:      "Skriftfarge",
+		backcolor:      "Bakgrunnsfarge",
+		horizontalrule: "Horisontal linje",
+		createlink:     "Sett inn lenke",
+		insertimage:    "Sett inn bilde",
+		inserttable:    "Sett inn tabell",
+		htmlmode:       "Vis HTML kode",
+		popupeditor:    "Forstørr redigeringsvindu",
+		about:          "Om..",
+		help:           "Hjelp",
+		textindicator:  "Gjeldende stil"
+	}
+};

Modified: plog/trunk/js/htmlarea/lang/nl.js
===================================================================
--- plog/trunk/js/htmlarea/lang/nl.js	2005-02-05 13:57:52 UTC (rev 948)
+++ plog/trunk/js/htmlarea/lang/nl.js	2005-02-05 15:29:38 UTC (rev 949)
@@ -1,90 +1,90 @@
-// I18N constants
-
-// LANG: "nl", ENCODING: UTF-8 | ISO-8859-1
-// Author: Michel Weegeerink (info at 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.)
-
-HTMLArea.I18N = {
-
-	// the following should be the filename without .js extension
-	// it will be used for automatically load plugin language.
-	lang: "nl",
-
-	tooltips: {
-		bold:					"Vet",
-		italic:					"Cursief",
-		underline:				"Onderstrepen",
-		strikethrough:			"Doorhalen",
-		subscript:				"Subscript",
-		superscript:			"Superscript",
-		justifyleft:			"Links uitlijnen",
-		justifycenter:			"Centreren",
-		justifyright:			"Rechts uitlijnen",
-		justifyfull:			"Uitvullen",
-		insertorderedlist:		"Nummering",
-		insertunorderedlist:	"Opsommingstekens",
-		outdent:				"Inspringing verkleinen",
-		indent:					"Inspringing vergroten",
-		forecolor:				"Tekstkleur",
-		hilitecolor:			"Achtergrondkleur",
-		inserthorizontalrule:	"Horizontale lijn",
-		createlink:				"Hyperlink invoegen/aanpassen",
-		insertimage:			"Afbeelding invoegen/aanpassen",
-		inserttable:			"Tabel invoegen",
-		htmlmode:				"HTML broncode",
-		popupeditor:			"Vergroot Editor",
-		about:					"Over deze editor",
-		showhelp:				"HTMLArea help",
-		textindicator:			"Huidige stijl",
-		undo:					"Ongedaan maken",
-		redo:					"Herhalen",
-		cut:					"Knippen",
-		copy:					"Kopiëren",
-		paste:					"Plakken",
-		lefttoright:			"Tekstrichting links naar rechts",
-		righttoleft:			"Tekstrichting rechts naar links"
-	},
-
-	buttons: {
-		"ok":					"OK",
-		"cancel":				"Annuleren"
-	},
-
-	msg: {
-		"Path":					"Pad",
-		"TEXT_MODE":			"Je bent in TEKST-mode. Gebruik de [<>] knop om terug te keren naar WYSIWYG-mode.",
-      
-		"IE-sucks-full-screen" :
-		// translate here
-		"Fullscreen-mode veroorzaakt problemen met Internet Explorer door bugs in de webbrowser " +
-		"die we niet kunnen omzeilen. Hierdoor kunnen de volgende effecten optreden: verknoeide teksten, " +
-		"een verlies aan editor-functionaliteit en/of willekeurig vastlopen van de webbrowser. " +
-		"Als u Windows 95 of 98 gebruikt, is het zeer waarschijnlijk dat u een algemene beschermingsfout " +
-		"('General Protection Fault') krijgt en de computer opnieuw zal moeten opstarten.\n\n" +
-		"U bent gewaarschuwd. Druk OK als u toch nog de Fullscreen-editor wil gebruiken."
-	},
-
-	dialogs: {
-		"Cancel"                                            : "Annuleren",
-		"Insert/Modify Link"                                : "Hyperlink invoegen/aanpassen",
-		"New window (_blank)"                               : "Nieuw venster (_blank)",
-		"None (use implicit)"                               : "Geen",
-		"OK"                                                : "OK",
-		"Other"                                             : "Ander",
-		"Same frame (_self)"                                : "Zelfde frame (_self)",
-		"Target:"                                           : "Doel:",
-		"Title (tooltip):"                                  : "Titel (tooltip):",
-		"Top frame (_top)"                                  : "Bovenste frame (_top)",
-		"URL:"                                              : "URL:",
-		"You must enter the URL where this link points to"  : "Geef de URL in waar de link naar verwijst"
-	}
-};
-
+// I18N constants
+
+// LANG: "nl", ENCODING: UTF-8 | ISO-8859-1
+// Author: Michel Weegeerink (info at 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.)
+
+HTMLArea.I18N = {
+
+	// the following should be the filename without .js extension
+	// it will be used for automatically load plugin language.
+	lang: "nl",
+
+	tooltips: {
+		bold:					"Vet",
+		italic:					"Cursief",
+		underline:				"Onderstrepen",
+		strikethrough:			"Doorhalen",
+		subscript:				"Subscript",
+		superscript:			"Superscript",
+		justifyleft:			"Links uitlijnen",
+		justifycenter:			"Centreren",
+		justifyright:			"Rechts uitlijnen",
+		justifyfull:			"Uitvullen",
+		orderedlist:		"Nummering",
+		unorderedlist:	"Opsommingstekens",
+		outdent:				"Inspringing verkleinen",
+		indent:					"Inspringing vergroten",
+		forecolor:				"Tekstkleur",
+		hilitecolor:			"Achtergrondkleur",
+		inserthorizontalrule:	"Horizontale lijn",
+		createlink:				"Hyperlink invoegen/aanpassen",
+		insertimage:			"Afbeelding invoegen/aanpassen",
+		inserttable:			"Tabel invoegen",
+		htmlmode:				"HTML broncode",
+		popupeditor:			"Vergroot Editor",
+		about:					"Over deze editor",
+		showhelp:				"HTMLArea help",
+		textindicator:			"Huidige stijl",
+		undo:					"Ongedaan maken",
+		redo:					"Herhalen",
+		cut:					"Knippen",
+		copy:					"Kopiëren",
+		paste:					"Plakken",
+		lefttoright:			"Tekstrichting links naar rechts",
+		righttoleft:			"Tekstrichting rechts naar links"
+	},
+
+	buttons: {
+		"ok":					"OK",
+		"cancel":				"Annuleren"
+	},
+
+	msg: {
+		"Path":					"Pad",
+		"TEXT_MODE":			"Je bent in TEKST-mode. Gebruik de [<>] knop om terug te keren naar WYSIWYG-mode.",
+      
+		"IE-sucks-full-screen" :
+		// translate here
+		"Fullscreen-mode veroorzaakt problemen met Internet Explorer door bugs in de webbrowser " +
+		"die we niet kunnen omzeilen. Hierdoor kunnen de volgende effecten optreden: verknoeide teksten, " +
+		"een verlies aan editor-functionaliteit en/of willekeurig vastlopen van de webbrowser. " +
+		"Als u Windows 95 of 98 gebruikt, is het zeer waarschijnlijk dat u een algemene beschermingsfout " +
+		"('General Protection Fault') krijgt en de computer opnieuw zal moeten opstarten.\n\n" +
+		"U bent gewaarschuwd. Druk OK als u toch nog de Fullscreen-editor wil gebruiken."
+	},
+
+	dialogs: {
+		"Cancel"                                            : "Annuleren",
+		"Insert/Modify Link"                                : "Hyperlink invoegen/aanpassen",
+		"New window (_blank)"                               : "Nieuw venster (_blank)",
+		"None (use implicit)"                               : "Geen",
+		"OK"                                                : "OK",
+		"Other"                                             : "Ander",
+		"Same frame (_self)"                                : "Zelfde frame (_self)",
+		"Target:"                                           : "Doel:",
+		"Title (tooltip):"                                  : "Titel (tooltip):",
+		"Top frame (_top)"                                  : "Bovenste frame (_top)",
+		"URL:"                                              : "URL:",
+		"You must enter the URL where this link points to"  : "Geef de URL in waar de link naar verwijst"
+	}
+};
+

Modified: plog/trunk/js/htmlarea/lang/no.js
===================================================================
--- plog/trunk/js/htmlarea/lang/no.js	2005-02-05 13:57:52 UTC (rev 948)
+++ plog/trunk/js/htmlarea/lang/no.js	2005-02-05 15:29:38 UTC (rev 949)
@@ -1,79 +1,79 @@
-// Norwegian version for htmlArea v3.0 - pre1
-// - translated by ses<ses at online.no>
-// Additional translations by Håvard Wigtil <havardw at extend.no>
-// term´s and licenses are equal to htmlarea!
-
-HTMLArea.I18N = {
-
-	// the following should be the filename without .js extension
-	// it will be used for automatically load plugin language.
-	lang: "no",
-
-	tooltips: {
-		bold:                 "Fet",
-		italic:               "Kursiv",
-		underline:            "Understreket",
-		strikethrough:        "Gjennomstreket",
-		subscript:            "Nedsenket",
-		superscript:          "Opphøyet",
-		justifyleft:          "Venstrejuster",
-		justifycenter:        "Midtjuster",
-		justifyright:         "Høyrejuster",
-		justifyfull:          "Blokkjuster",
-		insertorderedlist:    "Nummerert liste",
-		insertunorderedlist:  "Punktliste",
-		outdent:              "Reduser innrykk",
-		indent:               "Øke innrykk",
-		forecolor:            "Tekstfarge",
-		hilitecolor:          "Bakgrundsfarge",
-		inserthorizontalrule: "Vannrett linje",
-		createlink:           "Lag lenke",
-		insertimage:          "Sett inn bilde",
-		inserttable:          "Sett inn tabell",
-		htmlmode:             "Vis kildekode",
-		popupeditor:          "Vis i eget vindu",
-		about:                "Om denne editor",
-		showhelp:             "Hjelp",
-		textindicator:        "Nåværende stil",
-                undo:                 "Angrer siste redigering",
-		redo:                 "Gjør om siste angring",
-		cut:                  "Klipp ut område",
-		copy:                 "Kopier område",
-		paste:                "Lim inn",
-		lefttoright:          "Fra venstre mot høyre",
-		righttoleft:          "Fra høyre mot venstre"
-	},
-    
-	buttons: {
-		"ok":           "OK",
-		"cancel":       "Avbryt"
-	},
-
-	msg: {
-		"Path":         "Tekstvelger",
-		"TEXT_MODE":    "Du er i tekstmodus  Klikk på [<>] for å gå tilbake til WYSIWIG.",
-                "IE-sucks-full-screen" :
-		// translate here
-                "Visning i eget vindu har kjente problemer med Internet Explorer, " + 
-                "på grunn av problemer med denne nettleseren. Mulige problemer er et uryddig " + 
-                "skjermbilde, manglende editorfunksjoner og/eller at nettleseren crasher. Hvis du bruker Windows 95 eller Windows 98 " +
-                "er det også muligheter for at Windows will crashe.\n\n" +
-                "Trykk 'OK' hvis du vil bruke visning i eget vindu på tross av denne advarselen."
-	},
-
-	dialogs: {
-		"Cancel"                                            : "Avbryt",
-		"Insert/Modify Link"                                : "Rediger lenke",
-		"New window (_blank)"                               : "Eget vindu (_blank)",
-		"None (use implicit)"                               : "Ingen (bruk standardinnstilling)",
-		"OK"                                                : "OK",
-		"Other"                                             : "Annen",
-		"Same frame (_self)"                                : "Samme ramme (_self)",
-		"Target:"                                           : "Mål:",
-		"Title (tooltip):"                                  : "Tittel (tooltip):",
-		"Top frame (_top)"                                  : "Toppramme (_top)",
-		"URL:"                                              : "Adresse:",
-		"You must enter the URL where this link points to"  : "Du må skrive inn en adresse som denne lenken skal peke til"
-	}
-};
-
+// Norwegian version for htmlArea v3.0 - pre1
+// - translated by ses<ses at online.no>
+// Additional translations by Håvard Wigtil <havardw at extend.no>
+// term´s and licenses are equal to htmlarea!
+
+HTMLArea.I18N = {
+
+	// the following should be the filename without .js extension
+	// it will be used for automatically load plugin language.
+	lang: "no",
+
+	tooltips: {
+		bold:                 "Fet",
+		italic:               "Kursiv",
+		underline:            "Understreket",
+		strikethrough:        "Gjennomstreket",
+		subscript:            "Nedsenket",
+		superscript:          "Opphøyet",
+		justifyleft:          "Venstrejuster",
+		justifycenter:        "Midtjuster",
+		justifyright:         "Høyrejuster",
+		justifyfull:          "Blokkjuster",
+		orderedlist:    "Nummerert liste",
+		unorderedlist:  "Punktliste",
+		outdent:              "Reduser innrykk",
+		indent:               "Øke innrykk",
+		forecolor:            "Tekstfarge",
+		hilitecolor:          "Bakgrundsfarge",
+		inserthorizontalrule: "Vannrett linje",
+		createlink:           "Lag lenke",
+		insertimage:          "Sett inn bilde",
+		inserttable:          "Sett inn tabell",
+		htmlmode:             "Vis kildekode",
+		popupeditor:          "Vis i eget vindu",
+		about:                "Om denne editor",
+		showhelp:             "Hjelp",
+		textindicator:        "Nåværende stil",
+                undo:                 "Angrer siste redigering",
+		redo:                 "Gjør om siste angring",
+		cut:                  "Klipp ut område",
+		copy:                 "Kopier område",
+		paste:                "Lim inn",
+		lefttoright:          "Fra venstre mot høyre",
+		righttoleft:          "Fra høyre mot venstre"
+	},
+    
+	buttons: {
+		"ok":           "OK",
+		"cancel":       "Avbryt"
+	},
+
+	msg: {
+		"Path":         "Tekstvelger",
+		"TEXT_MODE":    "Du er i tekstmodus  Klikk på [<>] for å gå tilbake til WYSIWIG.",
+                "IE-sucks-full-screen" :
+		// translate here
+                "Visning i eget vindu har kjente problemer med Internet Explorer, " + 
+                "på grunn av problemer med denne nettleseren. Mulige problemer er et uryddig " + 
+                "skjermbilde, manglende editorfunksjoner og/eller at nettleseren crasher. Hvis du bruker Windows 95 eller Windows 98 " +
+                "er det også muligheter for at Windows will crashe.\n\n" +
+                "Trykk 'OK' hvis du vil bruke visning i eget vindu på tross av denne advarselen."
+	},
+
+	dialogs: {
+		"Cancel"                                            : "Avbryt",
+		"Insert/Modify Link"                                : "Rediger lenke",
+		"New window (_blank)"                               : "Eget vindu (_blank)",
+		"None (use implicit)"                               : "Ingen (bruk standardinnstilling)",
+		"OK"                                                : "OK",
+		"Other"                                             : "Annen",
+		"Same frame (_self)"                                : "Samme ramme (_self)",
+		"Target:"                                           : "Mål:",
+		"Title (tooltip):"                                  : "Tittel (tooltip):",
+		"Top frame (_top)"                                  : "Toppramme (_top)",
+		"URL:"                                              : "Adresse:",
+		"You must enter the URL where this link points to"  : "Du må skrive inn en adresse som denne lenken skal peke til"
+	}
+};
+

Modified: plog/trunk/js/htmlarea/lang/pl.js
===================================================================
--- plog/trunk/js/htmlarea/lang/pl.js	2005-02-05 13:57:52 UTC (rev 948)
+++ plog/trunk/js/htmlarea/lang/pl.js	2005-02-05 15:29:38 UTC (rev 949)
@@ -1,36 +1,36 @@
-// I18N constants
+// I18N constants
+
+HTMLArea.I18N = {
 
-HTMLArea.I18N = {
-
-	// the following should be the filename without .js extension
-	// it will be used for automatically load plugin language.
-	lang: "pl",
-
-	tooltips: {
-		bold:           "Pogrubienie",
-		italic:         "Pochylenie",
-		underline:      "Podkreœlenie",
-		strikethrough:  "Przekreœlenie",
-		subscript:      "Indeks dolny",
-		superscript:    "Indeks górny",
-		justifyleft:    "Wyrównaj do lewej",
-		justifycenter:  "Wyœrodkuj",
-		justifyright:   "Wyrównaj do prawej",
-		justifyfull:    "Wyjustuj",
-		orderedlist:    "Numerowanie",
-		unorderedlist:  "Wypunktowanie",
-		outdent:        "Zmniejsz wciêcie",
-		indent:         "Zwiêksz wciêcie",
-		forecolor:      "Kolor czcionki",
-		backcolor:      "Kolor t³a",
-		horizontalrule: "Linia pozioma",
-		createlink:     "Wstaw adres sieci Web",
-		insertimage:    "Wstaw obraz",
-		inserttable:    "Wstaw tabelê",
-		htmlmode:       "Edycja WYSIWYG/w Ÿródle strony",
-		popupeditor:    "Pe³ny ekran",
-		about:          "Informacje o tym edytorze",
-		help:           "Pomoc",
-		textindicator:  "Obecny styl"
-	}
-};
+	// the following should be the filename without .js extension
+	// it will be used for automatically load plugin language.
+	lang: "pl",
+
+	tooltips: {
+		bold:           "Pogrubienie",
+		italic:         "Pochylenie",
+		underline:      "Podkreœlenie",
+		strikethrough:  "Przekreœlenie",
+		subscript:      "Indeks dolny",
+		superscript:    "Indeks górny",
+		justifyleft:    "Wyrównaj do lewej",
+		justifycenter:  "Wyœrodkuj",
+		justifyright:   "Wyrównaj do prawej",
+		justifyfull:    "Wyjustuj",
+		orderedlist:    "Numerowanie",
+		unorderedlist:  "Wypunktowanie",
+		outdent:        "Zmniejsz wciêcie",
+		indent:         "Zwiêksz wciêcie",
+		forecolor:      "Kolor czcionki",
+		backcolor:      "Kolor t³a",
+		horizontalrule: "Linia pozioma",
+		createlink:     "Wstaw adres sieci Web",
+		insertimage:    "Wstaw obraz",
+		inserttable:    "Wstaw tabelê",
+		htmlmode:       "Edycja WYSIWYG/w Ÿródle strony",
+		popupeditor:    "Pe³ny ekran",
+		about:          "Informacje o tym edytorze",
+		help:           "Pomoc",
+		textindicator:  "Obecny styl"
+	}
+};

Modified: plog/trunk/js/htmlarea/lang/pt_br.js
===================================================================
--- plog/trunk/js/htmlarea/lang/pt_br.js	2005-02-05 13:57:52 UTC (rev 948)
+++ plog/trunk/js/htmlarea/lang/pt_br.js	2005-02-05 15:29:38 UTC (rev 949)
@@ -1,37 +1,37 @@
-// I18N constants
-// Brazilian Portuguese Translation by Alex Piaz <webmaster at globalmap.com>
+// I18N constants
+// Brazilian Portuguese Translation by Alex Piaz <webmaster at globalmap.com>
+
+HTMLArea.I18N = {
 
-HTMLArea.I18N = {
-
-	// the following should be the filename without .js extension
-	// it will be used for automatically load plugin language.
-	lang: "pt_br",
-
-	tooltips: {
-		bold:           "Negrito",
-		italic:         "Itálico",
-		underline:      "Sublinhado",
-		strikethrough:  "Tachado",
-		subscript:      "Subescrito",
-		superscript:    "Sobrescrito",
-		justifyleft:    "Alinhar à Esquerda",
-		justifycenter:  "Centralizar",
-		justifyright:   "Alinhar à Direita",
-		justifyfull:    "Justificar",
-		orderedlist:    "Lista Numerada",
-		unorderedlist:  "Lista Marcadores",
-		outdent:        "Diminuir Indentação",
-		indent:         "Aumentar Indentação",
-		forecolor:      "Cor da Fonte",
-		backcolor:      "Cor do Fundo",
-		horizontalrule: "Linha Horizontal",
-		createlink:     "Inserir Link",
-		insertimage:    "Inserir Imagem",
-		inserttable:    "Inserir Tabela",
-		htmlmode:       "Ver Código-Fonte",
-		popupeditor:    "Expandir Editor",
-		about:          "Sobre",
-		help:           "Ajuda",
-		textindicator:  "Estilo Atual"
-	}
-};
+	// the following should be the filename without .js extension
+	// it will be used for automatically load plugin language.
+	lang: "pt_br",
+
+	tooltips: {
+		bold:           "Negrito",
+		italic:         "Itálico",
+		underline:      "Sublinhado",
+		strikethrough:  "Tachado",
+		subscript:      "Subescrito",
+		superscript:    "Sobrescrito",
+		justifyleft:    "Alinhar à Esquerda",
+		justifycenter:  "Centralizar",
+		justifyright:   "Alinhar à Direita",
+		justifyfull:    "Justificar",
+		orderedlist:    "Lista Numerada",
+		unorderedlist:  "Lista Marcadores",
+		outdent:        "Diminuir Indentação",
+		indent:         "Aumentar Indentação",
+		forecolor:      "Cor da Fonte",
+		backcolor:      "Cor do Fundo",
+		horizontalrule: "Linha Horizontal",
+		createlink:     "Inserir Link",
+		insertimage:    "Inserir Imagem",
+		inserttable:    "Inserir Tabela",
+		htmlmode:       "Ver Código-Fonte",
+		popupeditor:    "Expandir Editor",
+		about:          "Sobre",
+		help:           "Ajuda",
+		textindicator:  "Estilo Atual"
+	}
+};

Modified: plog/trunk/js/htmlarea/lang/ro.js
===================================================================
--- plog/trunk/js/htmlarea/lang/ro.js	2005-02-05 13:57:52 UTC (rev 948)
+++ plog/trunk/js/htmlarea/lang/ro.js	2005-02-05 15:29:38 UTC (rev 949)
@@ -1,80 +1,80 @@
-// I18N constants
-
-// LANG: "ro", ENCODING: UTF-8
-// Author: Mihai Bazon, http://dynarch.com/mishoo
-
-// 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: "ro",
-
-	tooltips: {
-		bold:           "ÃŽngroÅŸat",
-		italic:         "Italic",
-		underline:      "Subliniat",
-		strikethrough:  "Tăiat",
-		subscript:      "Indice jos",
-		superscript:    "Indice sus",
-		justifyleft:    "Aliniere la stânga",
-		justifycenter:  "Aliniere pe centru",
-		justifyright:   "Aliniere la dreapta",
-		justifyfull:    "Aliniere în ambele părţi",
-		orderedlist:    "Listă ordonată",
-		unorderedlist:  "Listă marcată",
-		outdent:        "Micşorează alineatul",
-		indent:         "Măreşte alineatul",
-		forecolor:      "Culoarea textului",
-		hilitecolor:    "Culoare de fundal",
-		horizontalrule: "Linie orizontală",
-		createlink:     "Inserează/modifică link",
-		insertimage:    "Inserează/modifică imagine",
-		inserttable:    "Inserează un tabel",
-		htmlmode:       "Sursa HTML / WYSIWYG",
-		popupeditor:    "Maximizează editorul",
-		about:          "Despre editor",
-		showhelp:       "Documentaţie (devel)",
-		textindicator:  "Stilul curent",
-		undo:           "Anulează ultima acţiune",
-		redo:           "Reface ultima acţiune anulată",
-		cut:            "Taie în clipboard",
-		copy:           "Copie în clipboard",
-		paste:          "Aduce din clipboard",
-		lefttoright:    "Direcţia de scriere: stânga - dreapta",
-		righttoleft:    "Direcţia de scriere: dreapta - stânga"
-	},
-
-	buttons: {
-		"ok":           "OK",
-		"cancel":       "Anulează"
-	},
-
-	msg: {
-		"Path":         "Calea",
-		"TEXT_MODE":    "Eşti în modul TEXT.  Apasă butonul [<>] pentru a te întoarce în modul WYSIWYG."
-	},
-
-	dialogs: {
-		"Cancel"                                            : "Renunţă",
-		"Insert/Modify Link"                                : "Inserează/modifcă link",
-		"New window (_blank)"                               : "Fereastră nouă (_blank)",
-		"None (use implicit)"                               : "Nimic (foloseÅŸte ce-i implicit)",
-		"OK"                                                : "Acceptă",
-		"Other"                                             : "Alt target",
-		"Same frame (_self)"                                : "Aceeaşi fereastră (_self)",
-		"Target:"                                           : "Å¢inta:",
-		"Title (tooltip):"                                  : "Titlul (tooltip):",
-		"Top frame (_top)"                                  : "Fereastra principală (_top)",
-		"URL:"                                              : "URL:",
-		"You must enter the URL where this link points to"  : "Trebuie să introduceţi un URL"
-	}
-};
+// I18N constants
+
+// LANG: "ro", ENCODING: UTF-8
+// Author: Mihai Bazon, http://dynarch.com/mishoo
+
+// 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: "ro",
+
+	tooltips: {
+		bold:           "ÃŽngroÅŸat",
+		italic:         "Italic",
+		underline:      "Subliniat",
+		strikethrough:  "Tăiat",
+		subscript:      "Indice jos",
+		superscript:    "Indice sus",
+		justifyleft:    "Aliniere la stânga",
+		justifycenter:  "Aliniere pe centru",
+		justifyright:   "Aliniere la dreapta",
+		justifyfull:    "Aliniere în ambele părţi",
+		orderedlist:    "Listă ordonată",
+		unorderedlist:  "Listă marcată",
+		outdent:        "Micşorează alineatul",
+		indent:         "Măreşte alineatul",
+		forecolor:      "Culoarea textului",
+		hilitecolor:    "Culoare de fundal",
+		horizontalrule: "Linie orizontală",
+		createlink:     "Inserează/modifică link",
+		insertimage:    "Inserează/modifică imagine",
+		inserttable:    "Inserează un tabel",
+		htmlmode:       "Sursa HTML / WYSIWYG",
+		popupeditor:    "Maximizează editorul",
+		about:          "Despre editor",
+		showhelp:       "Documentaţie (devel)",
+		textindicator:  "Stilul curent",
+		undo:           "Anulează ultima acţiune",
+		redo:           "Reface ultima acţiune anulată",
+		cut:            "Taie în clipboard",
+		copy:           "Copie în clipboard",
+		paste:          "Aduce din clipboard",
+		lefttoright:    "Direcţia de scriere: stânga - dreapta",
+		righttoleft:    "Direcţia de scriere: dreapta - stânga"
+	},
+
+	buttons: {
+		"ok":           "OK",
+		"cancel":       "Anulează"
+	},
+
+	msg: {
+		"Path":         "Calea",
+		"TEXT_MODE":    "Eşti în modul TEXT.  Apasă butonul [<>] pentru a te întoarce în modul WYSIWYG."
+	},
+
+	dialogs: {
+		"Cancel"                                            : "Renunţă",
+		"Insert/Modify Link"                                : "Inserează/modifcă link",
+		"New window (_blank)"                               : "Fereastră nouă (_blank)",
+		"None (use implicit)"                               : "Nimic (foloseÅŸte ce-i implicit)",
+		"OK"                                                : "Acceptă",
+		"Other"                                             : "Alt target",
+		"Same frame (_self)"                                : "Aceeaşi fereastră (_self)",
+		"Target:"                                           : "Å¢inta:",
+		"Title (tooltip):"                                  : "Titlul (tooltip):",
+		"Top frame (_top)"                                  : "Fereastra principală (_top)",
+		"URL:"                                              : "URL:",
+		"You must enter the URL where this link points to"  : "Trebuie să introduceţi un URL"
+	}
+};

Modified: plog/trunk/js/htmlarea/lang/ru.js
===================================================================
--- plog/trunk/js/htmlarea/lang/ru.js	2005-02-05 13:57:52 UTC (rev 948)
+++ plog/trunk/js/htmlarea/lang/ru.js	2005-02-05 15:29:38 UTC (rev 949)
@@ -1,63 +1,63 @@
-// I18N constants
-
-// LANG: "ru", ENCODING: UTF-8 | ISO-8859-1
-// Author: Yulya Shtyryakova, <yulya at vdcom.ru>
-
-// 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: "ru",
-
-	tooltips: {
-		bold:           "Полужирный",
-		italic:         "Наклонный",
-		underline:      "Подчеркнутый",
-		strikethrough:  "Перечеркнутый",
-		subscript:      "Нижний индекс",
-		superscript:    "Верхний индекс",
-		justifyleft:    "По левому краю",
-		justifycenter:  "По центру",
-		justifyright:   "По правому краю",
-		justifyfull:    "По ширине",
-		insertorderedlist:    "Нумерованный лист",
-		insertunorderedlist:  "Маркированный лист",
-		outdent:        "Уменьшить отступ",
-		indent:         "Увеличить отступ",
-		forecolor:      "Цвет шрифта",
-		hilitecolor:    "Цвет фона",
-		horizontalrule: "Горизонтальный разделитель",
-		createlink:     "Вставить гиперссылку",
-		insertimage:    "Вставить изображение",
-		inserttable:    "Вставить таблицу",
-		htmlmode:       "Показать Html-код",
-		popupeditor:    "Увеличить редактор",
-		about:          "О редакторе",
-		showhelp:       "Помощь",
-		textindicator:  "Текущий стиль",
-		undo:           "Отменить",
-		redo:           "Повторить",
-		cut:            "Вырезать",
-		copy:           "Копировать",
-		paste:          "Вставить"
-	},
-
-	buttons: {
-		"ok":           "OK",
-		"cancel":       "Отмена"
-	},
-
-	msg: {
-		"Path":         "Путь",
-		"TEXT_MODE":    "Вы в режиме отображения Html-кода. нажмите кнопку [<>], чтобы переключиться в визуальный режим."
-	}
-};
+// I18N constants
+
+// LANG: "ru", ENCODING: UTF-8 | ISO-8859-1
+// Author: Yulya Shtyryakova, <yulya at vdcom.ru>
+
+// 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: "ru",
+
+	tooltips: {
+		bold:           "Полужирный",
+		italic:         "Наклонный",
+		underline:      "Подчеркнутый",
+		strikethrough:  "Перечеркнутый",
+		subscript:      "Нижний индекс",
+		superscript:    "Верхний индекс",
+		justifyleft:    "По левому краю",
+		justifycenter:  "По центру",
+		justifyright:   "По правому краю",
+		justifyfull:    "По ширине",
+		orderedlist:    "Нумерованный лист",
+		unorderedlist:  "Маркированный лист",
+		outdent:        "Уменьшить отступ",
+		indent:         "Увеличить отступ",
+		forecolor:      "Цвет шрифта",
+		hilitecolor:    "Цвет фона",
+		horizontalrule: "Горизонтальный разделитель",
+		createlink:     "Вставить гиперссылку",
+		insertimage:    "Вставить изображение",
+		inserttable:    "Вставить таблицу",
+		htmlmode:       "Показать Html-код",
+		popupeditor:    "Увеличить редактор",
+		about:          "О редакторе",
+		showhelp:       "Помощь",
+		textindicator:  "Текущий стиль",
+		undo:           "Отменить",
+		redo:           "Повторить",
+		cut:            "Вырезать",
+		copy:           "Копировать",
+		paste:          "Вставить"
+	},
+
+	buttons: {
+		"ok":           "OK",
+		"cancel":       "Отмена"
+	},
+
+	msg: {
+		"Path":         "Путь",
+		"TEXT_MODE":    "Вы в режиме отображения Html-кода. нажмите кнопку [<>], чтобы переключиться в визуальный режим."
+	}
+};

Modified: plog/trunk/js/htmlarea/lang/se.js
===================================================================
--- plog/trunk/js/htmlarea/lang/se.js	2005-02-05 13:57:52 UTC (rev 948)
+++ plog/trunk/js/htmlarea/lang/se.js	2005-02-05 15:29:38 UTC (rev 949)
@@ -1,38 +1,38 @@
-// Swedish version for htmlArea v3.0 - Alpha Release
-// - translated by pat<pat at engvall.nu>
-// term´s and licenses are equal to htmlarea!
+// Swedish version for htmlArea v3.0 - Alpha Release
+// - translated by pat<pat at engvall.nu>
+// term´s and licenses are equal to htmlarea!
+
+HTMLArea.I18N = {
 
-HTMLArea.I18N = {
-
-	// the following should be the filename without .js extension
-	// it will be used for automatically load plugin language.
-	lang: "se",
-
-	tooltips: {
-		bold:           "Fet",
-		italic:         "Kursiv",
-		underline:      "Understruken",
-		strikethrough:  "Genomstruken",
-		subscript:      "Nedsänkt",
-		superscript:    "Upphöjd",
-		justifyleft:    "Vänsterjustera",
-		justifycenter:  "Centrera",
-		justifyright:   "Högerjustera",
-		justifyfull:    "Marginaljustera",
-		orderedlist:    "Numrerad lista",
-		unorderedlist:  "Punktlista",
-		outdent:        "Minska indrag",
-		indent:         "Öka indrag",
-		forecolor:      "Textfärg",
-		backcolor:      "Bakgrundsfärg",
-		horizontalrule: "Vågrät linje",
-		createlink:     "Infoga länk",
-		insertimage:    "Infoga bild",
-		inserttable:    "Infoga tabell",
-		htmlmode:       "Visa källkod",
-		popupeditor:    "Visa i eget fönster",
-		about:          "Om denna editor",
-		help:           "Hjälp",
-		textindicator:  "Nuvarande stil"
-	}
-};
+	// the following should be the filename without .js extension
+	// it will be used for automatically load plugin language.
+	lang: "se",
+
+	tooltips: {
+		bold:           "Fet",
+		italic:         "Kursiv",
+		underline:      "Understruken",
+		strikethrough:  "Genomstruken",
+		subscript:      "Nedsänkt",
+		superscript:    "Upphöjd",
+		justifyleft:    "Vänsterjustera",
+		justifycenter:  "Centrera",
+		justifyright:   "Högerjustera",
+		justifyfull:    "Marginaljustera",
+		orderedlist:    "Numrerad lista",
+		unorderedlist:  "Punktlista",
+		outdent:        "Minska indrag",
+		indent:         "Öka indrag",
+		forecolor:      "Textfärg",
+		backcolor:      "Bakgrundsfärg",
+		horizontalrule: "Vågrät linje",
+		createlink:     "Infoga länk",
+		insertimage:    "Infoga bild",
+		inserttable:    "Infoga tabell",
+		htmlmode:       "Visa källkod",
+		popupeditor:    "Visa i eget fönster",
+		about:          "Om denna editor",
+		help:           "Hjälp",
+		textindicator:  "Nuvarande stil"
+	}
+};

Modified: plog/trunk/js/htmlarea/lang/si.js
===================================================================
--- plog/trunk/js/htmlarea/lang/si.js	2005-02-05 13:57:52 UTC (rev 948)
+++ plog/trunk/js/htmlarea/lang/si.js	2005-02-05 15:29:38 UTC (rev 949)
@@ -1,63 +1,63 @@
-// I18N constants
-
-// LANG: "si", ENCODING: ISO-8859-2
-// Author: Tomaz Kregar, x_tomo_x at email.si
-
-// 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: "si",
-
-	tooltips: {
-		bold:           "Krepko",
-		italic:         "Le¾eèe",
-		underline:      "Podèrtano",
-		strikethrough:  "Preèrtano",
-		subscript:      "Podpisano",
-		superscript:    "Nadpisano",
-		justifyleft:    "Poravnaj levo",
-		justifycenter:  "Na sredino",
-		justifyright:   "Poravnaj desno",
-		justifyfull:    "Porazdeli vsebino",
-		orderedlist:    "O¹tevilèevanje",
-		unorderedlist:  "Oznaèevanje",
-		outdent:        "Zmanj¹aj zamik",
-		indent:         "Poveèaj zamik",
-		forecolor:      "Barva pisave",
-		hilitecolor:    "Barva ozadja",
-		horizontalrule: "Vodoravna èrta",
-		createlink:     "Vstavi hiperpovezavo",
-		insertimage:    "Vstavi sliko",
-		inserttable:    "Vstavi tabelo",
-		htmlmode:       "Preklopi na HTML kodo",
-		popupeditor:    "Poveèaj urejevalnik",
-		about:          "Vizitka za urejevalnik",
-		showhelp:       "Pomoè za urejevalnik",
-		textindicator:  "Trenutni slog",
-		undo:           "Razveljavi zadnjo akcijo",
-		redo:           "Uveljavi zadnjo akcijo",
-		cut:            "Izre¾i",
-		copy:           "Kopiraj",
-		paste:          "Prilepi"
-	},
-
-	buttons: {
-		"ok":           "V redu",
-		"cancel":       "Preklièi"
-	},
-
-	msg: {
-		"Path":         "Pot",
-		"TEXT_MODE":    "Si v tekstovnem naèinu.  Uporabi [<>] gumb za prklop nazaj na WYSIWYG."
-	}
-};
+// I18N constants
+
+// LANG: "si", ENCODING: ISO-8859-2
+// Author: Tomaz Kregar, x_tomo_x at email.si
+
+// 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: "si",
+
+	tooltips: {
+		bold:           "Krepko",
+		italic:         "Le¾eèe",
+		underline:      "Podèrtano",
+		strikethrough:  "Preèrtano",
+		subscript:      "Podpisano",
+		superscript:    "Nadpisano",
+		justifyleft:    "Poravnaj levo",
+		justifycenter:  "Na sredino",
+		justifyright:   "Poravnaj desno",
+		justifyfull:    "Porazdeli vsebino",
+		orderedlist:    "O¹tevilèevanje",
+		unorderedlist:  "Oznaèevanje",
+		outdent:        "Zmanj¹aj zamik",
+		indent:         "Poveèaj zamik",
+		forecolor:      "Barva pisave",
+		hilitecolor:    "Barva ozadja",
+		horizontalrule: "Vodoravna èrta",
+		createlink:     "Vstavi hiperpovezavo",
+		insertimage:    "Vstavi sliko",
+		inserttable:    "Vstavi tabelo",
+		htmlmode:       "Preklopi na HTML kodo",
+		popupeditor:    "Poveèaj urejevalnik",
+		about:          "Vizitka za urejevalnik",
+		showhelp:       "Pomoè za urejevalnik",
+		textindicator:  "Trenutni slog",
+		undo:           "Razveljavi zadnjo akcijo",
+		redo:           "Uveljavi zadnjo akcijo",
+		cut:            "Izre¾i",
+		copy:           "Kopiraj",
+		paste:          "Prilepi"
+	},
+
+	buttons: {
+		"ok":           "V redu",
+		"cancel":       "Preklièi"
+	},
+
+	msg: {
+		"Path":         "Pot",
+		"TEXT_MODE":    "Si v tekstovnem naèinu.  Uporabi [<>] gumb za prklop nazaj na WYSIWYG."
+	}
+};

Modified: plog/trunk/js/htmlarea/lang/vn.js
===================================================================
--- plog/trunk/js/htmlarea/lang/vn.js	2005-02-05 13:57:52 UTC (rev 948)
+++ plog/trunk/js/htmlarea/lang/vn.js	2005-02-05 15:29:38 UTC (rev 949)
@@ -1,51 +1,77 @@
-// I18N constants : Vietnamese
-// LANG: "en", ENCODING: UTF-8
-// Author: Nguyễn Đình Nam, <hncryptologist at yahoo.com>
-
-HTMLArea.I18N = {
-
-	// the following should be the filename without .js extension
-	// it will be used for automatically load plugin language.
-	lang: "vn",
-
-	tooltips: {
-		bold:           "Đậm",
-		italic:         "Nghiêng",
-		underline:      "Gạch Chân",
-		strikethrough:  "Gạch Xóa",
-		subscript:      "Viết Xuống Dưới",
-		superscript:    "Viết Lên Trên",
-		justifyleft:    "Căn Trái",
-		justifycenter:  "Căn Giữa",
-		justifyright:   "Căn Phải",
-		justifyfull:    "Căn Đều",
-		orderedlist:    "Danh Sách Có Thứ Tự",
-		unorderedlist:  "Danh Sách Phi Thứ Tự",
-		outdent:        "Lùi Ra Ngoài",
-		indent:         "Thụt Vào Trong",
-		forecolor:      "Màu Chữ",
-		backcolor:      "Màu Nền",
-		horizontalrule: "Dòng Kẻ Ngang",
-		createlink:     "Tạo Liên Kết",
-		insertimage:    "Chèn Ảnh",
-		inserttable:    "Chèn Bảng",
-		htmlmode:       "Chế Độ Mã HTML",
-		popupeditor:    "Phóng To Ô Soạn Thảo",
-		about:          "Tự Giới Thiệu",
-		showhelp:       "Giúp Đỡ",
-		textindicator:  "Định Dạng Hiện Thời",
-		undo:           "Undo",
-		redo:           "Redo",
-		cut:            "Cắt",
-		copy:           "Copy",
-		paste:          "Dán"
-	},
-	buttons: {
-		"ok":           "OK",
-		"cancel":       "Hủy"
-	},
-	msg: {
-		"Path":         "Đường Dẫn",
-		"TEXT_MODE":    "Bạn đang ở chế độ text.  Sử dụng nút [<>] để chuyển lại chế độ WYSIWIG."
-	}
-};
+// I18N constants : Vietnamese
+// LANG: "en", ENCODING: UTF-8
+// Author: Nguyễn Đình Nam, <hncryptologist at yahoo.com>
+// Modified 21/07/2004 by Phạm Mai Quân <pmquan at 4vn.org>
+
+HTMLArea.I18N = {
+
+  // the following should be the filename without .js extension
+  // it will be used for automatically load plugin language.
+  lang: "vn",
+
+  tooltips: {
+    bold:           "Đậm",
+    italic:         "Nghiêng",
+    underline:      "Gạch Chân",
+    strikethrough:  "Gạch Xóa",
+    subscript:      "Viết Xuống Dưới",
+    superscript:    "Viết Lên Trên",
+    justifyleft:    "Căn Trái",
+    justifycenter:  "Căn Giữa",
+    justifyright:   "Căn Phải",
+    justifyfull:    "Căn Đều",
+    insertorderedlist:    "Danh Sách Có Thứ Tự (1, 2, 3)",
+    insertunorderedlist:  "Danh Sách Phi Thứ Tự (Chấm đầu dòng)",
+    outdent:        "Lùi Ra Ngoài",
+    indent:         "Thụt Vào Trong",
+    forecolor:      "Màu Chữ",
+    hilitecolor:    "Màu Nền",
+    inserthorizontalrule: "Dòng Kẻ Ngang",
+    createlink:     "Tạo Liên Kết",
+    insertimage:    "Chèn Ảnh",
+    inserttable:    "Chèn Bảng",
+    htmlmode:       "Chế Độ Mã HTML",
+    popupeditor:    "Phóng To Ô Soạn Thảo",
+    about:          "Tự Giới Thiệu",
+    showhelp:       "Giúp Đỡ",
+    textindicator:  "Định Dạng Hiện Thời",
+    undo:           "Hủy thao tác trước",
+    redo:           "Lấy lại thao tác vừa bỏ",
+    cut:            "Cắt",
+    copy:           "Sao chép",
+    paste:          "Dán",
+    lefttoright:    "Viết từ trái sang phải",
+    righttoleft:    "Viết từ phải sang trái"
+  },
+  buttons: {
+    "ok":           "Đồng ý",
+    "cancel":       "Hủy",
+
+    "IE-sucks-full-screen" :
+    // translate here
+    "Chế độ phóng to ô soạn thảo có thể gây lỗi với Internet Explorer vì một số lỗi của trình duyệt này," +
+    " vì thế chế độ này có thể sẽ không chạy. Hiển thị không đúng, lộn xộn, không có đầy đủ chức năng," +
+    " và cũng có thể làm trình duyệt của bạn bị tắt ngang. Nếu bạn đang sử dụng Windows 9x " +
+    "bạn có thể bị báo lỗi 'General Protection Fault' và máy tính của bạn buộc phải khởi động lại.\n\n" +
+    "Chúng tôi đã cảnh báo bạn. Nhấn nút 'Đồng ý' nếu bạn vẫn muốn sử dụng tính năng này."
+  },
+  msg: {
+    "Path":         "Đường Dẫn",
+    "TEXT_MODE":    "Bạn đang ở chế độ text.  Sử dụng nút [<>] để chuyển lại chế độ WYSIWIG."
+  },
+
+  dialogs: {
+    "Cancel"                                            : "Hủy",
+    "Insert/Modify Link"                                : "Thêm/Chỉnh sửa đường dẫn",
+    "New window (_blank)"                               : "Cửa sổ mới (_blank)",
+    "None (use implicit)"                               : "Không (sử dụng implicit)",
+    "OK"                                                : "Đồng ý",
+    "Other"                                             : "Khác",
+    "Same frame (_self)"                                : "Trên cùng khung (_self)",
+    "Target:"                                           : "Nơi hiện thị:",
+    "Title (tooltip):"                                  : "Tiêu đề (của hướng dẫn):",
+    "Top frame (_top)"                                  : "Khung trên cùng (_top)",
+    "URL:"                                              : "URL:",
+    "You must enter the URL where this link points to"  : "Bạn phải điền địa chỉ (URL) mà đường dẫn sẽ liên kết tới"
+  }
+};

Deleted: plog/trunk/js/htmlarea/license.txt
===================================================================
--- plog/trunk/js/htmlarea/license.txt	2005-02-05 13:57:52 UTC (rev 948)
+++ plog/trunk/js/htmlarea/license.txt	2005-02-05 15:29:38 UTC (rev 949)
@@ -1,30 +0,0 @@
-htmlArea License (based on BSD license)
-Copyright (c) 2002-2004, interactivetools.com, inc.
-Copyright (c) 2003-2004 dynarch.com
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-1) Redistributions of source code must retain the above copyright notice,
-   this list of conditions and the following disclaimer.
-
-2) Redistributions in binary form must reproduce the above copyright notice,
-   this list of conditions and the following disclaimer in the documentation
-   and/or other materials provided with the distribution.
-
-3) Neither the name of interactivetools.com, inc. nor the names of its
-   contributors may be used to endorse or promote products derived from this
-   software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
-LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGE.

Modified: plog/trunk/js/htmlarea/plugins/CSS/css.js
===================================================================
--- plog/trunk/js/htmlarea/plugins/CSS/css.js	2005-02-05 13:57:52 UTC (rev 948)
+++ plog/trunk/js/htmlarea/plugins/CSS/css.js	2005-02-05 15:29:38 UTC (rev 949)
@@ -1,116 +1,116 @@
-// Simple CSS (className) plugin for the editor
-// Sponsored by http://www.miro.com.au
-// Implementation by Mihai Bazon, http://dynarch.com/mishoo.
-//
-// (c) dynarch.com 2003
-// Distributed under the same terms as HTMLArea itself.
-// This notice MUST stay intact for use (see license.txt).
-//
-// $Id: css.js,v 1.4 2003/11/24 01:34:33 mishoo Exp $
-
-function CSS(editor, params) {
-	this.editor = editor;
-	var cfg = editor.config;
-	var toolbar = cfg.toolbar;
-	var self = this;
-	var i18n = CSS.I18N;
-	var plugin_config = params[0];
-	var combos = plugin_config.combos;
-
-	var first = true;
-	for (var i = combos.length; --i >= 0;) {
-		var combo = combos[i];
-		var id = "CSS-class" + i;
-		var css_class = {
-			id         : id,
-			options    : combo.options,
-			action     : function(editor) { self.onSelect(editor, this, combo.context, combo.updatecontextclass); },
-			refresh    : function(editor) { self.updateValue(editor, this); },
-			context    : combo.context
-		};
-		cfg.registerDropdown(css_class);
-
-		// prepend to the toolbar
-		toolbar[1].splice(0, 0, first ? "separator" : "space");
-		toolbar[1].splice(0, 0, id);
-		if (combo.label)
-			toolbar[1].splice(0, 0, "T[" + combo.label + "]");
-		first = false;
-	}
-};
-
-CSS._pluginInfo = {
-	name          : "CSS",
-	version       : "1.0",
-	developer     : "Mihai Bazon",
-	developer_url : "http://dynarch.com/mishoo/",
-	c_owner       : "Mihai Bazon",
-	sponsor       : "Miro International",
-	sponsor_url   : "http://www.miro.com.au",
-	license       : "htmlArea"
-};
-
-CSS.prototype.onSelect = function(editor, obj, context, updatecontextclass) {
-	var tbobj = editor._toolbarObjects[obj.id];
-	var index = tbobj.element.selectedIndex;
-	var className = tbobj.element.value;
-
-	// retrieve parent element of the selection
-	var parent = editor.getParentElement();
-	var surround = true;
-
-	var is_span = (parent && parent.tagName.toLowerCase() == "span");
-	var update_parent = (context && updatecontextclass && parent && parent.tagName.toLowerCase() == context);
-
-	if (update_parent) {
-		parent.className = className;
-		editor.updateToolbar();
-		return;
-	}
-
-	if (is_span && index == 0 && !/\S/.test(parent.style.cssText)) {
-		while (parent.firstChild) {
-			parent.parentNode.insertBefore(parent.firstChild, parent);
-		}
-		parent.parentNode.removeChild(parent);
-		editor.updateToolbar();
-		return;
-	}
-
-	if (is_span) {
-		// maybe we could simply change the class of the parent node?
-		if (parent.childNodes.length == 1) {
-			parent.className = className;
-			surround = false;
-			// in this case we should handle the toolbar updation
-			// ourselves.
-			editor.updateToolbar();
-		}
-	}
-
-	// Other possibilities could be checked but require a lot of code.  We
-	// can't afford to do that now.
-	if (surround) {
-		// shit happens ;-) most of the time.  this method works, but
-		// it's dangerous when selection spans multiple block-level
-		// elements.
-		editor.surroundHTML("<span class='" + className + "'>", "</span>");
-	}
-};
-
-CSS.prototype.updateValue = function(editor, obj) {
-	var select = editor._toolbarObjects[obj.id].element;
-	var parent = editor.getParentElement();
-	if (typeof parent.className != "undefined" && /\S/.test(parent.className)) {
-		var options = select.options;
-		var value = parent.className;
-		for (var i = options.length; --i >= 0;) {
-			var option = options[i];
-			if (value == option.value) {
-				select.selectedIndex = i;
-				return;
-			}
-		}
-	}
-	select.selectedIndex = 0;
-};
+// Simple CSS (className) plugin for the editor
+// Sponsored by http://www.miro.com.au
+// Implementation by Mihai Bazon, http://dynarch.com/mishoo.
+//
+// (c) dynarch.com 2003-2005.
+// Distributed under the same terms as HTMLArea itself.
+// This notice MUST stay intact for use (see license.txt).
+//
+// $Id: css.js,v 1.5 2005/01/20 17:49:03 mishoo Exp $
+
+function CSS(editor, params) {
+	this.editor = editor;
+	var cfg = editor.config;
+	var toolbar = cfg.toolbar;
+	var self = this;
+	var i18n = CSS.I18N;
+	var plugin_config = params[0];
+	var combos = plugin_config.combos;
+
+	var first = true;
+	for (var i = combos.length; --i >= 0;) {
+		var combo = combos[i];
+		var id = "CSS-class" + i;
+		var css_class = {
+			id         : id,
+			options    : combo.options,
+			action     : function(editor) { self.onSelect(editor, this, combo.context, combo.updatecontextclass); },
+			refresh    : function(editor) { self.updateValue(editor, this); },
+			context    : combo.context
+		};
+		cfg.registerDropdown(css_class);
+
+		// prepend to the toolbar
+		toolbar[1].splice(0, 0, first ? "separator" : "space");
+		toolbar[1].splice(0, 0, id);
+		if (combo.label)
+			toolbar[1].splice(0, 0, "T[" + combo.label + "]");
+		first = false;
+	}
+};
+
+CSS._pluginInfo = {
+	name          : "CSS",
+	version       : "1.0",
+	developer     : "Mihai Bazon",
+	developer_url : "http://dynarch.com/mishoo/",
+	c_owner       : "Mihai Bazon",
+	sponsor       : "Miro International",
+	sponsor_url   : "http://www.miro.com.au",
+	license       : "htmlArea"
+};
+
+CSS.prototype.onSelect = function(editor, obj, context, updatecontextclass) {
+	var tbobj = editor._toolbarObjects[obj.id];
+	var index = tbobj.element.selectedIndex;
+	var className = tbobj.element.value;
+
+	// retrieve parent element of the selection
+	var parent = editor.getParentElement();
+	var surround = true;
+
+	var is_span = (parent && parent.tagName.toLowerCase() == "span");
+	var update_parent = (context && updatecontextclass && parent && parent.tagName.toLowerCase() == context);
+
+	if (update_parent) {
+		parent.className = className;
+		editor.updateToolbar();
+		return;
+	}
+
+	if (is_span && index == 0 && !/\S/.test(parent.style.cssText)) {
+		while (parent.firstChild) {
+			parent.parentNode.insertBefore(parent.firstChild, parent);
+		}
+		parent.parentNode.removeChild(parent);
+		editor.updateToolbar();
+		return;
+	}
+
+	if (is_span) {
+		// maybe we could simply change the class of the parent node?
+		if (parent.childNodes.length == 1) {
+			parent.className = className;
+			surround = false;
+			// in this case we should handle the toolbar updation
+			// ourselves.
+			editor.updateToolbar();
+		}
+	}
+
+	// Other possibilities could be checked but require a lot of code.  We
+	// can't afford to do that now.
+	if (surround) {
+		// shit happens ;-) most of the time.  this method works, but
+		// it's dangerous when selection spans multiple block-level
+		// elements.
+		editor.surroundHTML("<span class='" + className + "'>", "</span>");
+	}
+};
+
+CSS.prototype.updateValue = function(editor, obj) {
+	var select = editor._toolbarObjects[obj.id].element;
+	var parent = editor.getParentElement();
+	if (typeof parent.className != "undefined" && /\S/.test(parent.className)) {
+		var options = select.options;
+		var value = parent.className;
+		for (var i = options.length; --i >= 0;) {
+			var option = options[i];
+			if (value == option.value) {
+				select.selectedIndex = i;
+				return;
+			}
+		}
+	}
+	select.selectedIndex = 0;
+};

Modified: plog/trunk/js/htmlarea/plugins/CSS/lang/en.js
===================================================================
--- plog/trunk/js/htmlarea/plugins/CSS/lang/en.js	2005-02-05 13:57:52 UTC (rev 948)
+++ plog/trunk/js/htmlarea/plugins/CSS/lang/en.js	2005-02-05 15:29:38 UTC (rev 949)
@@ -1,2 +1,2 @@
-// none yet; this file is a stub.
-CSS.I18N = {};
+// none yet; this file is a stub.
+CSS.I18N = {};

Added: plog/trunk/js/htmlarea/plugins/CharacterMap/character-map.js
===================================================================
--- plog/trunk/js/htmlarea/plugins/CharacterMap/character-map.js	2005-02-05 13:57:52 UTC (rev 948)
+++ plog/trunk/js/htmlarea/plugins/CharacterMap/character-map.js	2005-02-05 15:29:38 UTC (rev 949)
@@ -0,0 +1,70 @@
+// Character Map plugin for HTMLArea
+// Sponsored by http://www.systemconcept.de
+// Implementation by Holger Hees based on HTMLArea XTD 1.5 (http://mosforge.net/projects/htmlarea3xtd/)
+// Original Author - Bernhard Pfeifer novocaine at gmx.net 
+//
+// (c) systemconcept.de 2004
+// Distributed under the same terms as HTMLArea itself.
+// This notice MUST stay intact for use (see license.txt).
+
+function CharacterMap(editor) {
+        this.editor = editor;
+	        
+        var cfg = editor.config;
+	var toolbar = cfg.toolbar;
+	var self = this;
+	var i18n = CharacterMap.I18N;
+        
+	cfg.registerButton({
+                id       : "insertcharacter",
+                tooltip  : i18n["CharacterMapTooltip"],
+                image    : editor.imgURL("ed_charmap.gif", "CharacterMap"),
+                textMode : false,
+                action   : function(editor) {
+                                self.buttonPress(editor);
+                           }
+            })
+
+	var a, i, j, found = false;
+	for (i = 0; !found && i < toolbar.length; ++i) {
+		a = toolbar[i];
+		for (j = 0; j < a.length; ++j) {
+			if (a[j] == "inserthorizontalrule") {
+				found = true;
+				break;
+			}
+		}
+	}
+	if (found)
+	    a.splice(j, 0, "insertcharacter");
+        else{                
+            toolbar[1].splice(0, 0, "separator");
+	    toolbar[1].splice(0, 0, "insertcharacter");
+        }
+};
+
+CharacterMap._pluginInfo = {
+	name          : "CharacterMap",
+	version       : "1.0",
+	developer     : "Holger Hees & Bernhard Pfeifer",
+	developer_url : "http://www.systemconcept.de/",
+	c_owner       : "Holger Hees & Bernhard Pfeifer",
+	sponsor       : "System Concept GmbH & Bernhard Pfeifer",
+	sponsor_url   : "http://www.systemconcept.de/",
+	license       : "htmlArea"
+};
+
+CharacterMap.prototype.buttonPress = function(editor) {
+    editor._popupDialog( "plugin://CharacterMap/select_character", function( entity ) 
+    {
+        if ( !entity ) 
+        {  
+            //user must have pressed Cancel
+            return false;
+        }
+        
+        editor.insertHTML( entity );
+               
+    }, null);
+}
+

Added: plog/trunk/js/htmlarea/plugins/CharacterMap/img/ed_charmap.gif
===================================================================
(Binary files differ)


Property changes on: plog/trunk/js/htmlarea/plugins/CharacterMap/img/ed_charmap.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: plog/trunk/js/htmlarea/plugins/CharacterMap/lang/de.js
===================================================================
--- plog/trunk/js/htmlarea/plugins/CharacterMap/lang/de.js	2005-02-05 13:57:52 UTC (rev 948)
+++ plog/trunk/js/htmlarea/plugins/CharacterMap/lang/de.js	2005-02-05 15:29:38 UTC (rev 949)
@@ -0,0 +1,16 @@
+// I18N constants
+
+// LANG: "de", ENCODING: UTF-8 | ISO-8859-1
+// Sponsored by http://www.systemconcept.de
+// Author: Holger Hees, <hhees at systemconcept.de>
+//
+// (c) systemconcept.de 2004
+// Distributed under the same terms as HTMLArea itself.
+// This notice MUST stay intact for use (see license.txt).
+
+CharacterMap.I18N = {
+	"CharacterMapTooltip"       : "Sonderzeichen einfügen",
+	"Insert special character"  : "Sonderzeichen einfügen",
+	"HTML value:"               : "HTML Wert:",
+	"Cancel"                    : "Abbrechen"
+};

Added: plog/trunk/js/htmlarea/plugins/CharacterMap/lang/en.js
===================================================================
--- plog/trunk/js/htmlarea/plugins/CharacterMap/lang/en.js	2005-02-05 13:57:52 UTC (rev 948)
+++ plog/trunk/js/htmlarea/plugins/CharacterMap/lang/en.js	2005-02-05 15:29:38 UTC (rev 949)
@@ -0,0 +1,16 @@
+// I18N constants
+
+// LANG: "en", ENCODING: UTF-8 | ISO-8859-1
+// Sponsored by http://www.systemconcept.de
+// Author: Holger Hees, <hhees at systemconcept.de>
+//
+// (c) systemconcept.de 2004
+// Distributed under the same terms as HTMLArea itself.
+// This notice MUST stay intact for use (see license.txt).
+
+CharacterMap.I18N = {
+	"CharacterMapTooltip"       : "Insert special character",
+	"Insert special character"  : "Insert special character",
+	"HTML value:"               : "HTML value:",
+	"Cancel"                    : "Cancel"
+};

Added: plog/trunk/js/htmlarea/plugins/CharacterMap/popups/select_character.html
===================================================================
--- plog/trunk/js/htmlarea/plugins/CharacterMap/popups/select_character.html	2005-02-05 13:57:52 UTC (rev 948)
+++ plog/trunk/js/htmlarea/plugins/CharacterMap/popups/select_character.html	2005-02-05 15:29:38 UTC (rev 949)
@@ -0,0 +1,251 @@
+<html>
+<head>
+<title>Insert special character</title>
+<style type="text/css">
+ at import url(../../../htmlarea.css);
+td.character {
+    font-family: Verdana,Arial,Helvetica,sans-serif;
+    font-size: 14px;
+    font-weight: bold;
+    text-align: center;
+    background: #FFF;
+    padding: 4px;
+}
+
+td.character-hilite {
+    background: Highlight;
+    color: HighlightText;
+}
+
+html, body {
+  background: ButtonFace;
+  color: ButtonText;
+  font: 11px Tahoma,Verdana,sans-serif;
+  margin: 0px;
+  padding: 0px;
+}
+body { padding: 5px; }
+table {
+  font: 11px Tahoma,Verdana,sans-serif;
+}
+select, input, button { font: 11px Tahoma,Verdana,sans-serif; }
+button { width: 70px; }
+table .label { text-align: right; width: 8em; }
+
+.title { background: none; color: #000; font-weight: bold; font-size: 120%; padding: 3px 10px; margin-bottom: 10px;
+border-bottom: 1px solid black; letter-spacing: 2px;
+}
+#buttons {
+      margin-top: 1em; border-top: 1px solid #999;
+      padding: 2px; text-align: right;
+}
+</style>
+<script type="text/javascript" src="../../../popups/popup.js"></script>
+<script type="text/javascript">
+// HTMLSource based on HTMLArea XTD 1.5 (http://mosforge.net/projects/htmlarea3xtd/) modified by Holger Hees
+// Original Author - Bernhard Pfeifer novocaine at gmx.net
+
+CharacterMap = window.opener.CharacterMap; // load the CharacterMap plugin and lang file ;-)
+window.resizeTo(480, 300);
+// center on parent
+var x = opener.screenX + (opener.outerWidth - window.outerWidth) / 2;
+var y = opener.screenY + (opener.outerHeight - window.outerHeight) / 2;
+window.moveTo(x, y);
+
+function _CloseOnEsc()
+{
+    if ( event.keyCode == 27 )
+    {
+        window.close();
+        return;
+    }
+}
+
+function Init()                                                         // run on page load
+{
+   __dlg_translate(CharacterMap.I18N);
+   __dlg_init();
+    document.body.onkeypress = _CloseOnEsc;
+
+    var character = '';                                                   // set default input to empty
+    View( null, character );
+}
+
+var oldView = null;
+function View( td, character )               // preview character
+{
+    if (oldView)
+        oldView.className = oldView.className.replace(/\s+character-hilite/, '');
+    document.getElementById( 'characterPreview' ).value = character;
+    document.getElementById( 'showCharacter' ).value = character;
+    if (td)
+        (oldView = td).className += " character-hilite";
+}
+
+function Set( string )                // return character
+{
+    var character = string;
+
+    __dlg_close( character );
+}
+
+function onCancel()                   // cancel selection
+{
+    __dlg_close( null );
+
+    return false;
+};
+
+</script>
+</head>
+<body style="background: Buttonface; margin: 0px; padding: 0px" onload="Init();self.focus();">
+<form method="get" style="margin:2px; padding:2px" onSubmit="Set(document.getElementById('showCharacter').value); return false;">
+<table border="0" cellspacing="0" cellpadding="4" width="100%">
+ <tr>
+  <td style="background: Buttonface" valign="center"><div style="padding: 1px; white-space: nowrap; font-family: tahoma,arial,sans-serif; font-size: 11px; font-weight: normal;">HTML value:<div id="characterPreview"></div></div></td>
+  <td style="background: Buttonface" valign="center"><input type="text" name="showcharacter" id="showCharacter" value="" size="15" style="background: #fff; font-size: 11px;" /></td>
+  <td style="background: Buttonface" width="100%"></td>
+ </tr>
+</table>
+</form>
+<table border="0" cellspacing="1" cellpadding="0" width="100%" style="cursor: pointer; background: #ADAD9C; border: 1px inset;">
+<tr>
+<td class="character" onMouseOver="View(this,'&amp;Yuml;')" onClick="Set('&Yuml;')">&Yuml;</td>
+<td class="character" onMouseOver="View(this,'&amp;scaron;')" onClick="Set('&scaron;')">&scaron;</td>
+<td class="character" onMouseOver="View(this,'&amp;#064;')" onClick="Set('&#064;')">@</td>
+<td class="character" onMouseOver="View(this,'&amp;quot;')" onClick="Set('&quot;')">&quot;</td>
+<td class="character" onMouseOver="View(this,'&amp;iexcl;')" onClick="Set('&iexcl;')">&iexcl;</td>
+<td class="character" onMouseOver="View(this,'&amp;cent;')" onClick="Set('&cent;')">&cent;</td>
+<td class="character" onMouseOver="View(this,'&amp;pound;')" onClick="Set('&pound;')">&pound;</td>
+<td class="character" onMouseOver="View(this,'&amp;curren;')" onClick="Set('&curren;')">&curren;</td>
+<td class="character" onMouseOver="View(this,'&amp;yen;')" onClick="Set('&yen;')">&yen;</td>
+<td class="character" onMouseOver="View(this,'&amp;brvbar;')" onClick="Set('&brvbar;')">&brvbar;</td>
+<td class="character" onMouseOver="View(this,'&amp;sect;')" onClick="Set('&sect;')">&sect;</td>
+<td class="character" onMouseOver="View(this,'&amp;uml;')" onClick="Set('&uml;')">&uml;</td>
+<td class="character" onMouseOver="View(this,'&amp;copy;')" onClick="Set('&copy;')">&copy;</td>
+<td class="character" onMouseOver="View(this,'&amp;ordf;')" onClick="Set('&ordf;')">&ordf;</td>
+<td class="character" onMouseOver="View(this,'&amp;laquo;')" onClick="Set('&laquo;')">&laquo;</td>
+<td class="character" onMouseOver="View(this,'&amp;not;')" onClick="Set('&not;')">&not</td>
+</tr><tr>
+<td class="character" onMouseOver="View(this,'&amp;macr;')" onClick="Set('&macr;')">&macr;</td>
+<td class="character" onMouseOver="View(this,'&amp;deg;')" onClick="Set('&deg;')">&deg;</td>
+<td class="character" onMouseOver="View(this,'&amp;plusmn;')" onClick="Set('&plusmn;')">&plusmn;</td>
+<td class="character" onMouseOver="View(this,'&amp;sup2;')" onClick="Set('&sup2;')">&sup2;</td>
+<td class="character" onMouseOver="View(this,'&amp;sup3;')" onClick="Set('&sup3;')">&sup3;</td>
+<td class="character" onMouseOver="View(this,'&amp;acute;')" onClick="Set('&acute;')">&acute;</td>
+<td class="character" onMouseOver="View(this,'&amp;micro;')" onClick="Set('&micro;')">&micro;</td>
+<td class="character" onMouseOver="View(this,'&amp;para;')" onClick="Set('&para;')">&para;</td>
+<td class="character" onMouseOver="View(this,'&amp;middot;')" onClick="Set('&middot;')">&middot;</td>
+<td class="character" onMouseOver="View(this,'&amp;cedil;')" onClick="Set('&cedil;')">&cedil;</td>
+<td class="character" onMouseOver="View(this,'&amp;sup1;')" onClick="Set('&sup1;')">&sup1;</td>
+<td class="character" onMouseOver="View(this,'&amp;ordm;')" onClick="Set('&ordm;')">&ordm;</td>
+<td class="character" onMouseOver="View(this,'&amp;raquo;')" onClick="Set('&raquo;')">&raquo;</td>
+<td class="character" onMouseOver="View(this,'&amp;frac14;')" onClick="Set('&frac14;')">&frac14;</td>
+<td class="character" onMouseOver="View(this,'&amp;frac12;')" onClick="Set('&frac12;')">&frac12;</td>
+<td class="character" onMouseOver="View(this,'&amp;frac34;')" onClick="Set('&frac34;')">&frac34;</td>
+</tr><tr>
+<td class="character" onMouseOver="View(this,'&amp;iquest;')" onClick="Set('&iquest;')">&iquest;</td>
+<td class="character" onMouseOver="View(this,'&amp;times;')" onClick="Set('&times;')">&times;</td>
+<td class="character" onMouseOver="View(this,'&amp;Oslash;')" onClick="Set('&Oslash;')">&Oslash;</td>
+<td class="character" onMouseOver="View(this,'&amp;divide;')" onClick="Set('&divide;')">&divide;</td>
+<td class="character" onMouseOver="View(this,'&amp;oslash;')" onClick="Set('&oslash;')">&oslash;</td>
+<td class="character" onMouseOver="View(this,'&amp;fnof;')" onClick="Set('&fnof;')">&fnof;</td>
+<td class="character" onMouseOver="View(this,'&amp;circ;')" onClick="Set('&circ;')">&circ;</td>
+<td class="character" onMouseOver="View(this,'&amp;tilde;')" onClick="Set('&tilde;')">&tilde;</td>
+<td class="character" onMouseOver="View(this,'&amp;ndash;')" onClick="Set('&ndash;')">&ndash;</td>
+<td class="character" onMouseOver="View(this,'&amp;mdash;')" onClick="Set('&mdash;')">&mdash;</td>
+<td class="character" onMouseOver="View(this,'&amp;lsquo;')" onClick="Set('&lsquo;')">&lsquo;</td>
+<td class="character" onMouseOver="View(this,'&amp;rsquo;')" onClick="Set('&rsquo;')">&rsquo;</td>
+<td class="character" onMouseOver="View(this,'&amp;sbquo;')" onClick="Set('&sbquo;')">&sbquo;</td>
+<td class="character" onMouseOver="View(this,'&amp;ldquo;')" onClick="Set('&ldquo;')">&ldquo;</td>
+<td class="character" onMouseOver="View(this,'&amp;rdquo;')" onClick="Set('&rdquo;')">&rdquo;</td>
+<td class="character" onMouseOver="View(this,'&amp;bdquo;')" onClick="Set('&bdquo;')">&bdquo;</td>
+</tr><tr>
+<td class="character" onMouseOver="View(this,'&amp;dagger;')" onClick="Set('&dagger;')">&dagger;</td>
+<td class="character" onMouseOver="View(this,'&amp;Dagger;')" onClick="Set('&Dagger;')">&Dagger;</td>
+<td class="character" onMouseOver="View(this,'&amp;bull;')" onClick="Set('&bull;')">&bull;</td>
+<td class="character" onMouseOver="View(this,'&amp;hellip;')" onClick="Set('&hellip;')">&hellip;</td>
+<td class="character" onMouseOver="View(this,'&amp;permil;')" onClick="Set('&permil;')">&permil;</td>
+<td class="character" onMouseOver="View(this,'&amp;lsaquo;')" onClick="Set('&lsaquo;')">&lsaquo;</td>
+<td class="character" onMouseOver="View(this,'&amp;rsaquo;')" onClick="Set('&rsaquo;')">&rsaquo;</td>
+<td class="character" onMouseOver="View(this,'&amp;euro;')" onClick="Set('&euro;')">&euro;</td>
+<td class="character" onMouseOver="View(this,'&amp;trade;')" onClick="Set('&trade;')">&trade;</td>
+<td class="character" onMouseOver="View(this,'&amp;Agrave;')" onClick="Set('&Agrave;')">&Agrave;</td>
+<td class="character" onMouseOver="View(this,'&amp;Aacute;')" onClick="Set('&Aacute;')">&Aacute;</td>
+<td class="character" onMouseOver="View(this,'&amp;Acirc;')" onClick="Set('&Acirc;')">&Acirc;</td>
+<td class="character" onMouseOver="View(this,'&amp;Atilde;')" onClick="Set('&Atilde;')">&Atilde;</td>
+<td class="character" onMouseOver="View(this,'&amp;Auml;')" onClick="Set('&Auml;')">&Auml;</td>
+<td class="character" onMouseOver="View(this,'&amp;Aring;')" onClick="Set('&Aring;')">&Aring;</td>
+<td class="character" onMouseOver="View(this,'&amp;AElig;')" onClick="Set('&AElig;')">&AElig;</td>
+</tr><tr>
+<td class="character" onMouseOver="View(this,'&amp;Ccedil;')" onClick="Set('&Ccedil;')">&Ccedil;</td>
+<td class="character" onMouseOver="View(this,'&amp;Egrave;')" onClick="Set('&Egrave;')">&Egrave;</td>
+<td class="character" onMouseOver="View(this,'&amp;Eacute;')" onClick="Set('&Eacute;')">&Eacute;</td>
+<td class="character" onMouseOver="View(this,'&amp;Ecirc;')" onClick="Set('&Ecirc;')">&Ecirc;</td>
+<td class="character" onMouseOver="View(this,'&amp;Euml;')" onClick="Set('&Euml;')">&Euml;</td>
+<td class="character" onMouseOver="View(this,'&amp;Igrave;')" onClick="Set('&Igrave;')">&Igrave;</td>
+<td class="character" onMouseOver="View(this,'&amp;Iacute;')" onClick="Set('&Iacute;')">&Iacute;</td>
+<td class="character" onMouseOver="View(this,'&amp;Icirc;')" onClick="Set('&Icirc;')">&Icirc;</td>
+<td class="character" onMouseOver="View(this,'&amp;Iuml;')" onClick="Set('&Iuml;')">&Iuml;</td>
+<td class="character" onMouseOver="View(this,'&amp;ETH;')" onClick="Set('&ETH;')">&ETH;</td>
+<td class="character" onMouseOver="View(this,'&amp;Ntilde;')" onClick="Set('&Ntilde;')">&Ntilde;</td>
+<td class="character" onMouseOver="View(this,'&amp;Ograve;')" onClick="Set('&Ograve;')">&Ograve;</td>
+<td class="character" onMouseOver="View(this,'&amp;Oacute;')" onClick="Set('&Oacute;')">&Oacute;</td>
+<td class="character" onMouseOver="View(this,'&amp;Ocirc;')" onClick="Set('&Ocirc;')">&Ocirc;</td>
+<td class="character" onMouseOver="View(this,'&amp;Otilde;')" onClick="Set('&Otilde;')">&Otilde;</td>
+<td class="character" onMouseOver="View(this,'&amp;Ouml;')" onClick="Set('&Ouml;')">&Ouml;</td>
+</tr><tr>
+<td class="character" onMouseOver="View(this,'&amp;reg;')" onClick="Set('&reg;')">&reg;</td>
+<td class="character" onMouseOver="View(this,'&amp;times;')" onClick="Set('&times;')">&times;</td>
+<td class="character" onMouseOver="View(this,'&amp;Ugrave;')" onClick="Set('&Ugrave;')">&Ugrave;</td>
+<td class="character" onMouseOver="View(this,'&amp;Uacute;')" onClick="Set('&Uacute;')">&Uacute;</td>
+<td class="character" onMouseOver="View(this,'&amp;Ucirc;')" onClick="Set('&Ucirc;')">&Ucirc;</td>
+<td class="character" onMouseOver="View(this,'&amp;Uuml;')" onClick="Set('&Uuml;')">&Uuml;</td>
+<td class="character" onMouseOver="View(this,'&amp;Yacute;')" onClick="Set('&Yacute;')">&Yacute;</td>
+<td class="character" onMouseOver="View(this,'&amp;THORN;')" onClick="Set('&THORN;')">&THORN;</td>
+<td class="character" onMouseOver="View(this,'&amp;szlig;')" onClick="Set('&szlig;')">&szlig;</td>
+<td class="character" onMouseOver="View(this,'&amp;agrave;')" onClick="Set('&agrave;')">&agrave;</td>
+<td class="character" onMouseOver="View(this,'&amp;aacute;')" onClick="Set('&aacute;')">&aacute;</td>
+<td class="character" onMouseOver="View(this,'&amp;acirc;')" onClick="Set('&acirc;')">&acirc;</td>
+<td class="character" onMouseOver="View(this,'&amp;atilde;')" onClick="Set('&atilde;')">&atilde;</td>
+<td class="character" onMouseOver="View(this,'&amp;auml;')" onClick="Set('&auml;')">&auml;</td>
+<td class="character" onMouseOver="View(this,'&amp;aring;')" onClick="Set('&aring;')">&aring;</td>
+<td class="character" onMouseOver="View(this,'&amp;aelig;')" onClick="Set('&aelig;')">&aelig;</td>
+</tr><tr>
+<td class="character" onMouseOver="View(this,'&amp;ccedil;')" onClick="Set('&ccedil;')">&ccedil;</td>
+<td class="character" onMouseOver="View(this,'&amp;egrave;')" onClick="Set('&egrave;')">&egrave;</td>
+<td class="character" onMouseOver="View(this,'&amp;eacute;')" onClick="Set('&eacute;')">&eacute;</td>
+<td class="character" onMouseOver="View(this,'&amp;ecirc;')" onClick="Set('&ecirc;')">&ecirc;</td>
+<td class="character" onMouseOver="View(this,'&amp;euml;')" onClick="Set('&euml;')">&euml;</td>
+<td class="character" onMouseOver="View(this,'&amp;igrave;')" onClick="Set('&igrave;')">&igrave;</td>
+<td class="character" onMouseOver="View(this,'&amp;iacute;')" onClick="Set('&iacute;')">&iacute;</td>
+<td class="character" onMouseOver="View(this,'&amp;icirc;')" onClick="Set('&icirc;')">&icirc;</td>
+<td class="character" onMouseOver="View(this,'&amp;iuml;')" onClick="Set('&iuml;')">&iuml;</td>
+<td class="character" onMouseOver="View(this,'&amp;eth;')" onClick="Set('&eth;')">&eth;</td>
+<td class="character" onMouseOver="View(this,'&amp;ntilde;')" onClick="Set('&ntilde;')">&ntilde;</td>
+<td class="character" onMouseOver="View(this,'&amp;ograve;')" onClick="Set('&ograve;')">&ograve;</td>
+<td class="character" onMouseOver="View(this,'&amp;oacute;')" onClick="Set('&oacute;')">&oacute;</td>
+<td class="character" onMouseOver="View(this,'&amp;ocirc;')" onClick="Set('&ocirc;')">&ocirc;</td>
+<td class="character" onMouseOver="View(this,'&amp;otilde;')" onClick="Set('&otilde;')">&otilde;</td>
+<td class="character" onMouseOver="View(this,'&amp;ouml;')" onClick="Set('&ouml;')">&ouml;</td>
+</tr><tr>
+<td class="character" onMouseOver="View(this,'&amp;divide;')" onClick="Set('&divide;')">&divide;</td>
+<td class="character" onMouseOver="View(this,'&amp;oslash;')" onClick="Set('&oslash;')">&oslash;</td>
+<td class="character" onMouseOver="View(this,'&amp;ugrave;')" onClick="Set('&ugrave;')">&ugrave;</td>
+<td class="character" onMouseOver="View(this,'&amp;uacute;')" onClick="Set('&uacute;')">&uacute;</td>
+<td class="character" onMouseOver="View(this,'&amp;ucirc;')" onClick="Set('&ucirc;')">&ucirc;</td>
+<td class="character" onMouseOver="View(this,'&amp;uuml;')" onClick="Set('&uuml;')">&uuml;</td>
+<td class="character" onMouseOver="View(this,'&amp;yacute;')" onClick="Set('&yacute;')">&yacute;</td>
+<td class="character" onMouseOver="View(this,'&amp;thorn;')" onClick="Set('&thorn;')">&thorn;</td>
+<td class="character" onMouseOver="View(this,'&amp;yuml;')" onClick="Set('&yuml;')">&yuml;</td>
+<td class="character" onMouseOver="View(this,'&amp;OElig;')" onClick="Set('&OElig;')">&OElig;</td>
+<td class="character" onMouseOver="View(this,'&amp;oelig;')" onClick="Set('&oelig;')">&oelig;</td>
+<td class="character" onMouseOver="View(this,'&amp;Scaron;')" onClick="Set('&Scaron;')">&Scaron;</td>
+<td class="character">&nbsp;</td>
+<td class="character">&nbsp;</td>
+<td class="character">&nbsp;</td>
+<td class="character">&nbsp;</td>
+</table><br />
+<form style="text-align: center;"><button type="button" name="cancel" onclick="return onCancel();" class="submitInsertTable">Cancel</button></form>
+</body>
+</html>

Modified: plog/trunk/js/htmlarea/plugins/ContextMenu/context-menu.js
===================================================================
--- plog/trunk/js/htmlarea/plugins/ContextMenu/context-menu.js	2005-02-05 13:57:52 UTC (rev 948)
+++ plog/trunk/js/htmlarea/plugins/ContextMenu/context-menu.js	2005-02-05 15:29:38 UTC (rev 949)
@@ -1,416 +1,451 @@
-// Context Menu Plugin for HTMLArea-3.0
-// Sponsored by www.americanbible.org
-// Implementation by Mihai Bazon, http://dynarch.com/mishoo/
-//
-// (c) dynarch.com 2003.
-// Distributed under the same terms as HTMLArea itself.
-// This notice MUST stay intact for use (see license.txt).
-//
-// $Id: context-menu.js,v 1.2 2003/12/05 09:17:02 mishoo Exp $
-
-HTMLArea.loadStyle("menu.css", "ContextMenu");
-
-function ContextMenu(editor) {
-	this.editor = editor;
-};
-
-ContextMenu._pluginInfo = {
-	name          : "ContextMenu",
-	version       : "1.0",
-	developer     : "Mihai Bazon",
-	developer_url : "http://dynarch.com/mishoo/",
-	c_owner       : "dynarch.com",
-	sponsor       : "American Bible Society",
-	sponsor_url   : "http://www.americanbible.org",
-	license       : "htmlArea"
-};
-
-ContextMenu.prototype.onGenerate = function() {
-	var self = this;
-	var doc = this.editordoc = this.editor._iframe.contentWindow.document;
-	HTMLArea._addEvents(doc, ["contextmenu"],
-			    function (event) {
-				    return self.popupMenu(HTMLArea.is_ie ? self.editor._iframe.contentWindow.event : event);
-			    });
-	this.currentMenu = null;
-};
-
-ContextMenu.prototype.getContextMenu = function(target) {
-	var self = this;
-	var editor = this.editor;
-	var config = editor.config;
-	var menu = [];
-	var tbo = this.editor.plugins.TableOperations;
-	if (tbo) tbo = tbo.instance;
-	var i18n = ContextMenu.I18N;
-
-	var selection = editor.hasSelectedText();
-	if (selection)
-		menu.push([ i18n["Cut"], function() { editor.execCommand("cut"); }, null, config.btnList["cut"][1] ],
-			  [ i18n["Copy"], function() { editor.execCommand("copy"); }, null, config.btnList["copy"][1] ]);
-	menu.push([ i18n["Paste"], function() { editor.execCommand("paste"); }, null, config.btnList["paste"][1] ]);
-
-	var currentTarget = target;
-	var elmenus = [];
-
-	var link = null;
-	var table = null;
-	var tr = null;
-	var td = null;
-	var img = null;
-
-	function tableOperation(opcode) {
-		tbo.buttonPress(editor, opcode);
-	};
-
-	for (; target; target = target.parentNode) {
-		var tag = target.tagName;
-		if (!tag)
-			continue;
-		tag = tag.toLowerCase();
-		switch (tag) {
-		    case "img":
-			img = target;
-			elmenus.push(null,
-				     [ i18n["Image Properties"],
-				       function() {
-					       editor._insertImage(img);
-				       },
-				       i18n["Show the image properties dialog"],
-				       config.btnList["insertimage"][1] ]
-				);
-			break;
-		    case "a":
-			link = target;
-			elmenus.push(null,
-				     [ i18n["Modify Link"],
-				       function() { editor.execCommand("createlink", true); },
-				       i18n["Current URL is"] + ': ' + link.href,
-				       config.btnList["createlink"][1] ],
-
-				     [ i18n["Check Link"],
-				       function() { window.open(link.href); },
-				       i18n["Opens this link in a new window"] ],
-
-				     [ i18n["Remove Link"],
-				       function() {
-					       if (confirm(i18n["Please confirm that you want to unlink this element."] + "\n" +
-							   i18n["Link points to:"] + " " + link.href)) {
-						       while (link.firstChild)
-							       link.parentNode.insertBefore(link.firstChild, link);
-						       link.parentNode.removeChild(link);
-					       }
-				       },
-				       i18n["Unlink the current element"] ]
-				);
-			break;
-		    case "td":
-			td = target;
-			if (!tbo) break;
-			elmenus.push(null,
-				     [ i18n["Cell Properties"],
-				       function() { tableOperation("TO-cell-prop"); },
-				       i18n["Show the Table Cell Properties dialog"],
-				       config.btnList["TO-cell-prop"][1] ]
-				);
-			break;
-		    case "tr":
-			tr = target;
-			if (!tbo) break;
-			elmenus.push(null,
-				     [ i18n["Row Properties"],
-				       function() { tableOperation("TO-row-prop"); },
-				       i18n["Show the Table Row Properties dialog"],
-				       config.btnList["TO-row-prop"][1] ],
-
-				     [ i18n["Insert Row Before"],
-				       function() { tableOperation("TO-row-insert-above"); },
-				       i18n["Insert a new row before the current one"],
-				       config.btnList["TO-row-insert-above"][1] ],
-
-				     [ i18n["Insert Row After"],
-				       function() { tableOperation("TO-row-insert-under"); },
-				       i18n["Insert a new row after the current one"],
-				       config.btnList["TO-row-insert-under"][1] ],
-
-				     [ i18n["Delete Row"],
-				       function() { tableOperation("TO-row-delete"); },
-				       i18n["Delete the current row"],
-				       config.btnList["TO-row-delete"][1] ]
-				);
-			break;
-		    case "table":
-			table = target;
-			if (!tbo) break;
-			elmenus.push(null,
-				     [ i18n["Table Properties"],
-				       function() { tableOperation("TO-table-prop"); },
-				       i18n["Show the Table Properties dialog"],
-				       config.btnList["TO-table-prop"][1] ],
-
-				     [ i18n["Insert Column Before"],
-				       function() { tableOperation("TO-col-insert-before"); },
-				       i18n["Insert a new column before the current one"],
-				       config.btnList["TO-col-insert-before"][1] ],
-
-				     [ i18n["Insert Column After"],
-				       function() { tableOperation("TO-col-insert-after"); },
-				       i18n["Insert a new column after the current one"],
-				       config.btnList["TO-col-insert-after"][1] ],
-
-				     [ i18n["Delete Column"],
-				       function() { tableOperation("TO-col-delete"); },
-				       i18n["Delete the current column"],
-				       config.btnList["TO-col-delete"][1] ]
-				);
-			break;
-		    case "body":
-			elmenus.push(null,
-				     [ i18n["Justify Left"],
-				       function() { editor.execCommand("justifyleft"); }, null,
-				       config.btnList["justifyleft"][1] ],
-				     [ i18n["Justify Center"],
-				       function() { editor.execCommand("justifycenter"); }, null,
-				       config.btnList["justifycenter"][1] ],
-				     [ i18n["Justify Right"],
-				       function() { editor.execCommand("justifyright"); }, null,
-				       config.btnList["justifyright"][1] ],
-				     [ i18n["Justify Full"],
-				       function() { editor.execCommand("justifyfull"); }, null,
-				       config.btnList["justifyfull"][1] ]
-				);
-			break;
-		}
-	}
-
-	if (selection && !link)
-		menu.push(null, [ i18n["Make link"],
-				  function() { editor.execCommand("createlink", true); },
-				  i18n["Create a link"],
-				  config.btnList["createlink"][1] ]);
-
-	for (var i in elmenus)
-		menu.push(elmenus[i]);
-
-	menu.push(null,
-		  [ i18n["Remove the"] + " &lt;" + currentTarget.tagName + "&gt; " + i18n["Element"],
-		    function() {
-			    if (confirm(i18n["Please confirm that you want to remove this element:"] + " " + currentTarget.tagName)) {
-				    var el = currentTarget;
-				    var p = el.parentNode;
-				    p.removeChild(el);
-				    if (HTMLArea.is_gecko) {
-					    if (p.tagName.toLowerCase() == "td" && !p.hasChildNodes())
-						    p.appendChild(editor._doc.createElement("br"));
-					    editor.forceRedraw();
-					    editor.focusEditor();
-					    editor.updateToolbar();
-					    if (table) {
-						    var save_collapse = table.style.borderCollapse;
-						    table.style.borderCollapse = "collapse";
-						    table.style.borderCollapse = "separate";
-						    table.style.borderCollapse = save_collapse;
-					    }
-				    }
-			    }
-		    },
-		    i18n["Remove this node from the document"] ]);
-	return menu;
-};
-
-ContextMenu.prototype.popupMenu = function(ev) {
-	var self = this;
-	var i18n = ContextMenu.I18N;
-	if (this.currentMenu)
-		this.currentMenu.parentNode.removeChild(this.currentMenu);
-	function getPos(el) {
-		var r = { x: el.offsetLeft, y: el.offsetTop };
-		if (el.offsetParent) {
-			var tmp = getPos(el.offsetParent);
-			r.x += tmp.x;
-			r.y += tmp.y;
-		}
-		return r;
-	};
-	function documentClick(ev) {
-		ev || (ev = window.event);
-		if (!self.currentMenu) {
-			alert(i18n["How did you get here? (Please report!)"]);
-			return false;
-		}
-		var el = HTMLArea.is_ie ? ev.srcElement : ev.target;
-		for (; el != null && el != self.currentMenu; el = el.parentNode);
-		if (el == null)
-			self.closeMenu();
-		//HTMLArea._stopEvent(ev);
-		//return false;
-	};
-	var keys = [];
-	function keyPress(ev) {
-		ev || (ev = window.event);
-		HTMLArea._stopEvent(ev);
-		if (ev.keyCode == 27) {
-			self.closeMenu();
-			return false;
-		}
-		var key = String.fromCharCode(HTMLArea.is_ie ? ev.keyCode : ev.charCode).toLowerCase();
-		for (var i = keys.length; --i >= 0;) {
-			var k = keys[i];
-			if (k[0].toLowerCase() == key)
-				k[1].__msh.activate();
-		}
-	};
-	self.closeMenu = function() {
-		self.currentMenu.parentNode.removeChild(self.currentMenu);
-		self.currentMenu = null;
-		HTMLArea._removeEvent(document, "mousedown", documentClick);
-		HTMLArea._removeEvent(self.editordoc, "mousedown", documentClick);
-		if (keys.length > 0)
-			HTMLArea._removeEvent(self.editordoc, "keypress", keyPress);
-		if (HTMLArea.is_ie)
-			self.iePopup.hide();
-	};
-	var target = HTMLArea.is_ie ? ev.srcElement : ev.target;
-	var ifpos = getPos(self.editor._iframe);
-	var x = ev.clientX + ifpos.x;
-	var y = ev.clientY + ifpos.y;
-
-	var div;
-	var doc;
-	if (!HTMLArea.is_ie) {
-		doc = document;
-	} else {
-		// IE stinks
-		var popup = this.iePopup = window.createPopup();
-		doc = popup.document;
-		doc.open();
-		doc.write("<html><head><style type='text/css'>@import url(" + _editor_url + "plugins/ContextMenu/menu.css); html, body { padding: 0px; margin: 0px; overflow: hidden; border: 0px; }</style></head><body unselectable='yes'></body></html>");
-		doc.close();
-	}
-	div = doc.createElement("div");
-	if (HTMLArea.is_ie)
-		div.unselectable = "on";
-	div.oncontextmenu = function() { return false; };
-	div.className = "htmlarea-context-menu";
-	if (!HTMLArea.is_ie)
-		div.style.left = div.style.top = "0px";
-	doc.body.appendChild(div);
-
-	var table = doc.createElement("table");
-	div.appendChild(table);
-	table.cellSpacing = 0;
-	table.cellPadding = 0;
-	var parent = doc.createElement("tbody");
-	table.appendChild(parent);
-
-	var options = this.getContextMenu(target);
-	for (var i = 0; i < options.length; ++i) {
-		var option = options[i];
-		var item = doc.createElement("tr");
-		parent.appendChild(item);
-		if (HTMLArea.is_ie)
-			item.unselectable = "on";
-		else item.onmousedown = function(ev) {
-			HTMLArea._stopEvent(ev);
-			return false;
-		};
-		if (!option) {
-			item.className = "separator";
-			var td = doc.createElement("td");
-			td.className = "icon";
-			var IE_IS_A_FUCKING_SHIT = '>';
-			if (HTMLArea.is_ie) {
-				td.unselectable = "on";
-				IE_IS_A_FUCKING_SHIT = " unselectable='on' style='height=1px'>&nbsp;";
-			}
-			td.innerHTML = "<div" + IE_IS_A_FUCKING_SHIT + "</div>";
-			var td1 = td.cloneNode(true);
-			td1.className = "label";
-			item.appendChild(td);
-			item.appendChild(td1);
-		} else {
-			var label = option[0];
-			item.className = "item";
-			item.__msh = {
-				item: item,
-				label: label,
-				action: option[1],
-				tooltip: option[2] || null,
-				icon: option[3] || null,
-				activate: function() {
-					self.closeMenu();
-					self.editor.focusEditor();
-					this.action();
-				}
-			};
-			label = label.replace(/_([a-zA-Z0-9])/, "<u>$1</u>");
-			if (label != option[0])
-				keys.push([ RegExp.$1, item ]);
-			label = label.replace(/__/, "_");
-			var td1 = doc.createElement("td");
-			if (HTMLArea.is_ie)
-				td1.unselectable = "on";
-			item.appendChild(td1);
-			td1.className = "icon";
-			if (item.__msh.icon)
-				td1.innerHTML = "<img align='middle' src='" + item.__msh.icon + "' />";
-			var td2 = doc.createElement("td");
-			if (HTMLArea.is_ie)
-				td2.unselectable = "on";
-			item.appendChild(td2);
-			td2.className = "label";
-			td2.innerHTML = label;
-			item.onmouseover = function() {
-				this.className += " hover";
-				self.editor._statusBarTree.innerHTML = this.__msh.tooltip || '&nbsp;';
-			};
-			item.onmouseout = function() { this.className = "item"; };
-			item.oncontextmenu = function(ev) {
-				this.__msh.activate();
-				if (!HTMLArea.is_ie)
-					HTMLArea._stopEvent(ev);
-				return false;
-			};
-			item.onmouseup = function(ev) {
-				var timeStamp = (new Date()).getTime();
-				if (timeStamp - self.timeStamp > 500)
-					this.__msh.activate();
-				if (!HTMLArea.is_ie)
-					HTMLArea._stopEvent(ev);
-				return false;
-			};
-			//if (typeof option[2] == "string")
-			//item.title = option[2];
-		}
-	}
-
-	if (!HTMLArea.is_ie) {
-		var dx = x + div.offsetWidth - window.innerWidth + 4;
-		var dy = y + div.offsetHeight - window.innerHeight + 4;
-		if (dx > 0) x -= dx;
-		if (dy > 0) y -= dy;
-		div.style.left = x + "px";
-		div.style.top = y + "px";
-	} else {
-		// determine the size (did I mention that IE stinks?)
-		var foobar = document.createElement("div");
-		foobar.className = "htmlarea-context-menu";
-		foobar.innerHTML = div.innerHTML;
-		document.body.appendChild(foobar);
-		var w = foobar.offsetWidth;
-		var h = foobar.offsetHeight;
-		document.body.removeChild(foobar);
-		this.iePopup.show(ev.screenX, ev.screenY, w, h);
-	}
-
-	this.currentMenu = div;
-	this.timeStamp = (new Date()).getTime();
-
-	HTMLArea._addEvent(document, "mousedown", documentClick);
-	HTMLArea._addEvent(this.editordoc, "mousedown", documentClick);
-	if (keys.length > 0)
-		HTMLArea._addEvent(this.editordoc, "keypress", keyPress);
-
-	HTMLArea._stopEvent(ev);
-	return false;
-};
+// Context Menu Plugin for HTMLArea-3.0
+// Sponsored by www.americanbible.org
+// Implementation by Mihai Bazon, http://dynarch.com/mishoo/
+//
+// (c) dynarch.com 2003-2005.
+// Distributed under the same terms as HTMLArea itself.
+// This notice MUST stay intact for use (see license.txt).
+//
+// $Id: context-menu.js,v 1.6 2005/01/20 17:49:03 mishoo Exp $
+
+HTMLArea.loadStyle("menu.css", "ContextMenu");
+
+function ContextMenu(editor) {
+	this.editor = editor;
+};
+
+ContextMenu._pluginInfo = {
+	name          : "ContextMenu",
+	version       : "1.0",
+	developer     : "Mihai Bazon",
+	developer_url : "http://dynarch.com/mishoo/",
+	c_owner       : "dynarch.com",
+	sponsor       : "American Bible Society",
+	sponsor_url   : "http://www.americanbible.org",
+	license       : "htmlArea"
+};
+
+ContextMenu.prototype.onGenerate = function() {
+	var self = this;
+	var doc = this.editordoc = this.editor._iframe.contentWindow.document;
+	HTMLArea._addEvents(doc, ["contextmenu"],
+			    function (event) {
+				    return self.popupMenu(HTMLArea.is_ie ? self.editor._iframe.contentWindow.event : event);
+			    });
+	this.currentMenu = null;
+};
+
+ContextMenu.prototype.getContextMenu = function(target) {
+	var self = this;
+	var editor = this.editor;
+	var config = editor.config;
+	var menu = [];
+	var tbo = this.editor.plugins.TableOperations;
+	if (tbo) tbo = tbo.instance;
+	var i18n = ContextMenu.I18N;
+
+	var selection = editor.hasSelectedText();
+	if (selection)
+		menu.push([ i18n["Cut"], function() { editor.execCommand("cut"); }, null, config.btnList["cut"][1] ],
+			  [ i18n["Copy"], function() { editor.execCommand("copy"); }, null, config.btnList["copy"][1] ]);
+	menu.push([ i18n["Paste"], function() { editor.execCommand("paste"); }, null, config.btnList["paste"][1] ]);
+
+	var currentTarget = target;
+	var elmenus = [];
+	var tmp;
+
+	var link = null;
+	var table = null;
+	var tr = null;
+	var td = null;
+	var img = null;
+
+	function tableOperation(opcode) {
+		tbo.buttonPress(editor, opcode);
+	};
+
+	function insertPara(currentTarget, after) {
+		var el = currentTarget;
+		var par = el.parentNode;
+		var p = editor._doc.createElement("p");
+		p.appendChild(editor._doc.createElement("br"));
+		par.insertBefore(p, after ? el.nextSibling : el);
+		var sel = editor._getSelection();
+		var range = editor._createRange(sel);
+		if (!HTMLArea.is_ie) {
+			sel.removeAllRanges();
+			range.selectNodeContents(p);
+			range.collapse(true);
+			sel.addRange(range);
+		} else {
+			range.moveToElementText(p);
+			range.collapse(true);
+			range.select();
+		}
+	};
+
+	for (; target; target = target.parentNode) {
+		var tag = target.tagName;
+		if (!tag)
+			continue;
+		tag = tag.toLowerCase();
+		switch (tag) {
+		    case "img":
+			img = target;
+			elmenus.push(null,
+				     [ i18n["Image Properties"],
+				       function() {
+					       editor._insertImage(img);
+				       },
+				       i18n["Show the image properties dialog"],
+				       config.btnList["insertimage"][1] ]
+				);
+			break;
+		    case "a":
+			link = target;
+			elmenus.push(null,
+				     [ i18n["Modify Link"],
+				       function() { editor.execCommand("createlink", true); },
+				       i18n["Current URL is"] + ': ' + link.href,
+				       config.btnList["createlink"][1] ],
+
+				     [ i18n["Check Link"],
+				       function() { window.open(link.href); },
+				       i18n["Opens this link in a new window"] ],
+
+				     [ i18n["Remove Link"],
+				       function() {
+					       if (confirm(i18n["Please confirm that you want to unlink this element."] + "\n" +
+							   i18n["Link points to:"] + " " + link.href)) {
+						       while (link.firstChild)
+							       link.parentNode.insertBefore(link.firstChild, link);
+						       link.parentNode.removeChild(link);
+					       }
+				       },
+				       i18n["Unlink the current element"] ]
+				);
+			break;
+		    case "td":
+			td = target;
+			if (!tbo) break;
+			elmenus.push(null,
+				     [ i18n["Cell Properties"],
+				       function() { tableOperation("TO-cell-prop"); },
+				       i18n["Show the Table Cell Properties dialog"],
+				       config.btnList["TO-cell-prop"][1] ],
+				     [ i18n["Delete Cell"],
+				       function() { tableOperation("TO-cell-delete"); }, null,
+				       config.btnList["TO-cell-delete"][1] ]
+				);
+			break;
+		    case "tr":
+			tr = target;
+			if (!tbo) break;
+			elmenus.push(null,
+				     [ i18n["Row Properties"],
+				       function() { tableOperation("TO-row-prop"); },
+				       i18n["Show the Table Row Properties dialog"],
+				       config.btnList["TO-row-prop"][1] ],
+
+				     [ i18n["Insert Row Before"],
+				       function() { tableOperation("TO-row-insert-above"); },
+				       i18n["Insert a new row before the current one"],
+				       config.btnList["TO-row-insert-above"][1] ],
+
+				     [ i18n["Insert Row After"],
+				       function() { tableOperation("TO-row-insert-under"); },
+				       i18n["Insert a new row after the current one"],
+				       config.btnList["TO-row-insert-under"][1] ],
+
+				     [ i18n["Delete Row"],
+				       function() { tableOperation("TO-row-delete"); },
+				       i18n["Delete the current row"],
+				       config.btnList["TO-row-delete"][1] ]
+				);
+			break;
+		    case "table":
+			table = target;
+			if (!tbo) break;
+			elmenus.push(null,
+				     [ i18n["Table Properties"],
+				       function() { tableOperation("TO-table-prop"); },
+				       i18n["Show the Table Properties dialog"],
+				       config.btnList["TO-table-prop"][1] ],
+
+				     [ i18n["Insert Column Before"],
+				       function() { tableOperation("TO-col-insert-before"); },
+				       i18n["Insert a new column before the current one"],
+				       config.btnList["TO-col-insert-before"][1] ],
+
+				     [ i18n["Insert Column After"],
+				       function() { tableOperation("TO-col-insert-after"); },
+				       i18n["Insert a new column after the current one"],
+				       config.btnList["TO-col-insert-after"][1] ],
+
+				     [ i18n["Delete Column"],
+				       function() { tableOperation("TO-col-delete"); },
+				       i18n["Delete the current column"],
+				       config.btnList["TO-col-delete"][1] ]
+				);
+			break;
+		    case "body":
+			elmenus.push(null,
+				     [ i18n["Justify Left"],
+				       function() { editor.execCommand("justifyleft"); }, null,
+				       config.btnList["justifyleft"][1] ],
+				     [ i18n["Justify Center"],
+				       function() { editor.execCommand("justifycenter"); }, null,
+				       config.btnList["justifycenter"][1] ],
+				     [ i18n["Justify Right"],
+				       function() { editor.execCommand("justifyright"); }, null,
+				       config.btnList["justifyright"][1] ],
+				     [ i18n["Justify Full"],
+				       function() { editor.execCommand("justifyfull"); }, null,
+				       config.btnList["justifyfull"][1] ]
+				);
+			break;
+		}
+	}
+
+	if (selection && !link)
+		menu.push(null, [ i18n["Make link"],
+				  function() { editor.execCommand("createlink", true); },
+				  i18n["Create a link"],
+				  config.btnList["createlink"][1] ]);
+
+	for (var i = 0; i < elmenus.length; ++i)
+		menu.push(elmenus[i]);
+
+	if (!/html|body/i.test(currentTarget.tagName)) {
+		table ? (tmp = table, table = null) : (tmp = currentTarget);
+		menu.push(null,
+			  [ i18n["Remove the"] + " &lt;" + tmp.tagName + "&gt; " + i18n["Element"],
+			    function() {
+				    if (confirm(i18n["Please confirm that you want to remove this element:"] + " " +
+						tmp.tagName)) {
+					    var el = tmp;
+					    var p = el.parentNode;
+					    p.removeChild(el);
+					    if (HTMLArea.is_gecko) {
+						    if (p.tagName.toLowerCase() == "td" && !p.hasChildNodes())
+							    p.appendChild(editor._doc.createElement("br"));
+						    editor.forceRedraw();
+						    editor.focusEditor();
+						    editor.updateToolbar();
+						    if (table) {
+							    var save_collapse = table.style.borderCollapse;
+							    table.style.borderCollapse = "collapse";
+							    table.style.borderCollapse = "separate";
+							    table.style.borderCollapse = save_collapse;
+						    }
+					    }
+				    }
+			    },
+			    i18n["Remove this node from the document"] ],
+			  [ i18n["Insert paragraph before"],
+			    function() { insertPara(tmp, false); },
+			    i18n["Insert a paragraph before the current node"] ],
+			  [ i18n["Insert paragraph after"],
+			    function() { insertPara(tmp, true); },
+			    i18n["Insert a paragraph after the current node"] ]
+			);
+	}
+	return menu;
+};
+
+ContextMenu.prototype.popupMenu = function(ev) {
+	var self = this;
+	var i18n = ContextMenu.I18N;
+	if (this.currentMenu)
+		this.currentMenu.parentNode.removeChild(this.currentMenu);
+	function getPos(el) {
+		var r = { x: el.offsetLeft, y: el.offsetTop };
+		if (el.offsetParent) {
+			var tmp = getPos(el.offsetParent);
+			r.x += tmp.x;
+			r.y += tmp.y;
+		}
+		return r;
+	};
+	function documentClick(ev) {
+		ev || (ev = window.event);
+		if (!self.currentMenu) {
+			alert(i18n["How did you get here? (Please report!)"]);
+			return false;
+		}
+		var el = HTMLArea.is_ie ? ev.srcElement : ev.target;
+		for (; el != null && el != self.currentMenu; el = el.parentNode);
+		if (el == null)
+			self.closeMenu();
+		//HTMLArea._stopEvent(ev);
+		//return false;
+	};
+	var keys = [];
+	function keyPress(ev) {
+		ev || (ev = window.event);
+		HTMLArea._stopEvent(ev);
+		if (ev.keyCode == 27) {
+			self.closeMenu();
+			return false;
+		}
+		var key = String.fromCharCode(HTMLArea.is_ie ? ev.keyCode : ev.charCode).toLowerCase();
+		for (var i = keys.length; --i >= 0;) {
+			var k = keys[i];
+			if (k[0].toLowerCase() == key)
+				k[1].__msh.activate();
+		}
+	};
+	self.closeMenu = function() {
+		self.currentMenu.parentNode.removeChild(self.currentMenu);
+		self.currentMenu = null;
+		HTMLArea._removeEvent(document, "mousedown", documentClick);
+		HTMLArea._removeEvent(self.editordoc, "mousedown", documentClick);
+		if (keys.length > 0)
+			HTMLArea._removeEvent(self.editordoc, "keypress", keyPress);
+		if (HTMLArea.is_ie)
+			self.iePopup.hide();
+	};
+	var target = HTMLArea.is_ie ? ev.srcElement : ev.target;
+	var ifpos = getPos(self.editor._iframe);
+	var x = ev.clientX + ifpos.x;
+	var y = ev.clientY + ifpos.y;
+
+	var div;
+	var doc;
+	if (!HTMLArea.is_ie) {
+		doc = document;
+	} else {
+		// IE stinks
+		var popup = this.iePopup = window.createPopup();
+		doc = popup.document;
+		doc.open();
+		doc.write("<html><head><style type='text/css'>@import url(" + _editor_url + "plugins/ContextMenu/menu.css); html, body { padding: 0px; margin: 0px; overflow: hidden; border: 0px; }</style></head><body unselectable='yes'></body></html>");
+		doc.close();
+	}
+	div = doc.createElement("div");
+	if (HTMLArea.is_ie)
+		div.unselectable = "on";
+	div.oncontextmenu = function() { return false; };
+	div.className = "htmlarea-context-menu";
+	if (!HTMLArea.is_ie)
+		div.style.left = div.style.top = "0px";
+	doc.body.appendChild(div);
+
+	var table = doc.createElement("table");
+	div.appendChild(table);
+	table.cellSpacing = 0;
+	table.cellPadding = 0;
+	var parent = doc.createElement("tbody");
+	table.appendChild(parent);
+
+	var options = this.getContextMenu(target);
+	for (var i = 0; i < options.length; ++i) {
+		var option = options[i];
+		var item = doc.createElement("tr");
+		parent.appendChild(item);
+		if (HTMLArea.is_ie)
+			item.unselectable = "on";
+		else item.onmousedown = function(ev) {
+			HTMLArea._stopEvent(ev);
+			return false;
+		};
+		if (!option) {
+			item.className = "separator";
+			var td = doc.createElement("td");
+			td.className = "icon";
+			var IE_IS_A_FUCKING_SHIT = '>';
+			if (HTMLArea.is_ie) {
+				td.unselectable = "on";
+				IE_IS_A_FUCKING_SHIT = " unselectable='on' style='height=1px'>&nbsp;";
+			}
+			td.innerHTML = "<div" + IE_IS_A_FUCKING_SHIT + "</div>";
+			var td1 = td.cloneNode(true);
+			td1.className = "label";
+			item.appendChild(td);
+			item.appendChild(td1);
+		} else {
+			var label = option[0];
+			item.className = "item";
+			item.__msh = {
+				item: item,
+				label: label,
+				action: option[1],
+				tooltip: option[2] || null,
+				icon: option[3] || null,
+				activate: function() {
+					self.closeMenu();
+					self.editor.focusEditor();
+					this.action();
+				}
+			};
+			label = label.replace(/_([a-zA-Z0-9])/, "<u>$1</u>");
+			if (label != option[0])
+				keys.push([ RegExp.$1, item ]);
+			label = label.replace(/__/, "_");
+			var td1 = doc.createElement("td");
+			if (HTMLArea.is_ie)
+				td1.unselectable = "on";
+			item.appendChild(td1);
+			td1.className = "icon";
+			if (item.__msh.icon)
+				td1.innerHTML = "<img align='middle' src='" + item.__msh.icon + "' />";
+			var td2 = doc.createElement("td");
+			if (HTMLArea.is_ie)
+				td2.unselectable = "on";
+			item.appendChild(td2);
+			td2.className = "label";
+			td2.innerHTML = label;
+			item.onmouseover = function() {
+				this.className += " hover";
+				self.editor._statusBarTree.innerHTML = this.__msh.tooltip || '&nbsp;';
+			};
+			item.onmouseout = function() { this.className = "item"; };
+			item.oncontextmenu = function(ev) {
+				this.__msh.activate();
+				if (!HTMLArea.is_ie)
+					HTMLArea._stopEvent(ev);
+				return false;
+			};
+			item.onmouseup = function(ev) {
+				var timeStamp = (new Date()).getTime();
+				if (timeStamp - self.timeStamp > 500)
+					this.__msh.activate();
+				if (!HTMLArea.is_ie)
+					HTMLArea._stopEvent(ev);
+				return false;
+			};
+			//if (typeof option[2] == "string")
+			//item.title = option[2];
+		}
+	}
+
+	if (!HTMLArea.is_ie) {
+		var dx = x + div.offsetWidth - window.innerWidth + 4;
+		var dy = y + div.offsetHeight - window.innerHeight + 4;
+		if (dx > 0) x -= dx;
+		if (dy > 0) y -= dy;
+		div.style.left = x + "px";
+		div.style.top = y + "px";
+	} else {
+		// determine the size (did I mention that IE stinks?)
+		var foobar = document.createElement("div");
+		foobar.className = "htmlarea-context-menu";
+		foobar.innerHTML = div.innerHTML;
+		document.body.appendChild(foobar);
+		var w = foobar.offsetWidth;
+		var h = foobar.offsetHeight;
+		document.body.removeChild(foobar);
+		this.iePopup.show(ev.screenX, ev.screenY, w, h);
+	}
+
+	this.currentMenu = div;
+	this.timeStamp = (new Date()).getTime();
+
+	HTMLArea._addEvent(document, "mousedown", documentClick);
+	HTMLArea._addEvent(this.editordoc, "mousedown", documentClick);
+	if (keys.length > 0)
+		HTMLArea._addEvent(this.editordoc, "keypress", keyPress);
+
+	HTMLArea._stopEvent(ev);
+	return false;
+};

Modified: plog/trunk/js/htmlarea/plugins/ContextMenu/lang/de.js
===================================================================
--- plog/trunk/js/htmlarea/plugins/ContextMenu/lang/de.js	2005-02-05 13:57:52 UTC (rev 948)
+++ plog/trunk/js/htmlarea/plugins/ContextMenu/lang/de.js	2005-02-05 15:29:38 UTC (rev 949)
@@ -1,59 +1,59 @@
-// I18N constants
-
-// LANG: "de", ENCODING: UTF-8 | ISO-8859-1
-
-// translated: <]{MJ}[>  i at student.ethz.ch
-
-
-ContextMenu.I18N = {
-	// Items that appear in menu.  Please note that an underscore (_)
-	// character in the translation (right column) will cause the following
-	// letter to become underlined and be shortcut for that menu option.
-
-	"Cut"                                                   : "Ausschneiden",
-	"Copy"                                                  : "Kopieren",
-	"Paste"                                                 : "Einfügen",
-	"Image Properties"                                      : "_Bild Einstellungen...",
-	"Modify Link"                                           : "_Link ändern...",
-	"Check Link"                                            : "Link testen...",
-	"Remove Link"                                           : "Link entfernen...",
-	"Cell Properties"                                       : "Z_ellen Einstellungen...",
-	"Row Properties"                                        : "Ze_ilen Einstellungen...",
-	"Insert Row Before"                                     : "Zeile einfügen v_or Position",
-	"Insert Row After"                                      : "Zeile einfügen n_ach Position",
-	"Delete Row"                                            : "Zeile löschen",
-	"Table Properties"                                      : "_Tabellen Einstellungen...",
-	"Insert Column Before"                                  : "Spalte einfügen vo_r Position",
-	"Insert Column After"                                   : "Spalte einfügen na_ch Position",
-	"Delete Column"                                         : "Spalte löschen",
-	"Justify Left"                                          : "Links ausrichten",
-	"Justify Center"                                        : "Zentriert",
-	"Justify Right"                                         : "Rechts ausrichten",
-	"Justify Full"                                          : "Blocksatz",
-	"Make link"                                             : "Lin_k erstellen...",
-	"Remove the"                                            : "",
-	"Element"                                               : "Element entfernen...",
-
-	// Other labels (tooltips and alert/confirm box messages)
-
-	"Please confirm that you want to remove this element:"  : "Wollen sie dieses Element wirklich entfernen ?",
-	"Remove this node from the document"                    : "Dieses Element aus dem Dokument entfernen",
-	"How did you get here? (Please report!)"                : "How did you get here? (Please report!)",
-	"Show the image properties dialog"                      : "Fenster für die Bild-Einstellungen anzeigen",
-	"Modify URL"                                            : "URL ändern",
-	"Current URL is"                                        : "Aktuelle URL ist",
-	"Opens this link in a new window"                       : "Diesen Link in neuem Fenster öffnen",
-	"Please confirm that you want to unlink this element."  : "Wollen sie diesen Link wirklich entfernen ?",
-	"Link points to:"                                       : "Link zeigt auf:",
-	"Unlink the current element"                            : "Link auf Element entfernen",
-	"Show the Table Cell Properties dialog"                 : "Zellen-Einstellungen anzeigen",
-	"Show the Table Row Properties dialog"                  : "Zeilen-Einstellungen anzeigen",
-	"Insert a new row before the current one"               : "Zeile einfügen vor der aktuellen Position",
-	"Insert a new row after the current one"                : "Zeile einfügen nach der aktuellen Position",
-	"Delete the current row"                                : "Zeile löschen",
-	"Show the Table Properties dialog"                      : "Show the Table Properties dialog",
-	"Insert a new column before the current one"            : "Spalte einfügen vor der aktuellen Position",
-	"Insert a new column after the current one"             : "Spalte einfügen nach der aktuellen Position",
-	"Delete the current column"                             : "Spalte löschen",
-	"Create a link"                                         : "Link erstellen"
-};
+// I18N constants
+
+// LANG: "de", ENCODING: UTF-8 | ISO-8859-1
+
+// translated: <]{MJ}[>  i at student.ethz.ch
+
+
+ContextMenu.I18N = {
+	// Items that appear in menu.  Please note that an underscore (_)
+	// character in the translation (right column) will cause the following
+	// letter to become underlined and be shortcut for that menu option.
+
+	"Cut"                                                   : "Ausschneiden",
+	"Copy"                                                  : "Kopieren",
+	"Paste"                                                 : "Einfügen",
+	"Image Properties"                                      : "_Bild Einstellungen...",
+	"Modify Link"                                           : "_Link ändern...",
+	"Check Link"                                            : "Link testen...",
+	"Remove Link"                                           : "Link entfernen...",
+	"Cell Properties"                                       : "Z_ellen Einstellungen...",
+	"Row Properties"                                        : "Ze_ilen Einstellungen...",
+	"Insert Row Before"                                     : "Zeile einfügen v_or Position",
+	"Insert Row After"                                      : "Zeile einfügen n_ach Position",
+	"Delete Row"                                            : "Zeile löschen",
+	"Table Properties"                                      : "_Tabellen Einstellungen...",
+	"Insert Column Before"                                  : "Spalte einfügen vo_r Position",
+	"Insert Column After"                                   : "Spalte einfügen na_ch Position",
+	"Delete Column"                                         : "Spalte löschen",
+	"Justify Left"                                          : "Links ausrichten",
+	"Justify Center"                                        : "Zentriert",
+	"Justify Right"                                         : "Rechts ausrichten",
+	"Justify Full"                                          : "Blocksatz",
+	"Make link"                                             : "Lin_k erstellen...",
+	"Remove the"                                            : "",
+	"Element"                                               : "Element entfernen...",
+
+	// Other labels (tooltips and alert/confirm box messages)
+
+	"Please confirm that you want to remove this element:"  : "Wollen sie dieses Element wirklich entfernen ?",
+	"Remove this node from the document"                    : "Dieses Element aus dem Dokument entfernen",
+	"How did you get here? (Please report!)"                : "How did you get here? (Please report!)",
+	"Show the image properties dialog"                      : "Fenster für die Bild-Einstellungen anzeigen",
+	"Modify URL"                                            : "URL ändern",
+	"Current URL is"                                        : "Aktuelle URL ist",
+	"Opens this link in a new window"                       : "Diesen Link in neuem Fenster öffnen",
+	"Please confirm that you want to unlink this element."  : "Wollen sie diesen Link wirklich entfernen ?",
+	"Link points to:"                                       : "Link zeigt auf:",
+	"Unlink the current element"                            : "Link auf Element entfernen",
+	"Show the Table Cell Properties dialog"                 : "Zellen-Einstellungen anzeigen",
+	"Show the Table Row Properties dialog"                  : "Zeilen-Einstellungen anzeigen",
+	"Insert a new row before the current one"               : "Zeile einfügen vor der aktuellen Position",
+	"Insert a new row after the current one"                : "Zeile einfügen nach der aktuellen Position",
+	"Delete the current row"                                : "Zeile löschen",
+	"Show the Table Properties dialog"                      : "Show the Table Properties dialog",
+	"Insert a new column before the current one"            : "Spalte einfügen vor der aktuellen Position",
+	"Insert a new column after the current one"             : "Spalte einfügen nach der aktuellen Position",
+	"Delete the current column"                             : "Spalte löschen",
+	"Create a link"                                         : "Link erstellen"
+};

Modified: plog/trunk/js/htmlarea/plugins/ContextMenu/lang/el.js
===================================================================
--- plog/trunk/js/htmlarea/plugins/ContextMenu/lang/el.js	2005-02-05 13:57:52 UTC (rev 948)
+++ plog/trunk/js/htmlarea/plugins/ContextMenu/lang/el.js	2005-02-05 15:29:38 UTC (rev 949)
@@ -1,57 +1,57 @@
-// I18N constants
-
-// LANG: "el", ENCODING: UTF-8 | ISO-8859-7
-// Author: Dimitris Glezos, dimitris at glezos.com
-
-ContextMenu.I18N = {
-	// Items that appear in menu.  Please note that an underscore (_)
-	// character in the translation (right column) will cause the following
-	// letter to become underlined and be shortcut for that menu option.
-
-	"Cut"                                                   : "Αποκοπή",
-	"Copy"                                                  : "Αντιγραφή",
-	"Paste"                                                 : "Επικόλληση",
-	"Image Properties"                                      : "Ιδιότητες Εικόνας...",
-	"Modify Link"                                           : "Τροποποίηση συνδέσμου...",
-	"Check Link"                                            : "Έλεγχος συνδέσμων...",
-	"Remove Link"                                           : "Διαγραφή συνδέσμου...",
-	"Cell Properties"                                       : "Ιδιότητες κελιού...",
-	"Row Properties"                                        : "Ιδιότητες γραμμής...",
-	"Insert Row Before"                                     : "Εισαγωγή γραμμής πριν",
-	"Insert Row After"                                      : "Εισαγωγή γραμμής μετά",
-	"Delete Row"                                            : "Διαγραφή γραμμής",
-	"Table Properties"                                      : "Ιδιότητες πίνακα...",
-	"Insert Column Before"                                  : "Εισαγωγή στήλης πριν",
-	"Insert Column After"                                   : "Εισαγωγή στήλης μετά",
-	"Delete Column"                                         : "Διαγραφή στήλης",
-	"Justify Left"                                          : "Στοίχηση Αριστερά",
-	"Justify Center"                                        : "Στοίχηση Κέντρο",
-	"Justify Right"                                         : "Στοίχηση Δεξιά",
-	"Justify Full"                                          : "Πλήρης Στοίχηση",
-	"Make link"                                             : "Δημιουργία συνδέσμου...",
-	"Remove the"                                            : "Αφαίρεση",
-	"Element"                                               : "στοιχείου...",
-
-	// Other labels (tooltips and alert/confirm box messages)
-
-	"Please confirm that you want to remove this element:"  : "Είστε βέβαιος πως θέλετε να αφαιρέσετε το στοιχείο ",
-	"Remove this node from the document"                    : "Αφαίρεση αυτού του κόμβου από το έγγραφο",
-	"How did you get here? (Please report!)"                : "Πώς ήρθατε μέχρι εδώ; (Παρακαλούμε αναφέρετε το!)",
-	"Show the image properties dialog"                      : "Εμφάνιση διαλόγου με τις Ιδιότητες εικόνας",
-	"Modify URL"                                            : "Τροποποίηση URL",
-	"Current URL is"                                        : "Το τρέχων URL είναι",
-	"Opens this link in a new window"                       : "Ανοίγει αυτό τον σύνδεσμο σε ένα νέο παράθυρο",
-	"Please confirm that you want to unlink this element."  : "Είστε βέβαιος πως θέλετε να αφαιρέσετε τον σύνδεσμο από αυτό το στοιχείο:",
-	"Link points to:"                                       : "Ο σύνδεμος οδηγεί εδώ:",
-	"Unlink the current element"                            : "Αφαίρεση συνδέσμου από το παρών στοιχείο",
-	"Show the Table Cell Properties dialog"                 : "Εμφάνιση διαλόγου με τις Ιδιότητες κελιού Πίνακα",
-	"Show the Table Row Properties dialog"                  : "Εμφάνιση διαλόγου με τις Ιδιότητες γραμμής Πίνακα",
-	"Insert a new row before the current one"               : "Εισαγωγή μιας νέας γραμμής πριν την επιλεγμένη",
-	"Insert a new row after the current one"                : "Εισαγωγή μιας νέας γραμμής μετά την επιλεγμένη",
-	"Delete the current row"                                : "Διαγραφή επιλεγμένης γραμμής",
-	"Show the Table Properties dialog"                      : "Εμφάνιση διαλόγου με τις Ιδιότητες Πίνακα",
-	"Insert a new column before the current one"            : "Εισαγωγή νέας στήλης πριν την επιλεγμένη",
-	"Insert a new column after the current one"             : "Εισαγωγή νέας στήλης μετά την επιλεγμένη",
-	"Delete the current column"                             : "Διαγραφή επιλεγμένης στήλης",
-	"Create a link"                                         : "Δημιουργία συνδέσμου"
-};
+// I18N constants
+
+// LANG: "el", ENCODING: UTF-8 | ISO-8859-7
+// Author: Dimitris Glezos, dimitris at glezos.com
+
+ContextMenu.I18N = {
+	// Items that appear in menu.  Please note that an underscore (_)
+	// character in the translation (right column) will cause the following
+	// letter to become underlined and be shortcut for that menu option.
+
+	"Cut"                                                   : "Αποκοπή",
+	"Copy"                                                  : "Αντιγραφή",
+	"Paste"                                                 : "Επικόλληση",
+	"Image Properties"                                      : "Ιδιότητες Εικόνας...",
+	"Modify Link"                                           : "Τροποποίηση συνδέσμου...",
+	"Check Link"                                            : "Έλεγχος συνδέσμων...",
+	"Remove Link"                                           : "Διαγραφή συνδέσμου...",
+	"Cell Properties"                                       : "Ιδιότητες κελιού...",
+	"Row Properties"                                        : "Ιδιότητες γραμμής...",
+	"Insert Row Before"                                     : "Εισαγωγή γραμμής πριν",
+	"Insert Row After"                                      : "Εισαγωγή γραμμής μετά",
+	"Delete Row"                                            : "Διαγραφή γραμμής",
+	"Table Properties"                                      : "Ιδιότητες πίνακα...",
+	"Insert Column Before"                                  : "Εισαγωγή στήλης πριν",
+	"Insert Column After"                                   : "Εισαγωγή στήλης μετά",
+	"Delete Column"                                         : "Διαγραφή στήλης",
+	"Justify Left"                                          : "Στοίχηση Αριστερά",
+	"Justify Center"                                        : "Στοίχηση Κέντρο",
+	"Justify Right"                                         : "Στοίχηση Δεξιά",
+	"Justify Full"                                          : "Πλήρης Στοίχηση",
+	"Make link"                                             : "Δημιουργία συνδέσμου...",
+	"Remove the"                                            : "Αφαίρεση",
+	"Element"                                               : "στοιχείου...",
+
+	// Other labels (tooltips and alert/confirm box messages)
+
+	"Please confirm that you want to remove this element:"  : "Είστε βέβαιος πως θέλετε να αφαιρέσετε το στοιχείο ",
+	"Remove this node from the document"                    : "Αφαίρεση αυτού του κόμβου από το έγγραφο",
+	"How did you get here? (Please report!)"                : "Πώς ήρθατε μέχρι εδώ; (Παρακαλούμε αναφέρετε το!)",
+	"Show the image properties dialog"                      : "Εμφάνιση διαλόγου με τις Ιδιότητες εικόνας",
+	"Modify URL"                                            : "Τροποποίηση URL",
+	"Current URL is"                                        : "Το τρέχων URL είναι",
+	"Opens this link in a new window"                       : "Ανοίγει αυτό τον σύνδεσμο σε ένα νέο παράθυρο",
+	"Please confirm that you want to unlink this element."  : "Είστε βέβαιος πως θέλετε να αφαιρέσετε τον σύνδεσμο από αυτό το στοιχείο:",
+	"Link points to:"                                       : "Ο σύνδεμος οδηγεί εδώ:",
+	"Unlink the current element"                            : "Αφαίρεση συνδέσμου από το παρών στοιχείο",
+	"Show the Table Cell Properties dialog"                 : "Εμφάνιση διαλόγου με τις Ιδιότητες κελιού Πίνακα",
+	"Show the Table Row Properties dialog"                  : "Εμφάνιση διαλόγου με τις Ιδιότητες γραμμής Πίνακα",
+	"Insert a new row before the current one"               : "Εισαγωγή μιας νέας γραμμής πριν την επιλεγμένη",
+	"Insert a new row after the current one"                : "Εισαγωγή μιας νέας γραμμής μετά την επιλεγμένη",
+	"Delete the current row"                                : "Διαγραφή επιλεγμένης γραμμής",
+	"Show the Table Properties dialog"                      : "Εμφάνιση διαλόγου με τις Ιδιότητες Πίνακα",
+	"Insert a new column before the current one"            : "Εισαγωγή νέας στήλης πριν την επιλεγμένη",
+	"Insert a new column after the current one"             : "Εισαγωγή νέας στήλης μετά την επιλεγμένη",
+	"Delete the current column"                             : "Διαγραφή επιλεγμένης στήλης",
+	"Create a link"                                         : "Δημιουργία συνδέσμου"
+};

Modified: plog/trunk/js/htmlarea/plugins/ContextMenu/lang/en.js
===================================================================
--- plog/trunk/js/htmlarea/plugins/ContextMenu/lang/en.js	2005-02-05 13:57:52 UTC (rev 948)
+++ plog/trunk/js/htmlarea/plugins/ContextMenu/lang/en.js	2005-02-05 15:29:38 UTC (rev 949)
@@ -1,66 +1,71 @@
-// I18N constants
-
-// LANG: "en", ENCODING: UTF-8 | ISO-8859-1
-// Author: Mihai Bazon, http://dynarch.com/mishoo
-
-// 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.)
-
-ContextMenu.I18N = {
-	// Items that appear in menu.  Please note that an underscore (_)
-	// character in the translation (right column) will cause the following
-	// letter to become underlined and be shortcut for that menu option.
-
-	"Cut"                                                   : "Cut",
-	"Copy"                                                  : "Copy",
-	"Paste"                                                 : "Paste",
-	"Image Properties"                                      : "_Image Properties...",
-	"Modify Link"                                           : "_Modify Link...",
-	"Check Link"                                            : "Chec_k Link...",
-	"Remove Link"                                           : "_Remove Link...",
-	"Cell Properties"                                       : "C_ell Properties...",
-	"Row Properties"                                        : "Ro_w Properties...",
-	"Insert Row Before"                                     : "I_nsert Row Before",
-	"Insert Row After"                                      : "In_sert Row After",
-	"Delete Row"                                            : "_Delete Row",
-	"Table Properties"                                      : "_Table Properties...",
-	"Insert Column Before"                                  : "Insert _Column Before",
-	"Insert Column After"                                   : "Insert C_olumn After",
-	"Delete Column"                                         : "De_lete Column",
-	"Justify Left"                                          : "Justify Left",
-	"Justify Center"                                        : "Justify Center",
-	"Justify Right"                                         : "Justify Right",
-	"Justify Full"                                          : "Justify Full",
-	"Make link"                                             : "Make lin_k...",
-	"Remove the"                                            : "Remove the",
-	"Element"                                               : "Element...",
-
-	// Other labels (tooltips and alert/confirm box messages)
-
-	"Please confirm that you want to remove this element:"  : "Please confirm that you want to remove this element:",
-	"Remove this node from the document"                    : "Remove this node from the document",
-	"How did you get here? (Please report!)"                : "How did you get here? (Please report!)",
-	"Show the image properties dialog"                      : "Show the image properties dialog",
-	"Modify URL"                                            : "Modify URL",
-	"Current URL is"                                        : "Current URL is",
-	"Opens this link in a new window"                       : "Opens this link in a new window",
-	"Please confirm that you want to unlink this element."  : "Please confirm that you want to unlink this element.",
-	"Link points to:"                                       : "Link points to:",
-	"Unlink the current element"                            : "Unlink the current element",
-	"Show the Table Cell Properties dialog"                 : "Show the Table Cell Properties dialog",
-	"Show the Table Row Properties dialog"                  : "Show the Table Row Properties dialog",
-	"Insert a new row before the current one"               : "Insert a new row before the current one",
-	"Insert a new row after the current one"                : "Insert a new row after the current one",
-	"Delete the current row"                                : "Delete the current row",
-	"Show the Table Properties dialog"                      : "Show the Table Properties dialog",
-	"Insert a new column before the current one"            : "Insert a new column before the current one",
-	"Insert a new column after the current one"             : "Insert a new column after the current one",
-	"Delete the current column"                             : "Delete the current column",
-	"Create a link"                                         : "Create a link"
-};
+// I18N constants
+
+// LANG: "en", ENCODING: UTF-8 | ISO-8859-1
+// Author: Mihai Bazon, http://dynarch.com/mishoo
+
+// 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.)
+
+ContextMenu.I18N = {
+	// Items that appear in menu.  Please note that an underscore (_)
+	// character in the translation (right column) will cause the following
+	// letter to become underlined and be shortcut for that menu option.
+
+	"Cut"                                                   : "Cut",
+	"Copy"                                                  : "Copy",
+	"Paste"                                                 : "Paste",
+	"Image Properties"                                      : "_Image Properties...",
+	"Modify Link"                                           : "_Modify Link...",
+	"Check Link"                                            : "Chec_k Link...",
+	"Remove Link"                                           : "_Remove Link...",
+	"Cell Properties"                                       : "C_ell Properties...",
+	"Row Properties"                                        : "Ro_w Properties...",
+	"Insert Row Before"                                     : "I_nsert Row Before",
+	"Insert Row After"                                      : "In_sert Row After",
+	"Delete Row"                                            : "_Delete Row",
+	"Delete Cell"                                           : "Delete Cell",
+	"Table Properties"                                      : "_Table Properties...",
+	"Insert Column Before"                                  : "Insert _Column Before",
+	"Insert Column After"                                   : "Insert C_olumn After",
+	"Delete Column"                                         : "De_lete Column",
+	"Justify Left"                                          : "Justify Left",
+	"Justify Center"                                        : "Justify Center",
+	"Justify Right"                                         : "Justify Right",
+	"Justify Full"                                          : "Justify Full",
+	"Make link"                                             : "Make lin_k...",
+	"Remove the"                                            : "Remove the",
+	"Element"                                               : "Element...",
+	"Insert paragraph before"                               : "Insert paragraph before",
+	"Insert paragraph after"                                : "Insert paragraph after",
+
+	// Other labels (tooltips and alert/confirm box messages)
+
+	"Please confirm that you want to remove this element:"  : "Please confirm that you want to remove this element:",
+	"Remove this node from the document"                    : "Remove this node from the document",
+	"How did you get here? (Please report!)"                : "How did you get here? (Please report!)",
+	"Show the image properties dialog"                      : "Show the image properties dialog",
+	"Modify URL"                                            : "Modify URL",
+	"Current URL is"                                        : "Current URL is",
+	"Opens this link in a new window"                       : "Opens this link in a new window",
+	"Please confirm that you want to unlink this element."  : "Please confirm that you want to unlink this element.",
+	"Link points to:"                                       : "Link points to:",
+	"Unlink the current element"                            : "Unlink the current element",
+	"Show the Table Cell Properties dialog"                 : "Show the Table Cell Properties dialog",
+	"Show the Table Row Properties dialog"                  : "Show the Table Row Properties dialog",
+	"Insert a new row before the current one"               : "Insert a new row before the current one",
+	"Insert a new row after the current one"                : "Insert a new row after the current one",
+	"Delete the current row"                                : "Delete the current row",
+	"Show the Table Properties dialog"                      : "Show the Table Properties dialog",
+	"Insert a new column before the current one"            : "Insert a new column before the current one",
+	"Insert a new column after the current one"             : "Insert a new column after the current one",
+	"Delete the current column"                             : "Delete the current column",
+	"Create a link"                                         : "Create a link",
+	"Insert a paragraph before the current node"            : "Insert a paragraph before the current node",
+	"Insert a paragraph after the current node"             : "Insert a paragraph after the current node"
+};

Added: plog/trunk/js/htmlarea/plugins/ContextMenu/lang/fr.js
===================================================================
--- plog/trunk/js/htmlarea/plugins/ContextMenu/lang/fr.js	2005-02-05 13:57:52 UTC (rev 948)
+++ plog/trunk/js/htmlarea/plugins/ContextMenu/lang/fr.js	2005-02-05 15:29:38 UTC (rev 949)
@@ -0,0 +1,66 @@
+// I18N constants
+
+// LANG: "fr", ENCODING: UTF-8 | ISO-8859-1
+// Author: Cédric Guillemette, http://www.ebdata.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.)
+
+ContextMenu.I18N = {
+	// Items that appear in menu.  Please note that an underscore (_)
+	// character in the translation (right column) will cause the following
+	// letter to become underlined and be shortcut for that menu option.
+
+	"Cut"                                                   : "Couper",
+	"Copy"                                                  : "Copier",
+	"Paste"                                                 : "Coller",
+	"Image Properties"                                      : "_Propriétés de l'image...",
+	"Modify Link"                                           : "_Modifier le lien...",
+	"Check Link"                                            : "_Vérifier le lien...",
+	"Remove Link"                                           : "_Supprimer le lien...",
+	"Cell Properties"                                       : "P_ropriétés de la cellule...",
+	"Row Properties"                                        : "Pr_opriétés de la rangée...",
+	"Insert Row Before"                                     : "Insérer une rangée a_vant",
+	"Insert Row After"                                      : "Insér_er une rangée après",
+	"Delete Row"                                            : "Suppr_imer une rangée",
+	"Table Properties"                                      : "Proprié_tés de la table...",
+	"Insert Column Before"                                  : "I_nsérer une colonne avant",
+	"Insert Column After"                                   : "Insérer une colonne _après",
+	"Delete Column"                                         : "_Supprimer la colonne",
+	"Justify Left"                                          : "Justifier _gauche",
+	"Justify Center"                                        : "Justifier _centre",
+	"Justify Right"                                         : "Justifier _droit",
+	"Justify Full"                                          : "Justifier p_lein",
+	"Make link"                                             : "Convertir en lien...",
+	"Remove the"                                            : "Supprimer",
+	"Element"                                               : "Élément...",
+
+	// Other labels (tooltips and alert/confirm box messages)
+
+	"Please confirm that you want to remove this element:"  : "Confirmer la suppression de cet élément:",
+	"Remove this node from the document"                    : "Supprimer ce noeud du document",
+	"How did you get here? (Please report!)"                : "Comment êtes-vous arrivé ici? (Please report!)",
+	"Show the image properties dialog"                      : "Afficher le dialogue des propriétés d'image",
+	"Modify URL"                                            : "Modifier le URL",
+	"Current URL is"                                        : "Le URL courant est",
+	"Opens this link in a new window"                       : "Ouvrir ce lien dans une nouvelle fenêtre",
+	"Please confirm that you want to unlink this element."  : "Voulez-vous vraiment enlever le lien présent sur cet élément.",
+	"Link points to:"                                       : "Lier les points jusqu'à:",
+	"Unlink the current element"                            : "Enlever le lien sur cet élément",
+	"Show the Table Cell Properties dialog"                 : "Afficher le dialogue des propriétés des cellules",
+	"Show the Table Row Properties dialog"                  : "Afficher le dialogue des propriétés des rangées",
+	"Insert a new row before the current one"               : "Insérer une nouvelle rangée avant celle-ci",
+	"Insert a new row after the current one"                : "Insérer une nouvelle rangée après celle-ci",
+	"Delete the current row"                                : "Supprimer la rangée courante",
+	"Show the Table Properties dialog"                      : "Afficher le dialogue des propriétés de table",
+	"Insert a new column before the current one"            : "Insérer une nouvelle rangée avant celle-ci",
+	"Insert a new column after the current one"             : "Insérer une nouvelle colonne après celle-ci",
+	"Delete the current column"                             : "Supprimer cette colonne",
+	"Create a link"                                         : "Créer un lien"
+};

Added: plog/trunk/js/htmlarea/plugins/ContextMenu/lang/he.js
===================================================================
--- plog/trunk/js/htmlarea/plugins/ContextMenu/lang/he.js	2005-02-05 13:57:52 UTC (rev 948)
+++ plog/trunk/js/htmlarea/plugins/ContextMenu/lang/he.js	2005-02-05 15:29:38 UTC (rev 949)
@@ -0,0 +1,66 @@
+// I18N constants
+
+// LANG: "he", ENCODING: UTF-8
+// Author: Liron Newman, http://www.eesh.net, <plastish at ultinet dot org>
+
+// 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.)
+
+ContextMenu.I18N = {
+	// Items that appear in menu.  Please note that an underscore (_)
+	// character in the translation (right column) will cause the following
+	// letter to become underlined and be shortcut for that menu option.
+
+	"Cut"                                                   : "גזור",
+	"Copy"                                                  : "העתק",
+	"Paste"                                                 : "הדבק",
+	"Image Properties"                                      : "_מאפייני תמונה...",
+	"Modify Link"                                           : "_שנה קישור...",
+	"Check Link"                                            : "בדו_ק קישור...",
+	"Remove Link"                                           : "_הסר קישור...",
+	"Cell Properties"                                       : "מאפייני ת_א...",
+	"Row Properties"                                        : "מאפייני _טור...",
+	"Insert Row Before"                                     : "ה_כנס שורה לפני",
+	"Insert Row After"                                      : "הכנ_ס שורה אחרי",
+	"Delete Row"                                            : "_מחק שורה",
+	"Table Properties"                                      : "מאפייני ט_בלה...",
+	"Insert Column Before"                                  : "הכנס _טור לפני",
+	"Insert Column After"                                   : "הכנס ט_ור אחרי",
+	"Delete Column"                                         : "מח_ק טור",
+	"Justify Left"                                          : "ישור לשמאל",
+	"Justify Center"                                        : "ישור למרכז",
+	"Justify Right"                                         : "ישור לימין",
+	"Justify Full"                                          : "ישור לשורה מלאה",
+	"Make link"                                             : "צור קי_שור...",
+	"Remove the"                                            : "הסר את אלמנט ה-",
+	"Element"                                               : "...",
+
+	// Other labels (tooltips and alert/confirm box messages)
+
+	"Please confirm that you want to remove this element:"  : "אנא אשר שברצונך להסיר את האלמנט הזה:",
+	"Remove this node from the document"                    : "הסרה של node זה מהמסמך",
+	"How did you get here? (Please report!)"                : "איך הגעת הנה? (אנא דווח!)",
+	"Show the image properties dialog"                      : "מציג את חלון הדו-שיח של מאפייני תמונה",
+	"Modify URL"                                            : "שינוי URL",
+	"Current URL is"                                        : "URL נוכחי הוא",
+	"Opens this link in a new window"                       : "פתיחת קישור זה בחלון חדש",
+	"Please confirm that you want to unlink this element."  : "אנא אשר שאתה רוצה לנתק את אלמנט זה.",
+	"Link points to:"                                       : "הקישור מצביע אל:",
+	"Unlink the current element"                            : "ניתוק את האלמנט הנוכחי",
+	"Show the Table Cell Properties dialog"                 : "מציג את חלון הדו-שיח של מאפייני תא בטבלה",
+	"Show the Table Row Properties dialog"                  : "מציג את חלון הדו-שיח של מאפייני שורה בטבלה",
+	"Insert a new row before the current one"               : "הוספת שורה חדשה לפני הנוכחית",
+	"Insert a new row after the current one"                : "הוספת שורה חדשה אחרי הנוכחית",
+	"Delete the current row"                                : "מחיקת את השורה הנוכחית",
+	"Show the Table Properties dialog"                      : "מציג את חלון הדו-שיח של מאפייני טבלה",
+	"Insert a new column before the current one"            : "הוספת טור חדש לפני הנוכחי",
+	"Insert a new column after the current one"             : "הוספת טור חדש אחרי הנוכחי",
+	"Delete the current column"                             : "מחיקת את הטור הנוכחי",
+	"Create a link"                                         : "יצירת קישור"
+};

Modified: plog/trunk/js/htmlarea/plugins/ContextMenu/lang/nl.js
===================================================================
--- plog/trunk/js/htmlarea/plugins/ContextMenu/lang/nl.js	2005-02-05 13:57:52 UTC (rev 948)
+++ plog/trunk/js/htmlarea/plugins/ContextMenu/lang/nl.js	2005-02-05 15:29:38 UTC (rev 949)
@@ -1,66 +1,66 @@
-// I18N constants
-
-// LANG: "nl", ENCODING: UTF-8 | ISO-8859-1
-// Author: Michel Weegeerink (info at 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.)
-
-ContextMenu.I18N = {
-	// Items that appear in menu.  Please note that an underscore (_)
-	// character in the translation (right column) will cause the following
-	// letter to become underlined and be shortcut for that menu option.
-
-	"Cut"                                                   : "Knippen",
-	"Copy"                                                  : "Kopiëren",
-	"Paste"                                                 : "Plakken",
-	"Image Properties"                                      : "Eigenschappen afbeelding...",
-	"Modify Link"                                           : "Hyperlin_k aanpassen...",
-	"Check Link"                                            : "Controleer hyperlin_k...",
-	"Remove Link"                                           : "Ve_rwijder hyperlink...",
-	"Cell Properties"                                       : "C_eleigenschappen...",
-	"Row Properties"                                        : "Rijeigenscha_ppen...",
-	"Insert Row Before"                                     : "Rij invoegen boven",
-	"Insert Row After"                                      : "Rij invoegen onder",
-	"Delete Row"                                            : "Rij _verwijderen",
-	"Table Properties"                                      : "_Tabeleigenschappen...",
-	"Insert Column Before"                                  : "Kolom invoegen voor",
-	"Insert Column After"                                   : "Kolom invoegen na",
-	"Delete Column"                                         : "Kolom verwijderen",
-	"Justify Left"                                          : "Links uitlijnen",
-	"Justify Center"                                        : "Centreren",
-	"Justify Right"                                         : "Rechts uitlijnen",
-	"Justify Full"                                          : "Uitvullen",
-	"Make link"                                             : "Maak hyperlin_k...",
-	"Remove the"                                            : "Verwijder het",
-	"Element"                                               : "element...",
-
-	// Other labels (tooltips and alert/confirm box messages)
-
-	"Please confirm that you want to remove this element:"  : "Is het werkelijk de bedoeling dit element te verwijderen:",
-	"Remove this node from the document"                    : "Verwijder dit punt van het document",
-	"How did you get here? (Please report!)"                : "Hoe kwam je hier? (A.U.B. doorgeven!)",
-	"Show the image properties dialog"                      : "Laat het afbeeldingseigenschappen dialog zien",
-	"Modify URL"                                            : "Aanpassen URL",
-	"Current URL is"                                        : "Huidig URL is",
-	"Opens this link in a new window"                       : "Opend deze hyperlink in een nieuw venster",
-	"Please confirm that you want to unlink this element."  : "Is het werkelijk de bedoeling dit element te unlinken.",
-	"Link points to:"                                       : "Hyperlink verwijst naar:",
-	"Unlink the current element"                            : "Unlink het huidige element",
-	"Show the Table Cell Properties dialog"                 : "Laat de tabel celeigenschappen dialog zien",
-	"Show the Table Row Properties dialog"                  : "Laat de tabel rijeigenschappen dialog zien",
-	"Insert a new row before the current one"               : "Voeg een nieuwe rij in boven de huidige",
-	"Insert a new row after the current one"                : "Voeg een nieuwe rij in onder de huidige",
-	"Delete the current row"                                : "Verwijder de huidige rij",
-	"Show the Table Properties dialog"                      : "Laat de tabel eigenschappen dialog zien",
-	"Insert a new column before the current one"            : "Voeg een nieuwe kolom in voor de huidige",
-	"Insert a new column after the current one"             : "Voeg een nieuwe kolom in na de huidige",
-	"Delete the current column"                             : "Verwijder de huidige kolom",
-	"Create a link"                                         : "Maak een hyperlink"
-};
+// I18N constants
+
+// LANG: "nl", ENCODING: UTF-8 | ISO-8859-1
+// Author: Michel Weegeerink (info at 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.)
+
+ContextMenu.I18N = {
+	// Items that appear in menu.  Please note that an underscore (_)
+	// character in the translation (right column) will cause the following
+	// letter to become underlined and be shortcut for that menu option.
+
+	"Cut"                                                   : "Knippen",
+	"Copy"                                                  : "Kopiëren",
+	"Paste"                                                 : "Plakken",
+	"Image Properties"                                      : "Eigenschappen afbeelding...",
+	"Modify Link"                                           : "Hyperlin_k aanpassen...",
+	"Check Link"                                            : "Controleer hyperlin_k...",
+	"Remove Link"                                           : "Ve_rwijder hyperlink...",
+	"Cell Properties"                                       : "C_eleigenschappen...",
+	"Row Properties"                                        : "Rijeigenscha_ppen...",
+	"Insert Row Before"                                     : "Rij invoegen boven",
+	"Insert Row After"                                      : "Rij invoegen onder",
+	"Delete Row"                                            : "Rij _verwijderen",
+	"Table Properties"                                      : "_Tabeleigenschappen...",
+	"Insert Column Before"                                  : "Kolom invoegen voor",
+	"Insert Column After"                                   : "Kolom invoegen na",
+	"Delete Column"                                         : "Kolom verwijderen",
+	"Justify Left"                                          : "Links uitlijnen",
+	"Justify Center"                                        : "Centreren",
+	"Justify Right"                                         : "Rechts uitlijnen",
+	"Justify Full"                                          : "Uitvullen",
+	"Make link"                                             : "Maak hyperlin_k...",
+	"Remove the"                                            : "Verwijder het",
+	"Element"                                               : "element...",
+
+	// Other labels (tooltips and alert/confirm box messages)
+
+	"Please confirm that you want to remove this element:"  : "Is het werkelijk de bedoeling dit element te verwijderen:",
+	"Remove this node from the document"                    : "Verwijder dit punt van het document",
+	"How did you get here? (Please report!)"                : "Hoe kwam je hier? (A.U.B. doorgeven!)",
+	"Show the image properties dialog"                      : "Laat het afbeeldingseigenschappen dialog zien",
+	"Modify URL"                                            : "Aanpassen URL",
+	"Current URL is"                                        : "Huidig URL is",
+	"Opens this link in a new window"                       : "Opend deze hyperlink in een nieuw venster",
+	"Please confirm that you want to unlink this element."  : "Is het werkelijk de bedoeling dit element te unlinken.",
+	"Link points to:"                                       : "Hyperlink verwijst naar:",
+	"Unlink the current element"                            : "Unlink het huidige element",
+	"Show the Table Cell Properties dialog"                 : "Laat de tabel celeigenschappen dialog zien",
+	"Show the Table Row Properties dialog"                  : "Laat de tabel rijeigenschappen dialog zien",
+	"Insert a new row before the current one"               : "Voeg een nieuwe rij in boven de huidige",
+	"Insert a new row after the current one"                : "Voeg een nieuwe rij in onder de huidige",
+	"Delete the current row"                                : "Verwijder de huidige rij",
+	"Show the Table Properties dialog"                      : "Laat de tabel eigenschappen dialog zien",
+	"Insert a new column before the current one"            : "Voeg een nieuwe kolom in voor de huidige",
+	"Insert a new column after the current one"             : "Voeg een nieuwe kolom in na de huidige",
+	"Delete the current column"                             : "Verwijder de huidige kolom",
+	"Create a link"                                         : "Maak een hyperlink"
+};

Modified: plog/trunk/js/htmlarea/plugins/ContextMenu/menu.css
===================================================================
--- plog/trunk/js/htmlarea/plugins/ContextMenu/menu.css	2005-02-05 13:57:52 UTC (rev 948)
+++ plog/trunk/js/htmlarea/plugins/ContextMenu/menu.css	2005-02-05 15:29:38 UTC (rev 949)
@@ -1,64 +1,65 @@
-/* styles for the ContextMenu /HTMLArea */
-/* The ContextMenu plugin is (c) dynarch.com 2003. */
-/* Distributed under the same terms as HTMLArea itself */
-
-div.htmlarea-context-menu {
-  position: absolute;
-  border: 1px solid #aca899;
-  padding: 2px;
-  background-color: #fff;
-  cursor: default;
-  z-index: 1000;
-}
-
-div.htmlarea-context-menu table {
-  font: 11px tahoma,verdana,sans-serif;
-  border-collapse: collapse;
-}
-
-div.htmlarea-context-menu tr.item td.icon img {
-  width: 18px;
-  height: 18px;
-}
-
-div.htmlarea-context-menu tr.item td.icon {
-  padding: 0px 3px;
-  height: 18px;
-  background-color: #cdf;
-}
-
-div.htmlarea-context-menu tr.item td.label {
-  padding: 1px 10px 1px 3px;
-}
-
-div.htmlarea-context-menu tr.separator td {
-  padding: 2px 0px;
-}
-
-div.htmlarea-context-menu tr.separator td div {
-  border-top: 1px solid #aca899;
-  overflow: hidden;
-  position: relative;
-}
-
-div.htmlarea-context-menu tr.separator td.icon {
-  background-color: #cdf;
-}
-
-div.htmlarea-context-menu tr.separator td.icon div {
-/*  margin-left: 3px; */
-  border-color: #fff;
-}
-
-div.htmlarea-context-menu tr.separator td.label div {
-  margin-right: 3px;
-}
-
-div.htmlarea-context-menu tr.item.hover {
-  background-color: #316ac5;
-  color: #fff;
-}
-
-div.htmlarea-context-menu tr.item.hover td.icon {
-  background-color: #619af5;
-}
+/* styles for the ContextMenu /HTMLArea */
+/* The ContextMenu plugin is (c) dynarch.com 2003. */
+/* Distributed under the same terms as HTMLArea itself */
+
+div.htmlarea-context-menu {
+  position: absolute;
+  border: 1px solid #aca899;
+  padding: 2px;
+  background-color: #fff;
+  color: #000;
+  cursor: default;
+  z-index: 1000;
+}
+
+div.htmlarea-context-menu table {
+  font: 11px tahoma,verdana,sans-serif;
+  border-collapse: collapse;
+}
+
+div.htmlarea-context-menu tr.item td.icon img {
+  width: 18px;
+  height: 18px;
+}
+
+div.htmlarea-context-menu tr.item td.icon {
+  padding: 0px 3px;
+  height: 18px;
+  background-color: #cdf;
+}
+
+div.htmlarea-context-menu tr.item td.label {
+  padding: 1px 10px 1px 3px;
+}
+
+div.htmlarea-context-menu tr.separator td {
+  padding: 2px 0px;
+}
+
+div.htmlarea-context-menu tr.separator td div {
+  border-top: 1px solid #aca899;
+  overflow: hidden;
+  position: relative;
+}
+
+div.htmlarea-context-menu tr.separator td.icon {
+  background-color: #cdf;
+}
+
+div.htmlarea-context-menu tr.separator td.icon div {
+/*  margin-left: 3px; */
+  border-color: #fff;
+}
+
+div.htmlarea-context-menu tr.separator td.label div {
+  margin-right: 3px;
+}
+
+div.htmlarea-context-menu tr.item.hover {
+  background-color: #316ac5;
+  color: #fff;
+}
+
+div.htmlarea-context-menu tr.item.hover td.icon {
+  background-color: #619af5;
+}

Added: plog/trunk/js/htmlarea/plugins/DynamicCSS/dynamiccss.js
===================================================================
--- plog/trunk/js/htmlarea/plugins/DynamicCSS/dynamiccss.js	2005-02-05 13:57:52 UTC (rev 948)
+++ plog/trunk/js/htmlarea/plugins/DynamicCSS/dynamiccss.js	2005-02-05 15:29:38 UTC (rev 949)
@@ -0,0 +1,235 @@
+// Dynamic CSS (className) plugin for HTMLArea
+// Sponsored by http://www.systemconcept.de
+// Implementation by Holger Hees
+//
+// (c) systemconcept.de 2004
+// Distributed under the same terms as HTMLArea itself.
+// This notice MUST stay intact for use (see license.txt).
+
+function DynamicCSS(editor, args) {
+        this.editor = editor;
+	        
+        var cfg = editor.config;
+	var toolbar = cfg.toolbar;
+	var self = this;
+	var i18n = DynamicCSS.I18N;
+
+        /*var cssArray=null;
+        var cssLength=0;
+        var lastTag=null;
+        var lastClass=null;*/
+        
+	var css_class = {
+		id         : "DynamicCSS-class",
+		tooltip       : i18n["DynamicCSSStyleTooltip"],
+		options    : {"":""},
+		action     : function(editor) { self.onSelect(editor, this); },
+		refresh    : function(editor) { self.updateValue(editor, this); }
+	};
+	cfg.registerDropdown(css_class);
+
+	toolbar[0].splice(0, 0, "separator");
+	toolbar[0].splice(0, 0, "DynamicCSS-class");
+	toolbar[0].splice(0, 0, "T[CSS]");
+};
+
+DynamicCSS.parseStyleSheet=function(editor){
+        var i18n = DynamicCSS.I18N;
+        iframe = editor._iframe.contentWindow.document;
+        
+        cssArray=DynamicCSS.cssArray;
+        if(!cssArray) cssArray=new Array();
+        
+        for(i=0;i<iframe.styleSheets.length;i++){
+            // Mozilla
+            if(HTMLArea.is_gecko){
+                try{
+                    cssArray=DynamicCSS.applyCSSRule(i18n,iframe.styleSheets[i].cssRules,cssArray);
+                }
+                catch(e){
+                    //alert(e);
+                }
+            }
+            // IE
+            else {
+                try{
+                    if(iframe.styleSheets[i].rules){
+                        cssArray=DynamicCSS.applyCSSRule(i18n,iframe.styleSheets[i].rules,cssArray);
+                    }
+                    // @import StyleSheets (IE)
+                    if(iframe.styleSheets[i].imports){
+                        for(j=0;j<iframe.styleSheets[i].imports.length;j++){
+                            cssArray=DynamicCSS.applyCSSRule(i18n,iframe.styleSheets[i].imports[j].rules,cssArray);
+                        }
+                    }
+                }
+                catch(e){
+                    //alert(e);
+                }
+            }
+        }
+        DynamicCSS.cssArray=cssArray;
+}
+
+DynamicCSS.applyCSSRule=function(i18n,cssRules,cssArray){
+    for(rule in cssRules){
+        // StyleRule
+        if(cssRules[rule].selectorText){
+            if(cssRules[rule].selectorText.search(/:+/)==-1){
+                
+                // split equal Styles (Mozilla-specific) e.q. head, body {border:0px}
+                // for ie not relevant. returns allways one element
+                cssElements = cssRules[rule].selectorText.split(",");
+                for(k=0;k<cssElements.length;k++){
+                    cssElement = cssElements[k].split(".");
+                    
+                    tagName=cssElement[0].toLowerCase().trim();
+                    className=cssElement[1];
+                                        
+                    if(!tagName) tagName='all';
+                    if(!cssArray[tagName]) cssArray[tagName]=new Array();
+                    
+                    if(className){
+                        if(tagName=='all') cssName=className;
+                        else cssName='<'+className+'>';
+                    }
+                    else{
+                        className='none';
+                        if(tagName=='all') cssName=i18n["Default"];
+                        else cssName='<'+i18n["Default"]+'>';
+                    }
+                    cssArray[tagName][className]=cssName;
+                    DynamicCSS.cssLength++;
+                }
+            }
+        }
+        // ImportRule (Mozilla)
+        else if(cssRules[rule].styleSheet){
+            cssArray=DynamicCSS.applyCSSRule(i18n,cssRules[rule].styleSheet.cssRules,cssArray);
+        }
+    }
+    return cssArray;
+}
+
+DynamicCSS._pluginInfo = {
+	name          : "DynamicCSS",
+	version       : "1.5.2",
+	developer     : "Holger Hees",
+	developer_url : "http://www.systemconcept.de/",
+	c_owner       : "Holger Hees",
+	sponsor       : "System Concept GmbH",
+	sponsor_url   : "http://www.systemconcept.de/",
+	license       : "htmlArea"
+};
+
+DynamicCSS.prototype.onSelect = function(editor, obj) {
+    var tbobj = editor._toolbarObjects[obj.id];
+    var index = tbobj.element.selectedIndex;
+    var className = tbobj.element.value;
+        
+    var parent = editor.getParentElement();
+    
+    if(className!='none'){
+        parent.className=className;
+        DynamicCSS.lastClass=className;
+    }
+    else{
+        if(HTMLArea.is_gecko) parent.removeAttribute('class');
+        else parent.removeAttribute('className');
+    }
+    editor.updateToolbar();
+};
+
+/*DynamicCSS.prototype.onMode = function(mode) {
+    if(mode=='wysiwyg'){
+        // reparse possible changed css files
+        DynamicCSS.cssArray=null;
+        this.updateValue(this.editor,this.editor.config.customSelects["DynamicCSS-class"]);
+    }
+}*/
+
+DynamicCSS.prototype.reparseTimer = function(editor, obj, instance) {
+    // new attempt of rescan stylesheets in 1,2,4 and 8 second (e.g. for external css-files with longer initialisation)
+    if(DynamicCSS.parseCount<9){
+        setTimeout(function () {
+            DynamicCSS.cssLength=0;
+            DynamicCSS.parseStyleSheet(editor);
+            if(DynamicCSS.cssOldLength!=DynamicCSS.cssLength){
+                DynamicCSS.cssOldLength=DynamicCSS.cssLength;
+                DynamicCSS.lastClass=null;
+                instance.updateValue(editor, obj);
+            }
+            instance.reparseTimer(editor, obj, instance);
+        },DynamicCSS.parseCount*1000);
+        DynamicCSS.parseCount=DynamicCSS.parseCount*2;
+    }
+}
+
+DynamicCSS.prototype.updateValue = function(editor, obj) {
+        cssArray=DynamicCSS.cssArray;
+        // initial style init
+        if(!cssArray){
+            DynamicCSS.cssLength=0;
+            DynamicCSS.parseStyleSheet(editor);
+            cssArray=DynamicCSS.cssArray;
+            DynamicCSS.cssOldLength=DynamicCSS.cssLength;
+            DynamicCSS.parseCount=1;
+            this.reparseTimer(editor,obj,this);
+        }
+        
+        var parent = editor.getParentElement();
+        var tagName = parent.tagName.toLowerCase();
+        var className = parent.className;
+        
+        if(DynamicCSS.lastTag!=tagName || DynamicCSS.lastClass!=className){        
+            DynamicCSS.lastTag=tagName;
+            DynamicCSS.lastClass=className;
+        
+            var i18n = DynamicCSS.I18N;
+            var select = editor._toolbarObjects[obj.id].element;
+            
+            while(select.length>0){
+                select.options[select.length-1] = null;
+            }
+            
+            select.options[0]=new Option(i18n["Default"],'none');
+            if(cssArray){
+                // style class only allowed if parent tag is not body or editor is in fullpage mode
+                if(tagName!='body' || editor.config.fullPage){
+                    if(cssArray[tagName]){
+                        for(cssClass in cssArray[tagName]){
+                            if(cssClass=='none') select.options[0]=new Option(cssArray[tagName][cssClass],cssClass);
+                            else select.options[select.length]=new Option(cssArray[tagName][cssClass],cssClass);
+                        }
+                    }
+                    
+                    if(cssArray['all']){
+                        for(cssClass in cssArray['all']){
+                            select.options[select.length]=new Option(cssArray['all'][cssClass],cssClass);
+                        }
+                    }
+                }
+                else if(cssArray[tagName] && cssArray[tagName]['none']) select.options[0]=new Option(cssArray[tagName]['none'],'none');
+            }
+                                
+            select.selectedIndex = 0;
+            
+            if (typeof className != "undefined" && /\S/.test(className)) {
+                var options = select.options;
+                for (var i = options.length; --i >= 0;) {
+                    var option = options[i];
+                    if (className == option.value) {
+                            select.selectedIndex = i;
+                            break;
+                    }
+                }
+                if(select.selectedIndex == 0){
+                    select.options[select.length]=new Option(i18n["Undefined"],className);
+                    select.selectedIndex=select.length-1;
+                }
+            }
+                        
+            if(select.length>1) select.disabled=false;
+            else select.disabled=true;
+        }
+};

Added: plog/trunk/js/htmlarea/plugins/DynamicCSS/lang/de.js
===================================================================
--- plog/trunk/js/htmlarea/plugins/DynamicCSS/lang/de.js	2005-02-05 13:57:52 UTC (rev 948)
+++ plog/trunk/js/htmlarea/plugins/DynamicCSS/lang/de.js	2005-02-05 15:29:38 UTC (rev 949)
@@ -0,0 +1,15 @@
+// I18N constants
+
+// LANG: "de", ENCODING: UTF-8 | ISO-8859-1
+// Sponsored by http://www.systemconcept.de
+// Author: Holger Hees, <hhees at systemconcept.de>
+//
+// (c) systemconcept.de 2004
+// Distributed under the same terms as HTMLArea itself.
+// This notice MUST stay intact for use (see license.txt).
+
+DynamicCSS.I18N = {
+	"Default"                      : "Standard",
+	"Undefined"                    : "Nicht definiert",
+	"DynamicCSSStyleTooltip"       : "Wählen Sie einen StyleSheet aus"
+};

Added: plog/trunk/js/htmlarea/plugins/DynamicCSS/lang/en.js
===================================================================
--- plog/trunk/js/htmlarea/plugins/DynamicCSS/lang/en.js	2005-02-05 13:57:52 UTC (rev 948)
+++ plog/trunk/js/htmlarea/plugins/DynamicCSS/lang/en.js	2005-02-05 15:29:38 UTC (rev 949)
@@ -0,0 +1,15 @@
+// I18N constants
+
+// LANG: "de", ENCODING: UTF-8 | ISO-8859-1
+// Sponsored by http://www.systemconcept.de
+// Author: Holger Hees, <hhees at systemconcept.de>
+//
+// (c) systemconcept.de 2004
+// Distributed under the same terms as HTMLArea itself.
+// This notice MUST stay intact for use (see license.txt).
+
+DynamicCSS.I18N = {
+	"Default"                      : "Default",
+	"Undefined"                    : "Undefined",
+	"DynamicCSSStyleTooltip"       : "Choose stylesheet"
+};

Added: plog/trunk/js/htmlarea/plugins/DynamicCSS/lang/fr.js
===================================================================
--- plog/trunk/js/htmlarea/plugins/DynamicCSS/lang/fr.js	2005-02-05 13:57:52 UTC (rev 948)
+++ plog/trunk/js/htmlarea/plugins/DynamicCSS/lang/fr.js	2005-02-05 15:29:38 UTC (rev 949)
@@ -0,0 +1,15 @@
+// I18N constants
+
+// LANG: "fr", ENCODING: UTF-8 | ISO-8859-1
+// Sponsored by http://www.ebdata.com
+// Author: Cédric Guillemette, <cguillemette at ebdata.com>
+//
+// (c) www.ebdata.com 2004
+// Distributed under the same terms as HTMLArea itself.
+// This notice MUST stay intact for use (see license.txt).
+
+DynamicCSS.I18N = {
+	"Default"                      : "Défaut",
+	"Undefined"                    : "Non défini",
+	"DynamicCSSStyleTooltip"       : "Choisir feuille de style"
+};

Added: plog/trunk/js/htmlarea/plugins/EnterParagraphs/enter-paragraphs.js
===================================================================
--- plog/trunk/js/htmlarea/plugins/EnterParagraphs/enter-paragraphs.js	2005-02-05 13:57:52 UTC (rev 948)
+++ plog/trunk/js/htmlarea/plugins/EnterParagraphs/enter-paragraphs.js	2005-02-05 15:29:38 UTC (rev 949)
@@ -0,0 +1,287 @@
+// By Adam Wright, for The University of Western Australia
+//
+// Distributed under the same terms as HTMLArea itself.
+// This notice MUST stay intact for use (see license.txt).
+
+function EnterParagraphs(editor) {
+	this.editor = editor;
+
+	// Activate only if we're talking to Gecko
+	if (HTMLArea.is_gecko) 
+		this.onKeyPress = this.__onKeyPress;
+};
+
+EnterParagraphs._pluginInfo = {
+	name          : "EnterParagraphs",
+	version       : "1.0",
+	developer     : "Adam Wright",
+	developer_url : "http://www.hipikat.org/",
+	sponsor       : "The University of Western Australia",
+	sponsor_url   : "http://www.uwa.edu.au/",
+	license       : "htmlArea"
+};
+
+// Whitespace Regex
+EnterParagraphs.prototype._whiteSpace = /^\s*$/;
+// The pragmatic list of which elements a paragraph may not contain, and which may contain a paragraph
+EnterParagraphs.prototype._pExclusions = /^(address|blockquote|body|dd|div|dl|dt|fieldset|form|h1|h2|h3|h4|h5|h6|hr|li|noscript|ol|p|pre|table|ul)$/i;
+EnterParagraphs.prototype._pContainers = /^(body|del|div|fieldset|form|ins|map|noscript|object|td|th)$/i;
+// Elements which may not contain paragraphs, and would prefer a break to being split
+EnterParagraphs.prototype._pBreak = /^(address|pre|blockquote)$/i;
+// Elements which may not contain children
+EnterParagraphs.prototype._permEmpty = /^(area|base|basefont|br|col|frame|hr|img|input|isindex|link|meta|param)$/i;
+// Elements which count as content, as distinct from whitespace or containers
+EnterParagraphs.prototype._elemSolid = /^(applet|br|button|hr|img|input|table)$/i;
+// Elements which should get a new P, before or after, when enter is pressed at either end
+EnterParagraphs.prototype._pifySibling = /^(address|blockquote|del|div|dl|fieldset|form|h1|h2|h3|h4|h5|h6|hr|ins|map|noscript|object|ol|p|pre|table|ul|)$/i;
+EnterParagraphs.prototype._pifyForced = /^(ul|ol|dl|table)$/i;
+// Elements which should get a new P, before or after a close parent, when enter is pressed at either end
+EnterParagraphs.prototype._pifyParent = /^(dd|dt|li|td|th|tr)$/i;
+
+// Gecko's a bit lacking in some odd ways...
+EnterParagraphs.prototype.insertAdjacentElement = function(ref,pos,el) {
+
+	if ( pos == 'BeforeBegin' ) ref.parentNode.insertBefore(el,ref);
+	else if ( pos == 'AfterEnd' ) ref.nextSibling ? ref.parentNode.insertBefore(el,ref.nextSibling) : ref.parentNode.appendChild(el);
+	else if ( pos == 'AfterBegin' && ref.firstChild ) ref.insertBefore(el,ref.firstChild);
+	else if ( pos == 'BeforeEnd' || pos == 'AfterBegin' ) ref.appendChild(el);
+};
+
+// Passes a global parent node or document fragment to forEachNode
+EnterParagraphs.prototype.forEachNodeUnder = function (top, fn, ltr, init, parm) {
+
+	// Identify the first and last nodes to deal with
+	var start, end;
+	if ( top.nodeType == 11 && top.firstChild ) {
+		start = top.firstChild;
+		end = top.lastChild;
+	} else start = end = top;
+	while ( end.lastChild ) end = end.lastChild;
+
+	// Pass onto forEachNode
+	return this.forEachNode(start, end, fn, ltr, init, parm);
+};
+
+// Throws each node into a function
+EnterParagraphs.prototype.forEachNode = function (left, right, fn, ltr, init, parm) {
+
+	var xBro = function(elem, ltr) { return ( ltr ? elem.nextSibling : elem.previousSibling ); };
+	var xSon = function(elem, ltr) { return ( ltr ? elem.firstChild : elem.lastChild ); };
+	var walk, lookup, fnVal, ping = init;
+
+	// Until we've hit the last node
+	while ( walk != ltr ? right : left ) {
+
+		// Progress to the next node
+		if ( !walk ) walk = ltr ? left : right;
+		else {
+			if ( xSon(walk,ltr) ) walk = xSon(walk,ltr);
+			else {
+				if ( xBro(walk,ltr) ) walk = xBro(walk,ltr);
+				else {
+					lookup = walk;
+					while ( !xBro(lookup,ltr) && lookup != (ltr ? right : left) ) lookup = lookup.parentNode;
+					walk = ( lookup.nextSibling ? lookup.nextSibling : lookup ) ;
+					if ( walk == right ) break;
+		}	}	}
+
+		fnVal = fn(this, walk, ping, parm, (walk==(ltr?right:left)));	// Throw this node at the wanted function
+		if ( fnVal[0] ) return fnVal[1];								// If this node wants us to return, return pong
+		if ( fnVal[1] ) ping = fnVal[1];								// Otherwise, set pong to ping, to pass to the next node
+	}
+	return false;
+};
+
+// forEachNode fn: Find a post-insertion node, only if all nodes are empty, or the first content
+EnterParagraphs.prototype._fenEmptySet = function (parent, node, pong, getCont, last) {
+
+	// Mark this if it's the first base
+	if ( !pong && !node.firstChild ) pong = node;
+
+	// Check for content
+	if ( (node.nodeType == 1 && parent._elemSolid.test(node.nodeName)) ||
+		(node.nodeType == 3 && !parent._whiteSpace.test(node.nodeValue)) ||
+		(node.nodeType != 1 && node.nodeType != 3) ) {
+
+		return new Array(true, (getCont?node:false));
+	}
+
+	// Only return the 'base' node if we didn't want content
+	if ( last && !getCont ) return new Array(true, pong);
+	return new Array(false, pong);
+};
+
+// forEachNode fn: 
+EnterParagraphs.prototype._fenCullIds = function (parent, node, pong, parm, last) {
+
+	// Check for an id, blast it if it's in the store, otherwise add it
+	if ( node.id ) pong[node.id] ? node.id = '' : pong[node.id] = true;
+	return new Array(false,pong);
+};
+
+// Grabs a range suitable for paragraph stuffing
+EnterParagraphs.prototype.processSide = function(rng, left) {
+
+	var next = function(element, left) { return ( left ? element.previousSibling : element.nextSibling ); };
+	var node = left ? rng.startContainer : rng.endContainer;
+	var offset = left ? rng.startOffset : rng.endOffset;
+	var roam, start = node;
+
+	// Never start with an element, because then the first roaming node might
+	// be on the exclusion list and we wouldn't know until it was too late
+	while ( start.nodeType == 1 && !this._permEmpty.test(start.nodeName) ) start = ( offset ? start.lastChild : start.firstChild );
+
+	// Climb the tree, left or right, until our course of action presents itself
+	while ( roam = roam ? ( next(roam,left) ? next(roam,left) : roam.parentNode ) : start ) {
+
+		if ( next(roam,left) ) {
+			// If the next sibling's on the exclusion list, stop before it
+			if ( this._pExclusions.test(next(roam,left).nodeName) ) {
+				return this.processRng(rng, left, roam, next(roam,left), (left?'AfterEnd':'BeforeBegin'), true, false);
+		} } else {
+			// If our parent's on the container list, stop inside it
+			if (this._pContainers.test(roam.parentNode.nodeName)) {
+				return this.processRng(rng, left, roam, roam.parentNode, (left?'AfterBegin':'BeforeEnd'), true, false);
+			}
+			// If our parent's on the exclusion list, chop without wrapping
+			else if (this._pExclusions.test(roam.parentNode.nodeName)) {
+				if (this._pBreak.test(roam.parentNode.nodeName)) {
+					return this.processRng(rng, left, roam, roam.parentNode,
+														(left?'AfterBegin':'BeforeEnd'), false, (left?true:false));
+				} else {
+					return this.processRng(rng, left, (roam = roam.parentNode),
+														(next(roam,left) ? next(roam,left) : roam.parentNode),
+							(next(roam,left) ? (left?'AfterEnd':'BeforeBegin') : (left?'AfterBegin':'BeforeEnd')), false, false);
+}	}	}	}	};
+
+// Neighbour and insertion identify where the new node, roam, needs to enter
+// the document; landmarks in our selection will be deleted before insertion
+EnterParagraphs.prototype.processRng = function(rng, left, roam, neighbour, insertion, pWrap, preBr) {
+
+	var node = left ? rng.startContainer : rng.endContainer;
+	var offset = left ? rng.startOffset : rng.endOffset;
+
+	// Define the range to cut, and extend the selection range to the same boundary
+	var newRng = this.editor._doc.createRange();
+	newRng.selectNode(roam);
+	if (left) {
+		newRng.setEnd(node, offset);
+		rng.setStart(newRng.startContainer, newRng.startOffset);
+	} else {
+		newRng.setStart(node, offset);
+		rng.setEnd(newRng.endContainer, newRng.endOffset);
+	}
+
+	// Clone the range and remove duplicate ids it would otherwise produce
+	var cnt = newRng.cloneContents();
+	this.forEachNodeUnder(cnt, this._fenCullIds, true, this.takenIds, false);
+
+	// Special case, for inserting paragraphs before some blocks when caret is at their zero offset
+	var pify, pifyOffset, fill;
+	pify = left ? (newRng.endContainer.nodeType == 3 ? true:false) : (newRng.startContainer.nodeType == 3 ? false:true);
+	pifyOffset = pify ? newRng.startOffset : newRng.endOffset;
+	pify = pify ? newRng.startContainer : newRng.endContainer;
+
+	if ( this._pifyParent.test(pify.nodeName) && pify.parentNode.childNodes.item(0) == pify ) {
+		while ( !this._pifySibling.test(pify.nodeName) ) pify = pify.parentNode;
+	}
+
+	if ( cnt.nodeType == 11 && !cnt.firstChild ) cnt.appendChild(this.editor._doc.createElement(pify.nodeName));
+	fill = this.forEachNodeUnder(cnt,this._fenEmptySet,true,false,false);
+
+	if ( fill && this._pifySibling.test(pify.nodeName) &&
+		( (pifyOffset == 0) || ( pifyOffset == 1 && this._pifyForced.test(pify.nodeName) ) ) ) {
+
+		roam = this.editor._doc.createElement('p');
+		roam.appendChild(this.editor._doc.createElement('br'));
+
+		if (left && pify.previousSibling) return new Array(pify.previousSibling, 'AfterEnd', roam);
+		else if (!left && pify.nextSibling) return new Array(pify.nextSibling, 'BeforeBegin', roam);
+		else return new Array(pify.parentNode, (left?'AfterBegin':'BeforeEnd'), roam);
+	}
+
+	// If our cloned contents are 'content'-less, shove a break in them
+	if ( fill ) {
+		if ( fill.nodeType == 3 ) fill = fill.parentNode;		// Ill-concieved?
+		if ( (fill.nodeType == 1 && !this._elemSolid.test()) || fill.nodeType == 11 ) fill.appendChild(this.editor._doc.createElement('br'));
+		else fill.parentNode.insertBefore(this.editor._doc.createElement('br'),fill);
+	}
+
+	// And stuff a shiny new object with whatever contents we have
+	roam = (pWrap || (cnt.nodeType == 11 && !cnt.firstChild)) ? this.editor._doc.createElement('p') : this.editor._doc.createDocumentFragment();
+	roam.appendChild(cnt);
+	if (preBr) roam.appendChild(this.editor._doc.createElement('br'));
+
+	// Return the nearest relative, relative insertion point and fragment to insert
+	return new Array(neighbour, insertion, roam);
+};
+
+// Called when a key is pressed in the editor
+EnterParagraphs.prototype.__onKeyPress = function(ev) {
+
+	// If they've hit enter and shift is up, take it
+	if (ev.keyCode == 13 && !ev.shiftKey && this.editor._iframe.contentWindow.getSelection)
+		return this.handleEnter(ev);
+};
+
+// Handles the pressing of an unshifted enter for Gecko
+EnterParagraphs.prototype.handleEnter = function(ev) {
+
+	// Grab the selection and associated range
+	var sel = this.editor._getSelection();
+	var rng = this.editor._createRange(sel);
+	this.takenIds = new Object();
+
+	// Grab ranges for document re-stuffing, if appropriate
+	var pStart = this.processSide(rng, true);
+	var pEnd = this.processSide(rng, false);
+
+	// Get rid of everything local to the selection
+	sel.removeAllRanges();
+	rng.deleteContents();
+
+	// Grab a node we'll have after insertion, since fragments will be lost
+	var holdEnd = this.forEachNodeUnder(pEnd[2], this._fenEmptySet, true, false, true);
+
+	// Reinsert our carefully chosen document fragments
+	if ( pStart ) this.insertAdjacentElement(pStart[0], pStart[1], pStart[2]);
+	if ( pEnd.nodeType != 1 ) this.insertAdjacentElement(pEnd[0], pEnd[1], pEnd[2]);
+
+	// Move the caret in front of the first good text element
+	if ( this._permEmpty.test(holdEnd.nodeName) ) {
+		var prodigal = 0;
+		while ( holdEnd.parentNode.childNodes.item(prodigal) != holdEnd ) prodigal++;
+		sel.collapse( holdEnd.parentNode, prodigal);
+	}
+	else sel.collapse(holdEnd, 0);
+    // this.editor.scrollToElement(holdEnd);
+	this.editor.updateToolbar();
+
+	//======================
+    HTMLArea._stopEvent(ev);
+    return true;
+};
+
+// Scroll to the last line, for Gecko only
+HTMLArea.prototype.scrollToElement = function(e)
+{
+    if(HTMLArea.is_gecko)
+    {
+        var top = 0;
+        var left = 0;
+        while(e)
+        {
+            top += e.offsetTop;
+            left += e.offsetLeft;
+            if(e.offsetParent && e.offsetParent.tagName.toLowerCase() != 'body')
+            {
+                e = e.offsetParent;
+            }
+            else
+            {
+                e = null;
+            }
+        }
+        this._iframe.contentWindow.scrollTo(left, top);
+    }
+}

Added: plog/trunk/js/htmlarea/plugins/EnterParagraphs/lang/en.js
===================================================================
--- plog/trunk/js/htmlarea/plugins/EnterParagraphs/lang/en.js	2005-02-05 13:57:52 UTC (rev 948)
+++ plog/trunk/js/htmlarea/plugins/EnterParagraphs/lang/en.js	2005-02-05 15:29:38 UTC (rev 949)
@@ -0,0 +1,5 @@
+// I18N constants
+
+EnterParagraphs.I18N = {
+};
+

Modified: plog/trunk/js/htmlarea/plugins/FullPage/full-page.js
===================================================================
--- plog/trunk/js/htmlarea/plugins/FullPage/full-page.js	2005-02-05 13:57:52 UTC (rev 948)
+++ plog/trunk/js/htmlarea/plugins/FullPage/full-page.js	2005-02-05 15:29:38 UTC (rev 949)
@@ -1,143 +1,172 @@
-// FullPage Plugin for HTMLArea-3.0
-// Implementation by Mihai Bazon.  Sponsored by http://thycotic.com
-//
-// htmlArea v3.0 - Copyright (c) 2002 interactivetools.com, inc.
-// 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://dynarch.com/mishoo
-//
-// $Id: full-page.js,v 1.2 2003/10/24 19:43:51 mishoo Exp $
-
-function FullPage(editor) {
-	this.editor = editor;
-
-	var cfg = editor.config;
-	cfg.fullPage = true;
-	var tt = FullPage.I18N;
-	var self = this;
-
-	cfg.registerButton("FP-docprop", tt["Document properties"], editor.imgURL("docprop.gif", "FullPage"), false,
-			   function(editor, id) {
-				   self.buttonPress(editor, id);
-			   });
-
-	// add a new line in the toolbar
-	cfg.toolbar[0].splice(0, 0, "separator");
-	cfg.toolbar[0].splice(0, 0, "FP-docprop");
-};
-
-FullPage._pluginInfo = {
-	name          : "FullPage",
-	version       : "1.0",
-	developer     : "Mihai Bazon",
-	developer_url : "http://dynarch.com/mishoo/",
-	c_owner       : "Mihai Bazon",
-	sponsor       : "Thycotic Software Ltd.",
-	sponsor_url   : "http://thycotic.com",
-	license       : "htmlArea"
-};
-
-FullPage.prototype.buttonPress = function(editor, id) {
-	var self = this;
-	switch (id) {
-	    case "FP-docprop":
-		var doc = editor._doc;
-		var links = doc.getElementsByTagName("link");
-		var style1 = '';
-		var style2 = '';
-		for (var i = links.length; --i >= 0;) {
-			var link = links[i];
-			if (/stylesheet/i.test(link.rel)) {
-				if (/alternate/i.test(link.rel))
-					style2 = link.href;
-				else
-					style1 = link.href;
-			}
-		}
-		var title = doc.getElementsByTagName("title")[0];
-		title = title ? title.innerHTML : '';
-		var init = {
-			f_doctype      : editor.doctype,
-			f_title        : title,
-			f_body_bgcolor : HTMLArea._colorToRgb(doc.body.style.backgroundColor),
-			f_body_fgcolor : HTMLArea._colorToRgb(doc.body.style.color),
-			f_base_style   : style1,
-			f_alt_style    : style2,
-
-			editor         : editor
-		};
-		editor._popupDialog("plugin://FullPage/docprop", function(params) {
-			self.setDocProp(params);
-		}, init);
-		break;
-	}
-};
-
-FullPage.prototype.setDocProp = function(params) {
-	var txt = "";
-	var doc = this.editor._doc;
-	var head = doc.getElementsByTagName("head")[0];
-	var links = doc.getElementsByTagName("link");
-	var style1 = null;
-	var style2 = null;
-	for (var i = links.length; --i >= 0;) {
-		var link = links[i];
-		if (/stylesheet/i.test(link.rel)) {
-			if (/alternate/i.test(link.rel))
-				style2 = link;
-			else
-				style1 = link;
-		}
-	}
-	function createLink(alt) {
-		var link = doc.createElement("link");
-		link.rel = alt ? "alternate stylesheet" : "stylesheet";
-		head.appendChild(link);
-		return link;
-	};
-
-	if (!style1 && params.f_base_style)
-		style1 = createLink(false);
-	if (params.f_base_style)
-		style1.href = params.f_base_style;
-	else if (style1)
-		head.removeChild(style1);
-
-	if (!style2 && params.f_alt_style)
-		style2 = createLink(true);
-	if (params.f_alt_style)
-		style2.href = params.f_alt_style;
-	else if (style2)
-		head.removeChild(style2);
-
-	for (var i in params) {
-		var val = params[i];
-		switch (i) {
-		    case "f_title":
-			var title = doc.getElementsByTagName("title")[0];
-			if (!title) {
-				title = doc.createElement("title");
-				head.appendChild(title);
-			} else while (node = title.lastChild)
-				title.removeChild(node);
-			if (!HTMLArea.is_ie)
-				title.appendChild(doc.createTextNode(val));
-			else
-				doc.title = val;
-			break;
-		    case "f_doctype":
-			this.editor.setDoctype(val);
-			break;
-		    case "f_body_bgcolor":
-			doc.body.style.backgroundColor = val;
-			break;
-		    case "f_body_fgcolor":
-			doc.body.style.color = val;
-			break;
-		}
-	}
-};
+// FullPage Plugin for HTMLArea-3.0
+// Implementation by Mihai Bazon.  Sponsored by http://thycotic.com
+//
+// (c) dynarch.com 2003-2005.
+// Distributed under the same terms as HTMLArea itself.
+// This notice MUST stay intact for use (see license.txt).
+//
+// $Id: full-page.js,v 1.4 2005/01/20 17:49:03 mishoo Exp $
+
+function FullPage(editor) {
+	this.editor = editor;
+
+	var cfg = editor.config;
+	cfg.fullPage = true;
+	var tt = FullPage.I18N;
+	var self = this;
+
+	cfg.registerButton("FP-docprop", tt["Document properties"], editor.imgURL("docprop.gif", "FullPage"), false,
+			   function(editor, id) {
+				   self.buttonPress(editor, id);
+			   });
+
+	// add a new line in the toolbar
+	cfg.toolbar[0].splice(0, 0, "separator");
+	cfg.toolbar[0].splice(0, 0, "FP-docprop");
+};
+
+FullPage._pluginInfo = {
+	name          : "FullPage",
+	version       : "1.0",
+	developer     : "Mihai Bazon",
+	developer_url : "http://dynarch.com/mishoo/",
+	c_owner       : "Mihai Bazon",
+	sponsor       : "Thycotic Software Ltd.",
+	sponsor_url   : "http://thycotic.com",
+	license       : "htmlArea"
+};
+
+FullPage.prototype.buttonPress = function(editor, id) {
+	var self = this;
+	switch (id) {
+	    case "FP-docprop":
+		var doc = editor._doc;
+		var links = doc.getElementsByTagName("link");
+		var style1 = '';
+		var style2 = '';
+		var charset = '';
+		for (var i = links.length; --i >= 0;) {
+			var link = links[i];
+			if (/stylesheet/i.test(link.rel)) {
+				if (/alternate/i.test(link.rel))
+					style2 = link.href;
+				else
+					style1 = link.href;
+			}
+		}
+		var metas = doc.getElementsByTagName("meta");
+		for (var i = metas.length; --i >= 0;) {
+			var meta = metas[i];
+			if (/content-type/i.test(meta.httpEquiv)) {
+				r = /^text\/html; *charset=(.*)$/i.exec(meta.content);
+				charset = r[1];
+			}
+		}
+		var title = doc.getElementsByTagName("title")[0];
+		title = title ? title.innerHTML : '';
+		var init = {
+			f_doctype      : editor.doctype,
+			f_title        : title,
+			f_body_bgcolor : HTMLArea._colorToRgb(doc.body.style.backgroundColor),
+			f_body_fgcolor : HTMLArea._colorToRgb(doc.body.style.color),
+			f_base_style   : style1,
+			f_alt_style    : style2,
+			f_charset      : charset,
+			editor         : editor
+		};
+		editor._popupDialog("plugin://FullPage/docprop", function(params) {
+			self.setDocProp(params);
+		}, init);
+		break;
+	}
+};
+
+FullPage.prototype.setDocProp = function(params) {
+	var txt = "";
+	var doc = this.editor._doc;
+	var head = doc.getElementsByTagName("head")[0];
+	var links = doc.getElementsByTagName("link");
+	var metas = doc.getElementsByTagName("meta");
+	var style1 = null;
+	var style2 = null;
+	var charset = null;
+	var charset_meta = null;
+	for (var i = links.length; --i >= 0;) {
+		var link = links[i];
+		if (/stylesheet/i.test(link.rel)) {
+			if (/alternate/i.test(link.rel))
+				style2 = link;
+			else
+				style1 = link;
+		}
+	}
+	for (var i = metas.length; --i >= 0;) {
+		var meta = metas[i];
+		if (/content-type/i.test(meta.httpEquiv)) {
+			r = /^text\/html; *charset=(.*)$/i.exec(meta.content);
+			charset = r[1];
+			charset_meta = meta;
+		}
+	}
+	function createLink(alt) {
+		var link = doc.createElement("link");
+		link.rel = alt ? "alternate stylesheet" : "stylesheet";
+		head.appendChild(link);
+		return link;
+	};
+	function createMeta(name, content) {
+		var meta = doc.createElement("meta");
+		meta.httpEquiv = name;
+		meta.content = content;
+		head.appendChild(meta);
+		return meta;
+	};
+
+	if (!style1 && params.f_base_style)
+		style1 = createLink(false);
+	if (params.f_base_style)
+		style1.href = params.f_base_style;
+	else if (style1)
+		head.removeChild(style1);
+
+	if (!style2 && params.f_alt_style)
+		style2 = createLink(true);
+	if (params.f_alt_style)
+		style2.href = params.f_alt_style;
+	else if (style2)
+		head.removeChild(style2);
+
+	if (charset_meta) {
+		head.removeChild(charset_meta);
+		charset_meta = null;
+	}
+	if (!charset_meta && params.f_charset)
+		charset_meta = createMeta("Content-Type", "text/html; charset="+params.f_charset);
+
+  	for (var i in params) {
+		var val = params[i];
+		switch (i) {
+		    case "f_title":
+			var title = doc.getElementsByTagName("title")[0];
+			if (!title) {
+				title = doc.createElement("title");
+				head.appendChild(title);
+			} else while (node = title.lastChild)
+				title.removeChild(node);
+			if (!HTMLArea.is_ie)
+				title.appendChild(doc.createTextNode(val));
+			else
+				doc.title = val;
+			break;
+		    case "f_doctype":
+			this.editor.setDoctype(val);
+			break;
+		    case "f_body_bgcolor":
+			doc.body.style.backgroundColor = val;
+			break;
+		    case "f_body_fgcolor":
+			doc.body.style.color = val;
+			break;
+		}
+	}
+};

Added: plog/trunk/js/htmlarea/plugins/FullPage/lang/de.js
===================================================================
--- plog/trunk/js/htmlarea/plugins/FullPage/lang/de.js	2005-02-05 13:57:52 UTC (rev 948)
+++ plog/trunk/js/htmlarea/plugins/FullPage/lang/de.js	2005-02-05 15:29:38 UTC (rev 949)
@@ -0,0 +1,25 @@
+// I18N for the FullPage plugin
+
+// LANG: "en", ENCODING: UTF-8 | ISO-8859-1
+// Author: Holger Hees, http://www.systemconcept.de
+
+// 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.)
+
+FullPage.I18N = {
+	"Alternate style-sheet:":		"Alternativer Stylesheet:",
+	"Background color:":			"Hintergrundfarbe:",
+	"Cancel":				"Abbrechen",
+	"DOCTYPE:":				"DOCTYPE:",
+	"Document properties":			"Dokumenteigenschaften",
+	"Document title:":			"Dokumenttitel:",
+	"OK":					"OK",
+	"Primary style-sheet:":			"Stylesheet:",
+	"Text color:":				"Textfarbe:"
+};

Modified: plog/trunk/js/htmlarea/plugins/FullPage/lang/en.js
===================================================================
--- plog/trunk/js/htmlarea/plugins/FullPage/lang/en.js	2005-02-05 13:57:52 UTC (rev 948)
+++ plog/trunk/js/htmlarea/plugins/FullPage/lang/en.js	2005-02-05 15:29:38 UTC (rev 949)
@@ -1,25 +1,25 @@
-// I18N for the FullPage plugin
-
-// LANG: "en", ENCODING: UTF-8 | ISO-8859-1
-// Author: Mihai Bazon, http://dynarch.com/mishoo
-
-// 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.)
-
-FullPage.I18N = {
-	"Alternate style-sheet:":		"Alternate style-sheet:",
-	"Background color:":			"Background color:",
-	"Cancel":				"Cancel",
-	"DOCTYPE:":				"DOCTYPE:",
-	"Document properties":			"Document properties",
-	"Document title:":			"Document title:",
-	"OK":					"OK",
-	"Primary style-sheet:":			"Primary style-sheet:",
-	"Text color:":				"Text color:"
-};
+// I18N for the FullPage plugin
+
+// LANG: "en", ENCODING: UTF-8 | ISO-8859-1
+// Author: Mihai Bazon, http://dynarch.com/mishoo
+
+// 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.)
+
+FullPage.I18N = {
+	"Alternate style-sheet:":		"Alternate style-sheet:",
+	"Background color:":			"Background color:",
+	"Cancel":				"Cancel",
+	"DOCTYPE:":				"DOCTYPE:",
+	"Document properties":			"Document properties",
+	"Document title:":			"Document title:",
+	"OK":					"OK",
+	"Primary style-sheet:":			"Primary style-sheet:",
+	"Text color:":				"Text color:"
+};

Added: plog/trunk/js/htmlarea/plugins/FullPage/lang/fr.js
===================================================================
--- plog/trunk/js/htmlarea/plugins/FullPage/lang/fr.js	2005-02-05 13:57:52 UTC (rev 948)
+++ plog/trunk/js/htmlarea/plugins/FullPage/lang/fr.js	2005-02-05 15:29:38 UTC (rev 949)
@@ -0,0 +1,25 @@
+// I18N for the FullPage plugin
+
+// LANG: "fr", ENCODING: UTF-8 | ISO-8859-1
+// Author: Cédric Guillemette, http://www.ebdata.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.)
+
+FullPage.I18N = {
+	"Alternate style-sheet:":		"Feuille de style alternative:",
+	"Background color:":			"Couleur d'arrière plan:",
+	"Cancel":				"Annuler",
+	"DOCTYPE:":				"DOCTYPE:",
+	"Document properties":			"Propriétés de document",
+	"Document title:":			"Titre du document:",
+	"OK":					"OK",
+	"Primary style-sheet:":			"Feuille de style primaire:",
+	"Text color:":				"Couleur de texte:"
+};

Added: plog/trunk/js/htmlarea/plugins/FullPage/lang/he.js
===================================================================
--- plog/trunk/js/htmlarea/plugins/FullPage/lang/he.js	2005-02-05 13:57:52 UTC (rev 948)
+++ plog/trunk/js/htmlarea/plugins/FullPage/lang/he.js	2005-02-05 15:29:38 UTC (rev 949)
@@ -0,0 +1,25 @@
+// I18N for the FullPage plugin
+
+// LANG: "he", ENCODING: UTF-8
+// Author: Liron Newman, http://www.eesh.net, <plastish at ultinet dot org>
+
+// 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.)
+
+FullPage.I18N = {
+	"Alternate style-sheet:":		"גיליון סגנון אחר:",
+	"Background color:":			"צבע רקע:",
+	"Cancel":				"ביטול",
+	"DOCTYPE:":				"DOCTYPE:",
+	"Document properties":			"מאפייני מסמך",
+	"Document title:":			"כותרת מסמך:",
+	"OK":					"אישור",
+	"Primary style-sheet:":			"גיליון סגנון ראשי:",
+	"Text color:":				"צבע טקסט:"
+};

Modified: plog/trunk/js/htmlarea/plugins/FullPage/lang/ro.js
===================================================================
--- plog/trunk/js/htmlarea/plugins/FullPage/lang/ro.js	2005-02-05 13:57:52 UTC (rev 948)
+++ plog/trunk/js/htmlarea/plugins/FullPage/lang/ro.js	2005-02-05 15:29:38 UTC (rev 949)
@@ -1,25 +1,25 @@
-// I18N for the FullPage plugin
-
-// LANG: "en", ENCODING: UTF-8 | ISO-8859-1
-// Author: Mihai Bazon, http://dynarch.com/mishoo
-
-// 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.)
-
-FullPage.I18N = {
-	"Alternate style-sheet:":		"Template CSS alternativ:",
-	"Background color:":			"Culoare de fundal:",
-	"Cancel":				"Renunţă",
-	"DOCTYPE:":				"DOCTYPE:",
-	"Document properties":			"Proprietăţile documentului",
-	"Document title:":			"Titlul documentului:",
-	"OK":					"Acceptă",
-	"Primary style-sheet:":			"Template CSS principal:",
-	"Text color:":				"Culoare text:"
-};
+// I18N for the FullPage plugin
+
+// LANG: "en", ENCODING: UTF-8 | ISO-8859-1
+// Author: Mihai Bazon, http://dynarch.com/mishoo
+
+// 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.)
+
+FullPage.I18N = {
+	"Alternate style-sheet:":		"Template CSS alternativ:",
+	"Background color:":			"Culoare de fundal:",
+	"Cancel":				"Renunţă",
+	"DOCTYPE:":				"DOCTYPE:",
+	"Document properties":			"Proprietăţile documentului",
+	"Document title:":			"Titlul documentului:",
+	"OK":					"Acceptă",
+	"Primary style-sheet:":			"Template CSS principal:",
+	"Text color:":				"Culoare text:"
+};

Modified: plog/trunk/js/htmlarea/plugins/FullPage/popups/docprop.html
===================================================================
--- plog/trunk/js/htmlarea/plugins/FullPage/popups/docprop.html	2005-02-05 13:57:52 UTC (rev 948)
+++ plog/trunk/js/htmlarea/plugins/FullPage/popups/docprop.html	2005-02-05 15:29:38 UTC (rev 949)
@@ -1,131 +1,143 @@
-<html>
-
-<head>
-  <title>Document properties</title>
-
-<script type="text/javascript" src="../../../popups/popup.js"></script>
-
-<script type="text/javascript">
-
-FullPage = window.opener.FullPage; // load the FullPage plugin and lang file ;-)
-window.resizeTo(400, 100);
-
-  var accepted = {
-      f_doctype       : true,
-      f_title         : true,
-      f_body_bgcolor  : true,
-      f_body_fgcolor  : true,
-      f_base_style    : true,
-      f_alt_style     : true
-  };
-
-var editor = null;
-function Init() {
-  __dlg_translate(FullPage.I18N);
-  __dlg_init();
-  var params = window.dialogArguments;
-  for (var i in params) {
-      if (i in accepted) {
-        var el = document.getElementById(i);
-        el.value = params[i];
-      }
-  }
-  editor = params.editor;
-  document.getElementById("f_title").focus();
-  document.getElementById("f_title").select();
-};
-
-function onOK() {
-  var required = {
-  };
-  for (var i in required) {
-    var el = document.getElementById(i);
-    if (!el.value) {
-      alert(required[i]);
-      el.focus();
-      return false;
-    }
-  }
-
-  var param = {};
-  for (var i in accepted) {
-    var el = document.getElementById(i);
-    param[i] = el.value;
-  }
-  __dlg_close(param);
-  return false;
-};
-
-function onCancel() {
-  __dlg_close(null);
-  return false;
-};
-
-</script>
-
-<style type="text/css">
-html, body {
-  background: ButtonFace;
-  color: ButtonText;
-  font: 11px Tahoma,Verdana,sans-serif;
-  margin: 0px;
-  padding: 0px;
-}
-body { padding: 5px; }
-table {
-  font: 11px Tahoma,Verdana,sans-serif;
-}
-select, input, button { font: 11px Tahoma,Verdana,sans-serif; }
-button { width: 70px; }
-table .label { text-align: right; width: 12em; }
-
-.title { background: #ddf; color: #000; font-weight: bold; font-size: 120%; padding: 3px 10px; margin-bottom: 10px;
-border-bottom: 1px solid black; letter-spacing: 2px;
-}
-
-#buttons {
-      margin-top: 1em; border-top: 1px solid #999;
-      padding: 2px; text-align: right;
-}
-</style>
-
-  </head>
-
-  <body onload="Init()">
-
-    <div class="title"><span>Document properties</span></div>
-
-    <table style="width: 100%">
-      <tr>
-        <td class="label"><span>Document title:</span></td>
-        <td><input type="text" id="f_title" style="width: 100%" /></td>
-      </tr>
-      <tr>
-        <td class="label"><span>DOCTYPE:</span></td>
-        <td><input type="text" id="f_doctype" style="width: 100%" /></td>
-      </tr>
-      <tr>
-        <td class="label"><span>Primary style-sheet:</span></td>
-        <td><input type="text" id="f_base_style" style="width: 100%" /></td>
-      </tr>
-      <tr>
-        <td class="label"><span>Alternate style-sheet:</span></td>
-        <td><input type="text" id="f_alt_style" style="width: 100%" /></td>
-      </tr>
-      <tr>
-        <td class="label"><span>Background color:</span></td>
-        <td><input type="text" id="f_body_bgcolor" size="7" /></td>
-      </tr>
-      <tr>
-        <td class="label"><span>Text color:</span></td>
-        <td><input type="text" id="f_body_fgcolor" size="7" /></td>
-      </tr>
-    </table>
-
-    <div id="buttons">
-      <button type="button" name="ok" onclick="return onOK();"><span>OK</span></button>
-      <button type="button" name="cancel" onclick="return onCancel();"><span>Cancel</span></button>
-    </div>
-
-  </body>
-</html>
+<html>
+
+<head>
+  <title>Document properties</title>
+
+<script type="text/javascript" src="../../../popups/popup.js"></script>
+
+<script type="text/javascript">
+
+FullPage = window.opener.FullPage; // load the FullPage plugin and lang file ;-)
+window.resizeTo(400, 100);
+
+  var accepted = {
+      f_doctype       : true,
+      f_title         : true,
+      f_body_bgcolor  : true,
+      f_body_fgcolor  : true,
+      f_base_style    : true,
+      f_alt_style     : true,
+      f_charset       : true
+  };
+
+var editor = null;
+function Init() {
+  __dlg_translate(FullPage.I18N);
+  __dlg_init();
+  var params = window.dialogArguments;
+  for (var i in params) {
+      if (i in accepted) {
+        var el = document.getElementById(i);
+        el.value = params[i];
+      }
+  }
+  editor = params.editor;
+  document.getElementById("f_title").focus();
+  document.getElementById("f_title").select();
+};
+
+function onOK() {
+  var required = {
+  };
+  for (var i in required) {
+    var el = document.getElementById(i);
+    if (!el.value) {
+      alert(required[i]);
+      el.focus();
+      return false;
+    }
+  }
+
+  var param = {};
+  for (var i in accepted) {
+    var el = document.getElementById(i);
+    param[i] = el.value;
+  }
+  __dlg_close(param);
+  return false;
+};
+
+function onCancel() {
+  __dlg_close(null);
+  return false;
+};
+
+</script>
+
+<style type="text/css">
+html, body {
+  background: ButtonFace;
+  color: ButtonText;
+  font: 11px Tahoma,Verdana,sans-serif;
+  margin: 0px;
+  padding: 0px;
+}
+body { padding: 5px; }
+table {
+  font: 11px Tahoma,Verdana,sans-serif;
+}
+select, input, button { font: 11px Tahoma,Verdana,sans-serif; }
+button { width: 70px; }
+table .label { text-align: right; width: 12em; }
+
+.title { background: #ddf; color: #000; font-weight: bold; font-size: 120%; padding: 3px 10px; margin-bottom: 10px;
+border-bottom: 1px solid black; letter-spacing: 2px;
+}
+
+#buttons {
+      margin-top: 1em; border-top: 1px solid #999;
+      padding: 2px; text-align: right;
+}
+</style>
+
+  </head>
+
+  <body onload="Init()">
+
+    <div class="title"><span>Document properties</span></div>
+
+    <table style="width: 100%">
+      <tr>
+        <td class="label"><span>Document title:</span></td>
+        <td><input type="text" id="f_title" style="width: 100%" /></td>
+      </tr>
+      <tr>
+        <td class="label"><span>DOCTYPE:</span></td>
+        <td><input type="text" id="f_doctype" style="width: 100%" /></td>
+      </tr>
+      <tr>
+        <td class="label"><span>Primary style-sheet:</span></td>
+        <td><input type="text" id="f_base_style" style="width: 100%" /></td>
+      </tr>
+      <tr>
+        <td class="label"><span>Alternate style-sheet:</span></td>
+        <td><input type="text" id="f_alt_style" style="width: 100%" /></td>
+      </tr>
+      <tr>
+        <td class="label"><span>Background color:</span></td>
+        <td><input type="text" id="f_body_bgcolor" size="7" /></td>
+      </tr>
+      <tr>
+        <td class="label"><span>Text color:</span></td>
+        <td><input type="text" id="f_body_fgcolor" size="7" /></td>
+      </tr>
+      <tr>
+        <td class="label"><span>Character set:</span></td>
+        <td><select id="f_charset">
+          <option value=""></option>
+          <option value="utf-8">UTF-8 (recommended)</option>
+          <option value="windows-1251">cyrillic (WINDOWS-1251)</option>
+          <option value="koi8-r">cyrillic (KOI8-R)</option>
+          <option value="iso-8859-5">cyrillic (ISO-8859-5)</option>
+          <option value="iso-8859-1">western (ISO-8859-1)</option>
+        </select></td>
+      </tr>
+    </table>
+
+    <div id="buttons">
+      <button type="button" name="ok" onclick="return onOK();"><span>OK</span></button>
+      <button type="button" name="cancel" onclick="return onCancel();"><span>Cancel</span></button>
+    </div>
+
+  </body>
+</html>

Modified: plog/trunk/js/htmlarea/plugins/FullPage/test.html
===================================================================
--- plog/trunk/js/htmlarea/plugins/FullPage/test.html	2005-02-05 13:57:52 UTC (rev 948)
+++ plog/trunk/js/htmlarea/plugins/FullPage/test.html	2005-02-05 15:29:38 UTC (rev 949)
@@ -1,89 +1,89 @@
-<html>
-  <head>
-    <title>Test of FullPage plugin</title>
-    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-    <script type="text/javascript">
-      _editor_url = "../../";
-    </script>
-
-    <!-- load the main HTMLArea files -->
-    <script type="text/javascript" src="../../htmlarea.js"></script>
-    <script type="text/javascript" src="../../lang/en.js"></script>
-    <script type="text/javascript" src="../../dialog.js"></script>
-
-    <!-- <script type="text/javascript" src="popupdiv.js"></script> -->
-    <script type="text/javascript" src="../../popupwin.js"></script>
-
-    <script type="text/javascript">
-      HTMLArea.loadPlugin("TableOperations");
-      HTMLArea.loadPlugin("SpellChecker");
-      HTMLArea.loadPlugin("FullPage");
-
-      function initDocument() {
-        var editor = new HTMLArea("editor");
-        editor.registerPlugin(TableOperations);
-        editor.registerPlugin(SpellChecker);
-        editor.registerPlugin(FullPage);
-        editor.generate();
-      }
-    </script>
-
-    <style type="text/css">
-      @import url(../../htmlarea.css);
-    </style>
-
-  </head>
-
-  <body onload="initDocument()">
-    <h1>Test of FullPage plugin</h1>
-
-    <textarea id="editor" style="height: 30em; width: 100%;">
-      &lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"&gt;
-      &lt;html&gt;
-        &lt;head&gt;
-          &lt;title&gt;FullPage plugin for HTMLArea&lt;/title&gt;
-          &lt;link rel="alternate stylesheet" href="http://dynarch.com/mishoo/css/dark.css" /&gt;
-          &lt;link rel="stylesheet" href="http://dynarch.com/mishoo/css/cool-light.css" /&gt;
-        &lt;/head&gt;
-        &lt;body style="background-color: #ddddee; color: #000077;"&gt;
-          &lt;table style="width:60%; height: 90%; margin: 2% auto 1% auto;" align="center" border="0" cellpadding="0" cellspacing="0"&gt;
-            &lt;tr&gt;
-              &lt;td style="background-color: #ddeedd; border: 2px solid #002; height: 1.5em; padding: 2px; font: bold 24px Verdana;"&gt;
-                FullPage plugin
-              &lt;/td&gt;
-            &lt;/tr&gt;
-            &lt;tr&gt;
-              &lt;td style="background-color: #fff; border: 1px solid #aab; padding: 1em 3em; font: 12px Verdana;"&gt;
-                &lt;p&gt;
-                  This plugin enables one to edit a full HTML file in &lt;a
-                    href="http://dynarch.com/htmlarea/"&gt;HTMLArea&lt;/a&gt;.  This is not
-                  normally possible with just the core editor since it only
-                  retrieves the HTML inside the &lt;code&gt;body&lt;/code&gt; tag.
-                &lt;/p&gt;
-                &lt;p&gt;
-                  It provides the ability to change the &lt;code&gt;DOCTYPE&lt;/code&gt; of
-                  the document, &lt;code&gt;body&lt;/code&gt; &lt;code&gt;bgcolor&lt;/code&gt; and
-                  &lt;code&gt;fgcolor&lt;/code&gt; attributes as well as to add additional
-                  &lt;code&gt;link&lt;/code&gt;-ed stylesheets.  Cool, eh?
-                &lt;/p&gt;
-                &lt;p&gt;
-                  The development of this plugin was initiated and sponsored by
-                  &lt;a href="http://thycotic.com"&gt;Thycotic Software Ltd.&lt;/a&gt;.
-                  That's also cool, isn't it? ;-)
-                &lt;/p&gt;
-              &lt;/td&gt;
-            &lt;/tr&gt;
-          &lt;/table&gt;
-        &lt;/body&gt;
-      &lt;/html&gt;
-    </textarea>
-
-    <hr />
-    <address><a href="http://dynarch.com/mishoo/">Mihai Bazon</a></address>
-<!-- Created: Wed Oct  1 19:55:37 EEST 2003 -->
-<!-- hhmts start -->
-Last modified on Sat Oct 25 01:06:59 2003
-<!-- hhmts end -->
-<!-- doc-lang: English -->
-  </body>
-</html>
+<html>
+  <head>
+    <title>Test of FullPage plugin</title>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+    <script type="text/javascript">
+      _editor_url = "../../";
+    </script>
+
+    <!-- load the main HTMLArea files -->
+    <script type="text/javascript" src="../../htmlarea.js"></script>
+    <script type="text/javascript" src="../../lang/en.js"></script>
+    <script type="text/javascript" src="../../dialog.js"></script>
+
+    <!-- <script type="text/javascript" src="popupdiv.js"></script> -->
+    <script type="text/javascript" src="../../popupwin.js"></script>
+
+    <script type="text/javascript">
+      HTMLArea.loadPlugin("TableOperations");
+      HTMLArea.loadPlugin("SpellChecker");
+      HTMLArea.loadPlugin("FullPage");
+
+      function initDocument() {
+        var editor = new HTMLArea("editor");
+        editor.registerPlugin(TableOperations);
+        editor.registerPlugin(SpellChecker);
+        editor.registerPlugin(FullPage);
+        editor.generate();
+      }
+    </script>
+
+    <style type="text/css">
+      @import url(../../htmlarea.css);
+    </style>
+
+  </head>
+
+  <body onload="initDocument()">
+    <h1>Test of FullPage plugin</h1>
+
+    <textarea id="editor" style="height: 30em; width: 100%;">
+      &lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"&gt;
+      &lt;html&gt;
+        &lt;head&gt;
+          &lt;title&gt;FullPage plugin for HTMLArea&lt;/title&gt;
+          &lt;link rel="alternate stylesheet" href="http://dynarch.com/mishoo/css/dark.css" /&gt;
+          &lt;link rel="stylesheet" href="http://dynarch.com/mishoo/css/cool-light.css" /&gt;
+        &lt;/head&gt;
+        &lt;body style="background-color: #ddddee; color: #000077;"&gt;
+          &lt;table style="width:60%; height: 90%; margin: 2% auto 1% auto;" align="center" border="0" cellpadding="0" cellspacing="0"&gt;
+            &lt;tr&gt;
+              &lt;td style="background-color: #ddeedd; border: 2px solid #002; height: 1.5em; padding: 2px; font: bold 24px Verdana;"&gt;
+                FullPage plugin
+              &lt;/td&gt;
+            &lt;/tr&gt;
+            &lt;tr&gt;
+              &lt;td style="background-color: #fff; border: 1px solid #aab; padding: 1em 3em; font: 12px Verdana;"&gt;
+                &lt;p&gt;
+                  This plugin enables one to edit a full HTML file in &lt;a
+                    href="http://dynarch.com/htmlarea/"&gt;HTMLArea&lt;/a&gt;.  This is not
+                  normally possible with just the core editor since it only
+                  retrieves the HTML inside the &lt;code&gt;body&lt;/code&gt; tag.
+                &lt;/p&gt;
+                &lt;p&gt;
+                  It provides the ability to change the &lt;code&gt;DOCTYPE&lt;/code&gt; of
+                  the document, &lt;code&gt;body&lt;/code&gt; &lt;code&gt;bgcolor&lt;/code&gt; and
+                  &lt;code&gt;fgcolor&lt;/code&gt; attributes as well as to add additional
+                  &lt;code&gt;link&lt;/code&gt;-ed stylesheets.  Cool, eh?
+                &lt;/p&gt;
+                &lt;p&gt;
+                  The development of this plugin was initiated and sponsored by
+                  &lt;a href="http://thycotic.com"&gt;Thycotic Software Ltd.&lt;/a&gt;.
+                  That's also cool, isn't it? ;-)
+                &lt;/p&gt;
+              &lt;/td&gt;
+            &lt;/tr&gt;
+          &lt;/table&gt;
+        &lt;/body&gt;
+      &lt;/html&gt;
+    </textarea>
+
+    <hr />
+    <address><a href="http://dynarch.com/mishoo/">Mihai Bazon</a></address>
+<!-- Created: Wed Oct  1 19:55:37 EEST 2003 -->
+<!-- hhmts start -->
+Last modified on Sat Oct 25 01:06:59 2003
+<!-- hhmts end -->
+<!-- doc-lang: English -->
+  </body>
+</html>

Added: plog/trunk/js/htmlarea/plugins/HtmlTidy/README
===================================================================
--- plog/trunk/js/htmlarea/plugins/HtmlTidy/README	2005-02-05 13:57:52 UTC (rev 948)
+++ plog/trunk/js/htmlarea/plugins/HtmlTidy/README	2005-02-05 15:29:38 UTC (rev 949)
@@ -0,0 +1,104 @@
+// Plugin for htmlArea to run code through the server's HTML Tidy
+// By Adam Wright, for The University of Western Australia
+//
+//   Email:      zeno at ucc.gu.uwa.edu.au
+//   Homepage:   http://blog.hipikat.org/
+//
+// Distributed under the same terms as HTMLArea itself.
+// This notice MUST stay intact for use (see license.txt).
+//
+// Version: 0.5
+// Released to the outside world: 04/03/04
+
+
+HtmlTidy is a plugin for the popular cross-browser TTY WYSIWYG editor,
+htmlArea (http://www.htmlarea.com/). HtmlTidy
+basically queries HTML Tidy (http://tidy.sourceforge.net/) on the
+server side, getting it to make-html-nice, instead of relying on masses
+of javascript, which the client would have to download.
+
+Hi, this is a quick explanation of how to install HtmlTidy. Much better
+documentation is probably required, and you're welcome to write it :)
+
+
+* The HtmlTidy directory you should have found this file in should
+  include the following:
+
+  - README
+        This file, providing help installing the plugin.
+
+  - html-tidy-config.cfg
+        This file contains the configuration options HTML Tidy uses to
+        clean html, and can be modified to suit your organizations
+        requirements.
+
+  - html-tidy-logic.php
+        This is the php script, which is queried with dirty html and is
+        responsible for invoking HTML Tidy, getting nice new html and
+        returning it to the client.
+
+  - html-tidy.js
+        The main htmlArea plugin, providing functionality to tidy html
+        through the htmlArea interface.
+
+  - htmlarea.js.onmode_event.diff
+        At the time of publishing, an extra event handler was required
+        inside the main htmlarea.js file. htmlarea.js may be patched
+        against this file to make the changes reuquired, but be aware
+        that the event handler may either now be in the core or
+        htmlarea.js may have changed enough to invalidate the patch.
+
+	UPDATE: now it exists in the official htmlarea.js; applying
+	this patch is thus no longer necessary.
+
+  - img/html-tidy.gif
+        The HtmlTidy icon, for the htmlArea toolbar. Created by Dan
+        Petty for The University of Western Australia.
+
+  - lang/en.js
+        English language file. Add your own language files here and
+        please contribute back into the htmlArea community!
+
+  The HtmlArea directory should be extracted to your htmlarea/plugins/
+  directory.
+
+
+* Make sure the onMode event handler mentioned above, regarding
+  htmlarea.js.onmode_event.diff, exists in your htmlarea.js
+
+
+* html-tidy-logic.php should be executable, and your web server should
+  be configured to execute php scripts in the directory
+  html-tidy-logic.php exists in.
+
+
+* HTML Tidy needs to be installed on your server, and 'tidy' should be
+  an alias to it, lying in the PATH known to the user executing such
+  web scripts.
+
+
+* In your htmlArea configuration, do something like this:
+
+    HTMLArea.loadPlugin("HtmlTidy");
+
+    editor = new HTMLArea("doc");
+    editor.registerPlugin("HtmlTidy");
+
+
+* Then, in your htmlArea toolbar configuration, use:
+
+    - "HT-html-tidy"
+        This will create the 'tidy broom' icon on the toolbar, which
+        will attempt to tidy html source when clicked, and;
+
+    - "HT-auto-tidy"
+        This will create an "Auto Tidy" / "Don't Tidy" dropdown, to
+        select whether the source should be tidied automatically when
+        entering source view. On by default, if you'd like it otherwise
+        you can do so programatically after generating the toolbar :)
+        (Or just hack it to be otherwise...)
+
+
+Thank you.
+
+Any bugs you find can be emailed to zeno at ucc.gu.uwa.edu.au

Added: plog/trunk/js/htmlarea/plugins/HtmlTidy/html-tidy-config.cfg
===================================================================
--- plog/trunk/js/htmlarea/plugins/HtmlTidy/html-tidy-config.cfg	2005-02-05 13:57:52 UTC (rev 948)
+++ plog/trunk/js/htmlarea/plugins/HtmlTidy/html-tidy-config.cfg	2005-02-05 15:29:38 UTC (rev 949)
@@ -0,0 +1,29 @@
+// Default configuration file for the htmlArea, HtmlTidy plugin
+// By Adam Wright, for The University of Western Australia
+//
+// Evertything you always wanted to know about HTML Tidy *
+// can be found at http://tidy.sourceforge.net/, and a
+// quick reference to the configuration options exists at
+// http://tidy.sourceforge.net/docs/quickref.html
+//
+// * But were afraid to ask
+//
+// Distributed under the same terms as HTMLArea itself.
+// This notice MUST stay intact for use (see license.txt).
+
+word-2000: yes
+clean: no
+drop-font-tags: yes
+doctype: auto
+drop-empty-paras: yes
+drop-proprietary-attributes: yes
+enclose-block-text: yes
+enclose-text: yes
+escape-cdata: yes
+logical-emphasis: yes
+indent: auto
+indent-spaces: 2
+break-before-br: yes
+output-xhtml: yes
+
+force-output: yes

Added: plog/trunk/js/htmlarea/plugins/HtmlTidy/html-tidy-logic.php
===================================================================
--- plog/trunk/js/htmlarea/plugins/HtmlTidy/html-tidy-logic.php	2005-02-05 13:57:52 UTC (rev 948)
+++ plog/trunk/js/htmlarea/plugins/HtmlTidy/html-tidy-logic.php	2005-02-05 15:29:38 UTC (rev 949)
@@ -0,0 +1,83 @@
+<?  ###################################################################
+   ##
+  ##  Plugin for htmlArea, to run code through the server's HTML Tidy
+ ##   By Adam Wright, for The University of Western Australia
+##    This is the server-side script, which dirty code is run through.
+##
+##  Distributed under the same terms as HTMLArea itself.
+##  This notice MUST stay intact for use (see license.txt).
+##
+
+	// Get the original source
+	$source = $_POST['htisource_name'];
+	$source = stripslashes($source);
+
+	// Open a tidy process - I hope it's installed!
+	$descriptorspec = array(
+		0 => array("pipe", "r"),
+		1 => array("pipe", "w"),
+		2 => array("file", "/dev/null", "a")
+	);
+	$process = proc_open("tidy -config html-tidy-config.cfg", $descriptorspec, $pipes);
+
+	// Make sure the program started and we got the hooks...
+	// Either way, get some source code into $source
+	if (is_resource($process)) {
+
+		// Feed untidy source into the stdin
+		fwrite($pipes[0], $source);
+		fclose($pipes[0]);
+
+		// Read clean source out to the browser
+		while (!feof($pipes[1])) {
+			//echo fgets($pipes[1], 1024);
+			$newsrc .= fgets($pipes[1], 1024);
+		}
+		fclose($pipes[1]);
+
+		// Clean up after ourselves
+		proc_close($process);
+
+	} else {
+		// Better give them back what they came with, so they don't lose it all...
+		$newsrc = "<body>\n" .$source. "\n</body>";
+	}
+
+	// Split our source into an array by lines
+	$srcLines = explode("\n",$newsrc);
+
+	// Get only the lines between the body tags
+	$startLn = 0;
+	while ( strpos( $srcLines[$startLn++], '<body' ) === false && $startLn < sizeof($srcLines) );
+	$endLn = $startLn;
+	while ( strpos( $srcLines[$endLn++], '</body' ) === false && $endLn < sizeof($srcLines) );
+
+	$srcLines = array_slice( $srcLines, $startLn, ($endLn - $startLn - 1) );
+
+	// Create a set of javascript code to compile a new source string
+	foreach ($srcLines as $line) {
+		$jsMakeSrc .= "\tns += '" . str_replace("'","\'",$line) . "\\n';\n";
+	}
+?>
+
+
+<html>
+  <head>
+    <script type="text/javascript">
+
+function setNewHtml() {
+	var htRef = window.parent._editorRef.plugins['HtmlTidy'];
+	htRef.instance.processTidied(tidyString());
+}
+function tidyString() {
+	var ns = '\n';
+	<?=$jsMakeSrc;?>
+	return ns;
+}
+
+    </script>
+  </head>
+
+  <body id="htiNewBody" onload="setNewHtml()">
+  </body>
+</html>

Added: plog/trunk/js/htmlarea/plugins/HtmlTidy/html-tidy.js
===================================================================
--- plog/trunk/js/htmlarea/plugins/HtmlTidy/html-tidy.js	2005-02-05 13:57:52 UTC (rev 948)
+++ plog/trunk/js/htmlarea/plugins/HtmlTidy/html-tidy.js	2005-02-05 15:29:38 UTC (rev 949)
@@ -0,0 +1,128 @@
+// Plugin for htmlArea to run code through the server's HTML Tidy
+// By Adam Wright, for The University of Western Australia
+//
+// Distributed under the same terms as HTMLArea itself.
+// This notice MUST stay intact for use (see license.txt).
+
+function HtmlTidy(editor) {
+	this.editor = editor;
+
+	var cfg = editor.config;
+	var tt = HtmlTidy.I18N;
+	var bl = HtmlTidy.btnList;
+	var self = this;
+
+	this.onMode = this.__onMode;
+
+	// register the toolbar buttons provided by this plugin
+	var toolbar = [];
+	for (var i = 0; i < bl.length; ++i) {
+		var btn = bl[i];
+		if (btn == "html-tidy") {
+			var id = "HT-html-tidy";
+			cfg.registerButton(id, tt[id], editor.imgURL(btn[0] + ".gif", "HtmlTidy"), true,
+					   function(editor, id) {
+						   // dispatch button press event
+						   self.buttonPress(editor, id);
+					   }, btn[1]);
+			toolbar.push(id);
+		} else if (btn == "html-auto-tidy") {
+			var ht_class = {
+				id	: "HT-auto-tidy",
+				options	: { "Auto-Tidy" : "auto", "Don't Tidy" : "noauto" },
+				action	: function (editor) { self.__onSelect(editor, this); },
+				refresh	: function (editor) { },
+				context	: "body"
+			};
+			cfg.registerDropdown(ht_class);
+		}
+	}
+
+	for (var i in toolbar) {
+		cfg.toolbar[0].push(toolbar[i]);
+	}
+};
+
+HtmlTidy._pluginInfo = {
+	name          : "HtmlTidy",
+	version       : "1.0",
+	developer     : "Adam Wright",
+	developer_url : "http://blog.hipikat.org/",
+	sponsor       : "The University of Western Australia",
+	sponsor_url   : "http://www.uwa.edu.au/",
+	license       : "htmlArea"
+};
+
+HtmlTidy.prototype.__onSelect = function(editor, obj) {
+	// Get the toolbar element object
+	var elem = editor._toolbarObjects[obj.id].element;
+
+	// Set our onMode event appropriately
+	if (elem.value == "auto")
+		this.onMode = this.__onMode;
+	else
+		this.onMode = null;
+};
+
+HtmlTidy.prototype.__onMode = function(mode) {
+	if ( mode == "textmode" ) {
+		this.buttonPress(this.editor, "HT-html-tidy");
+	}
+};
+
+HtmlTidy.btnList = [
+		    null, // separator
+		    ["html-tidy"],
+		    ["html-auto-tidy"]
+];
+
+HtmlTidy.prototype.onGenerateOnce = function() {
+	var editor = this.editor;
+
+	var ifr = document.createElement("iframe");
+	ifr.name = "htiframe_name";
+	var s = ifr.style;
+	s.position = "absolute";
+	s.width = s.height = s.border = s.left = s.top = s.padding = s.margin = "0px";
+	document.body.appendChild(ifr);
+
+	var frm = '<form id="htiform_id" name="htiform_name" method="post" target="htiframe_name" action="';
+	frm += _editor_url + 'plugins/HtmlTidy/html-tidy-logic.php';
+	frm += '"><textarea name="htisource_name" id="htisource_id">';
+	frm += '</textarea></form>';
+
+	var newdiv = document.createElement('div');
+	newdiv.style.display = "none";
+	newdiv.innerHTML = frm;
+	document.body.appendChild(newdiv);
+};
+
+HtmlTidy.prototype.buttonPress = function(editor, id) {
+	var i18n = HtmlTidy.I18N;
+
+	switch (id) {
+	    case "HT-html-tidy":
+
+		var oldhtml = editor.getHTML();
+
+		// Ask the server for some nice new html, based on the old...
+		var myform = document.getElementById('htiform_id');
+		var txtarea = document.getElementById('htisource_id');
+		txtarea.value = editor.getHTML();
+
+		// Apply the 'meanwhile' text, e.g. "Tidying HTML, please wait..."
+		editor.setHTML(i18n['tidying']);
+
+		// The returning tidying processing script needs to find the editor
+		window._editorRef = editor;
+
+		// ...And send our old source off for processing!
+		myform.submit();
+		break;
+	}
+};
+
+HtmlTidy.prototype.processTidied = function(newSrc) {
+	editor = this.editor;
+	editor.setHTML(newSrc);
+};

Added: plog/trunk/js/htmlarea/plugins/HtmlTidy/img/html-tidy.gif
===================================================================
(Binary files differ)


Property changes on: plog/trunk/js/htmlarea/plugins/HtmlTidy/img/html-tidy.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: plog/trunk/js/htmlarea/plugins/HtmlTidy/lang/en.js
===================================================================
--- plog/trunk/js/htmlarea/plugins/HtmlTidy/lang/en.js	2005-02-05 13:57:52 UTC (rev 948)
+++ plog/trunk/js/htmlarea/plugins/HtmlTidy/lang/en.js	2005-02-05 15:29:38 UTC (rev 949)
@@ -0,0 +1,18 @@
+// I18N constants
+
+// LANG: "en", ENCODING: UTF-8 | ISO-8859-1
+// Author: Adam Wright, http://blog.hipikat.org/
+
+// 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.)
+
+HtmlTidy.I18N = {
+	"tidying"                               : "\n Tidying up the HTML source, please wait...",
+	"HT-html-tidy"                          : "HTML Tidy"
+};

Added: plog/trunk/js/htmlarea/plugins/ListType/lang/de.js
===================================================================
--- plog/trunk/js/htmlarea/plugins/ListType/lang/de.js	2005-02-05 13:57:52 UTC (rev 948)
+++ plog/trunk/js/htmlarea/plugins/ListType/lang/de.js	2005-02-05 15:29:38 UTC (rev 949)
@@ -0,0 +1,23 @@
+// I18N constants
+
+// LANG: "en", ENCODING: UTF-8 | ISO-8859-1
+// Author: Holger Hees, http://www.systemconcept.de
+
+// 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.)
+
+ListType.I18N = {
+	"Decimal"                :    "1-Zahlen",
+	"Lower roman"            :    "i-Roemisch",
+	"Upper roman"            :    "I-Roemisch",
+	"Lower latin"            :    "a-Zeichen",
+	"Upper latin"            :    "A-Zeichen",
+	"Lower greek"            :    "Griechisch",
+	"ListStyleTooltip"       :    "Wählen Sie einen Typ für die Nummerierung aus"
+};

Added: plog/trunk/js/htmlarea/plugins/ListType/lang/en.js
===================================================================
--- plog/trunk/js/htmlarea/plugins/ListType/lang/en.js	2005-02-05 13:57:52 UTC (rev 948)
+++ plog/trunk/js/htmlarea/plugins/ListType/lang/en.js	2005-02-05 15:29:38 UTC (rev 949)
@@ -0,0 +1,23 @@
+// I18N constants
+
+// LANG: "en", ENCODING: UTF-8 | ISO-8859-1
+// Author: Mihai Bazon, http://dynarch.com/mishoo
+
+// 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.)
+
+ListType.I18N = {
+	"Decimal"                :    "Decimal numbers",
+	"Lower roman"            :    "Lower roman numbers",
+	"Upper roman"            :    "Upper roman numbers",
+	"Lower latin"            :    "Lower latin letters",
+	"Upper latin"            :    "Upper latin letters",
+	"Lower greek"            :    "Lower greek letters",
+	"ListStyleTooltip"       :    "Choose list style type (for ordered lists)"
+};

Added: plog/trunk/js/htmlarea/plugins/ListType/list-type.js
===================================================================
--- plog/trunk/js/htmlarea/plugins/ListType/list-type.js	2005-02-05 13:57:52 UTC (rev 948)
+++ plog/trunk/js/htmlarea/plugins/ListType/list-type.js	2005-02-05 15:29:38 UTC (rev 949)
@@ -0,0 +1,89 @@
+// ListType Plugin for HTMLArea-3.0
+// Sponsored by MEdTech Unit - Queen's University
+// Implementation by Mihai Bazon, http://dynarch.com/mishoo/
+//
+// (c) dynarch.com 2003-2005.
+// Distributed under the same terms as HTMLArea itself.
+// This notice MUST stay intact for use (see license.txt).
+//
+// $Id: list-type.js,v 1.2 2005/01/20 17:49:03 mishoo Exp $
+
+function ListType(editor) {
+	this.editor = editor;
+	var cfg = editor.config;
+	var toolbar = cfg.toolbar;
+	var self = this;
+	var i18n = ListType.I18N;
+	var options = {};
+	options[i18n["Decimal"]] = "decimal";
+	options[i18n["Lower roman"]] = "lower-roman";
+	options[i18n["Upper roman"]] = "upper-roman";
+	options[i18n["Lower latin"]] = "lower-alpha";
+	options[i18n["Upper latin"]] = "upper-alpha";
+	if (!HTMLArea.is_ie)
+		// IE doesn't support this property; even worse, it complains
+		// with a gross error message when we tried to select it,
+		// therefore let's hide it from the damn "browser".
+		options[i18n["Lower greek"]] = "lower-greek";
+	var obj = {
+		id            : "ListType",
+		tooltip       : i18n["ListStyleTooltip"],
+		options       : options,
+		action        : function(editor) { self.onSelect(editor, this); },
+		refresh       : function(editor) { self.updateValue(editor, this); },
+		context       : "ol"
+	};
+	cfg.registerDropdown(obj);
+	var a, i, j, found = false;
+	for (i = 0; !found && i < toolbar.length; ++i) {
+		a = toolbar[i];
+		for (j = 0; j < a.length; ++j) {
+			if (a[j] == "unorderedlist") {
+				found = true;
+				break;
+			}
+		}
+	}
+	if (found)
+		a.splice(j, 0, "space", "ListType", "space");
+};
+
+ListType._pluginInfo = {
+	name          : "ListType",
+	version       : "1.0",
+	developer     : "Mihai Bazon",
+	developer_url : "http://dynarch.com/mishoo/",
+	c_owner       : "dynarch.com",
+	sponsor       : "MEdTech Unit - Queen's University",
+	sponsor_url   : "http://www.queensu.ca/",
+	license       : "htmlArea"
+};
+
+ListType.prototype.onSelect = function(editor, combo) {
+	var tbobj = editor._toolbarObjects[combo.id].element;
+	var parent = editor.getParentElement();
+	while (!/^ol$/i.test(parent.tagName)) {
+		parent = parent.parentNode;
+	}
+	parent.style.listStyleType = tbobj.value;
+};
+
+ListType.prototype.updateValue = function(editor, combo) {
+	var tbobj = editor._toolbarObjects[combo.id].element;
+	var parent = editor.getParentElement();
+	while (parent && !/^ol$/i.test(parent.tagName)) {
+		parent = parent.parentNode;
+	}
+	if (!parent) {
+		tbobj.selectedIndex = 0;
+		return;
+	}
+	var type = parent.style.listStyleType;
+	if (!type) {
+		tbobj.selectedIndex = 0;
+	} else {
+		for (var i = tbobj.firstChild; i; i = i.nextSibling) {
+			i.selected = (type.indexOf(i.value) != -1);
+		}
+	}
+};

Added: plog/trunk/js/htmlarea/plugins/SpellChecker/img/he-spell-check.gif
===================================================================
(Binary files differ)


Property changes on: plog/trunk/js/htmlarea/plugins/SpellChecker/img/he-spell-check.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Modified: plog/trunk/js/htmlarea/plugins/SpellChecker/lang/cz.js
===================================================================
--- plog/trunk/js/htmlarea/plugins/SpellChecker/lang/cz.js	2005-02-05 13:57:52 UTC (rev 948)
+++ plog/trunk/js/htmlarea/plugins/SpellChecker/lang/cz.js	2005-02-05 15:29:38 UTC (rev 949)
@@ -1,37 +1,37 @@
-// I18N constants
-
-// LANG: "cz", ENCODING: UTF-8 | ISO-8859-2
-// Author: Jiri Löw, <jirilow at 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 ;-)"
-};
+// I18N constants
+
+// LANG: "cz", ENCODING: UTF-8 | ISO-8859-2
+// Author: Jiri Löw, <jirilow at 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 ;-)"
+};

Modified: plog/trunk/js/htmlarea/plugins/SpellChecker/lang/da.js
===================================================================
--- plog/trunk/js/htmlarea/plugins/SpellChecker/lang/da.js	2005-02-05 13:57:52 UTC (rev 948)
+++ plog/trunk/js/htmlarea/plugins/SpellChecker/lang/da.js	2005-02-05 15:29:38 UTC (rev 949)
@@ -1,37 +1,37 @@
-// I18N constants
-
-// LANG: "en", ENCODING: UTF-8 | ISO-8859-1
-// Author: Steen Sønderup, <steen at 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"
-};
+// I18N constants
+
+// LANG: "en", ENCODING: UTF-8 | ISO-8859-1
+// Author: Steen Sønderup, <steen at 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"
+};

Modified: plog/trunk/js/htmlarea/plugins/SpellChecker/lang/de.js
===================================================================
--- plog/trunk/js/htmlarea/plugins/SpellChecker/lang/de.js	2005-02-05 13:57:52 UTC (rev 948)
+++ plog/trunk/js/htmlarea/plugins/SpellChecker/lang/de.js	2005-02-05 15:29:38 UTC (rev 949)
@@ -1,28 +1,28 @@
-// I18N constants
-
-// LANG: "en", ENCODING: UTF-8 | ISO-8859-1
-// Author: Broxx, <broxx at 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 ;-)"
-};
+// I18N constants
+
+// LANG: "en", ENCODING: UTF-8 | ISO-8859-1
+// Author: Broxx, <broxx at 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 ;-)"
+};

Modified: plog/trunk/js/htmlarea/plugins/SpellChecker/lang/en.js
===================================================================
--- plog/trunk/js/htmlarea/plugins/SpellChecker/lang/en.js	2005-02-05 13:57:52 UTC (rev 948)
+++ plog/trunk/js/htmlarea/plugins/SpellChecker/lang/en.js	2005-02-05 15:29:38 UTC (rev 949)
@@ -1,38 +1,38 @@
-// I18N constants
-
-// LANG: "en", ENCODING: UTF-8 | ISO-8859-1
-// Author: Mihai Bazon, http://dynarch.com/mishoo
-
-// 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"                    : "Please confirm that you want to open this link",
-	"Cancel"                                : "Cancel",
-	"Dictionary"                            : "Dictionary",
-	"Finished list of mispelled words"      : "Finished list of mispelled words",
-	"I will open it in a new page."         : "I will open it in a new page.",
-	"Ignore all"                            : "Ignore all",
-	"Ignore"                                : "Ignore",
-	"NO_ERRORS"                             : "No mispelled words found with the selected dictionary.",
-	"NO_ERRORS_CLOSING"                     : "Spell check complete, didn't find any mispelled words.  Closing now...",
-	"OK"                                    : "OK",
-	"Original word"                         : "Original word",
-	"Please wait.  Calling spell checker."  : "Please wait.  Calling spell checker.",
-	"Please wait: changing dictionary to"   : "Please wait: changing dictionary to",
-	"QUIT_CONFIRMATION"                     : "This will drop changes and quit spell checker.  Please confirm.",
-	"Re-check"                              : "Re-check",
-	"Replace all"                           : "Replace all",
-	"Replace with"                          : "Replace with",
-	"Replace"                               : "Replace",
-	"Revert"                                : "Revert",
-	"SC-spell-check"                        : "Spell-check",
-	"Suggestions"                           : "Suggestions",
-	"pliz weit ;-)"                         : "pliz weit ;-)"
-};
+// I18N constants
+
+// LANG: "en", ENCODING: UTF-8 | ISO-8859-1
+// Author: Mihai Bazon, http://dynarch.com/mishoo
+
+// 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"                    : "Please confirm that you want to open this link",
+	"Cancel"                                : "Cancel",
+	"Dictionary"                            : "Dictionary",
+	"Finished list of mispelled words"      : "Finished list of mispelled words",
+	"I will open it in a new page."         : "I will open it in a new page.",
+	"Ignore all"                            : "Ignore all",
+	"Ignore"                                : "Ignore",
+	"NO_ERRORS"                             : "No mispelled words found with the selected dictionary.",
+	"NO_ERRORS_CLOSING"                     : "Spell check complete, didn't find any mispelled words.  Closing now...",
+	"OK"                                    : "OK",
+	"Original word"                         : "Original word",
+	"Please wait.  Calling spell checker."  : "Please wait.  Calling spell checker.",
+	"Please wait: changing dictionary to"   : "Please wait: changing dictionary to",
+	"QUIT_CONFIRMATION"                     : "This will drop changes and quit spell checker.  Please confirm.",
+	"Re-check"                              : "Re-check",
+	"Replace all"                           : "Replace all",
+	"Replace with"                          : "Replace with",
+	"Replace"                               : "Replace",
+	"Revert"                                : "Revert",
+	"SC-spell-check"                        : "Spell-check",
+	"Suggestions"                           : "Suggestions",
+	"pliz weit ;-)"                         : "pliz weit ;-)"
+};

Added: plog/trunk/js/htmlarea/plugins/SpellChecker/lang/he.js
===================================================================
--- plog/trunk/js/htmlarea/plugins/SpellChecker/lang/he.js	2005-02-05 13:57:52 UTC (rev 948)
+++ plog/trunk/js/htmlarea/plugins/SpellChecker/lang/he.js	2005-02-05 15:29:38 UTC (rev 949)
@@ -0,0 +1,38 @@
+// I18N constants
+
+// LANG: "en", ENCODING: UTF-8 | ISO-8859-1
+// Author: Mihai Bazon, http://dynarch.com/mishoo
+
+// 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"                    : "אנא אשר שברצונך לפתוח קישור זה",
+	"Cancel"                                : "ביטול",
+	"Dictionary"                            : "מילון",
+	"Finished list of mispelled words"      : "הסתיימה רשימת המילים המאויתות באופן שגוי",
+	"I will open it in a new page."         : "אני אפתח את זה בחלון חדש.",
+	"Ignore all"                            : "התעלם מהכל",
+	"Ignore"                                : "התעלם",
+	"NO_ERRORS"                             : "לא נמצאו מילים מאויתות באופן שגוי עם המילון הנבחר.",
+	"NO_ERRORS_CLOSING"                     : "בדיקת האיות נסתיימה, לא נמצאו מילים מאויתות באופן שגוי.  נסגר כעת...",
+	"OK"                                    : "אישור",
+	"Original word"                         : "המילה המקורית",
+	"Please wait.  Calling spell checker."  : "אנא המתן.  קורא לבודק איות.",
+	"Please wait: changing dictionary to"   : "אנא המתן: מחליף מילון ל-",
+	"QUIT_CONFIRMATION"                     : "זה יבטל את השינויים ויצא מבודק האיות.  אנא אשר.",
+	"Re-check"                              : "בדוק מחדש",
+	"Replace all"                           : "החלף הכל",
+	"Replace with"                          : "החלף ב-",
+	"Replace"                               : "החלף",
+	"Revert"                                : "החזר שינויים",
+	"SC-spell-check"                        : "בדיקת איות",
+	"Suggestions"                           : "הצעות",
+	"pliz weit ;-)"                         : "ענא המטן ;-)"
+};

Modified: plog/trunk/js/htmlarea/plugins/SpellChecker/lang/hu.js
===================================================================
--- plog/trunk/js/htmlarea/plugins/SpellChecker/lang/hu.js	2005-02-05 13:57:52 UTC (rev 948)
+++ plog/trunk/js/htmlarea/plugins/SpellChecker/lang/hu.js	2005-02-05 15:29:38 UTC (rev 949)
@@ -1,37 +1,37 @@
-// I18N constants
-
-// LANG: "hu", ENCODING: UTF-8
-// Author: Miklós Somogyi, <somogyine at 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 ;-)"
-};
+// I18N constants
+
+// LANG: "hu", ENCODING: UTF-8
+// Author: Miklós Somogyi, <somogyine at 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 ;-)"
+};

Modified: plog/trunk/js/htmlarea/plugins/SpellChecker/lang/it.js
===================================================================
--- plog/trunk/js/htmlarea/plugins/SpellChecker/lang/it.js	2005-02-05 13:57:52 UTC (rev 948)
+++ plog/trunk/js/htmlarea/plugins/SpellChecker/lang/it.js	2005-02-05 15:29:38 UTC (rev 949)
@@ -1,28 +1,28 @@
-// I18N constants
-
-// LANG: "it", ENCODING: UTF-8 | ISO-8859-1
-// Author: Fabio Rotondo, <fabio at 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 ;-)"
-};
+// I18N constants
+
+// LANG: "it", ENCODING: UTF-8 | ISO-8859-1
+// Author: Fabio Rotondo, <fabio at 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 ;-)"
+};

Added: plog/trunk/js/htmlarea/plugins/SpellChecker/lang/nl.js
===================================================================
--- plog/trunk/js/htmlarea/plugins/SpellChecker/lang/nl.js	2005-02-05 13:57:52 UTC (rev 948)
+++ plog/trunk/js/htmlarea/plugins/SpellChecker/lang/nl.js	2005-02-05 15:29:38 UTC (rev 949)
@@ -0,0 +1,39 @@
+// I18N constants
+
+// LANG: "nl", ENCODING: UTF-8 | ISO-8859-1
+// Author: A.H van den Broek  http://www.kontaktfm.nl
+// Email : tonbroek at kontaktfm.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.)
+
+SpellChecker.I18N = {
+	"CONFIRM_LINK_CLICK"                    : "Weet u zeker dat u deze link wilt openen?",
+	"Cancel"                                : "Annuleer",
+	"Dictionary"                            : "Woordenboek",
+	"Finished list of mispelled words"      : "klaar met de lijst van fouten woorden",
+	"I will open it in a new page."         : "Ik zal het in een nieuwe pagina openen.",
+	"Ignore all"                            : "alles overslaan",
+	"Ignore"                                : "Overslaan",
+	"NO_ERRORS"                             : "Geen fouten gevonden met dit woordenboek.",
+	"NO_ERRORS_CLOSING"                     : "Spell checking is klaar, geen fouten gevonden.  spell checking word gesloten...",
+	"OK"                                    : "OK",
+	"Original word"                         : "Originele woord",
+	"Please wait.  Calling spell checker."  : "Even wachten. spell checker wordt geladen.",
+	"Please wait: changing dictionary to"   : "even wachten: woordenboek wordt veranderd naar",
+	"QUIT_CONFIRMATION"                     : "Dit zal alle veranderingen annuleren en de spell checker sluiten.  Weet u het zeker?",
+	"Re-check"                              : "Opnieuw",
+	"Replace all"                           : "Alles vervangen",
+	"Replace with"                          : "Vervangen met",
+	"Replace"                               : "Vervangen",
+	"Revert"                                : "Omkeren",
+	"SC-spell-check"                        : "Spell-check",
+	"Suggestions"                           : "Suggestie",
+	"pliz weit ;-)"                         : "Even wachten ;-)"
+};

Modified: plog/trunk/js/htmlarea/plugins/SpellChecker/lang/ro.js
===================================================================
--- plog/trunk/js/htmlarea/plugins/SpellChecker/lang/ro.js	2005-02-05 13:57:52 UTC (rev 948)
+++ plog/trunk/js/htmlarea/plugins/SpellChecker/lang/ro.js	2005-02-05 15:29:38 UTC (rev 949)
@@ -1,37 +1,37 @@
-// I18N constants
-
-// LANG: "ro", ENCODING: UTF-8
-// Author: Mihai Bazon, http://dynarch.com/mishoo
-
-// 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"                    : "Vă rog confirmaţi că vreţi să deschideţi acest link",
-	"Cancel"                                : "Anulează",
-	"Dictionary"                            : "Dicţionar",
-	"Finished list of mispelled words"      : "Am terminat lista de cuvinte greÅŸite",
-	"I will open it in a new page."         : "O voi deschide într-o altă fereastră.",
-	"Ignore all"                            : "Ignoră toate",
-	"Ignore"                                : "Ignoră",
-	"NO_ERRORS"                             : "Nu am găsit nici un cuvânt greşit cu acest dicţionar.",
-	"NO_ERRORS_CLOSING"                     : "Am terminat, nu am detectat nici o greşeală.  Acum închid fereastra...",
-	"OK"                                    : "OK",
-	"Original word"                         : "Cuvântul original",
-	"Please wait.  Calling spell checker."  : "Vă rog aşteptaţi.  Apelez spell-checker-ul.",
-	"Please wait: changing dictionary to"   : "Vă rog aşteptaţi.  Schimb dicţionarul cu",
-	"QUIT_CONFIRMATION"                     : "Doriţi să renunţaţi la modificări şi să închid spell-checker-ul?",
-	"Re-check"                              : "Scanează",
-	"Replace all"                           : "ÃŽnlocuieÅŸte toate",
-	"Replace with"                          : "ÃŽnlocuieÅŸte cu",
-	"Replace"                               : "ÃŽnlocuieÅŸte",
-	"SC-spell-check"                        : "Detectează greşeli",
-	"Suggestions"                           : "Sugestii",
-	"pliz weit ;-)"                         : "va rog ashteptatzi ;-)"
-};
+// I18N constants
+
+// LANG: "ro", ENCODING: UTF-8
+// Author: Mihai Bazon, http://dynarch.com/mishoo
+
+// 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"                    : "Vă rog confirmaţi că vreţi să deschideţi acest link",
+	"Cancel"                                : "Anulează",
+	"Dictionary"                            : "Dicţionar",
+	"Finished list of mispelled words"      : "Am terminat lista de cuvinte greÅŸite",
+	"I will open it in a new page."         : "O voi deschide într-o altă fereastră.",
+	"Ignore all"                            : "Ignoră toate",
+	"Ignore"                                : "Ignoră",
+	"NO_ERRORS"                             : "Nu am găsit nici un cuvânt greşit cu acest dicţionar.",
+	"NO_ERRORS_CLOSING"                     : "Am terminat, nu am detectat nici o greşeală.  Acum închid fereastra...",
+	"OK"                                    : "OK",
+	"Original word"                         : "Cuvântul original",
+	"Please wait.  Calling spell checker."  : "Vă rog aşteptaţi.  Apelez spell-checker-ul.",
+	"Please wait: changing dictionary to"   : "Vă rog aşteptaţi.  Schimb dicţionarul cu",
+	"QUIT_CONFIRMATION"                     : "Doriţi să renunţaţi la modificări şi să închid spell-checker-ul?",
+	"Re-check"                              : "Scanează",
+	"Replace all"                           : "ÃŽnlocuieÅŸte toate",
+	"Replace with"                          : "ÃŽnlocuieÅŸte cu",
+	"Replace"                               : "ÃŽnlocuieÅŸte",
+	"SC-spell-check"                        : "Detectează greşeli",
+	"Suggestions"                           : "Sugestii",
+	"pliz weit ;-)"                         : "va rog ashteptatzi ;-)"
+};

Modified: plog/trunk/js/htmlarea/plugins/SpellChecker/readme-tech.html
===================================================================
--- plog/trunk/js/htmlarea/plugins/SpellChecker/readme-tech.html	2005-02-05 13:57:52 UTC (rev 948)
+++ plog/trunk/js/htmlarea/plugins/SpellChecker/readme-tech.html	2005-02-05 15:29:38 UTC (rev 949)
@@ -1,114 +1,114 @@
-<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 3.2//EN">
-<html>
-  <head>
-    <title>HTMLArea Spell Checker</title>
-  </head>
-
-  <body>
-    <h1>HTMLArea Spell Checker</h1>
-
-    <p>The HTMLArea Spell Checker subsystem consists of the following
-      files:</p>
-
-    <ul>
-
-      <li>spell-checker.js &mdash; the spell checker plugin interface for
-        HTMLArea</li>
-
-      <li>spell-checker-ui.html &mdash; the HTML code for the user
-        interface</li>
-
-      <li>spell-checker-ui.js &mdash; functionality of the user
-        interface</li>
-
-      <li>spell-checker-logic.cgi &mdash; Perl CGI script that checks a text
-        given through POST for spelling errors</li>
-
-      <li>spell-checker-style.css &mdash; style for mispelled words</li>
-
-      <li>lang/en.js &mdash; main language file (English).</li>
-
-    </ul>
-
-    <h2>Process overview</h2>
-
-    <p>
-      When an end-user clicks the "spell-check" button in the HTMLArea
-      editor, a new window is opened with the URL of "spell-check-ui.html".
-      This window initializes itself with the text found in the editor (uses
-      <tt>window.opener.SpellChecker.editor</tt> global variable) and it
-      submits the text to the server-side script "spell-check-logic.cgi".
-      The target of the FORM is an inline frame which is used both to
-      display the text and correcting.
-    </p>
-
-    <p>
-      Further, spell-check-logic.cgi calls Aspell for each portion of plain
-      text found in the given HTML.  It rebuilds an HTML file that contains
-      clear marks of which words are incorrect, along with suggestions for
-      each of them.  This file is then loaded in the inline frame.  Upon
-      loading, a JavaScript function from "spell-check-ui.js" is called.
-      This function will retrieve all mispelled words from the HTML of the
-      iframe and will setup the user interface so that it allows correction.
-    </p>
-
-    <h2>The server-side script (spell-check-logic.cgi)</h2>
-
-    <p>
-      <strong>Unicode safety</strong> &mdash; the program <em>is</em>
-      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).  <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.</strike>
-    </p>
-
-    <p>
-      <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>
-      The Perl Unicode manual (man perluniintro) states:
-    </p>
-
-    <blockquote>
-      <em>
-        Starting from Perl 5.6.0, Perl has had the capacity to handle Unicode
-        natively.  Perl 5.8.0, however, is the first recommended release for
-        serious Unicode work.  The maintenance release 5.6.1 fixed many of the
-        problems of the initial Unicode implementation, but for example regular
-        expressions still do not work with Unicode in 5.6.1.
-      </em>
-    </blockquote>
-
-    <p>In other words, do <em>not</em> assume that this script is
-      Unicode-safe on Perl interpreters older than 5.8.0.</p>
-
-    <p>The following Perl modules are required:</p>
-
-    <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=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>
-
-    <p>Of these, only Text::Aspell might need to be installed manually.  The
-      others are likely to be available by default in most Perl distributions.</p>
-
-    <hr />
-    <address><a href="http://dynarch.com/mishoo/">Mihai Bazon</a></address>
-<!-- Created: Thu Jul 17 13:22:27 EEST 2003 -->
-<!-- hhmts start --> Last modified: Fri Jan 30 19:14:11 EET 2004 <!-- hhmts end -->
-<!-- doc-lang: English -->
-  </body>
-</html>
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 3.2//EN">
+<html>
+  <head>
+    <title>HTMLArea Spell Checker</title>
+  </head>
+
+  <body>
+    <h1>HTMLArea Spell Checker</h1>
+
+    <p>The HTMLArea Spell Checker subsystem consists of the following
+      files:</p>
+
+    <ul>
+
+      <li>spell-checker.js &mdash; the spell checker plugin interface for
+        HTMLArea</li>
+
+      <li>spell-checker-ui.html &mdash; the HTML code for the user
+        interface</li>
+
+      <li>spell-checker-ui.js &mdash; functionality of the user
+        interface</li>
+
+      <li>spell-checker-logic.cgi &mdash; Perl CGI script that checks a text
+        given through POST for spelling errors</li>
+
+      <li>spell-checker-style.css &mdash; style for mispelled words</li>
+
+      <li>lang/en.js &mdash; main language file (English).</li>
+
+    </ul>
+
+    <h2>Process overview</h2>
+
+    <p>
+      When an end-user clicks the "spell-check" button in the HTMLArea
+      editor, a new window is opened with the URL of "spell-check-ui.html".
+      This window initializes itself with the text found in the editor (uses
+      <tt>window.opener.SpellChecker.editor</tt> global variable) and it
+      submits the text to the server-side script "spell-check-logic.cgi".
+      The target of the FORM is an inline frame which is used both to
+      display the text and correcting.
+    </p>
+
+    <p>
+      Further, spell-check-logic.cgi calls Aspell for each portion of plain
+      text found in the given HTML.  It rebuilds an HTML file that contains
+      clear marks of which words are incorrect, along with suggestions for
+      each of them.  This file is then loaded in the inline frame.  Upon
+      loading, a JavaScript function from "spell-check-ui.js" is called.
+      This function will retrieve all mispelled words from the HTML of the
+      iframe and will setup the user interface so that it allows correction.
+    </p>
+
+    <h2>The server-side script (spell-check-logic.cgi)</h2>
+
+    <p>
+      <strong>Unicode safety</strong> &mdash; the program <em>is</em>
+      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).  <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.</strike>
+    </p>
+
+    <p>
+      <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>
+      The Perl Unicode manual (man perluniintro) states:
+    </p>
+
+    <blockquote>
+      <em>
+        Starting from Perl 5.6.0, Perl has had the capacity to handle Unicode
+        natively.  Perl 5.8.0, however, is the first recommended release for
+        serious Unicode work.  The maintenance release 5.6.1 fixed many of the
+        problems of the initial Unicode implementation, but for example regular
+        expressions still do not work with Unicode in 5.6.1.
+      </em>
+    </blockquote>
+
+    <p>In other words, do <em>not</em> assume that this script is
+      Unicode-safe on Perl interpreters older than 5.8.0.</p>
+
+    <p>The following Perl modules are required:</p>
+
+    <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=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>
+
+    <p>Of these, only Text::Aspell might need to be installed manually.  The
+      others are likely to be available by default in most Perl distributions.</p>
+
+    <hr />
+    <address><a href="http://dynarch.com/mishoo/">Mihai Bazon</a></address>
+<!-- Created: Thu Jul 17 13:22:27 EEST 2003 -->
+<!-- hhmts start --> Last modified: Fri Jan 30 19:14:11 EET 2004 <!-- hhmts end -->
+<!-- doc-lang: English -->
+  </body>
+</html>

Modified: plog/trunk/js/htmlarea/plugins/SpellChecker/spell-check-logic.cgi
===================================================================
--- plog/trunk/js/htmlarea/plugins/SpellChecker/spell-check-logic.cgi	2005-02-05 13:57:52 UTC (rev 948)
+++ plog/trunk/js/htmlarea/plugins/SpellChecker/spell-check-logic.cgi	2005-02-05 15:29:38 UTC (rev 949)
@@ -1,210 +1,210 @@
-#! /usr/bin/perl -w
-
-# Spell Checker Plugin for HTMLArea-3.0
-# Sponsored by www.americanbible.org
-# Implementation by Mihai Bazon, http://dynarch.com/mishoo/
-#
-# (c) dynarch.com 2003.
-# Distributed under the same terms as HTMLArea itself.
-# This notice MUST stay intact for use (see license.txt).
-#
-# $Id: spell-check-logic.cgi,v 1.10 2004/01/31 13:47:05 mishoo Exp $
-
-use strict;
-use utf8;
-use Encode;
-use Text::Aspell;
-use XML::DOM;
-use CGI;
-
-my $TIMER_start = undef;
-eval {
-    use Time::HiRes qw( gettimeofday tv_interval );
-    $TIMER_start = [gettimeofday()];
-};
-# use POSIX qw( locale_h );
-
-binmode STDIN, ':utf8';
-binmode STDOUT, ':utf8';
-
-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
-$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', 'normal');
-
-my %suggested_words = ();
-keys %suggested_words = 128;
-
-my $file_content = decode('UTF-8', $cgi->param('content'));
-$file_content = parse_with_dom($file_content);
-
-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' ]
-   ]);
-
-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();">^;
-
-print $file_content;
-if ($cgi->param('init') eq '1') {
-    my @dicts = $speller->dictionary_info();
-    my $dictionaries = '';
-    foreach my $i (@dicts) {
-        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>^;
-}
-
-print '</body></html>';
-
-# Perl is beautiful.
-sub spellcheck {
-    my $node = shift;
-    my $doc = $node->getOwnerDocument;
-    my $check = sub {                 # called for each word in the text
-        # input is 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
-            ++$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);
-        }
-    }
-};
-
-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;
-};
+#! /usr/bin/perl -w
+
+# Spell Checker Plugin for HTMLArea-3.0
+# Sponsored by www.americanbible.org
+# Implementation by Mihai Bazon, http://dynarch.com/mishoo/
+#
+# (c) dynarch.com 2003.
+# Distributed under the same terms as HTMLArea itself.
+# This notice MUST stay intact for use (see license.txt).
+#
+# $Id: spell-check-logic.cgi,v 1.10 2004/01/31 13:47:05 mishoo Exp $
+
+use strict;
+use utf8;
+use Encode;
+use Text::Aspell;
+use XML::DOM;
+use CGI;
+
+my $TIMER_start = undef;
+eval {
+    use Time::HiRes qw( gettimeofday tv_interval );
+    $TIMER_start = [gettimeofday()];
+};
+# use POSIX qw( locale_h );
+
+binmode STDIN, ':utf8';
+binmode STDOUT, ':utf8';
+
+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
+$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', 'normal');
+
+my %suggested_words = ();
+keys %suggested_words = 128;
+
+my $file_content = decode('UTF-8', $cgi->param('content'));
+$file_content = parse_with_dom($file_content);
+
+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' ]
+   ]);
+
+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();">^;
+
+print $file_content;
+if ($cgi->param('init') eq '1') {
+    my @dicts = $speller->dictionary_info();
+    my $dictionaries = '';
+    foreach my $i (@dicts) {
+        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>^;
+}
+
+print '</body></html>';
+
+# Perl is beautiful.
+sub spellcheck {
+    my $node = shift;
+    my $doc = $node->getOwnerDocument;
+    my $check = sub {                 # called for each word in the text
+        # input is 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
+            ++$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);
+        }
+    }
+};
+
+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;
+};

Modified: plog/trunk/js/htmlarea/plugins/SpellChecker/spell-check-style.css
===================================================================
--- plog/trunk/js/htmlarea/plugins/SpellChecker/spell-check-style.css	2005-02-05 13:57:52 UTC (rev 948)
+++ plog/trunk/js/htmlarea/plugins/SpellChecker/spell-check-style.css	2005-02-05 15:29:38 UTC (rev 949)
@@ -1,10 +1,10 @@
-.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 dashed #0b8; }
-.HA-spellcheck-current { background-color: #9be; color: #000; }
-.HA-spellcheck-suggestions { display: none; }
-
-#HA-spellcheck-dictionaries { display: none; }
-
-a:link, a:visited { color: #55e; }
+.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 dashed #0b8; }
+.HA-spellcheck-current { background-color: #9be; color: #000; }
+.HA-spellcheck-suggestions { display: none; }
+
+#HA-spellcheck-dictionaries { display: none; }
+
+a:link, a:visited { color: #55e; }

Modified: plog/trunk/js/htmlarea/plugins/SpellChecker/spell-check-ui.html
===================================================================
--- plog/trunk/js/htmlarea/plugins/SpellChecker/spell-check-ui.html	2005-02-05 13:57:52 UTC (rev 948)
+++ plog/trunk/js/htmlarea/plugins/SpellChecker/spell-check-ui.html	2005-02-05 15:29:38 UTC (rev 949)
@@ -1,122 +1,122 @@
-<!--
-
-  Strangely, IE sucks with or without the DOCTYPE switch.
-  I thought it would only suck without it.
-
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
-    "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
-
-   Spell Checker Plugin for HTMLArea-3.0
-   Sponsored by www.americanbible.org
-   Implementation by Mihai Bazon, http://dynarch.com/mishoo/
-  
-   (c) dynarch.com 2003.
-   Distributed under the same terms as HTMLArea itself.
-   This notice MUST stay intact for use (see license.txt).
-
-   $Id: spell-check-ui.html,v 1.5 2004/01/31 13:47:05 mishoo Exp $
-
--->
-<html xmlns="http://www.w3.org/1999/xhtml">
-
-  <head>
-    <title>Spell Checker</title>
-    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-    <script type="text/javascript" src="spell-check-ui.js"></script>
-
-    <style type="text/css">
-      html, body { height: 100%; margin: 0px; padding: 0px; background-color: #fff;
-      color: #000; }
-      a:link, a:visited { color: #00f; text-decoration: none; }
-      a:hover { color: #f00; text-decoration: underline; }
-
-      table { background-color: ButtonFace; color: ButtonText;
-      font-family: tahoma,verdana,sans-serif; font-size: 11px; }
-
-      iframe { background-color: #fff; color: #000; height: 100%; width: 100%; }
-
-      .controls { width: 13em; }
-      .controls .sectitle { /* background-color: #736c6c; color: #fff;
-      border-top: 1px solid #000; border-bottom: 1px solid #fff; */
-      text-align: center;
-      font-weight: bold; padding: 2px 4px; }
-      .controls .secbody { margin-bottom: 10px; }
-
-      button, select { font-family: tahoma,verdana,sans-serif; font-size: 11px; }
-      button { width: 6em; padding: 0px; }
-
-      input, select { font-family: fixed,"andale mono",monospace; }
-
-      #v_currentWord { color: #f00; font-weight: bold; }
-      #statusbar { padding: 7px 0px 0px 5px; }
-      #status { font-weight: bold; }
-    </style>
-
-  </head>
-
-  <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>
-
-    <table style="height: 100%; width: 100%; border-collapse: collapse;" cellspacing="0" cellpadding="0">
-      <tr>
-        <td colspan="2" style="height: 1em; padding: 2px;">
-          <div style="float: right; padding: 2px;"><span>Dictionary</span>
-            <select id="v_dictionaries" style="width: 10em"></select>
-            <button id="b_recheck">Re-check</button>
-          </div>
-          <span id="status">Please wait.  Calling spell checker.</span>
-        </td>
-      </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; 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 />
-            <div style="text-align: center; margin-top: 2px;">
-              <button id="b_replace">Replace</button><button
-                id="b_replall">Replace all</button><br /><button
-                id="b_ignore">Ignore</button><button
-                id="b_ignall">Ignore all</button>
-            </div>
-          </div>
-          <div class="sectitle">Suggestions</div>
-          <div class="secbody">
-            <select size="11" style="width: 94%; margin-left: 3%;" id="v_suggestions"></select>
-          </div>
-        </td>
-
-        <td>
-          <iframe src="about:blank" width="100%" height="100%"
-            id="i_framecontent" name="framecontent"></iframe>
-        </td>
-      </tr>
-      <tr>
-        <td style="height: 1em;" colspan="2">
-          <div style="padding: 4px 2px 2px 2px; float: right;">
-            <button id="b_ok">OK</button>
-            <button id="b_cancel">Cancel</button>
-          </div>
-          <div id="statusbar"></div>
-        </td>
-      </tr>
-    </table>
-
-  </body>
-
-</html>
+<!--
+
+  Strangely, IE sucks with or without the DOCTYPE switch.
+  I thought it would only suck without it.
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
+    "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+
+   Spell Checker Plugin for HTMLArea-3.0
+   Sponsored by www.americanbible.org
+   Implementation by Mihai Bazon, http://dynarch.com/mishoo/
+  
+   (c) dynarch.com 2003-2005.
+   Distributed under the same terms as HTMLArea itself.
+   This notice MUST stay intact for use (see license.txt).
+
+   $Id: spell-check-ui.html,v 1.6 2005/01/20 17:49:03 mishoo Exp $
+
+-->
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+  <head>
+    <title>Spell Checker</title>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+    <script type="text/javascript" src="spell-check-ui.js"></script>
+
+    <style type="text/css">
+      html, body { height: 100%; margin: 0px; padding: 0px; background-color: #fff;
+      color: #000; }
+      a:link, a:visited { color: #00f; text-decoration: none; }
+      a:hover { color: #f00; text-decoration: underline; }
+
+      table { background-color: ButtonFace; color: ButtonText;
+      font-family: tahoma,verdana,sans-serif; font-size: 11px; }
+
+      iframe { background-color: #fff; color: #000; height: 100%; width: 100%; }
+
+      .controls { width: 13em; }
+      .controls .sectitle { /* background-color: #736c6c; color: #fff;
+      border-top: 1px solid #000; border-bottom: 1px solid #fff; */
+      text-align: center;
+      font-weight: bold; padding: 2px 4px; }
+      .controls .secbody { margin-bottom: 10px; }
+
+      button, select { font-family: tahoma,verdana,sans-serif; font-size: 11px; }
+      button { width: 6em; padding: 0px; }
+
+      input, select { font-family: fixed,"andale mono",monospace; }
+
+      #v_currentWord { color: #f00; font-weight: bold; }
+      #statusbar { padding: 7px 0px 0px 5px; }
+      #status { font-weight: bold; }
+    </style>
+
+  </head>
+
+  <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>
+
+    <table style="height: 100%; width: 100%; border-collapse: collapse;" cellspacing="0" cellpadding="0">
+      <tr>
+        <td colspan="2" style="height: 1em; padding: 2px;">
+          <div style="float: right; padding: 2px;"><span>Dictionary</span>
+            <select id="v_dictionaries" style="width: 10em"></select>
+            <button id="b_recheck">Re-check</button>
+          </div>
+          <span id="status">Please wait.  Calling spell checker.</span>
+        </td>
+      </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; 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 />
+            <div style="text-align: center; margin-top: 2px;">
+              <button id="b_replace">Replace</button><button
+                id="b_replall">Replace all</button><br /><button
+                id="b_ignore">Ignore</button><button
+                id="b_ignall">Ignore all</button>
+            </div>
+          </div>
+          <div class="sectitle">Suggestions</div>
+          <div class="secbody">
+            <select size="11" style="width: 94%; margin-left: 3%;" id="v_suggestions"></select>
+          </div>
+        </td>
+
+        <td>
+          <iframe src="about:blank" width="100%" height="100%"
+            id="i_framecontent" name="framecontent"></iframe>
+        </td>
+      </tr>
+      <tr>
+        <td style="height: 1em;" colspan="2">
+          <div style="padding: 4px 2px 2px 2px; float: right;">
+            <button id="b_ok">OK</button>
+            <button id="b_cancel">Cancel</button>
+          </div>
+          <div id="statusbar"></div>
+        </td>
+      </tr>
+    </table>
+
+  </body>
+
+</html>

Modified: plog/trunk/js/htmlarea/plugins/SpellChecker/spell-check-ui.js
===================================================================
--- plog/trunk/js/htmlarea/plugins/SpellChecker/spell-check-ui.js	2005-02-05 13:57:52 UTC (rev 948)
+++ plog/trunk/js/htmlarea/plugins/SpellChecker/spell-check-ui.js	2005-02-05 15:29:38 UTC (rev 949)
@@ -1,397 +1,397 @@
-// Spell Checker Plugin for HTMLArea-3.0
-// Sponsored by www.americanbible.org
-// Implementation by Mihai Bazon, http://dynarch.com/mishoo/
-//
-// (c) dynarch.com 2003.
-// Distributed under the same terms as HTMLArea itself.
-// This notice MUST stay intact for use (see license.txt).
-//
-// $Id: spell-check-ui.js,v 1.9 2004/01/31 13:47:05 mishoo Exp $
-
-// internationalization file was already loaded in parent ;-)
-var SpellChecker = window.opener.SpellChecker;
-var i18n = SpellChecker.I18N;
-
-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';
-	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);
-		} else
-			el.className = "HA-spellcheck-fixed";
-	}
-	// 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, false, editor);
-};
-
-function recheckClicked() {
-	document.getElementById("status").innerHTML = i18n["Please wait: changing dictionary to"] + ': "' + document.getElementById("f_dictionary").value + '".';
-	var field = document.getElementById("f_content");
-	field.value = makeCleanDoc(true);
-	field.form.submit();
-};
-
-function saveClicked() {
-	if (modified) {
-		editor.setHTML(makeCleanDoc(false));
-	}
-	window.close();
-	return false;
-};
-
-function cancelClicked() {
-	var ok = true;
-	if (modified) {
-		ok = confirm(i18n["QUIT_CONFIRMATION"]);
-	}
-	if (ok) {
-		window.close();
-	}
-	return false;
-};
-
-function replaceWord(el) {
-	var replacement = document.getElementById("v_replacement").value;
-	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 (!this_word_modified) {
-		return false;
-	}
-	el.innerHTML = replacement;
-};
-
-function replaceClicked() {
-	replaceWord(currentElement);
-	var start = currentElement.__msh_id;
-	var index = start;
-	do {
-		++index;
-		if (index == wrongWords.length) {
-			index = 0;
-		}
-	} while ((index != start) && wrongWords[index].__msh_fixed);
-	if (index == start) {
-		index = 0;
-		alert(i18n["Finished list of mispelled words"]);
-	}
-	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;
-};
-
-function replaceAllClicked() {
-	var replacement = document.getElementById("v_replacement").value;
-	var ok = true;
-	var spans = allWords[currentElement.__msh_origWord];
-	if (spans.length == 0) {
-		alert("An impossible condition just happened.  Call FBI.  ;-)");
-	} else if (spans.length == 1) {
-		replaceClicked();
-		return false;
-	}
-	/*
-	var message = "The word \"" + currentElement.__msh_origWord + "\" occurs " + spans.length + " times.\n";
-	if (replacement == currentElement.__msh_origWord) {
-		ok = confirm(message + "Ignore all occurrences?");
-	} else {
-		ok = confirm(message + "Replace all occurrences with \"" + replacement + "\"?");
-	}
-	*/
-	if (ok) {
-		for (var i in spans) {
-			if (spans[i] != currentElement) {
-				replaceWord(spans[i]);
-			}
-		}
-		// replace current element the last, so that we jump to the next word ;-)
-		replaceClicked();
-	}
-	return false;
-};
-
-function ignoreClicked() {
-	document.getElementById("v_replacement").value = currentElement.__msh_origWord;
-	replaceClicked();
-	return false;
-};
-
-function ignoreAllClicked() {
-	document.getElementById("v_replacement").value = currentElement.__msh_origWord;
-	replaceAllClicked();
-	return false;
-};
-
-function learnClicked() {
-	alert("Not [yet] implemented");
-	return false;
-};
-
-function internationalizeWindow() {
-	var types = ["div", "span", "button"];
-	for (var i in types) {
-		var tag = types[i];
-		var els = document.getElementsByTagName(tag);
-		for (var j = els.length; --j >= 0;) {
-			var el = els[j];
-			if (el.childNodes.length == 1 && /\S/.test(el.innerHTML)) {
-				var txt = el.innerHTML;
-				if (typeof i18n[txt] != "undefined") {
-					el.innerHTML = i18n[txt];
-				}
-			}
-		}
-	}
-};
-
-function initDocument() {
-	internationalizeWindow();
-	modified = false;
-	frame = document.getElementById("i_framecontent");
-	var field = document.getElementById("f_content");
-	field.value = HTMLArea.getHTML(editor._doc.body, false, editor);
-	field.form.submit();
-	document.getElementById("f_init").value = "0";
-
-	// assign some global event handlers
-
-	var select = document.getElementById("v_suggestions");
-	select.onchange = function() {
-		document.getElementById("v_replacement").value = this.value;
-	};
-	if (is_ie) {
-		select.attachEvent("ondblclick", replaceClicked);
-	} else {
-		select.addEventListener("dblclick", replaceClicked, true);
-	}
-
-	document.getElementById("b_replace").onclick = replaceClicked;
-	// document.getElementById("b_learn").onclick = learnClicked;
-	document.getElementById("b_replall").onclick = replaceAllClicked;
-	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;
-
-	select = document.getElementById("v_dictionaries");
-	select.onchange = function() {
-		document.getElementById("f_dictionary").value = this.value;
-	};
-};
-
-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, " ");
-		for (var i in a) {
-			var el = a[i];
-			if (el != currentElement) {
-				el.className = el.className.replace(/\s*HA-spellcheck-same\s*/g, " ");
-			}
-		}
-	}
-	currentElement = this;
-	this.className += " HA-spellcheck-current";
-	var a = allWords[currentElement.__msh_origWord];
-	for (var i in a) {
-		var el = a[i];
-		if (el != currentElement) {
-			el.className += " HA-spellcheck-same";
-		}
-	}
-	// 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";
-	} else if (a.length == 2) {
-		txt = "two occurrences";
-	} 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>"';
-	for (var i = select.length; --i >= 0;) {
-		select.remove(i);
-	}
-	for (var i = 0; i < suggestions.length; ++i) {
-		var txt = suggestions[i];
-		var option = document.createElement("option");
-		option.value = txt;
-		option.appendChild(document.createTextNode(txt));
-		select.appendChild(option);
-	}
-	document.getElementById("v_currentWord").innerHTML = this.__msh_origWord;
-	if (suggestions.length > 0) {
-		select.selectedIndex = 0;
-		select.onchange();
-	} else {
-		document.getElementById("v_replacement").value = this.innerHTML;
-	}
-	select.style.display = "none";
-	select.style.display = "block";
-	return false;
-};
-
-function wordMouseOver() {
-	this.className += " HA-spellcheck-hover";
-};
-
-function wordMouseOut() {
-	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;
-        var spans = doc.getElementsByTagName("span");
-        var sps = [];
-	var id = 0;
-        for (var i = 0; i < spans.length; ++i) {
-                var el = spans[i];
-                if (/HA-spellcheck-error/.test(el.className)) {
-                        sps.push(el);
-			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++;
-			var txt = (el.__msh_origWord = el.firstChild.data);
-			el.__msh_fixed = false;
-			if (typeof allWords[txt] == "undefined") {
-				allWords[txt] = [el];
-			} else {
-				allWords[txt].push(el);
-			}
-                } else if (/HA-spellcheck-fixed/.test(el.className)) {
-			fixedWords.push(el);
-		}
-        }
-	wrongWords = sps;
-	if (sps.length == 0) {
-		if (!modified) {
-			alert(i18n["NO_ERRORS_CLOSING"]);
-			window.close();
-		} else {
-			alert(i18n["NO_ERRORS"]);
-		}
-		return false;
-	}
-	(currentElement = sps[0]).__msh_wordClicked(true);
-	var as = doc.getElementsByTagName("a");
-	for (var i = as.length; --i >= 0;) {
-		var a = as[i];
-		a.onclick = function() {
-			if (confirm(i18n["CONFIRM_LINK_CLICK"] + ":\n" +
-				    this.href + "\n" + i18n["I will open it in a new page."])) {
-				window.open(this.href);
-			}
-			return false;
-		};
-	}
-	var dicts = doc.getElementById("HA-spellcheck-dictionaries");
-	if (dicts) {
-		dicts.parentNode.removeChild(dicts);
-		dicts = dicts.innerHTML.split(/,/);
-		var select = document.getElementById("v_dictionaries");
-		for (var i = select.length; --i >= 0;) {
-			select.remove(i);
-		}
-		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);
-		}
-	}
-};
+// Spell Checker Plugin for HTMLArea-3.0
+// Sponsored by www.americanbible.org
+// Implementation by Mihai Bazon, http://dynarch.com/mishoo/
+//
+// (c) dynarch.com 2003-2005.
+// Distributed under the same terms as HTMLArea itself.
+// This notice MUST stay intact for use (see license.txt).
+//
+// $Id: spell-check-ui.js,v 1.11 2005/01/20 17:49:03 mishoo Exp $
+
+// internationalization file was already loaded in parent ;-)
+var SpellChecker = window.opener.SpellChecker;
+var i18n = SpellChecker.I18N;
+
+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';
+	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);
+		} else
+			el.className = "HA-spellcheck-fixed";
+	}
+	// 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, false, editor);
+};
+
+function recheckClicked() {
+	document.getElementById("status").innerHTML = i18n["Please wait: changing dictionary to"] + ': "' + document.getElementById("f_dictionary").value + '".';
+	var field = document.getElementById("f_content");
+	field.value = makeCleanDoc(true);
+	field.form.submit();
+};
+
+function saveClicked() {
+	if (modified) {
+		editor.setHTML(makeCleanDoc(false));
+	}
+	window.close();
+	return false;
+};
+
+function cancelClicked() {
+	var ok = true;
+	if (modified) {
+		ok = confirm(i18n["QUIT_CONFIRMATION"]);
+	}
+	if (ok) {
+		window.close();
+	}
+	return false;
+};
+
+function replaceWord(el) {
+	var replacement = document.getElementById("v_replacement").value;
+	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 (!this_word_modified) {
+		return false;
+	}
+	el.innerHTML = replacement;
+};
+
+function replaceClicked() {
+	replaceWord(currentElement);
+	var start = currentElement.__msh_id;
+	var index = start;
+	do {
+		++index;
+		if (index == wrongWords.length) {
+			index = 0;
+		}
+	} while ((index != start) && wrongWords[index].__msh_fixed);
+	if (index == start) {
+		index = 0;
+		alert(i18n["Finished list of mispelled words"]);
+	}
+	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;
+};
+
+function replaceAllClicked() {
+	var replacement = document.getElementById("v_replacement").value;
+	var ok = true;
+	var spans = allWords[currentElement.__msh_origWord];
+	if (spans.length == 0) {
+		alert("An impossible condition just happened.  Call FBI.  ;-)");
+	} else if (spans.length == 1) {
+		replaceClicked();
+		return false;
+	}
+	/*
+	var message = "The word \"" + currentElement.__msh_origWord + "\" occurs " + spans.length + " times.\n";
+	if (replacement == currentElement.__msh_origWord) {
+		ok = confirm(message + "Ignore all occurrences?");
+	} else {
+		ok = confirm(message + "Replace all occurrences with \"" + replacement + "\"?");
+	}
+	*/
+	if (ok) {
+		for (var i = 0; i < spans.length; ++i) {
+			if (spans[i] != currentElement) {
+				replaceWord(spans[i]);
+			}
+		}
+		// replace current element the last, so that we jump to the next word ;-)
+		replaceClicked();
+	}
+	return false;
+};
+
+function ignoreClicked() {
+	document.getElementById("v_replacement").value = currentElement.__msh_origWord;
+	replaceClicked();
+	return false;
+};
+
+function ignoreAllClicked() {
+	document.getElementById("v_replacement").value = currentElement.__msh_origWord;
+	replaceAllClicked();
+	return false;
+};
+
+function learnClicked() {
+	alert("Not [yet] implemented");
+	return false;
+};
+
+function internationalizeWindow() {
+	var types = ["div", "span", "button"];
+	for (var i = 0; i < types.length; ++i) {
+		var tag = types[i];
+		var els = document.getElementsByTagName(tag);
+		for (var j = els.length; --j >= 0;) {
+			var el = els[j];
+			if (el.childNodes.length == 1 && /\S/.test(el.innerHTML)) {
+				var txt = el.innerHTML;
+				if (typeof i18n[txt] != "undefined") {
+					el.innerHTML = i18n[txt];
+				}
+			}
+		}
+	}
+};
+
+function initDocument() {
+	internationalizeWindow();
+	modified = false;
+	frame = document.getElementById("i_framecontent");
+	var field = document.getElementById("f_content");
+	field.value = HTMLArea.getHTML(editor._doc.body, false, editor);
+	field.form.submit();
+	document.getElementById("f_init").value = "0";
+
+	// assign some global event handlers
+
+	var select = document.getElementById("v_suggestions");
+	select.onchange = function() {
+		document.getElementById("v_replacement").value = this.value;
+	};
+	if (is_ie) {
+		select.attachEvent("ondblclick", replaceClicked);
+	} else {
+		select.addEventListener("dblclick", replaceClicked, true);
+	}
+
+	document.getElementById("b_replace").onclick = replaceClicked;
+	// document.getElementById("b_learn").onclick = learnClicked;
+	document.getElementById("b_replall").onclick = replaceAllClicked;
+	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;
+
+	select = document.getElementById("v_dictionaries");
+	select.onchange = function() {
+		document.getElementById("f_dictionary").value = this.value;
+	};
+};
+
+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, " ");
+		for (var i = 0; i < a.length; ++i) {
+			var el = a[i];
+			if (el != currentElement) {
+				el.className = el.className.replace(/\s*HA-spellcheck-same\s*/g, " ");
+			}
+		}
+	}
+	currentElement = this;
+	this.className += " HA-spellcheck-current";
+	var a = allWords[currentElement.__msh_origWord];
+	for (var i = 0; i < a.length; ++i) {
+		var el = a[i];
+		if (el != currentElement) {
+			el.className += " HA-spellcheck-same";
+		}
+	}
+	// 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";
+	} else if (a.length == 2) {
+		txt = "two occurrences";
+	} 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>"';
+	for (var i = select.length; --i >= 0;) {
+		select.remove(i);
+	}
+	for (var i = 0; i < suggestions.length; ++i) {
+		var txt = suggestions[i];
+		var option = document.createElement("option");
+		option.value = txt;
+		option.appendChild(document.createTextNode(txt));
+		select.appendChild(option);
+	}
+	document.getElementById("v_currentWord").innerHTML = this.__msh_origWord;
+	if (suggestions.length > 0) {
+		select.selectedIndex = 0;
+		select.onchange();
+	} else {
+		document.getElementById("v_replacement").value = this.innerHTML;
+	}
+	select.style.display = "none";
+	select.style.display = "block";
+	return false;
+};
+
+function wordMouseOver() {
+	this.className += " HA-spellcheck-hover";
+};
+
+function wordMouseOut() {
+	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;
+        var spans = doc.getElementsByTagName("span");
+        var sps = [];
+	var id = 0;
+        for (var i = 0; i < spans.length; ++i) {
+                var el = spans[i];
+                if (/HA-spellcheck-error/.test(el.className)) {
+                        sps.push(el);
+			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++;
+			var txt = (el.__msh_origWord = el.firstChild.data);
+			el.__msh_fixed = false;
+			if (typeof allWords[txt] == "undefined") {
+				allWords[txt] = [el];
+			} else {
+				allWords[txt].push(el);
+			}
+                } else if (/HA-spellcheck-fixed/.test(el.className)) {
+			fixedWords.push(el);
+		}
+        }
+	wrongWords = sps;
+	if (sps.length == 0) {
+		if (!modified) {
+			alert(i18n["NO_ERRORS_CLOSING"]);
+			window.close();
+		} else {
+			alert(i18n["NO_ERRORS"]);
+		}
+		return false;
+	}
+	(currentElement = sps[0]).__msh_wordClicked(true);
+	var as = doc.getElementsByTagName("a");
+	for (var i = as.length; --i >= 0;) {
+		var a = as[i];
+		a.onclick = function() {
+			if (confirm(i18n["CONFIRM_LINK_CLICK"] + ":\n" +
+				    this.href + "\n" + i18n["I will open it in a new page."])) {
+				window.open(this.href);
+			}
+			return false;
+		};
+	}
+	var dicts = doc.getElementById("HA-spellcheck-dictionaries");
+	if (dicts) {
+		dicts.parentNode.removeChild(dicts);
+		dicts = dicts.innerHTML.split(/,/);
+		var select = document.getElementById("v_dictionaries");
+		for (var i = select.length; --i >= 0;) {
+			select.remove(i);
+		}
+		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);
+		}
+	}
+};

Modified: plog/trunk/js/htmlarea/plugins/SpellChecker/spell-checker.js
===================================================================
--- plog/trunk/js/htmlarea/plugins/SpellChecker/spell-checker.js	2005-02-05 13:57:52 UTC (rev 948)
+++ plog/trunk/js/htmlarea/plugins/SpellChecker/spell-checker.js	2005-02-05 15:29:38 UTC (rev 949)
@@ -1,79 +1,79 @@
-// Spell Checker Plugin for HTMLArea-3.0
-// Sponsored by www.americanbible.org
-// Implementation by Mihai Bazon, http://dynarch.com/mishoo/
-//
-// (c) dynarch.com 2003.
-// Distributed under the same terms as HTMLArea itself.
-// This notice MUST stay intact for use (see license.txt).
-//
-// $Id: spell-checker.js,v 1.7 2004/01/30 00:25:06 mishoo Exp $
-
-function SpellChecker(editor) {
-	this.editor = editor;
-
-	var cfg = editor.config;
-	var tt = SpellChecker.I18N;
-	var bl = SpellChecker.btnList;
-	var self = this;
-
-	// register the toolbar buttons provided by this plugin
-	var toolbar = [];
-	for (var i in bl) {
-		var btn = bl[i];
-		if (!btn) {
-			toolbar.push("separator");
-		} else {
-			var id = "SC-" + btn[0];
-			cfg.registerButton(id, tt[id], editor.imgURL(btn[0] + ".gif", "SpellChecker"), false,
-					   function(editor, id) {
-						   // dispatch button press event
-						   self.buttonPress(editor, id);
-					   }, btn[1]);
-			toolbar.push(id);
-		}
-	}
-
-	for (var i in toolbar) {
-		cfg.toolbar[0].push(toolbar[i]);
-	}
-};
-
-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"]
-	];
-
-SpellChecker.prototype.buttonPress = function(editor, id) {
-	switch (id) {
-	    case "SC-spell-check":
-		SpellChecker.editor = editor;
-		SpellChecker.init = true;
-		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=450");
-		} else {
-			win = window.open(uiurl, "SC_spell_checker",
-					  "toolbar=no,menubar=no,personalbar=no,width=600,height=450," +
-					  "scrollbars=no,resizable=yes");
-		}
-		win.focus();
-		break;
-	}
-};
-
-// this needs to be global, it's accessed from spell-check-ui.html
-SpellChecker.editor = null;
+// Spell Checker Plugin for HTMLArea-3.0
+// Sponsored by www.americanbible.org
+// Implementation by Mihai Bazon, http://dynarch.com/mishoo/
+//
+// (c) dynarch.com 2003-2005.
+// Distributed under the same terms as HTMLArea itself.
+// This notice MUST stay intact for use (see license.txt).
+//
+// $Id: spell-checker.js,v 1.9 2005/01/20 17:49:02 mishoo Exp $
+
+function SpellChecker(editor) {
+	this.editor = editor;
+
+	var cfg = editor.config;
+	var tt = SpellChecker.I18N;
+	var bl = SpellChecker.btnList;
+	var self = this;
+
+	// register the toolbar buttons provided by this plugin
+	var toolbar = [];
+	for (var i = 0; i < bl.length; ++i) {
+		var btn = bl[i];
+		if (!btn) {
+			toolbar.push("separator");
+		} else {
+			var id = "SC-" + btn[0];
+			cfg.registerButton(id, tt[id], editor.imgURL(btn[0] + ".gif", "SpellChecker"), false,
+					   function(editor, id) {
+						   // dispatch button press event
+						   self.buttonPress(editor, id);
+					   }, btn[1]);
+			toolbar.push(id);
+		}
+	}
+
+	for (var i = 0; i < toolbar.length; ++i) {
+		cfg.toolbar[0].push(toolbar[i]);
+	}
+};
+
+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"]
+	];
+
+SpellChecker.prototype.buttonPress = function(editor, id) {
+	switch (id) {
+	    case "SC-spell-check":
+		SpellChecker.editor = editor;
+		SpellChecker.init = true;
+		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=450");
+		} else {
+			win = window.open(uiurl, "SC_spell_checker",
+					  "toolbar=no,menubar=no,personalbar=no,width=600,height=450," +
+					  "scrollbars=no,resizable=yes");
+		}
+		win.focus();
+		break;
+	}
+};
+
+// this needs to be global, it's accessed from spell-check-ui.html
+SpellChecker.editor = null;

Modified: plog/trunk/js/htmlarea/plugins/TableOperations/lang/cz.js
===================================================================
--- plog/trunk/js/htmlarea/plugins/TableOperations/lang/cz.js	2005-02-05 13:57:52 UTC (rev 948)
+++ plog/trunk/js/htmlarea/plugins/TableOperations/lang/cz.js	2005-02-05 15:29:38 UTC (rev 949)
@@ -1,90 +1,90 @@
-// I18N constants
-
-// LANG: "cz", ENCODING: UTF-8 | ISO-8859-2
-// Author: Jiri Löw, <jirilow at 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ů"
-};
+// I18N constants
+
+// LANG: "cz", ENCODING: UTF-8 | ISO-8859-2
+// Author: Jiri Löw, <jirilow at 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ů"
+};

Modified: plog/trunk/js/htmlarea/plugins/TableOperations/lang/da.js
===================================================================
--- plog/trunk/js/htmlarea/plugins/TableOperations/lang/da.js	2005-02-05 13:57:52 UTC (rev 948)
+++ plog/trunk/js/htmlarea/plugins/TableOperations/lang/da.js	2005-02-05 15:29:38 UTC (rev 949)
@@ -1,90 +1,90 @@
-// I18N constants
-
-// LANG: "da", ENCODING: UTF-8 | ISO-8859-1
-// Author: Steen Sønderup, <steen at 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"
-};
+// I18N constants
+
+// LANG: "da", ENCODING: UTF-8 | ISO-8859-1
+// Author: Steen Sønderup, <steen at 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"
+};

Modified: plog/trunk/js/htmlarea/plugins/TableOperations/lang/de.js
===================================================================
--- plog/trunk/js/htmlarea/plugins/TableOperations/lang/de.js	2005-02-05 13:57:52 UTC (rev 948)
+++ plog/trunk/js/htmlarea/plugins/TableOperations/lang/de.js	2005-02-05 15:29:38 UTC (rev 949)
@@ -1,81 +1,81 @@
-// I18N constants
-
-// LANG: "de", ENCODING: UTF-8 | ISO-8859-1
-// Author: broxx, <broxx at 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"
-};
+// I18N constants
+
+// LANG: "de", ENCODING: UTF-8 | ISO-8859-1
+// Author: broxx, <broxx at 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"
+};

Modified: plog/trunk/js/htmlarea/plugins/TableOperations/lang/el.js
===================================================================
--- plog/trunk/js/htmlarea/plugins/TableOperations/lang/el.js	2005-02-05 13:57:52 UTC (rev 948)
+++ plog/trunk/js/htmlarea/plugins/TableOperations/lang/el.js	2005-02-05 15:29:38 UTC (rev 949)
@@ -1,81 +1,81 @@
-// I18N constants
-
-// LANG: "el", ENCODING: UTF-8 | ISO-8859-7
-// Author: Dimitris Glezos, dimitris at 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"
-};
+// I18N constants
+
+// LANG: "el", ENCODING: UTF-8 | ISO-8859-7
+// Author: Dimitris Glezos, dimitris at 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"
+};

Modified: plog/trunk/js/htmlarea/plugins/TableOperations/lang/en.js
===================================================================
--- plog/trunk/js/htmlarea/plugins/TableOperations/lang/en.js	2005-02-05 13:57:52 UTC (rev 948)
+++ plog/trunk/js/htmlarea/plugins/TableOperations/lang/en.js	2005-02-05 15:29:38 UTC (rev 949)
@@ -1,90 +1,90 @@
-// I18N constants
-
-// LANG: "en", ENCODING: UTF-8 | ISO-8859-1
-// Author: Mihai Bazon, http://dynarch.com/mishoo
-
-// 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":					  "Align",
-	"All four sides":				  "All four sides",
-	"Background":					  "Background",
-	"Baseline":                                       "Baseline",
-	"Border":					  "Border",
-	"Borders":					  "Borders",
-	"Bottom":                                         "Bottom",
-	"CSS Style":					  "Style [CSS]",
-	"Caption":					  "Caption",
-	"Cell Properties":                                "Cell Properties",
-	"Center":					  "Center",
-	"Char":                                           "Char",
-	"Collapsed borders":                              "Collapsed borders",
-	"Color":					  "Color",
-	"Description":					  "Description",
-	"FG Color":					  "FG Color",
-	"Float":                                          "Float",
-	"Frames":					  "Frames",
-	"Height":                                         "Height",
-	"How many columns would you like to merge?":      "How many columns would you like to merge?",
-	"How many rows would you like to merge?":         "How many rows would you like to merge?",
-	"Image URL":					  "Image URL",
-	"Justify":                                        "Justify",
-	"Layout":					  "Layout",
-	"Left":						  "Left",
-	"Margin":                                         "Margin",
-	"Middle":                                         "Middle",
-	"No rules":					  "No rules",
-	"No sides":					  "No sides",
-	"None":                                           "None",
-	"Padding":					  "Padding",
-	"Please click into some cell":                    "Please click into some cell",
-	"Right":					  "Right",
-	"Row Properties":                                 "Row Properties",
-	"Rules will appear between all rows and columns": "Rules will appear between all rows and columns",
-	"Rules will appear between columns only":	  "Rules will appear between columns only",
-	"Rules will appear between rows only":		  "Rules will appear between rows only",
-	"Rules":					  "Rules",
-	"Spacing and padding":                            "Spacing and padding",
-	"Spacing":					  "Spacing",
-	"Summary":					  "Summary",
-	"TO-cell-delete":				  "Delete cell",
-	"TO-cell-insert-after":				  "Insert cell after",
-	"TO-cell-insert-before":			  "Insert cell before",
-	"TO-cell-merge":				  "Merge cells",
-	"TO-cell-prop":					  "Cell properties",
-	"TO-cell-split":				  "Split cell",
-	"TO-col-delete":				  "Delete column",
-	"TO-col-insert-after":				  "Insert column after",
-	"TO-col-insert-before":				  "Insert column before",
-	"TO-col-split":					  "Split column",
-	"TO-row-delete":				  "Delete row",
-	"TO-row-insert-above":				  "Insert row before",
-	"TO-row-insert-under":				  "Insert row after",
-	"TO-row-prop":					  "Row properties",
-	"TO-row-split":					  "Split row",
-	"TO-table-prop":				  "Table properties",
-	"Table Properties":				  "Table Properties",
-	"Text align":                                     "Text align",
-	"The bottom side only":				  "The bottom side only",
-	"The left-hand side only":			  "The left-hand side only",
-	"The right and left sides only":		  "The right and left sides only",
-	"The right-hand side only":			  "The right-hand side only",
-	"The top and bottom sides only":		  "The top and bottom sides only",
-	"The top side only":				  "The top side only",
-	"Top":                                            "Top",	
-	"Unset color":                                    "Unset color",
-	"Vertical align":                                 "Vertical align",
-	"Width":					  "Width",
-	"not-del-last-cell":				  "HTMLArea cowardly refuses to delete the last cell in row.",
-	"not-del-last-col":				  "HTMLArea cowardly refuses to delete the last column in table.",
-	"not-del-last-row":				  "HTMLArea cowardly refuses to delete the last row in table.",
-	"percent":					  "percent",
-	"pixels":					  "pixels"
-};
+// I18N constants
+
+// LANG: "en", ENCODING: UTF-8 | ISO-8859-1
+// Author: Mihai Bazon, http://dynarch.com/mishoo
+
+// 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":					  "Align",
+	"All four sides":				  "All four sides",
+	"Background":					  "Background",
+	"Baseline":                                       "Baseline",
+	"Border":					  "Border",
+	"Borders":					  "Borders",
+	"Bottom":                                         "Bottom",
+	"CSS Style":					  "Style [CSS]",
+	"Caption":					  "Caption",
+	"Cell Properties":                                "Cell Properties",
+	"Center":					  "Center",
+	"Char":                                           "Char",
+	"Collapsed borders":                              "Collapsed borders",
+	"Color":					  "Color",
+	"Description":					  "Description",
+	"FG Color":					  "FG Color",
+	"Float":                                          "Float",
+	"Frames":					  "Frames",
+	"Height":                                         "Height",
+	"How many columns would you like to merge?":      "How many columns would you like to merge?",
+	"How many rows would you like to merge?":         "How many rows would you like to merge?",
+	"Image URL":					  "Image URL",
+	"Justify":                                        "Justify",
+	"Layout":					  "Layout",
+	"Left":						  "Left",
+	"Margin":                                         "Margin",
+	"Middle":                                         "Middle",
+	"No rules":					  "No rules",
+	"No sides":					  "No sides",
+	"None":                                           "None",
+	"Padding":					  "Padding",
+	"Please click into some cell":                    "Please click into some cell",
+	"Right":					  "Right",
+	"Row Properties":                                 "Row Properties",
+	"Rules will appear between all rows and columns": "Rules will appear between all rows and columns",
+	"Rules will appear between columns only":	  "Rules will appear between columns only",
+	"Rules will appear between rows only":		  "Rules will appear between rows only",
+	"Rules":					  "Rules",
+	"Spacing and padding":                            "Spacing and padding",
+	"Spacing":					  "Spacing",
+	"Summary":					  "Summary",
+	"TO-cell-delete":				  "Delete cell",
+	"TO-cell-insert-after":				  "Insert cell after",
+	"TO-cell-insert-before":			  "Insert cell before",
+	"TO-cell-merge":				  "Merge cells",
+	"TO-cell-prop":					  "Cell properties",
+	"TO-cell-split":				  "Split cell",
+	"TO-col-delete":				  "Delete column",
+	"TO-col-insert-after":				  "Insert column after",
+	"TO-col-insert-before":				  "Insert column before",
+	"TO-col-split":					  "Split column",
+	"TO-row-delete":				  "Delete row",
+	"TO-row-insert-above":				  "Insert row before",
+	"TO-row-insert-under":				  "Insert row after",
+	"TO-row-prop":					  "Row properties",
+	"TO-row-split":					  "Split row",
+	"TO-table-prop":				  "Table properties",
+	"Table Properties":				  "Table Properties",
+	"Text align":                                     "Text align",
+	"The bottom side only":				  "The bottom side only",
+	"The left-hand side only":			  "The left-hand side only",
+	"The right and left sides only":		  "The right and left sides only",
+	"The right-hand side only":			  "The right-hand side only",
+	"The top and bottom sides only":		  "The top and bottom sides only",
+	"The top side only":				  "The top side only",
+	"Top":                                            "Top",	
+	"Unset color":                                    "Unset color",
+	"Vertical align":                                 "Vertical align",
+	"Width":					  "Width",
+	"not-del-last-cell":				  "HTMLArea cowardly refuses to delete the last cell in row.",
+	"not-del-last-col":				  "HTMLArea cowardly refuses to delete the last column in table.",
+	"not-del-last-row":				  "HTMLArea cowardly refuses to delete the last row in table.",
+	"percent":					  "percent",
+	"pixels":					  "pixels"
+};

Modified: plog/trunk/js/htmlarea/plugins/TableOperations/lang/fi.js
===================================================================
--- plog/trunk/js/htmlarea/plugins/TableOperations/lang/fi.js	2005-02-05 13:57:52 UTC (rev 948)
+++ plog/trunk/js/htmlarea/plugins/TableOperations/lang/fi.js	2005-02-05 15:29:38 UTC (rev 949)
@@ -1,66 +1,66 @@
-TableOperations.I18N = {
-	"Align":					  "Kohdistus",
-	"All four sides":				  "Kaikki neljä sivua",
-	"Background":					  "Tausta",
-	"Baseline":                                       "Takaraja",
-	"Border":					  "Reuna",
-	"Borders":					  "Reunat",
-	"Bottom":                                         "Alle",
-	"CSS Style":					  "Tyyli [CSS]",
-	"Caption":					  "Otsikko",
-	"Cell Properties":                                "Solun asetukset",
-	"Center":					  "Keskelle",
-	"Char":                                           "Merkki",
-	"Collapsed borders":                              "Luhistetut reunat",
-	"Color":					  "Väri",
-	"Description":					  "Kuvaus",
-	"FG Color":					  "FG Väri",
-	"Frames":					  "Kehykset",
-	"Image URL":					  "Kuvan osoite",
-	"Layout":					  "Sommittelu",
-	"Left":						  "Vasen",
-	"Margin":                                         "Marginaali",
-	"Middle":                                         "Keskelle",
-	"No rules":					  "Ei viivoja",
-	"No sides":					  "Ei sivuja",
-	"Padding":					  "Palstantäyte",
-	"Right":					  "Oikea",
-	"Row Properties":                                 "Rivin asetukset",
-	"Rules will appear between all rows and columns": "Viivat jokaisen rivin ja sarakkeen välillä",
-	"Rules will appear between columns only":	  "Viivat ainoastaan sarakkeiden välillä",
-	"Rules will appear between rows only":		  "Viivat ainoastaan rivien välillä",
-	"Rules":					  "Viivat",
-	"Spacing":					  "Palstatila",
-	"Summary":					  "Yhteenveto",
-	"TO-cell-delete":				  "Poista solu",
-	"TO-cell-insert-after":				  "Lisää solu perään",
-	"TO-cell-insert-before":			  "Lisää solu ennen",
-	"TO-cell-merge":				  "Yhdistä solut",
-	"TO-cell-prop":					  "Solun asetukset",
-	"TO-cell-split":				  "Jaa solu",
-	"TO-col-delete":				  "Poista sarake",
-	"TO-col-insert-after":				  "Lisää sarake perään",
-	"TO-col-insert-before":				  "Lisää sarake ennen",
-	"TO-col-split":					  "Jaa sarake",
-	"TO-row-delete":				  "Poista rivi",
-	"TO-row-insert-above":				  "Lisää rivi yläpuolelle",
-	"TO-row-insert-under":				  "Lisää rivi alapuolelle",
-	"TO-row-prop":					  "Rivin asetukset",
-	"TO-row-split":					  "Jaa rivi",
-	"TO-table-prop":				  "Taulukon asetukset",
-	"Top":                                            "Ylös",	
-	"Table Properties":				  "Taulukon asetukset",
-	"The bottom side only":				  "Ainoastaan alapuolelle",
-	"The left-hand side only":			  "Ainoastaan vasenreuna",
-	"The right and left sides only":		  "Oikea- ja vasenreuna",
-	"The right-hand side only":			  "Ainoastaan oikeareuna",
-	"The top and bottom sides only":		  "Ylä- ja alapuoli.",
-	"The top side only":				  "Ainoastaan yläpuoli",
-	"Vertical align":                                 "Vertikaali kohdistus",
-	"Width":					  "Leveys",
-	"not-del-last-cell":				  "Ei voida poistaa viimeistä solua rivistä.",
-	"not-del-last-col":				  "Ei voida poistaa viimeistä saraketta taulusta.",
-	"not-del-last-row":				  "Ei voida poistaa viimeistä riviä taulusta.",
-	"percent":					  "prosenttia",
-	"pixels":					  "pikseliä"
-};
+TableOperations.I18N = {
+	"Align":					  "Kohdistus",
+	"All four sides":				  "Kaikki neljä sivua",
+	"Background":					  "Tausta",
+	"Baseline":                                       "Takaraja",
+	"Border":					  "Reuna",
+	"Borders":					  "Reunat",
+	"Bottom":                                         "Alle",
+	"CSS Style":					  "Tyyli [CSS]",
+	"Caption":					  "Otsikko",
+	"Cell Properties":                                "Solun asetukset",
+	"Center":					  "Keskelle",
+	"Char":                                           "Merkki",
+	"Collapsed borders":                              "Luhistetut reunat",
+	"Color":					  "Väri",
+	"Description":					  "Kuvaus",
+	"FG Color":					  "FG Väri",
+	"Frames":					  "Kehykset",
+	"Image URL":					  "Kuvan osoite",
+	"Layout":					  "Sommittelu",
+	"Left":						  "Vasen",
+	"Margin":                                         "Marginaali",
+	"Middle":                                         "Keskelle",
+	"No rules":					  "Ei viivoja",
+	"No sides":					  "Ei sivuja",
+	"Padding":					  "Palstantäyte",
+	"Right":					  "Oikea",
+	"Row Properties":                                 "Rivin asetukset",
+	"Rules will appear between all rows and columns": "Viivat jokaisen rivin ja sarakkeen välillä",
+	"Rules will appear between columns only":	  "Viivat ainoastaan sarakkeiden välillä",
+	"Rules will appear between rows only":		  "Viivat ainoastaan rivien välillä",
+	"Rules":					  "Viivat",
+	"Spacing":					  "Palstatila",
+	"Summary":					  "Yhteenveto",
+	"TO-cell-delete":				  "Poista solu",
+	"TO-cell-insert-after":				  "Lisää solu perään",
+	"TO-cell-insert-before":			  "Lisää solu ennen",
+	"TO-cell-merge":				  "Yhdistä solut",
+	"TO-cell-prop":					  "Solun asetukset",
+	"TO-cell-split":				  "Jaa solu",
+	"TO-col-delete":				  "Poista sarake",
+	"TO-col-insert-after":				  "Lisää sarake perään",
+	"TO-col-insert-before":				  "Lisää sarake ennen",
+	"TO-col-split":					  "Jaa sarake",
+	"TO-row-delete":				  "Poista rivi",
+	"TO-row-insert-above":				  "Lisää rivi yläpuolelle",
+	"TO-row-insert-under":				  "Lisää rivi alapuolelle",
+	"TO-row-prop":					  "Rivin asetukset",
+	"TO-row-split":					  "Jaa rivi",
+	"TO-table-prop":				  "Taulukon asetukset",
+	"Top":                                            "Ylös",	
+	"Table Properties":				  "Taulukon asetukset",
+	"The bottom side only":				  "Ainoastaan alapuolelle",
+	"The left-hand side only":			  "Ainoastaan vasenreuna",
+	"The right and left sides only":		  "Oikea- ja vasenreuna",
+	"The right-hand side only":			  "Ainoastaan oikeareuna",
+	"The top and bottom sides only":		  "Ylä- ja alapuoli.",
+	"The top side only":				  "Ainoastaan yläpuoli",
+	"Vertical align":                                 "Vertikaali kohdistus",
+	"Width":					  "Leveys",
+	"not-del-last-cell":				  "Ei voida poistaa viimeistä solua rivistä.",
+	"not-del-last-col":				  "Ei voida poistaa viimeistä saraketta taulusta.",
+	"not-del-last-row":				  "Ei voida poistaa viimeistä riviä taulusta.",
+	"percent":					  "prosenttia",
+	"pixels":					  "pikseliä"
+};

Added: plog/trunk/js/htmlarea/plugins/TableOperations/lang/fr.js
===================================================================
--- plog/trunk/js/htmlarea/plugins/TableOperations/lang/fr.js	2005-02-05 13:57:52 UTC (rev 948)
+++ plog/trunk/js/htmlarea/plugins/TableOperations/lang/fr.js	2005-02-05 15:29:38 UTC (rev 949)
@@ -0,0 +1,90 @@
+// I18N constants
+
+// LANG: "fr", ENCODING: UTF-8 | ISO-8859-1
+// Author: Cédric Guillemette, http://www.ebdata.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":					  "Aligner",
+	"All four sides":				  "Quatre cotés",
+	"Background":					  "Arrière plan",
+	"Baseline":                                       "Ligne de base",
+	"Border":					  "Bordure",
+	"Borders":					  "Bordures",
+	"Bottom":                                         "Bas",
+	"CSS Style":					  "Style [CSS]",
+	"Caption":					  "Étiquette",
+	"Cell Properties":                                "Propriétés de cellule",
+	"Center":					  "Centre",
+	"Char":                                           "Charactère",
+	"Collapsed borders":                              "Bordure effondrés",
+	"Color":					  "Couleur",
+	"Description":					  "Description",
+	"FG Color":					  "Couleur de face",
+	"Float":                                          "Flotteur",
+	"Frames":					  "Vues",
+	"Height":                                         "Largeur",
+	"How many columns would you like to merge?":      "Combien de colonnes voulez-vous fusionner?",
+	"How many rows would you like to merge?":         "Combien de rangées voulez-vous fusionner?",
+	"Image URL":					  "URL pour l'image",
+	"Justify":                                        "Justifié",
+	"Layout":					  "Arrangement",
+	"Left":						  "Gauche",
+	"Margin":                                         "Marge",
+	"Middle":                                         "Milieu",
+	"No rules":					  "Aucun règlement",
+	"No sides":					  "Aucun côtés",
+	"None":                                           "Aucun",
+	"Padding":					  "Remplissage",
+	"Please click into some cell":                    "Cliquer sur une cellule",
+	"Right":					  "Droit",
+	"Row Properties":                                 "Propriétés de rangée",
+	"Rules will appear between all rows and columns": "Les règles vont apparaître entre les rangées et les cellules",
+	"Rules will appear between columns only":	  "Les règles vont apparaître entre les colonnes seulement",
+	"Rules will appear between rows only":		  "Les règles vont apparaître entre les rangées seulement",
+	"Rules":					  "Les règles",
+	"Spacing and padding":                            "Espacement et remplissage",
+	"Spacing":					  "Espacement",
+	"Summary":					  "Sommaire",
+	"TO-cell-delete":				  "Supprimer une cellule",
+	"TO-cell-insert-after":				  "Insérer une cellule après",
+	"TO-cell-insert-before":			  "Insérer une cellule avant",
+	"TO-cell-merge":				  "Fusionner les cellules",
+	"TO-cell-prop":					  "Cell properties",
+	"TO-cell-split":				  "Diviser la cellule",
+	"TO-col-delete":				  "Supprimer la colonne",
+	"TO-col-insert-after":				  "Insérer une colonne après",
+	"TO-col-insert-before":				  "Insérer une colonne avant",
+	"TO-col-split":					  "Diviser une colonne",
+	"TO-row-delete":				  "Supprimer une rangée",
+	"TO-row-insert-above":				  "Insérer une rangée avant",
+	"TO-row-insert-under":				  "Insérer une rangée après",
+	"TO-row-prop":					  "Propriétés de rangée",
+	"TO-row-split":					  "Diviser la rangée",
+	"TO-table-prop":				  "Propriétés de table",
+	"Table Properties":				  "Propriétés de table",
+	"Text align":                                     "Aligner le texte",
+	"The bottom side only":				  "Côté du bas seulement",
+	"The left-hand side only":			  "Côté gauche seulement",
+	"The right and left sides only":		  "Côté gauche et droit seulement",
+	"The right-hand side only":			  "Côté droit seulement",
+	"The top and bottom sides only":		  "Côté haut et bas seulement",
+	"The top side only":				  "Côté haut seulement",
+	"Top":                                            "Haut",	
+	"Unset color":                                    "Enlever la couleur",
+	"Vertical align":                                 "Alignement vertical",
+	"Width":					  "Longeur",
+	"not-del-last-cell":				  "HTMLArea refuse de supprimer la dernière cellule de la rangée.",
+	"not-del-last-col":				  "HTMLArea refuse de supprimer la dernière colonne de la table.",
+	"not-del-last-row":				  "HTMLArea refuse de supprimer la dernière rangée de la table",
+	"percent":					  "pourcentage",
+	"pixels":					  "pixels"
+};

Added: plog/trunk/js/htmlarea/plugins/TableOperations/lang/he.js
===================================================================
--- plog/trunk/js/htmlarea/plugins/TableOperations/lang/he.js	2005-02-05 13:57:52 UTC (rev 948)
+++ plog/trunk/js/htmlarea/plugins/TableOperations/lang/he.js	2005-02-05 15:29:38 UTC (rev 949)
@@ -0,0 +1,90 @@
+// I18N constants
+
+// LANG: "he", ENCODING: UTF-8
+// Author: Liron Newman, http://www.eesh.net, <plastish at ultinet dot org>
+
+// 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":					  "ישור",
+	"All four sides":				  "כל ארבעת הצדדים",
+	"Background":					  "רקע",
+	"Baseline":                                       "קו בסיס",
+	"Border":					  "גבול",
+	"Borders":					  "גבולות",
+	"Bottom":                                         "תחתון",
+	"CSS Style":					  "סגנון [CSS]",
+	"Caption":					  "כותרת",
+	"Cell Properties":                                "מאפייני תא",
+	"Center":					  "מרכז",
+	"Char":                                           "תו",
+	"Collapsed borders":                              "גבולות קורסים",
+	"Color":					  "צבע",
+	"Description":					  "תיאור",
+	"FG Color":					  "צבע קידמה",
+	"Float":                                          "מרחף",
+	"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":					  "ללא צדדים",
+	"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":				  "HTMLArea מסרב בפחדנות למחוק את התא האחרון בשורה.",
+	"not-del-last-col":				  "HTMLArea מסרב בפחדנות למחוק את הטור האחרון בטבלה.",
+	"not-del-last-row":				  "HTMLArea מסרב בפחדנות למחוק את השורה האחרונה בטבלה.",
+	"percent":					  "אחוז",
+	"pixels":					  "פיקסלים"
+};

Modified: plog/trunk/js/htmlarea/plugins/TableOperations/lang/hu.js
===================================================================
--- plog/trunk/js/htmlarea/plugins/TableOperations/lang/hu.js	2005-02-05 13:57:52 UTC (rev 948)
+++ plog/trunk/js/htmlarea/plugins/TableOperations/lang/hu.js	2005-02-05 15:29:38 UTC (rev 949)
@@ -1,63 +1,63 @@
-// I18N constants
-
-// LANG: "hu", ENCODING: UTF-8
-// Author: Miklós Somogyi, <somogyine at 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"
-	}
-};
+// I18N constants
+
+// LANG: "hu", ENCODING: UTF-8
+// Author: Miklós Somogyi, <somogyine at 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"
+	}
+};

Modified: plog/trunk/js/htmlarea/plugins/TableOperations/lang/it.js
===================================================================
--- plog/trunk/js/htmlarea/plugins/TableOperations/lang/it.js	2005-02-05 13:57:52 UTC (rev 948)
+++ plog/trunk/js/htmlarea/plugins/TableOperations/lang/it.js	2005-02-05 15:29:38 UTC (rev 949)
@@ -1,81 +1,81 @@
-// I18N constants
-
-// LANG: "it", ENCODING: UTF-8 | ISO-8859-1
-// Author: Fabio Rotondo <fabio at 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"
-};
+// I18N constants
+
+// LANG: "it", ENCODING: UTF-8 | ISO-8859-1
+// Author: Fabio Rotondo <fabio at 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"
+};

Modified: plog/trunk/js/htmlarea/plugins/TableOperations/lang/nl.js
===================================================================
--- plog/trunk/js/htmlarea/plugins/TableOperations/lang/nl.js	2005-02-05 13:57:52 UTC (rev 948)
+++ plog/trunk/js/htmlarea/plugins/TableOperations/lang/nl.js	2005-02-05 15:29:38 UTC (rev 949)
@@ -1,90 +1,90 @@
-// I18N constants
-
-// LANG: "nl", ENCODING: UTF-8 | ISO-8859-1
-// Author: Michel Weegeerink (info at 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"
-};
+// I18N constants
+
+// LANG: "nl", ENCODING: UTF-8 | ISO-8859-1
+// Author: Michel Weegeerink (info at 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"
+};

Modified: plog/trunk/js/htmlarea/plugins/TableOperations/lang/no.js
===================================================================
--- plog/trunk/js/htmlarea/plugins/TableOperations/lang/no.js	2005-02-05 13:57:52 UTC (rev 948)
+++ plog/trunk/js/htmlarea/plugins/TableOperations/lang/no.js	2005-02-05 15:29:38 UTC (rev 949)
@@ -1,91 +1,91 @@
-// I18N constants
-
-// LANG: "en", ENCODING: UTF-8 | ISO-8859-1
-// Author: Mihai Bazon, <mishoo at infoiasi.ro>
-// translated into Norwegia: ses at 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":                       "Høyde",
-	"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":					  	"Høyre",
-	"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 før",
-	"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":	"Høyre- og venstresiden kun",
-	"The right-hand side only":			"Høyresiden 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"
-};
+// I18N constants
+
+// LANG: "en", ENCODING: UTF-8 | ISO-8859-1
+// Author: Mihai Bazon, <mihai_bazon at yahoo.com>
+// translated into Norwegia: ses at 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":                       "Høyde",
+	"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":					  	"Høyre",
+	"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 før",
+	"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":	"Høyre- og venstresiden kun",
+	"The right-hand side only":			"Høyresiden 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"
+};

Modified: plog/trunk/js/htmlarea/plugins/TableOperations/lang/ro.js
===================================================================
--- plog/trunk/js/htmlarea/plugins/TableOperations/lang/ro.js	2005-02-05 13:57:52 UTC (rev 948)
+++ plog/trunk/js/htmlarea/plugins/TableOperations/lang/ro.js	2005-02-05 15:29:38 UTC (rev 949)
@@ -1,90 +1,90 @@
-// I18N constants
-
-// LANG: "ro", ENCODING: UTF-8
-// Author: Mihai Bazon, http://dynarch.com/mishoo
-
-// 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":					  "Aliniere",
-	"All four sides":				  "Toate părţile",
-	"Background":					  "Fundal",
-	"Baseline":                                       "Baseline",
-	"Border":					  "Chenar",
-	"Borders":					  "Chenare",
-	"Bottom":                                         "Jos",
-	"CSS Style":					  "Stil [CSS]",
-	"Caption":					  "Titlu de tabel",
-	"Cell Properties":                                "Proprietăţile celulei",
-	"Center":					  "Centru",
-	"Char":                                           "Caracter",
-	"Collapsed borders":                              "Chenare asimilate",
-	"Color":					  "Culoare",
-	"Description":					  "Descriere",
-	"FG Color":					  "Culoare text",
-	"Float":                                          "Poziţie",
-	"Frames":					  "Chenare",
-	"Height":                                         "Înălţimea",
-	"How many columns would you like to merge?":      "Câte coloane vrei să uneşti?",
-	"How many rows would you like to merge?":         "Câte linii vrei să uneşti?",
-	"Image URL":					  "URL-ul imaginii",
-	"Justify":                                        "Justify",
-	"Layout":					  "Aranjament",
-	"Left":						  "Stânga",
-	"Margin":                                         "Margine",
-	"Middle":                                         "Mijloc",
-	"No rules":					  "Fără linii",
-	"No sides":					  "Fără părţi",
-	"None":                                           "Nimic",
-	"Padding":					  "Spaţiere",
-	"Please click into some cell":                    "Vă rog să daţi click într-o celulă",
-	"Right":					  "Dreapta",
-	"Row Properties":                                 "Proprietăţile liniei",
-	"Rules will appear between all rows and columns": "Vor apărea linii între toate rândurile şi coloanele",
-	"Rules will appear between columns only":	  "Vor apărea doar linii verticale",
-	"Rules will appear between rows only":		  "Vor apărea doar linii orizontale",
-	"Rules":					  "Linii",
-	"Spacing and padding":                            "Spaţierea",
-	"Spacing":					  "ÃŽntre celule",
-	"Summary":					  "Sumar",
-	"TO-cell-delete":				  "Åžterge celula",
-	"TO-cell-insert-after":				  "Inserează o celulă la dreapta",
-	"TO-cell-insert-before":			  "Inserează o celulă la stânga",
-	"TO-cell-merge":				  "UneÅŸte celulele",
-	"TO-cell-prop":					  "Proprietăţile celulei",
-	"TO-cell-split":				  "ÃŽmparte celula",
-	"TO-col-delete":				  "Åžterge coloana",
-	"TO-col-insert-after":				  "Inserează o coloană la dreapta",
-	"TO-col-insert-before":				  "Inserează o coloană la stânga",
-	"TO-col-split":					  "ÃŽmparte coloana",
-	"TO-row-delete":				  "Şterge rândul",
-	"TO-row-insert-above":				  "Inserează un rând înainte",
-	"TO-row-insert-under":				  "Inserează un rând după",
-	"TO-row-prop":					  "Proprietăţile rândului",
-	"TO-row-split":					  "Împarte rândul",
-	"TO-table-prop":				  "Proprietăţile tabelei",
-	"Table Properties":				  "Proprietăţile tabelei",
-	"Text align":                                     "Aliniere",
-	"The bottom side only":				  "Doar partea de jos",
-	"The left-hand side only":			  "Doar partea din stânga",
-	"The right and left sides only":		  "Partea din stânga şi cea din dreapta",
-	"The right-hand side only":			  "Doar partea din dreapta",
-	"The top and bottom sides only":		  "Partea de sus si cea de jos",
-	"The top side only":				  "Doar partea de sus",
-	"Top":                                            "Sus",	
-	"Unset color":                                    "Dezactivează culoarea",
-	"Vertical align":                                 "Aliniere pe verticală",
-	"Width":					  "Lăţime",
-	"not-del-last-cell":				  "HTMLArea refuză cu laşitate să şteargă ultima celulă din rând.",
-	"not-del-last-col":				  "HTMLArea refuză cu laşitate să şteargă ultima coloamă din tabela.",
-	"not-del-last-row":				  "HTMLArea refuză cu laşitate să şteargă ultimul rând din tabela.",
-	"percent":					  "procente",
-	"pixels":					  "pixeli"
-};
+// I18N constants
+
+// LANG: "ro", ENCODING: UTF-8
+// Author: Mihai Bazon, http://dynarch.com/mishoo
+
+// 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":					  "Aliniere",
+	"All four sides":				  "Toate părţile",
+	"Background":					  "Fundal",
+	"Baseline":                                       "Baseline",
+	"Border":					  "Chenar",
+	"Borders":					  "Chenare",
+	"Bottom":                                         "Jos",
+	"CSS Style":					  "Stil [CSS]",
+	"Caption":					  "Titlu de tabel",
+	"Cell Properties":                                "Proprietăţile celulei",
+	"Center":					  "Centru",
+	"Char":                                           "Caracter",
+	"Collapsed borders":                              "Chenare asimilate",
+	"Color":					  "Culoare",
+	"Description":					  "Descriere",
+	"FG Color":					  "Culoare text",
+	"Float":                                          "Poziţie",
+	"Frames":					  "Chenare",
+	"Height":                                         "Înălţimea",
+	"How many columns would you like to merge?":      "Câte coloane vrei să uneşti?",
+	"How many rows would you like to merge?":         "Câte linii vrei să uneşti?",
+	"Image URL":					  "URL-ul imaginii",
+	"Justify":                                        "Justify",
+	"Layout":					  "Aranjament",
+	"Left":						  "Stânga",
+	"Margin":                                         "Margine",
+	"Middle":                                         "Mijloc",
+	"No rules":					  "Fără linii",
+	"No sides":					  "Fără părţi",
+	"None":                                           "Nimic",
+	"Padding":					  "Spaţiere",
+	"Please click into some cell":                    "Vă rog să daţi click într-o celulă",
+	"Right":					  "Dreapta",
+	"Row Properties":                                 "Proprietăţile liniei",
+	"Rules will appear between all rows and columns": "Vor apărea linii între toate rândurile şi coloanele",
+	"Rules will appear between columns only":	  "Vor apărea doar linii verticale",
+	"Rules will appear between rows only":		  "Vor apărea doar linii orizontale",
+	"Rules":					  "Linii",
+	"Spacing and padding":                            "Spaţierea",
+	"Spacing":					  "ÃŽntre celule",
+	"Summary":					  "Sumar",
+	"TO-cell-delete":				  "Åžterge celula",
+	"TO-cell-insert-after":				  "Inserează o celulă la dreapta",
+	"TO-cell-insert-before":			  "Inserează o celulă la stânga",
+	"TO-cell-merge":				  "UneÅŸte celulele",
+	"TO-cell-prop":					  "Proprietăţile celulei",
+	"TO-cell-split":				  "ÃŽmparte celula",
+	"TO-col-delete":				  "Åžterge coloana",
+	"TO-col-insert-after":				  "Inserează o coloană la dreapta",
+	"TO-col-insert-before":				  "Inserează o coloană la stânga",
+	"TO-col-split":					  "ÃŽmparte coloana",
+	"TO-row-delete":				  "Şterge rândul",
+	"TO-row-insert-above":				  "Inserează un rând înainte",
+	"TO-row-insert-under":				  "Inserează un rând după",
+	"TO-row-prop":					  "Proprietăţile rândului",
+	"TO-row-split":					  "Împarte rândul",
+	"TO-table-prop":				  "Proprietăţile tabelei",
+	"Table Properties":				  "Proprietăţile tabelei",
+	"Text align":                                     "Aliniere",
+	"The bottom side only":				  "Doar partea de jos",
+	"The left-hand side only":			  "Doar partea din stânga",
+	"The right and left sides only":		  "Partea din stânga şi cea din dreapta",
+	"The right-hand side only":			  "Doar partea din dreapta",
+	"The top and bottom sides only":		  "Partea de sus si cea de jos",
+	"The top side only":				  "Doar partea de sus",
+	"Top":                                            "Sus",	
+	"Unset color":                                    "Dezactivează culoarea",
+	"Vertical align":                                 "Aliniere pe verticală",
+	"Width":					  "Lăţime",
+	"not-del-last-cell":				  "HTMLArea refuză cu laşitate să şteargă ultima celulă din rând.",
+	"not-del-last-col":				  "HTMLArea refuză cu laşitate să şteargă ultima coloamă din tabela.",
+	"not-del-last-row":				  "HTMLArea refuză cu laşitate să şteargă ultimul rând din tabela.",
+	"percent":					  "procente",
+	"pixels":					  "pixeli"
+};

Modified: plog/trunk/js/htmlarea/plugins/TableOperations/table-operations.js
===================================================================
--- plog/trunk/js/htmlarea/plugins/TableOperations/table-operations.js	2005-02-05 13:57:52 UTC (rev 948)
+++ plog/trunk/js/htmlarea/plugins/TableOperations/table-operations.js	2005-02-05 15:29:38 UTC (rev 949)
@@ -1,1160 +1,1113 @@
-// Table Operations Plugin for HTMLArea-3.0
-// Implementation by Mihai Bazon.  Sponsored by http://www.bloki.com
-//
-// htmlArea v3.0 - Copyright (c) 2002 interactivetools.com, inc.
-// 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://dynarch.com/mishoo
-//
-// $Id: table-operations.js,v 1.5 2003/10/06 11:47:42 mishoo Exp $
-
-// Object that will encapsulate all the table operations provided by
-// HTMLArea-3.0 (except "insert table" which is included in the main file)
-function TableOperations(editor) {
-	this.editor = editor;
-
-	var cfg = editor.config;
-	var tt = TableOperations.I18N;
-	var bl = TableOperations.btnList;
-	var self = this;
-
-	// register the toolbar buttons provided by this plugin
-	var toolbar = ["linebreak"];
-	for (var i in bl) {
-		var btn = bl[i];
-		if (!btn) {
-			toolbar.push("separator");
-		} else {
-			var id = "TO-" + btn[0];
-			cfg.registerButton(id, tt[id], editor.imgURL(btn[0] + ".gif", "TableOperations"), false,
-					   function(editor, id) {
-						   // dispatch button press event
-						   self.buttonPress(editor, id);
-					   }, btn[1]);
-			toolbar.push(id);
-		}
-	}
-
-	// add a new line in the toolbar
-	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
- ************************/
-
-// retrieves the closest element having the specified tagName in the list of
-// ancestors of the current selection/caret.
-TableOperations.prototype.getClosest = function(tagName) {
-	var editor = this.editor;
-	var ancestors = editor.getAllAncestors();
-	var ret = null;
-	tagName = ("" + tagName).toLowerCase();
-	for (var i in ancestors) {
-		var el = ancestors[i];
-		if (el.tagName.toLowerCase() == tagName) {
-			ret = el;
-			break;
-		}
-	}
-	return ret;
-};
-
-// this function requires the file PopupDiv/PopupWin to be loaded from browser
-TableOperations.prototype.dialogTableProperties = function() {
-	var i18n = TableOperations.I18N;
-	// retrieve existing values
-	var table = this.getClosest("table");
-	// this.editor.selectNodeContents(table);
-	// this.editor.updateToolbar();
-
-	var dialog = new PopupWin(this.editor, i18n["Table Properties"], function(dialog, params) {
-		TableOperations.processStyle(params, table);
-		for (var i in params) {
-			var val = params[i];
-			switch (i) {
-			    case "f_caption":
-				if (/\S/.test(val)) {
-					// contains non white-space characters
-					var caption = table.getElementsByTagName("caption")[0];
-					if (!caption) {
-						caption = dialog.editor._doc.createElement("caption");
-						table.insertBefore(caption, table.firstChild);
-					}
-					caption.innerHTML = val;
-				} else {
-					// search for caption and delete it if found
-					var caption = table.getElementsByTagName("caption")[0];
-					if (caption) {
-						caption.parentNode.removeChild(caption);
-					}
-				}
-				break;
-			    case "f_summary":
-				table.summary = val;
-				break;
-			    case "f_width":
-				table.style.width = ("" + val) + params.f_unit;
-				break;
-			    case "f_align":
-				table.align = val;
-				break;
-			    case "f_spacing":
-				table.cellSpacing = val;
-				break;
-			    case "f_padding":
-				table.cellPadding = val;
-				break;
-			    case "f_borders":
-				table.border = val;
-				break;
-			    case "f_frames":
-				table.frame = val;
-				break;
-			    case "f_rules":
-				table.rules = val;
-				break;
-			}
-		}
-		// various workarounds to refresh the table display (Gecko,
-		// what's going on?! do not disappoint me!)
-		dialog.editor.forceRedraw();
-		dialog.editor.focusEditor();
-		dialog.editor.updateToolbar();
-		var save_collapse = table.style.borderCollapse;
-		table.style.borderCollapse = "collapse";
-		table.style.borderCollapse = "separate";
-		table.style.borderCollapse = save_collapse;
-	},
-
-	// this function gets called when the dialog needs to be initialized
-	function (dialog) {
-
-		var f_caption = "";
-		var capel = table.getElementsByTagName("caption")[0];
-		if (capel) {
-			f_caption = capel.innerHTML;
-		}
-		var f_summary = table.summary;
-		var f_width = parseInt(table.style.width);
-		isNaN(f_width) && (f_width = "");
-		var f_unit = /%/.test(table.style.width) ? 'percent' : 'pixels';
-		var f_align = table.align;
-		var f_spacing = table.cellSpacing;
-		var f_padding = table.cellPadding;
-		var f_borders = table.border;
-		var f_frames = table.frame;
-		var f_rules = table.rules;
-
-		function selected(val) {
-			return val ? " selected" : "";
-		};
-
-		// dialog contents
-		dialog.content.style.width = "400px";
-		dialog.content.innerHTML = " \
-<div class='title'\
- style='background: url(" + dialog.baseURL + dialog.editor.imgURL("table-prop.gif", "TableOperations") + ") #fff 98% 50% no-repeat'>" + i18n["Table Properties"] + "\
-</div> \
-<table style='width:100%'> \
-  <tr> \
-    <td> \
-      <fieldset><legend>" + i18n["Description"] + "</legend> \
-       <table style='width:100%'> \
-        <tr> \
-          <td class='label'>" + i18n["Caption"] + ":</td> \
-          <td class='value'><input type='text' name='f_caption' value='" + f_caption + "'/></td> \
-        </tr><tr> \
-          <td class='label'>" + i18n["Summary"] + ":</td> \
-          <td class='value'><input type='text' name='f_summary' value='" + f_summary + "'/></td> \
-        </tr> \
-       </table> \
-      </fieldset> \
-    </td> \
-  </tr> \
-  <tr><td id='--HA-layout'></td></tr> \
-  <tr> \
-    <td> \
-      <fieldset><legend>" + i18n["Spacing and padding"] + "</legend> \
-       <table style='width:100%'> \
-"+//        <tr> \
-//           <td class='label'>" + i18n["Width"] + ":</td> \
-//           <td><input type='text' name='f_width' value='" + f_width + "' size='5' /> \
-//             <select name='f_unit'> \
-//               <option value='%'" + selected(f_unit == "percent") + ">" + i18n["percent"] + "</option> \
-//               <option value='px'" + selected(f_unit == "pixels") + ">" + i18n["pixels"] + "</option> \
-//             </select> &nbsp;&nbsp;" + i18n["Align"] + ": \
-//             <select name='f_align'> \
-//               <option value='left'" + selected(f_align == "left") + ">" + i18n["Left"] + "</option> \
-//               <option value='center'" + selected(f_align == "center") + ">" + i18n["Center"] + "</option> \
-//               <option value='right'" + selected(f_align == "right") + ">" + i18n["Right"] + "</option> \
-//             </select> \
-//           </td> \
-//         </tr> \
-"        <tr> \
-          <td class='label'>" + i18n["Spacing"] + ":</td> \
-          <td><input type='text' name='f_spacing' size='5' value='" + f_spacing + "' /> &nbsp;" + i18n["Padding"] + ":\
-            <input type='text' name='f_padding' size='5' value='" + f_padding + "' /> &nbsp;&nbsp;" + i18n["pixels"] + "\
-          </td> \
-        </tr> \
-       </table> \
-      </fieldset> \
-    </td> \
-  </tr> \
-  <tr> \
-    <td> \
-      <fieldset><legend>Frame and borders</legend> \
-        <table width='100%'> \
-          <tr> \
-            <td class='label'>" + i18n["Borders"] + ":</td> \
-            <td><input name='f_borders' type='text' size='5' value='" + f_borders + "' /> &nbsp;&nbsp;" + i18n["pixels"] + "</td> \
-          </tr> \
-          <tr> \
-            <td class='label'>" + i18n["Frames"] + ":</td> \
-            <td> \
-              <select name='f_frames'> \
-                <option value='void'" + selected(f_frames == "void") + ">" + i18n["No sides"] + "</option> \
-                <option value='above'" + selected(f_frames == "above") + ">" + i18n["The top side only"] + "</option> \
-                <option value='below'" + selected(f_frames == "below") + ">" + i18n["The bottom side only"] + "</option> \
-                <option value='hsides'" + selected(f_frames == "hsides") + ">" + i18n["The top and bottom sides only"] + "</option> \
-                <option value='vsides'" + selected(f_frames == "vsides") + ">" + i18n["The right and left sides only"] + "</option> \
-                <option value='lhs'" + selected(f_frames == "lhs") + ">" + i18n["The left-hand side only"] + "</option> \
-                <option value='rhs'" + selected(f_frames == "rhs") + ">" + i18n["The right-hand side only"] + "</option> \
-                <option value='box'" + selected(f_frames == "box") + ">" + i18n["All four sides"] + "</option> \
-              </select> \
-            </td> \
-          </tr> \
-          <tr> \
-            <td class='label'>" + i18n["Rules"] + ":</td> \
-            <td> \
-              <select name='f_rules'> \
-                <option value='none'" + selected(f_rules == "none") + ">" + i18n["No rules"] + "</option> \
-                <option value='rows'" + selected(f_rules == "rows") + ">" + i18n["Rules will appear between rows only"] + "</option> \
-                <option value='cols'" + selected(f_rules == "cols") + ">" + i18n["Rules will appear between columns only"] + "</option> \
-                <option value='all'" + selected(f_rules == "all") + ">" + i18n["Rules will appear between all rows and columns"] + "</option> \
-              </select> \
-            </td> \
-          </tr> \
-        </table> \
-      </fieldset> \
-    </td> \
-  </tr> \
-  <tr> \
-    <td id='--HA-style'></td> \
-  </tr> \
-</table> \
-";
-		var st_prop = TableOperations.createStyleFieldset(dialog.doc, dialog.editor, table);
-		var p = dialog.doc.getElementById("--HA-style");
-		p.appendChild(st_prop);
-		var st_layout = TableOperations.createStyleLayoutFieldset(dialog.doc, dialog.editor, table);
-		p = dialog.doc.getElementById("--HA-layout");
-		p.appendChild(st_layout);
-		dialog.modal = true;
-		dialog.addButtons("ok", "cancel");
-		dialog.showAtElement(dialog.editor._iframe, "c");
-	});
-};
-
-// this function requires the file PopupDiv/PopupWin to be loaded from browser
-TableOperations.prototype.dialogRowCellProperties = function(cell) {
-	var i18n = TableOperations.I18N;
-	// retrieve existing values
-	var element = this.getClosest(cell ? "td" : "tr");
-	var table = this.getClosest("table");
-	// this.editor.selectNodeContents(element);
-	// this.editor.updateToolbar();
-
-	var dialog = new PopupWin(this.editor, i18n[cell ? "Cell Properties" : "Row Properties"], function(dialog, params) {
-		TableOperations.processStyle(params, element);
-		for (var i in params) {
-			var val = params[i];
-			switch (i) {
-			    case "f_align":
-				element.align = val;
-				break;
-			    case "f_char":
-				element.ch = val;
-				break;
-			    case "f_valign":
-				element.vAlign = val;
-				break;
-			}
-		}
-		// various workarounds to refresh the table display (Gecko,
-		// what's going on?! do not disappoint me!)
-		dialog.editor.forceRedraw();
-		dialog.editor.focusEditor();
-		dialog.editor.updateToolbar();
-		var save_collapse = table.style.borderCollapse;
-		table.style.borderCollapse = "collapse";
-		table.style.borderCollapse = "separate";
-		table.style.borderCollapse = save_collapse;
-	},
-
-	// this function gets called when the dialog needs to be initialized
-	function (dialog) {
-
-		var f_align = element.align;
-		var f_valign = element.vAlign;
-		var f_char = element.ch;
-
-		function selected(val) {
-			return val ? " selected" : "";
-		};
-
-		// dialog contents
-		dialog.content.style.width = "400px";
-		dialog.content.innerHTML = " \
-<div class='title'\
- style='background: url(" + dialog.baseURL + dialog.editor.imgURL(cell ? "cell-prop.gif" : "row-prop.gif", "TableOperations") + ") #fff 98% 50% no-repeat'>" + i18n[cell ? "Cell Properties" : "Row Properties"] + "</div> \
-<table style='width:100%'> \
-  <tr> \
-    <td id='--HA-layout'> \
-"+//      <fieldset><legend>" + i18n["Layout"] + "</legend> \
-//        <table style='width:100%'> \
-//         <tr> \
-//           <td class='label'>" + i18n["Align"] + ":</td> \
-//           <td> \
-//             <select name='f_align'> \
-//               <option value='left'" + selected(f_align == "left") + ">" + i18n["Left"] + "</option> \
-//               <option value='center'" + selected(f_align == "center") + ">" + i18n["Center"] + "</option> \
-//               <option value='right'" + selected(f_align == "right") + ">" + i18n["Right"] + "</option> \
-//               <option value='char'" + selected(f_align == "char") + ">" + i18n["Char"] + "</option> \
-//             </select> \
-//             &nbsp;&nbsp;" + i18n["Char"] + ": \
-//             <input type='text' style='font-family: monospace; text-align: center' name='f_char' size='1' value='" + f_char + "' /> \
-//           </td> \
-//         </tr><tr> \
-//           <td class='label'>" + i18n["Vertical align"] + ":</td> \
-//           <td> \
-//             <select name='f_valign'> \
-//               <option value='top'" + selected(f_valign == "top") + ">" + i18n["Top"] + "</option> \
-//               <option value='middle'" + selected(f_valign == "middle") + ">" + i18n["Middle"] + "</option> \
-//               <option value='bottom'" + selected(f_valign == "bottom") + ">" + i18n["Bottom"] + "</option> \
-//               <option value='baseline'" + selected(f_valign == "baseline") + ">" + i18n["Baseline"] + "</option> \
-//             </select> \
-//           </td> \
-//         </tr> \
-//        </table> \
-//       </fieldset> \
-"    </td> \
-  </tr> \
-  <tr> \
-    <td id='--HA-style'></td> \
-  </tr> \
-</table> \
-";
-		var st_prop = TableOperations.createStyleFieldset(dialog.doc, dialog.editor, element);
-		var p = dialog.doc.getElementById("--HA-style");
-		p.appendChild(st_prop);
-		var st_layout = TableOperations.createStyleLayoutFieldset(dialog.doc, dialog.editor, element);
-		p = dialog.doc.getElementById("--HA-layout");
-		p.appendChild(st_layout);
-		dialog.modal = true;
-		dialog.addButtons("ok", "cancel");
-		dialog.showAtElement(dialog.editor._iframe, "c");
-	});
-};
-
-// this function gets called when some button from the TableOperations toolbar
-// was pressed.
-TableOperations.prototype.buttonPress = function(editor, button_id) {
-	this.editor = editor;
-	var mozbr = HTMLArea.is_gecko ? "<br />" : "";
-	var i18n = TableOperations.I18N;
-
-	// helper function that clears the content in a table row
-	function clearRow(tr) {
-		var tds = tr.getElementsByTagName("td");
-		for (var i = tds.length; --i >= 0;) {
-			var td = tds[i];
-			td.rowSpan = 1;
-			td.innerHTML = mozbr;
-		}
-	};
-
-	function splitRow(td) {
-		var n = parseInt("" + td.rowSpan);
-		var nc = parseInt("" + td.colSpan);
-		td.rowSpan = 1;
-		tr = td.parentNode;
-		var itr = tr.rowIndex;
-		var trs = tr.parentNode.rows;
-		var index = td.cellIndex;
-		while (--n > 0) {
-			tr = trs[++itr];
-			var otd = editor._doc.createElement("td");
-			otd.colSpan = td.colSpan;
-			otd.innerHTML = mozbr;
-			tr.insertBefore(otd, tr.cells[index]);
-		}
-		editor.forceRedraw();
-		editor.updateToolbar();
-	};
-
-	function splitCol(td) {
-		var nc = parseInt("" + td.colSpan);
-		td.colSpan = 1;
-		tr = td.parentNode;
-		var ref = td.nextSibling;
-		while (--nc > 0) {
-			var otd = editor._doc.createElement("td");
-			otd.rowSpan = td.rowSpan;
-			otd.innerHTML = mozbr;
-			tr.insertBefore(otd, ref);
-		}
-		editor.forceRedraw();
-		editor.updateToolbar();
-	};
-
-	function splitCell(td) {
-		var nc = parseInt("" + td.colSpan);
-		splitCol(td);
-		var items = td.parentNode.cells;
-		var index = td.cellIndex;
-		while (nc-- > 0) {
-			splitRow(items[index++]);
-		}
-	};
-
-	function selectNextNode(el) {
-		var node = el.nextSibling;
-		while (node && node.nodeType != 1) {
-			node = node.nextSibling;
-		}
-		if (!node) {
-			node = el.previousSibling;
-			while (node && node.nodeType != 1) {
-				node = node.previousSibling;
-			}
-		}
-		if (!node) {
-			node = el.parentNode;
-		}
-		editor.selectNodeContents(node);
-	};
-
-	switch (button_id) {
-		// ROWS
-
-	    case "TO-row-insert-above":
-	    case "TO-row-insert-under":
-		var tr = this.getClosest("tr");
-		if (!tr) {
-			break;
-		}
-		var otr = tr.cloneNode(true);
-		clearRow(otr);
-		tr.parentNode.insertBefore(otr, /under/.test(button_id) ? tr.nextSibling : tr);
-		editor.forceRedraw();
-		editor.focusEditor();
-		break;
-	    case "TO-row-delete":
-		var tr = this.getClosest("tr");
-		if (!tr) {
-			break;
-		}
-		var par = tr.parentNode;
-		if (par.rows.length == 1) {
-			alert(i18n["not-del-last-row"]);
-			break;
-		}
-		// set the caret first to a position that doesn't
-		// disappear.
-		selectNextNode(tr);
-		par.removeChild(tr);
-		editor.forceRedraw();
-		editor.focusEditor();
-		editor.updateToolbar();
-		break;
-	    case "TO-row-split":
-		var td = this.getClosest("td");
-		if (!td) {
-			break;
-		}
-		splitRow(td);
-		break;
-
-		// COLUMNS
-
-	    case "TO-col-insert-before":
-	    case "TO-col-insert-after":
-		var td = this.getClosest("td");
-		if (!td) {
-			break;
-		}
-		var rows = td.parentNode.parentNode.rows;
-		var index = td.cellIndex;
-		for (var i = rows.length; --i >= 0;) {
-			var tr = rows[i];
-			var ref = tr.cells[index + (/after/.test(button_id) ? 1 : 0)];
-			var otd = editor._doc.createElement("td");
-			otd.innerHTML = mozbr;
-			tr.insertBefore(otd, ref);
-		}
-		editor.focusEditor();
-		break;
-	    case "TO-col-split":
-		var td = this.getClosest("td");
-		if (!td) {
-			break;
-		}
-		splitCol(td);
-		break;
-	    case "TO-col-delete":
-		var td = this.getClosest("td");
-		if (!td) {
-			break;
-		}
-		var index = td.cellIndex;
-		if (td.parentNode.cells.length == 1) {
-			alert(i18n["not-del-last-col"]);
-			break;
-		}
-		// set the caret first to a position that doesn't disappear
-		selectNextNode(td);
-		var rows = td.parentNode.parentNode.rows;
-		for (var i = rows.length; --i >= 0;) {
-			var tr = rows[i];
-			tr.removeChild(tr.cells[index]);
-		}
-		editor.forceRedraw();
-		editor.focusEditor();
-		editor.updateToolbar();
-		break;
-
-		// CELLS
-
-	    case "TO-cell-split":
-		var td = this.getClosest("td");
-		if (!td) {
-			break;
-		}
-		splitCell(td);
-		break;
-	    case "TO-cell-insert-before":
-	    case "TO-cell-insert-after":
-		var td = this.getClosest("td");
-		if (!td) {
-			break;
-		}
-		var tr = td.parentNode;
-		var otd = editor._doc.createElement("td");
-		otd.innerHTML = mozbr;
-		tr.insertBefore(otd, /after/.test(button_id) ? td.nextSibling : td);
-		editor.forceRedraw();
-		editor.focusEditor();
-		break;
-	    case "TO-cell-delete":
-		var td = this.getClosest("td");
-		if (!td) {
-			break;
-		}
-		if (td.parentNode.cells.length == 1) {
-			alert(i18n["not-del-last-cell"]);
-			break;
-		}
-		// set the caret first to a position that doesn't disappear
-		selectNextNode(td);
-		td.parentNode.removeChild(td);
-		editor.forceRedraw();
-		editor.updateToolbar();
-		break;
-	    case "TO-cell-merge":
-		// !! FIXME: Mozilla specific !!
-		var sel = editor._getSelection();
-		var range, i = 0;
-		var rows = [];
-		var row = null;
-		var cells = null;
-		if (!HTMLArea.is_ie) {
-			try {
-				while (range = sel.getRangeAt(i++)) {
-					var td = range.startContainer.childNodes[range.startOffset];
-					if (td.parentNode != row) {
-						row = td.parentNode;
-						(cells) && rows.push(cells);
-						cells = [];
-					}
-					cells.push(td);
-				}
-			} catch(e) {/* finished walking through selection */}
-			rows.push(cells);
-		} else {
-			// Internet Explorer "browser"
-			var td = this.getClosest("td");
-			if (!td) {
-				alert(i18n["Please click into some cell"]);
-				break;
-			}
-			var tr = td.parentElement;
-			var no_cols = prompt(i18n["How many columns would you like to merge?"], 2);
-			if (!no_cols) {
-				// cancelled
-				break;
-			}
-			var no_rows = prompt(i18n["How many rows would you like to merge?"], 2);
-			if (!no_rows) {
-				// cancelled
-				break;
-			}
-			var cell_index = td.cellIndex;
-			while (no_rows-- > 0) {
-				td = tr.cells[cell_index];
-				cells = [td];
-				for (var i = 1; i < no_cols; ++i) {
-					td = td.nextSibling;
-					if (!td) {
-						break;
-					}
-					cells.push(td);
-				}
-				rows.push(cells);
-				tr = tr.nextSibling;
-				if (!tr) {
-					break;
-				}
-			}
-		}
-		var HTML = "";
-		for (i = 0; i < rows.length; ++i) {
-			// i && (HTML += "<br />");
-			var cells = rows[i];
-			for (var j = 0; j < cells.length; ++j) {
-				// j && (HTML += "&nbsp;");
-				var cell = cells[j];
-				HTML += cell.innerHTML;
-				(i || j) && (cell.parentNode.removeChild(cell));
-			}
-		}
-		var td = rows[0][0];
-		td.innerHTML = HTML;
-		td.rowSpan = rows.length;
-		td.colSpan = rows[0].length;
-		editor.selectNodeContents(td);
-		editor.forceRedraw();
-		editor.focusEditor();
-		break;
-
-		// PROPERTIES
-
-	    case "TO-table-prop":
-		this.dialogTableProperties();
-		break;
-
-	    case "TO-row-prop":
-		this.dialogRowCellProperties(false);
-		break;
-
-	    case "TO-cell-prop":
-		this.dialogRowCellProperties(true);
-		break;
-
-	    default:
-		alert("Button [" + button_id + "] not yet implemented");
-	}
-};
-
-// the list of buttons added by this plugin
-TableOperations.btnList = [
-	// table properties button
-	["table-prop",       "table"],
-	null,			// separator
-
-	// ROWS
-	["row-prop",         "tr"],
-	["row-insert-above", "tr"],
-	["row-insert-under", "tr"],
-	["row-delete",       "tr"],
-	["row-split",        "td[rowSpan!=1]"],
-	null,
-
-	// COLS
-	["col-insert-before", "td"],
-	["col-insert-after",  "td"],
-	["col-delete",        "td"],
-	["col-split",         "td[colSpan!=1]"],
-	null,
-
-	// CELLS
-	["cell-prop",          "td"],
-	["cell-insert-before", "td"],
-	["cell-insert-after",  "td"],
-	["cell-delete",        "td"],
-	["cell-merge",         "tr"],
-	["cell-split",         "td[colSpan!=1,rowSpan!=1]"]
-	];
-
-
-
-//// GENERIC CODE [style of any element; this should be moved into a separate
-//// file as it'll be very useful]
-//// BEGIN GENERIC CODE -----------------------------------------------------
-
-TableOperations.getLength = function(value) {
-	var len = parseInt(value);
-	if (isNaN(len)) {
-		len = "";
-	}
-	return len;
-};
-
-// Applies the style found in "params" to the given element.
-TableOperations.processStyle = function(params, element) {
-	var style = element.style;
-	for (var i in params) {
-		var val = params[i];
-		switch (i) {
-		    case "f_st_backgroundColor":
-			style.backgroundColor = val;
-			break;
-		    case "f_st_color":
-			style.color = val;
-			break;
-		    case "f_st_backgroundImage":
-			if (/\S/.test(val)) {
-				style.backgroundImage = "url(" + val + ")";
-			} else {
-				style.backgroundImage = "none";
-			}
-			break;
-		    case "f_st_borderWidth":
-			style.borderWidth = val;
-			break;
-		    case "f_st_borderStyle":
-			style.borderStyle = val;
-			break;
-		    case "f_st_borderColor":
-			style.borderColor = val;
-			break;
-		    case "f_st_borderCollapse":
-			style.borderCollapse = val ? "collapse" : "";
-			break;
-		    case "f_st_width":
-			if (/\S/.test(val)) {
-				style.width = val + params["f_st_widthUnit"];
-			} else {
-				style.width = "";
-			}
-			break;
-		    case "f_st_height":
-			if (/\S/.test(val)) {
-				style.height = val + params["f_st_heightUnit"];
-			} else {
-				style.height = "";
-			}
-			break;
-		    case "f_st_textAlign":
-			if (val == "char") {
-				var ch = params["f_st_textAlignChar"];
-				if (ch == '"') {
-					ch = '\\"';
-				}
-				style.textAlign = '"' + ch + '"';
-			} else {
-				style.textAlign = val;
-			}
-			break;
-		    case "f_st_verticalAlign":
-			style.verticalAlign = val;
-			break;
-		    case "f_st_float":
-			style.cssFloat = val;
-			break;
-// 		    case "f_st_margin":
-// 			style.margin = val + "px";
-// 			break;
-// 		    case "f_st_padding":
-// 			style.padding = val + "px";
-// 			break;
-		}
-	}
-};
-
-// Returns an HTML element for a widget that allows color selection.  That is,
-// a button that contains the given color, if any, and when pressed will popup
-// the sooner-or-later-to-be-rewritten select_color.html dialog allowing user
-// to select some color.  If a color is selected, an input field with the name
-// "f_st_"+name will be updated with the color value in #123456 format.
-TableOperations.createColorButton = function(doc, editor, color, name) {
-	if (!color) {
-		color = "";
-	} else if (!/#/.test(color)) {
-		color = HTMLArea._colorToRgb(color);
-	}
-
-	var df = doc.createElement("span");
- 	var field = doc.createElement("input");
-	field.type = "hidden";
-	df.appendChild(field);
- 	field.name = "f_st_" + name;
-	field.value = color;
-	var button = doc.createElement("span");
-	button.className = "buttonColor";
-	df.appendChild(button);
-	var span = doc.createElement("span");
-	span.className = "chooser";
-	// span.innerHTML = "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;";
-	span.style.backgroundColor = color;
-	button.appendChild(span);
-	button.onmouseover = function() { if (!this.disabled) { this.className += " buttonColor-hilite"; }};
-	button.onmouseout = function() { if (!this.disabled) { this.className = "buttonColor"; }};
-	span.onclick = function() {
-		if (this.parentNode.disabled) {
-			return false;
-		}
-		editor._popupDialog("select_color.html", function(color) {
-			if (color) {
-				span.style.backgroundColor = "#" + color;
-				field.value = "#" + color;
-			}
-		}, color);
-	};
-	var span2 = doc.createElement("span");
-	span2.innerHTML = "&#x00d7;";
-	span2.className = "nocolor";
-	span2.title = TableOperations.I18N["Unset color"];
-	button.appendChild(span2);
-	span2.onmouseover = function() { if (!this.parentNode.disabled) { this.className += " nocolor-hilite"; }};
-	span2.onmouseout = function() { if (!this.parentNode.disabled) { this.className = "nocolor"; }};
-	span2.onclick = function() {
-		span.style.backgroundColor = "";
-		field.value = "";
-	};
-	return df;
-};
-
-TableOperations.createStyleLayoutFieldset = function(doc, editor, el) {
-	var i18n = TableOperations.I18N;
-	var fieldset = doc.createElement("fieldset");
-	var legend = doc.createElement("legend");
-	fieldset.appendChild(legend);
-	legend.innerHTML = i18n["Layout"];
-	var table = doc.createElement("table");
-	fieldset.appendChild(table);
-	table.style.width = "100%";
-	var tbody = doc.createElement("tbody");
-	table.appendChild(tbody);
-
-	var tagname = el.tagName.toLowerCase();
-	var tr, td, input, select, option, options, i;
-
-	if (tagname != "td" && tagname != "tr" && tagname != "th") {
-		tr = doc.createElement("tr");
-		tbody.appendChild(tr);
-		td = doc.createElement("td");
-		td.className = "label";
-		tr.appendChild(td);
-		td.innerHTML = i18n["Float"] + ":";
-		td = doc.createElement("td");
-		tr.appendChild(td);
-		select = doc.createElement("select");
-		td.appendChild(select);
-		select.name = "f_st_float";
-		options = ["None", "Left", "Right"];
-		for (i in options) {
-			var Val = options[i];
-			var val = options[i].toLowerCase();
-			option = doc.createElement("option");
-			option.innerHTML = i18n[Val];
-			option.value = val;
-			option.selected = (("" + el.style.cssFloat).toLowerCase() == val);
-			select.appendChild(option);
-		}
-	}
-
-	tr = doc.createElement("tr");
-	tbody.appendChild(tr);
-	td = doc.createElement("td");
-	td.className = "label";
-	tr.appendChild(td);
-	td.innerHTML = i18n["Width"] + ":";
-	td = doc.createElement("td");
-	tr.appendChild(td);
-	input = doc.createElement("input");
-	input.type = "text";
-	input.value = TableOperations.getLength(el.style.width);
-	input.size = "5";
-	input.name = "f_st_width";
-	input.style.marginRight = "0.5em";
-	td.appendChild(input);
-	select = doc.createElement("select");
-	select.name = "f_st_widthUnit";
-	option = doc.createElement("option");
-	option.innerHTML = i18n["percent"];
-	option.value = "%";
-	option.selected = /%/.test(el.style.width);
-	select.appendChild(option);
-	option = doc.createElement("option");
-	option.innerHTML = i18n["pixels"];
-	option.value = "px";
-	option.selected = /px/.test(el.style.width);
-	select.appendChild(option);
-	td.appendChild(select);
-
-	select.style.marginRight = "0.5em";
-	td.appendChild(doc.createTextNode(i18n["Text align"] + ":"));
-	select = doc.createElement("select");
-	select.style.marginLeft = select.style.marginRight = "0.5em";
-	td.appendChild(select);
-	select.name = "f_st_textAlign";
-	options = ["Left", "Center", "Right", "Justify"];
-	if (tagname == "td") {
-		options.push("Char");
-	}
-	input = doc.createElement("input");
-	input.name = "f_st_textAlignChar";
-	input.size = "1";
-	input.style.fontFamily = "monospace";
-	td.appendChild(input);
-	for (i in options) {
-		var Val = options[i];
-		var val = Val.toLowerCase();
-		option = doc.createElement("option");
-		option.value = val;
-		option.innerHTML = i18n[Val];
-		option.selected = (el.style.textAlign.toLowerCase() == val);
-		select.appendChild(option);
-	}
-	function setCharVisibility(value) {
-		input.style.visibility = value ? "visible" : "hidden";
-		if (value) {
-			input.focus();
-			input.select();
-		}
-	};
-	select.onchange = function() { setCharVisibility(this.value == "char"); };
-	setCharVisibility(select.value == "char");
-
-	tr = doc.createElement("tr");
-	tbody.appendChild(tr);
-	td = doc.createElement("td");
-	td.className = "label";
-	tr.appendChild(td);
-	td.innerHTML = i18n["Height"] + ":";
-	td = doc.createElement("td");
-	tr.appendChild(td);
-	input = doc.createElement("input");
-	input.type = "text";
-	input.value = TableOperations.getLength(el.style.height);
-	input.size = "5";
-	input.name = "f_st_height";
-	input.style.marginRight = "0.5em";
-	td.appendChild(input);
-	select = doc.createElement("select");
-	select.name = "f_st_heightUnit";
-	option = doc.createElement("option");
-	option.innerHTML = i18n["percent"];
-	option.value = "%";
-	option.selected = /%/.test(el.style.height);
-	select.appendChild(option);
-	option = doc.createElement("option");
-	option.innerHTML = i18n["pixels"];
-	option.value = "px";
-	option.selected = /px/.test(el.style.height);
-	select.appendChild(option);
-	td.appendChild(select);
-
-	select.style.marginRight = "0.5em";
-	td.appendChild(doc.createTextNode(i18n["Vertical align"] + ":"));
-	select = doc.createElement("select");
-	select.name = "f_st_verticalAlign";
-	select.style.marginLeft = "0.5em";
-	td.appendChild(select);
-	options = ["Top", "Middle", "Bottom", "Baseline"];
-	for (i in options) {
-		var Val = options[i];
-		var val = Val.toLowerCase();
-		option = doc.createElement("option");
-		option.value = val;
-		option.innerHTML = i18n[Val];
-		option.selected = (el.style.verticalAlign.toLowerCase() == val);
-		select.appendChild(option);
-	}
-
-	return fieldset;
-};
-
-// Returns an HTML element containing the style attributes for the given
-// element.  This can be easily embedded into any dialog; the functionality is
-// also provided.
-TableOperations.createStyleFieldset = function(doc, editor, el) {
-	var i18n = TableOperations.I18N;
-	var fieldset = doc.createElement("fieldset");
-	var legend = doc.createElement("legend");
-	fieldset.appendChild(legend);
-	legend.innerHTML = i18n["CSS Style"];
-	var table = doc.createElement("table");
-	fieldset.appendChild(table);
-	table.style.width = "100%";
-	var tbody = doc.createElement("tbody");
-	table.appendChild(tbody);
-
-	var tr, td, input, select, option, options, i;
-
-	tr = doc.createElement("tr");
-	tbody.appendChild(tr);
-	td = doc.createElement("td");
-	tr.appendChild(td);
-	td.className = "label";
-	td.innerHTML = i18n["Background"] + ":";
-	td = doc.createElement("td");
-	tr.appendChild(td);
-	var df = TableOperations.createColorButton(doc, editor, el.style.backgroundColor, "backgroundColor");
-	df.firstChild.nextSibling.style.marginRight = "0.5em";
-	td.appendChild(df);
-	td.appendChild(doc.createTextNode(i18n["Image URL"] + ": "));
-	input = doc.createElement("input");
-	input.type = "text";
-	input.name = "f_st_backgroundImage";
-	if (el.style.backgroundImage.match(/url\(\s*(.*?)\s*\)/)) {
-		input.value = RegExp.$1;
-	}
-	// input.style.width = "100%";
-	td.appendChild(input);
-
-	tr = doc.createElement("tr");
-	tbody.appendChild(tr);
-	td = doc.createElement("td");
-	tr.appendChild(td);
-	td.className = "label";
-	td.innerHTML = i18n["FG Color"] + ":";
-	td = doc.createElement("td");
-	tr.appendChild(td);
-	td.appendChild(TableOperations.createColorButton(doc, editor, el.style.color, "color"));
-
-	// for better alignment we include an invisible field.
-	input = doc.createElement("input");
-	input.style.visibility = "hidden";
-	input.type = "text";
-	td.appendChild(input);
-
-	tr = doc.createElement("tr");
-	tbody.appendChild(tr);
-	td = doc.createElement("td");
-	tr.appendChild(td);
-	td.className = "label";
-	td.innerHTML = i18n["Border"] + ":";
-	td = doc.createElement("td");
-	tr.appendChild(td);
-
-	var colorButton = TableOperations.createColorButton(doc, editor, el.style.borderColor, "borderColor");
-	var btn = colorButton.firstChild.nextSibling;
-	td.appendChild(colorButton);
-	// borderFields.push(btn);
-	btn.style.marginRight = "0.5em";
-
-	select = doc.createElement("select");
-	var borderFields = [];
-	td.appendChild(select);
-	select.name = "f_st_borderStyle";
-	options = ["none", "dotted", "dashed", "solid", "double", "groove", "ridge", "inset", "outset"];
-	var currentBorderStyle = el.style.borderStyle;
-	// Gecko reports "solid solid solid solid" for "border-style: solid".
-	// That is, "top right bottom left" -- we only consider the first
-	// value.
-	(currentBorderStyle.match(/([^\s]*)\s/)) && (currentBorderStyle = RegExp.$1);
-	for (i in options) {
-		var val = options[i];
-		option = doc.createElement("option");
-		option.value = val;
-		option.innerHTML = val;
-		(val == currentBorderStyle) && (option.selected = true);
-		select.appendChild(option);
-	}
-	select.style.marginRight = "0.5em";
-	function setBorderFieldsStatus(value) {
-		for (i in borderFields) {
-			var el = borderFields[i];
-			el.style.visibility = value ? "hidden" : "visible";
-			if (!value && (el.tagName.toLowerCase() == "input")) {
-				el.focus();
-				el.select();
-			}
-		}
-	};
-	select.onchange = function() { setBorderFieldsStatus(this.value == "none"); };
-
-	input = doc.createElement("input");
-	borderFields.push(input);
-	input.type = "text";
-	input.name = "f_st_borderWidth";
-	input.value = TableOperations.getLength(el.style.borderWidth);
-	input.size = "5";
-	td.appendChild(input);
-	input.style.marginRight = "0.5em";
-	var span = doc.createElement("span");
-	span.innerHTML = i18n["pixels"];
-	td.appendChild(span);
-	borderFields.push(span);
-
-	setBorderFieldsStatus(select.value == "none");
-
-	if (el.tagName.toLowerCase() == "table") {
-		// the border-collapse style is only for tables
-		tr = doc.createElement("tr");
-		tbody.appendChild(tr);
-		td = doc.createElement("td");
-		td.className = "label";
-		tr.appendChild(td);
-		input = doc.createElement("input");
-		input.type = "checkbox";
-		input.name = "f_st_borderCollapse";
-		input.id = "f_st_borderCollapse";
-		var val = (/collapse/i.test(el.style.borderCollapse));
-		input.checked = val ? 1 : 0;
-		td.appendChild(input);
-
-		td = doc.createElement("td");
-		tr.appendChild(td);
-		var label = doc.createElement("label");
-		label.htmlFor = "f_st_borderCollapse";
-		label.innerHTML = i18n["Collapsed borders"];
-		td.appendChild(label);
-	}
-
-// 	tr = doc.createElement("tr");
-// 	tbody.appendChild(tr);
-// 	td = doc.createElement("td");
-// 	td.className = "label";
-// 	tr.appendChild(td);
-// 	td.innerHTML = i18n["Margin"] + ":";
-// 	td = doc.createElement("td");
-// 	tr.appendChild(td);
-// 	input = doc.createElement("input");
-// 	input.type = "text";
-// 	input.size = "5";
-// 	input.name = "f_st_margin";
-// 	td.appendChild(input);
-// 	input.style.marginRight = "0.5em";
-// 	td.appendChild(doc.createTextNode(i18n["Padding"] + ":"));
-
-// 	input = doc.createElement("input");
-// 	input.type = "text";
-// 	input.size = "5";
-// 	input.name = "f_st_padding";
-// 	td.appendChild(input);
-// 	input.style.marginLeft = "0.5em";
-// 	input.style.marginRight = "0.5em";
-// 	td.appendChild(doc.createTextNode(i18n["pixels"]));
-
-	return fieldset;
-};
-
-//// END GENERIC CODE -------------------------------------------------------
+// Table Operations Plugin for HTMLArea-3.0
+// Implementation by Mihai Bazon.  Sponsored by http://www.zapatec.com
+//
+// Copyright (c) dynarch.com 2003-2005
+// This copyright notice must stay intact for use.
+//
+// $Id: table-operations.js,v 1.7 2005/01/20 17:49:02 mishoo Exp $
+
+// Object that will encapsulate all the table operations provided by
+// HTMLArea-3.0 (except "insert table" which is included in the main file)
+function TableOperations(editor) {
+	this.editor = editor;
+
+	var cfg = editor.config;
+	var tt = TableOperations.I18N;
+	var bl = TableOperations.btnList;
+	var self = this;
+
+	// register the toolbar buttons provided by this plugin
+	var toolbar = ["linebreak"];
+	for (var i = 0; i < bl.length; ++i) {
+		var btn = bl[i];
+		if (!btn) {
+			toolbar.push("separator");
+		} else {
+			var id = "TO-" + btn[0];
+			cfg.registerButton(id, tt[id], editor.imgURL(btn[0] + ".gif", "TableOperations"), false,
+					   function(editor, id) {
+						   // dispatch button press event
+						   self.buttonPress(editor, id);
+					   }, btn[1]);
+			toolbar.push(id);
+		}
+	}
+
+	// add a new line in the toolbar
+	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
+ ************************/
+
+// retrieves the closest element having the specified tagName in the list of
+// ancestors of the current selection/caret.
+TableOperations.prototype.getClosest = function(tagName) {
+	var editor = this.editor;
+	var ancestors = editor.getAllAncestors();
+	var ret = null;
+	tagName = ("" + tagName).toLowerCase();
+	for (var i = 0; i < ancestors.length; ++i) {
+		var el = ancestors[i];
+		if (el.tagName.toLowerCase() == tagName) {
+			ret = el;
+			break;
+		}
+	}
+	return ret;
+};
+
+// this function requires the file PopupDiv/PopupWin to be loaded from browser
+TableOperations.prototype.dialogTableProperties = function() {
+	var i18n = TableOperations.I18N;
+	// retrieve existing values
+	var table = this.getClosest("table");
+	// this.editor.selectNodeContents(table);
+	// this.editor.updateToolbar();
+
+	var dialog = new PopupWin(this.editor, i18n["Table Properties"], function(dialog, params) {
+		TableOperations.processStyle(params, table);
+		for (var i in params) {
+			var val = params[i];
+			switch (i) {
+			    case "f_caption":
+				if (/\S/.test(val)) {
+					// contains non white-space characters
+					var caption = table.getElementsByTagName("caption")[0];
+					if (!caption) {
+						caption = dialog.editor._doc.createElement("caption");
+						table.insertBefore(caption, table.firstChild);
+					}
+					caption.innerHTML = val;
+				} else {
+					// search for caption and delete it if found
+					var caption = table.getElementsByTagName("caption")[0];
+					if (caption) {
+						caption.parentNode.removeChild(caption);
+					}
+				}
+				break;
+			    case "f_summary":
+				table.summary = val;
+				break;
+			    case "f_width":
+				table.style.width = ("" + val) + params.f_unit;
+				break;
+			    case "f_align":
+				table.align = val;
+				break;
+			    case "f_spacing":
+				table.cellSpacing = val;
+				break;
+			    case "f_padding":
+				table.cellPadding = val;
+				break;
+			    case "f_borders":
+				table.border = val;
+				break;
+			    case "f_frames":
+				table.frame = val;
+				break;
+			    case "f_rules":
+				table.rules = val;
+				break;
+			}
+		}
+		// various workarounds to refresh the table display (Gecko,
+		// what's going on?! do not disappoint me!)
+		dialog.editor.forceRedraw();
+		dialog.editor.focusEditor();
+		dialog.editor.updateToolbar();
+		var save_collapse = table.style.borderCollapse;
+		table.style.borderCollapse = "collapse";
+		table.style.borderCollapse = "separate";
+		table.style.borderCollapse = save_collapse;
+	},
+
+	// this function gets called when the dialog needs to be initialized
+	function (dialog) {
+
+		var f_caption = "";
+		var capel = table.getElementsByTagName("caption")[0];
+		if (capel) {
+			f_caption = capel.innerHTML;
+		}
+		var f_summary = table.summary;
+		var f_width = parseInt(table.style.width);
+		isNaN(f_width) && (f_width = "");
+		var f_unit = /%/.test(table.style.width) ? 'percent' : 'pixels';
+		var f_align = table.align;
+		var f_spacing = table.cellSpacing;
+		var f_padding = table.cellPadding;
+		var f_borders = table.border;
+		var f_frames = table.frame;
+		var f_rules = table.rules;
+
+		function selected(val) {
+			return val ? " selected" : "";
+		};
+
+		// dialog contents
+		dialog.content.style.width = "400px";
+		dialog.content.innerHTML = " \
+<div class='title'\
+ style='background: url(" + dialog.baseURL + dialog.editor.imgURL("table-prop.gif", "TableOperations") + ") #fff 98% 50% no-repeat'>" + i18n["Table Properties"] + "\
+</div> \
+<table style='width:100%'> \
+  <tr> \
+    <td> \
+      <fieldset><legend>" + i18n["Description"] + "</legend> \
+       <table style='width:100%'> \
+        <tr> \
+          <td class='label'>" + i18n["Caption"] + ":</td> \
+          <td class='value'><input type='text' name='f_caption' value='" + f_caption + "'/></td> \
+        </tr><tr> \
+          <td class='label'>" + i18n["Summary"] + ":</td> \
+          <td class='value'><input type='text' name='f_summary' value='" + f_summary + "'/></td> \
+        </tr> \
+       </table> \
+      </fieldset> \
+    </td> \
+  </tr> \
+  <tr><td id='--HA-layout'></td></tr> \
+  <tr> \
+    <td> \
+      <fieldset><legend>" + i18n["Spacing and padding"] + "</legend> \
+       <table style='width:100%'> \
+        <tr> \
+          <td class='label'>" + i18n["Spacing"] + ":</td> \
+          <td><input type='text' name='f_spacing' size='5' value='" + f_spacing + "' /> &nbsp;" + i18n["Padding"] + ":\
+            <input type='text' name='f_padding' size='5' value='" + f_padding + "' /> &nbsp;&nbsp;" + i18n["pixels"] + "\
+          </td> \
+        </tr> \
+       </table> \
+      </fieldset> \
+    </td> \
+  </tr> \
+  <tr> \
+    <td> \
+      <fieldset><legend>Frame and borders</legend> \
+        <table width='100%'> \
+          <tr> \
+            <td class='label'>" + i18n["Borders"] + ":</td> \
+            <td><input name='f_borders' type='text' size='5' value='" + f_borders + "' /> &nbsp;&nbsp;" + i18n["pixels"] + "</td> \
+          </tr> \
+          <tr> \
+            <td class='label'>" + i18n["Frames"] + ":</td> \
+            <td> \
+              <select name='f_frames'> \
+                <option value='void'" + selected(f_frames == "void") + ">" + i18n["No sides"] + "</option> \
+                <option value='above'" + selected(f_frames == "above") + ">" + i18n["The top side only"] + "</option> \
+                <option value='below'" + selected(f_frames == "below") + ">" + i18n["The bottom side only"] + "</option> \
+                <option value='hsides'" + selected(f_frames == "hsides") + ">" + i18n["The top and bottom sides only"] + "</option> \
+                <option value='vsides'" + selected(f_frames == "vsides") + ">" + i18n["The right and left sides only"] + "</option> \
+                <option value='lhs'" + selected(f_frames == "lhs") + ">" + i18n["The left-hand side only"] + "</option> \
+                <option value='rhs'" + selected(f_frames == "rhs") + ">" + i18n["The right-hand side only"] + "</option> \
+                <option value='box'" + selected(f_frames == "box") + ">" + i18n["All four sides"] + "</option> \
+              </select> \
+            </td> \
+          </tr> \
+          <tr> \
+            <td class='label'>" + i18n["Rules"] + ":</td> \
+            <td> \
+              <select name='f_rules'> \
+                <option value='none'" + selected(f_rules == "none") + ">" + i18n["No rules"] + "</option> \
+                <option value='rows'" + selected(f_rules == "rows") + ">" + i18n["Rules will appear between rows only"] + "</option> \
+                <option value='cols'" + selected(f_rules == "cols") + ">" + i18n["Rules will appear between columns only"] + "</option> \
+                <option value='all'" + selected(f_rules == "all") + ">" + i18n["Rules will appear between all rows and columns"] + "</option> \
+              </select> \
+            </td> \
+          </tr> \
+        </table> \
+      </fieldset> \
+    </td> \
+  </tr> \
+  <tr> \
+    <td id='--HA-style'></td> \
+  </tr> \
+</table> \
+";
+		var st_prop = TableOperations.createStyleFieldset(dialog.doc, dialog.editor, table);
+		var p = dialog.doc.getElementById("--HA-style");
+		p.appendChild(st_prop);
+		var st_layout = TableOperations.createStyleLayoutFieldset(dialog.doc, dialog.editor, table);
+		p = dialog.doc.getElementById("--HA-layout");
+		p.appendChild(st_layout);
+		dialog.modal = true;
+		dialog.addButtons("ok", "cancel");
+		dialog.showAtElement(dialog.editor._iframe, "c");
+	});
+};
+
+// this function requires the file PopupDiv/PopupWin to be loaded from browser
+TableOperations.prototype.dialogRowCellProperties = function(cell) {
+	var i18n = TableOperations.I18N;
+	// retrieve existing values
+	var element = this.getClosest(cell ? "td" : "tr");
+	var table = this.getClosest("table");
+	// this.editor.selectNodeContents(element);
+	// this.editor.updateToolbar();
+
+	var dialog = new PopupWin(this.editor, i18n[cell ? "Cell Properties" : "Row Properties"], function(dialog, params) {
+		TableOperations.processStyle(params, element);
+		for (var i in params) {
+			var val = params[i];
+			switch (i) {
+			    case "f_align":
+				element.align = val;
+				break;
+			    case "f_char":
+				element.ch = val;
+				break;
+			    case "f_valign":
+				element.vAlign = val;
+				break;
+			}
+		}
+		// various workarounds to refresh the table display (Gecko,
+		// what's going on?! do not disappoint me!)
+		dialog.editor.forceRedraw();
+		dialog.editor.focusEditor();
+		dialog.editor.updateToolbar();
+		var save_collapse = table.style.borderCollapse;
+		table.style.borderCollapse = "collapse";
+		table.style.borderCollapse = "separate";
+		table.style.borderCollapse = save_collapse;
+	},
+
+	// this function gets called when the dialog needs to be initialized
+	function (dialog) {
+
+		var f_align = element.align;
+		var f_valign = element.vAlign;
+		var f_char = element.ch;
+
+		function selected(val) {
+			return val ? " selected" : "";
+		};
+
+		// dialog contents
+		dialog.content.style.width = "400px";
+		dialog.content.innerHTML = " \
+<div class='title'\
+ style='background: url(" + dialog.baseURL + dialog.editor.imgURL(cell ? "cell-prop.gif" : "row-prop.gif", "TableOperations") + ") #fff 98% 50% no-repeat'>" + i18n[cell ? "Cell Properties" : "Row Properties"] + "</div> \
+<table style='width:100%'> \
+  <tr> \
+    <td id='--HA-layout'> \
+    </td> \
+  </tr> \
+  <tr> \
+    <td id='--HA-style'></td> \
+  </tr> \
+</table> \
+";
+		var st_prop = TableOperations.createStyleFieldset(dialog.doc, dialog.editor, element);
+		var p = dialog.doc.getElementById("--HA-style");
+		p.appendChild(st_prop);
+		var st_layout = TableOperations.createStyleLayoutFieldset(dialog.doc, dialog.editor, element);
+		p = dialog.doc.getElementById("--HA-layout");
+		p.appendChild(st_layout);
+		dialog.modal = true;
+		dialog.addButtons("ok", "cancel");
+		dialog.showAtElement(dialog.editor._iframe, "c");
+	});
+};
+
+// this function gets called when some button from the TableOperations toolbar
+// was pressed.
+TableOperations.prototype.buttonPress = function(editor, button_id) {
+	this.editor = editor;
+	var mozbr = HTMLArea.is_gecko ? "<br />" : "";
+	var i18n = TableOperations.I18N;
+
+	// helper function that clears the content in a table row
+	function clearRow(tr) {
+		var tds = tr.getElementsByTagName("td");
+		for (var i = tds.length; --i >= 0;) {
+			var td = tds[i];
+			td.rowSpan = 1;
+			td.innerHTML = mozbr;
+		}
+	};
+
+	function splitRow(td) {
+		var n = parseInt("" + td.rowSpan);
+		var nc = parseInt("" + td.colSpan);
+		td.rowSpan = 1;
+		tr = td.parentNode;
+		var itr = tr.rowIndex;
+		var trs = tr.parentNode.rows;
+		var index = td.cellIndex;
+		while (--n > 0) {
+			tr = trs[++itr];
+			var otd = editor._doc.createElement("td");
+			otd.colSpan = td.colSpan;
+			otd.innerHTML = mozbr;
+			tr.insertBefore(otd, tr.cells[index]);
+		}
+		editor.forceRedraw();
+		editor.updateToolbar();
+	};
+
+	function splitCol(td) {
+		var nc = parseInt("" + td.colSpan);
+		td.colSpan = 1;
+		tr = td.parentNode;
+		var ref = td.nextSibling;
+		while (--nc > 0) {
+			var otd = editor._doc.createElement("td");
+			otd.rowSpan = td.rowSpan;
+			otd.innerHTML = mozbr;
+			tr.insertBefore(otd, ref);
+		}
+		editor.forceRedraw();
+		editor.updateToolbar();
+	};
+
+	function splitCell(td) {
+		var nc = parseInt("" + td.colSpan);
+		splitCol(td);
+		var items = td.parentNode.cells;
+		var index = td.cellIndex;
+		while (nc-- > 0) {
+			splitRow(items[index++]);
+		}
+	};
+
+	function selectNextNode(el) {
+		var node = el.nextSibling;
+		while (node && node.nodeType != 1) {
+			node = node.nextSibling;
+		}
+		if (!node) {
+			node = el.previousSibling;
+			while (node && node.nodeType != 1) {
+				node = node.previousSibling;
+			}
+		}
+		if (!node) {
+			node = el.parentNode;
+		}
+		editor.selectNodeContents(node);
+	};
+
+	switch (button_id) {
+		// ROWS
+
+	    case "TO-row-insert-above":
+	    case "TO-row-insert-under":
+		var tr = this.getClosest("tr");
+		if (!tr) {
+			break;
+		}
+		var otr = tr.cloneNode(true);
+		clearRow(otr);
+		tr.parentNode.insertBefore(otr, /under/.test(button_id) ? tr.nextSibling : tr);
+		editor.forceRedraw();
+		editor.focusEditor();
+		break;
+	    case "TO-row-delete":
+		var tr = this.getClosest("tr");
+		if (!tr) {
+			break;
+		}
+		var par = tr.parentNode;
+		if (par.rows.length == 1) {
+			alert(i18n["not-del-last-row"]);
+			break;
+		}
+		// set the caret first to a position that doesn't
+		// disappear.
+		selectNextNode(tr);
+		par.removeChild(tr);
+		editor.forceRedraw();
+		editor.focusEditor();
+		editor.updateToolbar();
+		break;
+	    case "TO-row-split":
+		var td = this.getClosest("td");
+		if (!td) {
+			break;
+		}
+		splitRow(td);
+		break;
+
+		// COLUMNS
+
+	    case "TO-col-insert-before":
+	    case "TO-col-insert-after":
+		var td = this.getClosest("td");
+		if (!td) {
+			break;
+		}
+		var rows = td.parentNode.parentNode.rows;
+		var index = td.cellIndex;
+		for (var i = rows.length; --i >= 0;) {
+			var tr = rows[i];
+			var ref = tr.cells[index + (/after/.test(button_id) ? 1 : 0)];
+			var otd = editor._doc.createElement("td");
+			otd.innerHTML = mozbr;
+			tr.insertBefore(otd, ref);
+		}
+		editor.focusEditor();
+		break;
+	    case "TO-col-split":
+		var td = this.getClosest("td");
+		if (!td) {
+			break;
+		}
+		splitCol(td);
+		break;
+	    case "TO-col-delete":
+		var td = this.getClosest("td");
+		if (!td) {
+			break;
+		}
+		var index = td.cellIndex;
+		if (td.parentNode.cells.length == 1) {
+			alert(i18n["not-del-last-col"]);
+			break;
+		}
+		// set the caret first to a position that doesn't disappear
+		selectNextNode(td);
+		var rows = td.parentNode.parentNode.rows;
+		for (var i = rows.length; --i >= 0;) {
+			var tr = rows[i];
+			tr.removeChild(tr.cells[index]);
+		}
+		editor.forceRedraw();
+		editor.focusEditor();
+		editor.updateToolbar();
+		break;
+
+		// CELLS
+
+	    case "TO-cell-split":
+		var td = this.getClosest("td");
+		if (!td) {
+			break;
+		}
+		splitCell(td);
+		break;
+	    case "TO-cell-insert-before":
+	    case "TO-cell-insert-after":
+		var td = this.getClosest("td");
+		if (!td) {
+			break;
+		}
+		var tr = td.parentNode;
+		var otd = editor._doc.createElement("td");
+		otd.innerHTML = mozbr;
+		tr.insertBefore(otd, /after/.test(button_id) ? td.nextSibling : td);
+		editor.forceRedraw();
+		editor.focusEditor();
+		break;
+	    case "TO-cell-delete":
+		var td = this.getClosest("td");
+		if (!td) {
+			break;
+		}
+		if (td.parentNode.cells.length == 1) {
+			alert(i18n["not-del-last-cell"]);
+			break;
+		}
+		// set the caret first to a position that doesn't disappear
+		selectNextNode(td);
+		td.parentNode.removeChild(td);
+		editor.forceRedraw();
+		editor.updateToolbar();
+		break;
+	    case "TO-cell-merge":
+		// !! FIXME: Mozilla specific !!
+		var sel = editor._getSelection();
+		var range, i = 0;
+		var rows = [];
+		var row = null;
+		var cells = null;
+		if (!HTMLArea.is_ie) {
+			try {
+				while (range = sel.getRangeAt(i++)) {
+					var td = range.startContainer.childNodes[range.startOffset];
+					if (td.parentNode != row) {
+						row = td.parentNode;
+						(cells) && rows.push(cells);
+						cells = [];
+					}
+					cells.push(td);
+				}
+			} catch(e) {/* finished walking through selection */}
+			rows.push(cells);
+		} else {
+			// Internet Explorer "browser"
+			var td = this.getClosest("td");
+			if (!td) {
+				alert(i18n["Please click into some cell"]);
+				break;
+			}
+			var tr = td.parentElement;
+			var no_cols = prompt(i18n["How many columns would you like to merge?"], 2);
+			if (!no_cols) {
+				// cancelled
+				break;
+			}
+			var no_rows = prompt(i18n["How many rows would you like to merge?"], 2);
+			if (!no_rows) {
+				// cancelled
+				break;
+			}
+			var cell_index = td.cellIndex;
+			while (no_rows-- > 0) {
+				td = tr.cells[cell_index];
+				cells = [td];
+				for (var i = 1; i < no_cols; ++i) {
+					td = td.nextSibling;
+					if (!td) {
+						break;
+					}
+					cells.push(td);
+				}
+				rows.push(cells);
+				tr = tr.nextSibling;
+				if (!tr) {
+					break;
+				}
+			}
+		}
+		var HTML = "";
+		for (i = 0; i < rows.length; ++i) {
+			// i && (HTML += "<br />");
+			var cells = rows[i];
+			for (var j = 0; j < cells.length; ++j) {
+				// j && (HTML += "&nbsp;");
+				var cell = cells[j];
+				HTML += cell.innerHTML;
+				(i || j) && (cell.parentNode.removeChild(cell));
+			}
+		}
+		var td = rows[0][0];
+		td.innerHTML = HTML;
+		td.rowSpan = rows.length;
+		td.colSpan = rows[0].length;
+		editor.selectNodeContents(td);
+		editor.forceRedraw();
+		editor.focusEditor();
+		break;
+
+		// PROPERTIES
+
+	    case "TO-table-prop":
+		this.dialogTableProperties();
+		break;
+
+	    case "TO-row-prop":
+		this.dialogRowCellProperties(false);
+		break;
+
+	    case "TO-cell-prop":
+		this.dialogRowCellProperties(true);
+		break;
+
+	    default:
+		alert("Button [" + button_id + "] not yet implemented");
+	}
+};
+
+// the list of buttons added by this plugin
+TableOperations.btnList = [
+	// table properties button
+	["table-prop",       "table"],
+	null,			// separator
+
+	// ROWS
+	["row-prop",         "tr"],
+	["row-insert-above", "tr"],
+	["row-insert-under", "tr"],
+	["row-delete",       "tr"],
+	["row-split",        "td[rowSpan!=1]"],
+	null,
+
+	// COLS
+	["col-insert-before", "td"],
+	["col-insert-after",  "td"],
+	["col-delete",        "td"],
+	["col-split",         "td[colSpan!=1]"],
+	null,
+
+	// CELLS
+	["cell-prop",          "td"],
+	["cell-insert-before", "td"],
+	["cell-insert-after",  "td"],
+	["cell-delete",        "td"],
+	["cell-merge",         "tr"],
+	["cell-split",         "td[colSpan!=1,rowSpan!=1]"]
+	];
+
+
+
+//// GENERIC CODE [style of any element; this should be moved into a separate
+//// file as it'll be very useful]
+//// BEGIN GENERIC CODE -----------------------------------------------------
+
+TableOperations.getLength = function(value) {
+	var len = parseInt(value);
+	if (isNaN(len)) {
+		len = "";
+	}
+	return len;
+};
+
+// Applies the style found in "params" to the given element.
+TableOperations.processStyle = function(params, element) {
+	var style = element.style;
+	for (var i in params) {
+		var val = params[i];
+		switch (i) {
+		    case "f_st_backgroundColor":
+			style.backgroundColor = val;
+			break;
+		    case "f_st_color":
+			style.color = val;
+			break;
+		    case "f_st_backgroundImage":
+			if (/\S/.test(val)) {
+				style.backgroundImage = "url(" + val + ")";
+			} else {
+				style.backgroundImage = "none";
+			}
+			break;
+		    case "f_st_borderWidth":
+			style.borderWidth = val;
+			break;
+		    case "f_st_borderStyle":
+			style.borderStyle = val;
+			break;
+		    case "f_st_borderColor":
+			style.borderColor = val;
+			break;
+		    case "f_st_borderCollapse":
+			style.borderCollapse = val ? "collapse" : "";
+			break;
+		    case "f_st_width":
+			if (/\S/.test(val)) {
+				style.width = val + params["f_st_widthUnit"];
+			} else {
+				style.width = "";
+			}
+			break;
+		    case "f_st_height":
+			if (/\S/.test(val)) {
+				style.height = val + params["f_st_heightUnit"];
+			} else {
+				style.height = "";
+			}
+			break;
+		    case "f_st_textAlign":
+			if (val == "char") {
+				var ch = params["f_st_textAlignChar"];
+				if (ch == '"') {
+					ch = '\\"';
+				}
+				style.textAlign = '"' + ch + '"';
+			} else {
+				style.textAlign = val;
+			}
+			break;
+		    case "f_st_verticalAlign":
+			style.verticalAlign = val;
+			break;
+		    case "f_st_float":
+			style.cssFloat = val;
+			break;
+// 		    case "f_st_margin":
+// 			style.margin = val + "px";
+// 			break;
+// 		    case "f_st_padding":
+// 			style.padding = val + "px";
+// 			break;
+		}
+	}
+};
+
+// Returns an HTML element for a widget that allows color selection.  That is,
+// a button that contains the given color, if any, and when pressed will popup
+// the sooner-or-later-to-be-rewritten select_color.html dialog allowing user
+// to select some color.  If a color is selected, an input field with the name
+// "f_st_"+name will be updated with the color value in #123456 format.
+TableOperations.createColorButton = function(doc, editor, color, name) {
+	if (!color) {
+		color = "";
+	} else if (!/#/.test(color)) {
+		color = HTMLArea._colorToRgb(color);
+	}
+
+	var df = doc.createElement("span");
+ 	var field = doc.createElement("input");
+	field.type = "hidden";
+	df.appendChild(field);
+ 	field.name = "f_st_" + name;
+	field.value = color;
+	var button = doc.createElement("span");
+	button.className = "buttonColor";
+	df.appendChild(button);
+	var span = doc.createElement("span");
+	span.className = "chooser";
+	// span.innerHTML = "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;";
+	span.style.backgroundColor = color;
+	button.appendChild(span);
+	button.onmouseover = function() { if (!this.disabled) { this.className += " buttonColor-hilite"; }};
+	button.onmouseout = function() { if (!this.disabled) { this.className = "buttonColor"; }};
+	span.onclick = function() {
+		if (this.parentNode.disabled) {
+			return false;
+		}
+		editor._popupDialog("select_color.html", function(color) {
+			if (color) {
+				span.style.backgroundColor = "#" + color;
+				field.value = "#" + color;
+			}
+		}, color);
+	};
+	var span2 = doc.createElement("span");
+	span2.innerHTML = "&#x00d7;";
+	span2.className = "nocolor";
+	span2.title = TableOperations.I18N["Unset color"];
+	button.appendChild(span2);
+	span2.onmouseover = function() { if (!this.parentNode.disabled) { this.className += " nocolor-hilite"; }};
+	span2.onmouseout = function() { if (!this.parentNode.disabled) { this.className = "nocolor"; }};
+	span2.onclick = function() {
+		span.style.backgroundColor = "";
+		field.value = "";
+	};
+	return df;
+};
+
+TableOperations.createStyleLayoutFieldset = function(doc, editor, el) {
+	var i18n = TableOperations.I18N;
+	var fieldset = doc.createElement("fieldset");
+	var legend = doc.createElement("legend");
+	fieldset.appendChild(legend);
+	legend.innerHTML = i18n["Layout"];
+	var table = doc.createElement("table");
+	fieldset.appendChild(table);
+	table.style.width = "100%";
+	var tbody = doc.createElement("tbody");
+	table.appendChild(tbody);
+
+	var tagname = el.tagName.toLowerCase();
+	var tr, td, input, select, option, options, i;
+
+	if (tagname != "td" && tagname != "tr" && tagname != "th") {
+		tr = doc.createElement("tr");
+		tbody.appendChild(tr);
+		td = doc.createElement("td");
+		td.className = "label";
+		tr.appendChild(td);
+		td.innerHTML = i18n["Float"] + ":";
+		td = doc.createElement("td");
+		tr.appendChild(td);
+		select = doc.createElement("select");
+		td.appendChild(select);
+		select.name = "f_st_float";
+		options = ["None", "Left", "Right"];
+		for (var i = 0; i < options.length; ++i) {
+			var Val = options[i];
+			var val = options[i].toLowerCase();
+			option = doc.createElement("option");
+			option.innerHTML = i18n[Val];
+			option.value = val;
+			option.selected = (("" + el.style.cssFloat).toLowerCase() == val);
+			select.appendChild(option);
+		}
+	}
+
+	tr = doc.createElement("tr");
+	tbody.appendChild(tr);
+	td = doc.createElement("td");
+	td.className = "label";
+	tr.appendChild(td);
+	td.innerHTML = i18n["Width"] + ":";
+	td = doc.createElement("td");
+	tr.appendChild(td);
+	input = doc.createElement("input");
+	input.type = "text";
+	input.value = TableOperations.getLength(el.style.width);
+	input.size = "5";
+	input.name = "f_st_width";
+	input.style.marginRight = "0.5em";
+	td.appendChild(input);
+	select = doc.createElement("select");
+	select.name = "f_st_widthUnit";
+	option = doc.createElement("option");
+	option.innerHTML = i18n["percent"];
+	option.value = "%";
+	option.selected = /%/.test(el.style.width);
+	select.appendChild(option);
+	option = doc.createElement("option");
+	option.innerHTML = i18n["pixels"];
+	option.value = "px";
+	option.selected = /px/.test(el.style.width);
+	select.appendChild(option);
+	td.appendChild(select);
+
+	select.style.marginRight = "0.5em";
+	td.appendChild(doc.createTextNode(i18n["Text align"] + ":"));
+	select = doc.createElement("select");
+	select.style.marginLeft = select.style.marginRight = "0.5em";
+	td.appendChild(select);
+	select.name = "f_st_textAlign";
+	options = ["Left", "Center", "Right", "Justify"];
+	if (tagname == "td") {
+		options.push("Char");
+	}
+	input = doc.createElement("input");
+	input.name = "f_st_textAlignChar";
+	input.size = "1";
+	input.style.fontFamily = "monospace";
+	td.appendChild(input);
+	for (var i = 0; i < options.length; ++i) {
+		var Val = options[i];
+		var val = Val.toLowerCase();
+		option = doc.createElement("option");
+		option.value = val;
+		option.innerHTML = i18n[Val];
+		option.selected = (el.style.textAlign.toLowerCase() == val);
+		select.appendChild(option);
+	}
+	function setCharVisibility(value) {
+		input.style.visibility = value ? "visible" : "hidden";
+		if (value) {
+			input.focus();
+			input.select();
+		}
+	};
+	select.onchange = function() { setCharVisibility(this.value == "char"); };
+	setCharVisibility(select.value == "char");
+
+	tr = doc.createElement("tr");
+	tbody.appendChild(tr);
+	td = doc.createElement("td");
+	td.className = "label";
+	tr.appendChild(td);
+	td.innerHTML = i18n["Height"] + ":";
+	td = doc.createElement("td");
+	tr.appendChild(td);
+	input = doc.createElement("input");
+	input.type = "text";
+	input.value = TableOperations.getLength(el.style.height);
+	input.size = "5";
+	input.name = "f_st_height";
+	input.style.marginRight = "0.5em";
+	td.appendChild(input);
+	select = doc.createElement("select");
+	select.name = "f_st_heightUnit";
+	option = doc.createElement("option");
+	option.innerHTML = i18n["percent"];
+	option.value = "%";
+	option.selected = /%/.test(el.style.height);
+	select.appendChild(option);
+	option = doc.createElement("option");
+	option.innerHTML = i18n["pixels"];
+	option.value = "px";
+	option.selected = /px/.test(el.style.height);
+	select.appendChild(option);
+	td.appendChild(select);
+
+	select.style.marginRight = "0.5em";
+	td.appendChild(doc.createTextNode(i18n["Vertical align"] + ":"));
+	select = doc.createElement("select");
+	select.name = "f_st_verticalAlign";
+	select.style.marginLeft = "0.5em";
+	td.appendChild(select);
+	options = ["Top", "Middle", "Bottom", "Baseline"];
+	for (var i = 0; i < options.length; ++i) {
+		var Val = options[i];
+		var val = Val.toLowerCase();
+		option = doc.createElement("option");
+		option.value = val;
+		option.innerHTML = i18n[Val];
+		option.selected = (el.style.verticalAlign.toLowerCase() == val);
+		select.appendChild(option);
+	}
+
+	return fieldset;
+};
+
+// Returns an HTML element containing the style attributes for the given
+// element.  This can be easily embedded into any dialog; the functionality is
+// also provided.
+TableOperations.createStyleFieldset = function(doc, editor, el) {
+	var i18n = TableOperations.I18N;
+	var fieldset = doc.createElement("fieldset");
+	var legend = doc.createElement("legend");
+	fieldset.appendChild(legend);
+	legend.innerHTML = i18n["CSS Style"];
+	var table = doc.createElement("table");
+	fieldset.appendChild(table);
+	table.style.width = "100%";
+	var tbody = doc.createElement("tbody");
+	table.appendChild(tbody);
+
+	var tr, td, input, select, option, options, i;
+
+	tr = doc.createElement("tr");
+	tbody.appendChild(tr);
+	td = doc.createElement("td");
+	tr.appendChild(td);
+	td.className = "label";
+	td.innerHTML = i18n["Background"] + ":";
+	td = doc.createElement("td");
+	tr.appendChild(td);
+	var df = TableOperations.createColorButton(doc, editor, el.style.backgroundColor, "backgroundColor");
+	df.firstChild.nextSibling.style.marginRight = "0.5em";
+	td.appendChild(df);
+	td.appendChild(doc.createTextNode(i18n["Image URL"] + ": "));
+	input = doc.createElement("input");
+	input.type = "text";
+	input.name = "f_st_backgroundImage";
+	if (el.style.backgroundImage.match(/url\(\s*(.*?)\s*\)/)) {
+		input.value = RegExp.$1;
+	}
+	// input.style.width = "100%";
+	td.appendChild(input);
+
+	tr = doc.createElement("tr");
+	tbody.appendChild(tr);
+	td = doc.createElement("td");
+	tr.appendChild(td);
+	td.className = "label";
+	td.innerHTML = i18n["FG Color"] + ":";
+	td = doc.createElement("td");
+	tr.appendChild(td);
+	td.appendChild(TableOperations.createColorButton(doc, editor, el.style.color, "color"));
+
+	// for better alignment we include an invisible field.
+	input = doc.createElement("input");
+	input.style.visibility = "hidden";
+	input.type = "text";
+	td.appendChild(input);
+
+	tr = doc.createElement("tr");
+	tbody.appendChild(tr);
+	td = doc.createElement("td");
+	tr.appendChild(td);
+	td.className = "label";
+	td.innerHTML = i18n["Border"] + ":";
+	td = doc.createElement("td");
+	tr.appendChild(td);
+
+	var colorButton = TableOperations.createColorButton(doc, editor, el.style.borderColor, "borderColor");
+	var btn = colorButton.firstChild.nextSibling;
+	td.appendChild(colorButton);
+	// borderFields.push(btn);
+	btn.style.marginRight = "0.5em";
+
+	select = doc.createElement("select");
+	var borderFields = [];
+	td.appendChild(select);
+	select.name = "f_st_borderStyle";
+	options = ["none", "dotted", "dashed", "solid", "double", "groove", "ridge", "inset", "outset"];
+	var currentBorderStyle = el.style.borderStyle;
+	// Gecko reports "solid solid solid solid" for "border-style: solid".
+	// That is, "top right bottom left" -- we only consider the first
+	// value.
+	(currentBorderStyle.match(/([^\s]*)\s/)) && (currentBorderStyle = RegExp.$1);
+	for (var i in options) {
+		var val = options[i];
+		option = doc.createElement("option");
+		option.value = val;
+		option.innerHTML = val;
+		(val == currentBorderStyle) && (option.selected = true);
+		select.appendChild(option);
+	}
+	select.style.marginRight = "0.5em";
+	function setBorderFieldsStatus(value) {
+		for (var i = 0; i < borderFields.length; ++i) {
+			var el = borderFields[i];
+			el.style.visibility = value ? "hidden" : "visible";
+			if (!value && (el.tagName.toLowerCase() == "input")) {
+				el.focus();
+				el.select();
+			}
+		}
+	};
+	select.onchange = function() { setBorderFieldsStatus(this.value == "none"); };
+
+	input = doc.createElement("input");
+	borderFields.push(input);
+	input.type = "text";
+	input.name = "f_st_borderWidth";
+	input.value = TableOperations.getLength(el.style.borderWidth);
+	input.size = "5";
+	td.appendChild(input);
+	input.style.marginRight = "0.5em";
+	var span = doc.createElement("span");
+	span.innerHTML = i18n["pixels"];
+	td.appendChild(span);
+	borderFields.push(span);
+
+	setBorderFieldsStatus(select.value == "none");
+
+	if (el.tagName.toLowerCase() == "table") {
+		// the border-collapse style is only for tables
+		tr = doc.createElement("tr");
+		tbody.appendChild(tr);
+		td = doc.createElement("td");
+		td.className = "label";
+		tr.appendChild(td);
+		input = doc.createElement("input");
+		input.type = "checkbox";
+		input.name = "f_st_borderCollapse";
+		input.id = "f_st_borderCollapse";
+		var val = (/collapse/i.test(el.style.borderCollapse));
+		input.checked = val ? 1 : 0;
+		td.appendChild(input);
+
+		td = doc.createElement("td");
+		tr.appendChild(td);
+		var label = doc.createElement("label");
+		label.htmlFor = "f_st_borderCollapse";
+		label.innerHTML = i18n["Collapsed borders"];
+		td.appendChild(label);
+	}
+
+// 	tr = doc.createElement("tr");
+// 	tbody.appendChild(tr);
+// 	td = doc.createElement("td");
+// 	td.className = "label";
+// 	tr.appendChild(td);
+// 	td.innerHTML = i18n["Margin"] + ":";
+// 	td = doc.createElement("td");
+// 	tr.appendChild(td);
+// 	input = doc.createElement("input");
+// 	input.type = "text";
+// 	input.size = "5";
+// 	input.name = "f_st_margin";
+// 	td.appendChild(input);
+// 	input.style.marginRight = "0.5em";
+// 	td.appendChild(doc.createTextNode(i18n["Padding"] + ":"));
+
+// 	input = doc.createElement("input");
+// 	input.type = "text";
+// 	input.size = "5";
+// 	input.name = "f_st_padding";
+// 	td.appendChild(input);
+// 	input.style.marginLeft = "0.5em";
+// 	input.style.marginRight = "0.5em";
+// 	td.appendChild(doc.createTextNode(i18n["pixels"]));
+
+	return fieldset;
+};
+
+//// END GENERIC CODE -------------------------------------------------------

Modified: plog/trunk/js/htmlarea/popupdiv.js
===================================================================
--- plog/trunk/js/htmlarea/popupdiv.js	2005-02-05 13:57:52 UTC (rev 948)
+++ plog/trunk/js/htmlarea/popupdiv.js	2005-02-05 15:29:38 UTC (rev 949)
@@ -1,369 +1,369 @@
-/** This file is derived from PopupDiv, developed by Mihai Bazon for
- * SamWare.net.  Modifications were needed to make it usable in HTMLArea.
- * HTMLArea is a free WYSIWYG online HTML editor from InteractiveTools.com.
- *
- * This file does not function standalone.  It is dependent of global functions
- * defined in HTMLArea-3.0 (htmlarea.js).
- *
- * Please see file htmlarea.js for further details.
- **/
-
-var is_ie = ( (navigator.userAgent.toLowerCase().indexOf("msie") != -1) &&
-	      (navigator.userAgent.toLowerCase().indexOf("opera") == -1) );
-var is_compat = (document.compatMode == "BackCompat");
-
-function PopupDiv(editor, titleText, handler, initFunction) {
-	var self = this;
-
-	this.editor = editor;
-	this.doc = editor._mdoc;
-	this.handler = handler;
-
-	var el = this.doc.createElement("div");
-	el.className = "content";
-
-	var popup = this.doc.createElement("div");
-	popup.className = "dialog popupdiv";
-	this.element = popup;
-	var s = popup.style;
-	s.position = "absolute";
-	s.left = "0px";
-	s.top = "0px";
-
-	var title = this.doc.createElement("div");
-	title.className = "title";
-	this.title = title;
-	popup.appendChild(title);
-
-	HTMLArea._addEvent(title, "mousedown", function(ev) {
-		self._dragStart(is_ie ? window.event : ev);
-	});
-
-	var button = this.doc.createElement("div");
-	button.className = "button";
-	title.appendChild(button);
-	button.innerHTML = "&#x00d7;";
-	title.appendChild(this.doc.createTextNode(titleText));
-	this.titleText = titleText;
-
-	button.onmouseover = function() {
-		this.className += " button-hilite";
-	};
-	button.onmouseout = function() {
-		this.className = this.className.replace(/\s*button-hilite\s*/g, " ");
-	};
-	button.onclick = function() {
-		this.className = this.className.replace(/\s*button-hilite\s*/g, " ");
-		self.close();
-	};
-
-	popup.appendChild(el);
-	this.content = el;
-
-	this.doc.body.appendChild(popup);
-
-	this.dragging = false;
-	this.onShow = null;
-	this.onClose = null;
-	this.modal = false;
-
-	initFunction(this);
-};
-
-PopupDiv.currentPopup = null;
-
-PopupDiv.prototype.showAtElement = function(el, mode) {
-	this.defaultSize();
-	var pos, ew, eh;
-	var popup = this.element;
-	popup.style.display = "block";
-	var w = popup.offsetWidth;
-	var h = popup.offsetHeight;
-	popup.style.display = "none";
-	if (el != window) {
-		pos = PopupDiv.getAbsolutePos(el);
-		ew = el.offsetWidth;
-		eh = el.offsetHeight;
-	} else {
-		pos = {x:0, y:0};
-		var size = PopupDiv.getWindowSize();
-		ew = size.x;
-		eh = size.y;
-	}
-	var FX = false, FY = false;
-	if (mode.indexOf("l") != -1) {
-		pos.x -= w;
-		FX = true;
-	}
-	if (mode.indexOf("r") != -1) {
-		pos.x += ew;
-		FX = true;
-	}
-	if (mode.indexOf("t") != -1) {
-		pos.y -= h;
-		FY = true;
-	}
-	if (mode.indexOf("b") != -1) {
-		pos.y += eh;
-		FY = true;
-	}
-	if (mode.indexOf("c") != -1) {
-		FX || (pos.x += Math.round((ew - w) / 2));
-		FY || (pos.y += Math.round((eh - h) / 2));
-	}
-	this.showAt(pos.x, pos.y);
-};
-
-PopupDiv.prototype.defaultSize = function() {
-	var s = this.element.style;
-	var cs = this.element.currentStyle;
-	var addX = (is_ie && is_compat) ? (parseInt(cs.borderLeftWidth) +
-					   parseInt(cs.borderRightWidth) +
-					   parseInt(cs.paddingLeft) +
-					   parseInt(cs.paddingRight)) : 0;
-	var addY = (is_ie && is_compat) ? (parseInt(cs.borderTopWidth) +
-					   parseInt(cs.borderBottomWidth) +
-					   parseInt(cs.paddingTop) +
-					   parseInt(cs.paddingBottom)) : 0;
-	s.display = "block";
-	s.width = (this.content.offsetWidth + addX) + "px";
-	s.height = (this.content.offsetHeight + this.title.offsetHeight) + "px";
-	s.display = "none";
-};
-
-PopupDiv.prototype.showAt = function(x, y) {
-	this.defaultSize();
-	var s = this.element.style;
-	s.display = "block";
-	s.left = x + "px";
-	s.top = y + "px";
-	this.hideShowCovered();
-
-	PopupDiv.currentPopup = this;
-	HTMLArea._addEvents(this.doc.body, ["mousedown", "click"], PopupDiv.checkPopup);
-	HTMLArea._addEvents(this.editor._doc.body, ["mousedown", "click"], PopupDiv.checkPopup);
-	if (is_ie && this.modal) {
-		this.doc.body.setCapture(false);
-		this.doc.body.onlosecapture = function() {
-			(PopupDiv.currentPopup) && (this.doc.body.setCapture(false));
-		};
-	}
-	window.event && HTMLArea._stopEvent(window.event);
-
-	if (typeof this.onShow == "function") {
-		this.onShow();
-	} else if (typeof this.onShow == "string") {
-		eval(this.onShow);
-	}
-
-	var field = this.element.getElementsByTagName("input")[0];
-	if (!field) {
-		field = this.element.getElementsByTagName("select")[0];
-	}
-	if (!field) {
-		field = this.element.getElementsByTagName("textarea")[0];
-	}
-	if (field) {
-		field.focus();
-	}
-};
-
-PopupDiv.prototype.close = function() {
-	this.element.style.display = "none";
-	PopupDiv.currentPopup = null;
-	this.hideShowCovered();
-	HTMLArea._removeEvents(this.doc.body, ["mousedown", "click"], PopupDiv.checkPopup);
-	HTMLArea._removeEvents(this.editor._doc.body, ["mousedown", "click"], PopupDiv.checkPopup);
-	is_ie && this.modal && this.doc.body.releaseCapture();
-	if (typeof this.onClose == "function") {
-		this.onClose();
-	} else if (typeof this.onClose == "string") {
-		eval(this.onClose);
-	}
-	this.element.parentNode.removeChild(this.element);
-};
-
-PopupDiv.prototype.getForm = function() {
-	var forms = this.content.getElementsByTagName("form");
-	return (forms.length > 0) ? forms[0] : null;
-};
-
-PopupDiv.prototype.callHandler = function() {
-	var tags = ["input", "textarea", "select"];
-	var params = new Object();
-	for (var ti in tags) {
-		var tag = tags[ti];
-		var els = this.content.getElementsByTagName(tag);
-		for (var j = 0; j < els.length; ++j) {
-			var el = els[j];
-			params[el.name] = el.value;
-		}
-	}
-	this.handler(this, params);
-	return false;
-};
-
-PopupDiv.getAbsolutePos = function(el) {
-	var r = { x: el.offsetLeft, y: el.offsetTop };
-	if (el.offsetParent) {
-		var tmp = PopupDiv.getAbsolutePos(el.offsetParent);
-		r.x += tmp.x;
-		r.y += tmp.y;
-	}
-	return r;
-};
-
-PopupDiv.getWindowSize = function() {
-	if (window.innerHeight) {
-		return { y: window.innerHeight, x: window.innerWidth };
-	}
-	if (this.doc.body.clientHeight) {
-		return { y: this.doc.body.clientHeight, x: this.doc.body.clientWidth };
-	}
-	return { y: this.doc.documentElement.clientHeight, x: this.doc.documentElement.clientWidth };
-};
-
-PopupDiv.prototype.hideShowCovered = function () {
-	var self = this;
-	function isContained(el) {
-		while (el) {
-			if (el == self.element) {
-				return true;
-			}
-			el = el.parentNode;
-		}
-		return false;
-	};
-	var tags = new Array("applet", "select");
-	var el = this.element;
-
-	var p = PopupDiv.getAbsolutePos(el);
-	var EX1 = p.x;
-	var EX2 = el.offsetWidth + EX1;
-	var EY1 = p.y;
-	var EY2 = el.offsetHeight + EY1;
-
-	if (el.style.display == "none") {
-		EX1 = EX2 = EY1 = EY2 = 0;
-	}
-
-	for (var k = tags.length; k > 0; ) {
-		var ar = this.doc.getElementsByTagName(tags[--k]);
-		var cc = null;
-
-		for (var i = ar.length; i > 0;) {
-			cc = ar[--i];
-			if (isContained(cc)) {
-				cc.style.visibility = "visible";
-				continue;
-			}
-
-			p = PopupDiv.getAbsolutePos(cc);
-			var CX1 = p.x;
-			var CX2 = cc.offsetWidth + CX1;
-			var CY1 = p.y;
-			var CY2 = cc.offsetHeight + CY1;
-
-			if ((CX1 > EX2) || (CX2 < EX1) || (CY1 > EY2) || (CY2 < EY1)) {
-				cc.style.visibility = "visible";
-			} else {
-				cc.style.visibility = "hidden";
-			}
-		}
-	}
-};
-
-PopupDiv.prototype._dragStart = function (ev) {
-	if (this.dragging) {
-		return false;
-	}
-	this.dragging = true;
-	PopupDiv.currentPopup = this;
-	var posX = ev.clientX;
-	var posY = ev.clientY;
-	if (is_ie) {
-		posY += this.doc.body.scrollTop;
-		posX += this.doc.body.scrollLeft;
-	} else {
-		posY += window.scrollY;
-		posX += window.scrollX;
-	}
-	var st = this.element.style;
-	this.xOffs = posX - parseInt(st.left);
-	this.yOffs = posY - parseInt(st.top);
-	HTMLArea._addEvent(this.doc, "mousemove", PopupDiv.dragIt);
-	HTMLArea._addEvent(this.doc, "mouseover", HTMLArea._stopEvent);
-	HTMLArea._addEvent(this.doc, "mouseup", PopupDiv.dragEnd);
-	HTMLArea._stopEvent(ev);
-};
-
-PopupDiv.dragIt = function (ev) {
-	var popup = PopupDiv.currentPopup;
-	if (!(popup && popup.dragging)) {
-		return false;
-	}
-	is_ie && (ev = window.event);
-	var posX = ev.clientX;
-	var posY = ev.clientY;
-	if (is_ie) {
-		posY += this.doc.body.scrollTop;
-		posX += this.doc.body.scrollLeft;
-	} else {
-		posY += window.scrollY;
-		posX += window.scrollX;
-	}
-	popup.hideShowCovered();
-	var st = popup.element.style;
-	st.left = (posX - popup.xOffs) + "px";
-	st.top = (posY - popup.yOffs) + "px";
-	HTMLArea._stopEvent(ev);
-};
-
-PopupDiv.dragEnd = function () {
-	var popup = PopupDiv.currentPopup;
-	if (!popup) {
-		return false;
-	}
-	popup.dragging = false;
-	HTMLArea._removeEvent(popup.doc, "mouseup", PopupDiv.dragEnd);
-	HTMLArea._removeEvent(popup.doc, "mouseover", HTMLArea._stopEvent);
-	HTMLArea._removeEvent(popup.doc, "mousemove", PopupDiv.dragIt);
-	popup.hideShowCovered();
-};
-
-PopupDiv.checkPopup = function (ev) {
-	is_ie && (ev = window.event);
-	var el = is_ie ? ev.srcElement : ev.target;
-	var cp = PopupDiv.currentPopup;
-	for (; (el != null) && (el != cp.element); el = el.parentNode);
-	if (el == null) {
-		cp.modal || ev.type == "mouseover" || cp.close();
-		HTMLArea._stopEvent(ev);
-	}
-};
-
-PopupDiv.prototype.addButtons = function() {
-	var self = this;
-	var div = this.doc.createElement("div");
-	this.content.appendChild(div);
-	div.className = "buttons";
-	for (var i = 0; i < arguments.length; ++i) {
-		var btn = arguments[i];
-		var button = this.doc.createElement("button");
-		div.appendChild(button);
-		button.innerHTML = HTMLArea.I18N.buttons[btn];
-		switch (btn) {
-		    case "ok":
-			button.onclick = function() {
-				self.callHandler();
-				self.close();
-			};
-			break;
-		    case "cancel":
-			button.onclick = function() {
-				self.close();
-			};
-			break;
-		}
-	}
-};
+/** This file is derived from PopupDiv, developed by Mihai Bazon for
+ * SamWare.net.  Modifications were needed to make it usable in HTMLArea.
+ * HTMLArea is a free WYSIWYG online HTML editor from InteractiveTools.com.
+ *
+ * This file does not function standalone.  It is dependent of global functions
+ * defined in HTMLArea-3.0 (htmlarea.js).
+ *
+ * Please see file htmlarea.js for further details.
+ **/
+
+var is_ie = ( (navigator.userAgent.toLowerCase().indexOf("msie") != -1) &&
+	      (navigator.userAgent.toLowerCase().indexOf("opera") == -1) );
+var is_compat = (document.compatMode == "BackCompat");
+
+function PopupDiv(editor, titleText, handler, initFunction) {
+	var self = this;
+
+	this.editor = editor;
+	this.doc = editor._mdoc;
+	this.handler = handler;
+
+	var el = this.doc.createElement("div");
+	el.className = "content";
+
+	var popup = this.doc.createElement("div");
+	popup.className = "dialog popupdiv";
+	this.element = popup;
+	var s = popup.style;
+	s.position = "absolute";
+	s.left = "0px";
+	s.top = "0px";
+
+	var title = this.doc.createElement("div");
+	title.className = "title";
+	this.title = title;
+	popup.appendChild(title);
+
+	HTMLArea._addEvent(title, "mousedown", function(ev) {
+		self._dragStart(is_ie ? window.event : ev);
+	});
+
+	var button = this.doc.createElement("div");
+	button.className = "button";
+	title.appendChild(button);
+	button.innerHTML = "&#x00d7;";
+	title.appendChild(this.doc.createTextNode(titleText));
+	this.titleText = titleText;
+
+	button.onmouseover = function() {
+		this.className += " button-hilite";
+	};
+	button.onmouseout = function() {
+		this.className = this.className.replace(/\s*button-hilite\s*/g, " ");
+	};
+	button.onclick = function() {
+		this.className = this.className.replace(/\s*button-hilite\s*/g, " ");
+		self.close();
+	};
+
+	popup.appendChild(el);
+	this.content = el;
+
+	this.doc.body.appendChild(popup);
+
+	this.dragging = false;
+	this.onShow = null;
+	this.onClose = null;
+	this.modal = false;
+
+	initFunction(this);
+};
+
+PopupDiv.currentPopup = null;
+
+PopupDiv.prototype.showAtElement = function(el, mode) {
+	this.defaultSize();
+	var pos, ew, eh;
+	var popup = this.element;
+	popup.style.display = "block";
+	var w = popup.offsetWidth;
+	var h = popup.offsetHeight;
+	popup.style.display = "none";
+	if (el != window) {
+		pos = PopupDiv.getAbsolutePos(el);
+		ew = el.offsetWidth;
+		eh = el.offsetHeight;
+	} else {
+		pos = {x:0, y:0};
+		var size = PopupDiv.getWindowSize();
+		ew = size.x;
+		eh = size.y;
+	}
+	var FX = false, FY = false;
+	if (mode.indexOf("l") != -1) {
+		pos.x -= w;
+		FX = true;
+	}
+	if (mode.indexOf("r") != -1) {
+		pos.x += ew;
+		FX = true;
+	}
+	if (mode.indexOf("t") != -1) {
+		pos.y -= h;
+		FY = true;
+	}
+	if (mode.indexOf("b") != -1) {
+		pos.y += eh;
+		FY = true;
+	}
+	if (mode.indexOf("c") != -1) {
+		FX || (pos.x += Math.round((ew - w) / 2));
+		FY || (pos.y += Math.round((eh - h) / 2));
+	}
+	this.showAt(pos.x, pos.y);
+};
+
+PopupDiv.prototype.defaultSize = function() {
+	var s = this.element.style;
+	var cs = this.element.currentStyle;
+	var addX = (is_ie && is_compat) ? (parseInt(cs.borderLeftWidth) +
+					   parseInt(cs.borderRightWidth) +
+					   parseInt(cs.paddingLeft) +
+					   parseInt(cs.paddingRight)) : 0;
+	var addY = (is_ie && is_compat) ? (parseInt(cs.borderTopWidth) +
+					   parseInt(cs.borderBottomWidth) +
+					   parseInt(cs.paddingTop) +
+					   parseInt(cs.paddingBottom)) : 0;
+	s.display = "block";
+	s.width = (this.content.offsetWidth + addX) + "px";
+	s.height = (this.content.offsetHeight + this.title.offsetHeight) + "px";
+	s.display = "none";
+};
+
+PopupDiv.prototype.showAt = function(x, y) {
+	this.defaultSize();
+	var s = this.element.style;
+	s.display = "block";
+	s.left = x + "px";
+	s.top = y + "px";
+	this.hideShowCovered();
+
+	PopupDiv.currentPopup = this;
+	HTMLArea._addEvents(this.doc.body, ["mousedown", "click"], PopupDiv.checkPopup);
+	HTMLArea._addEvents(this.editor._doc.body, ["mousedown", "click"], PopupDiv.checkPopup);
+	if (is_ie && this.modal) {
+		this.doc.body.setCapture(false);
+		this.doc.body.onlosecapture = function() {
+			(PopupDiv.currentPopup) && (this.doc.body.setCapture(false));
+		};
+	}
+	window.event && HTMLArea._stopEvent(window.event);
+
+	if (typeof this.onShow == "function") {
+		this.onShow();
+	} else if (typeof this.onShow == "string") {
+		eval(this.onShow);
+	}
+
+	var field = this.element.getElementsByTagName("input")[0];
+	if (!field) {
+		field = this.element.getElementsByTagName("select")[0];
+	}
+	if (!field) {
+		field = this.element.getElementsByTagName("textarea")[0];
+	}
+	if (field) {
+		field.focus();
+	}
+};
+
+PopupDiv.prototype.close = function() {
+	this.element.style.display = "none";
+	PopupDiv.currentPopup = null;
+	this.hideShowCovered();
+	HTMLArea._removeEvents(this.doc.body, ["mousedown", "click"], PopupDiv.checkPopup);
+	HTMLArea._removeEvents(this.editor._doc.body, ["mousedown", "click"], PopupDiv.checkPopup);
+	is_ie && this.modal && this.doc.body.releaseCapture();
+	if (typeof this.onClose == "function") {
+		this.onClose();
+	} else if (typeof this.onClose == "string") {
+		eval(this.onClose);
+	}
+	this.element.parentNode.removeChild(this.element);
+};
+
+PopupDiv.prototype.getForm = function() {
+	var forms = this.content.getElementsByTagName("form");
+	return (forms.length > 0) ? forms[0] : null;
+};
+
+PopupDiv.prototype.callHandler = function() {
+	var tags = ["input", "textarea", "select"];
+	var params = new Object();
+	for (var ti = tags.length; --ti >= 0;) {
+		var tag = tags[ti];
+		var els = this.content.getElementsByTagName(tag);
+		for (var j = 0; j < els.length; ++j) {
+			var el = els[j];
+			params[el.name] = el.value;
+		}
+	}
+	this.handler(this, params);
+	return false;
+};
+
+PopupDiv.getAbsolutePos = function(el) {
+	var r = { x: el.offsetLeft, y: el.offsetTop };
+	if (el.offsetParent) {
+		var tmp = PopupDiv.getAbsolutePos(el.offsetParent);
+		r.x += tmp.x;
+		r.y += tmp.y;
+	}
+	return r;
+};
+
+PopupDiv.getWindowSize = function() {
+	if (window.innerHeight) {
+		return { y: window.innerHeight, x: window.innerWidth };
+	}
+	if (this.doc.body.clientHeight) {
+		return { y: this.doc.body.clientHeight, x: this.doc.body.clientWidth };
+	}
+	return { y: this.doc.documentElement.clientHeight, x: this.doc.documentElement.clientWidth };
+};
+
+PopupDiv.prototype.hideShowCovered = function () {
+	var self = this;
+	function isContained(el) {
+		while (el) {
+			if (el == self.element) {
+				return true;
+			}
+			el = el.parentNode;
+		}
+		return false;
+	};
+	var tags = new Array("applet", "select");
+	var el = this.element;
+
+	var p = PopupDiv.getAbsolutePos(el);
+	var EX1 = p.x;
+	var EX2 = el.offsetWidth + EX1;
+	var EY1 = p.y;
+	var EY2 = el.offsetHeight + EY1;
+
+	if (el.style.display == "none") {
+		EX1 = EX2 = EY1 = EY2 = 0;
+	}
+
+	for (var k = tags.length; k > 0; ) {
+		var ar = this.doc.getElementsByTagName(tags[--k]);
+		var cc = null;
+
+		for (var i = ar.length; i > 0;) {
+			cc = ar[--i];
+			if (isContained(cc)) {
+				cc.style.visibility = "visible";
+				continue;
+			}
+
+			p = PopupDiv.getAbsolutePos(cc);
+			var CX1 = p.x;
+			var CX2 = cc.offsetWidth + CX1;
+			var CY1 = p.y;
+			var CY2 = cc.offsetHeight + CY1;
+
+			if ((CX1 > EX2) || (CX2 < EX1) || (CY1 > EY2) || (CY2 < EY1)) {
+				cc.style.visibility = "visible";
+			} else {
+				cc.style.visibility = "hidden";
+			}
+		}
+	}
+};
+
+PopupDiv.prototype._dragStart = function (ev) {
+	if (this.dragging) {
+		return false;
+	}
+	this.dragging = true;
+	PopupDiv.currentPopup = this;
+	var posX = ev.clientX;
+	var posY = ev.clientY;
+	if (is_ie) {
+		posY += this.doc.body.scrollTop;
+		posX += this.doc.body.scrollLeft;
+	} else {
+		posY += window.scrollY;
+		posX += window.scrollX;
+	}
+	var st = this.element.style;
+	this.xOffs = posX - parseInt(st.left);
+	this.yOffs = posY - parseInt(st.top);
+	HTMLArea._addEvent(this.doc, "mousemove", PopupDiv.dragIt);
+	HTMLArea._addEvent(this.doc, "mouseover", HTMLArea._stopEvent);
+	HTMLArea._addEvent(this.doc, "mouseup", PopupDiv.dragEnd);
+	HTMLArea._stopEvent(ev);
+};
+
+PopupDiv.dragIt = function (ev) {
+	var popup = PopupDiv.currentPopup;
+	if (!(popup && popup.dragging)) {
+		return false;
+	}
+	is_ie && (ev = window.event);
+	var posX = ev.clientX;
+	var posY = ev.clientY;
+	if (is_ie) {
+		posY += this.doc.body.scrollTop;
+		posX += this.doc.body.scrollLeft;
+	} else {
+		posY += window.scrollY;
+		posX += window.scrollX;
+	}
+	popup.hideShowCovered();
+	var st = popup.element.style;
+	st.left = (posX - popup.xOffs) + "px";
+	st.top = (posY - popup.yOffs) + "px";
+	HTMLArea._stopEvent(ev);
+};
+
+PopupDiv.dragEnd = function () {
+	var popup = PopupDiv.currentPopup;
+	if (!popup) {
+		return false;
+	}
+	popup.dragging = false;
+	HTMLArea._removeEvent(popup.doc, "mouseup", PopupDiv.dragEnd);
+	HTMLArea._removeEvent(popup.doc, "mouseover", HTMLArea._stopEvent);
+	HTMLArea._removeEvent(popup.doc, "mousemove", PopupDiv.dragIt);
+	popup.hideShowCovered();
+};
+
+PopupDiv.checkPopup = function (ev) {
+	is_ie && (ev = window.event);
+	var el = is_ie ? ev.srcElement : ev.target;
+	var cp = PopupDiv.currentPopup;
+	for (; (el != null) && (el != cp.element); el = el.parentNode);
+	if (el == null) {
+		cp.modal || ev.type == "mouseover" || cp.close();
+		HTMLArea._stopEvent(ev);
+	}
+};
+
+PopupDiv.prototype.addButtons = function() {
+	var self = this;
+	var div = this.doc.createElement("div");
+	this.content.appendChild(div);
+	div.className = "buttons";
+	for (var i = 0; i < arguments.length; ++i) {
+		var btn = arguments[i];
+		var button = this.doc.createElement("button");
+		div.appendChild(button);
+		button.innerHTML = HTMLArea.I18N.buttons[btn];
+		switch (btn) {
+		    case "ok":
+			button.onclick = function() {
+				self.callHandler();
+				self.close();
+			};
+			break;
+		    case "cancel":
+			button.onclick = function() {
+				self.close();
+			};
+			break;
+		}
+	}
+};

Modified: plog/trunk/js/htmlarea/popups/about.html
===================================================================
--- plog/trunk/js/htmlarea/popups/about.html	2005-02-05 13:57:52 UTC (rev 948)
+++ plog/trunk/js/htmlarea/popups/about.html	2005-02-05 15:29:38 UTC (rev 949)
@@ -1,378 +1,375 @@
-<!--
-
-(c) dynarch.com, 2003-2004
-Author: Mihai Bazon, http://dynarch.com/mishoo
-Distributed as part of HTMLArea 3.0
-
-"You are not expected to understand this...  I don't neither."
-
-                      (from The Linux Kernel Source Code,
-                            ./arch/x86_64/ia32/ptrace.c:90)
-
-;-)
-
--->
-
-<html style="height: 100%">
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-<title>About HTMLArea</title>
-<script type="text/javascript" src="popup.js"></script>
-<script type="text/javascript">
-window.resizeTo(450, 250);
-var TABS = [];
-var CURRENT_TAB = 0;
-var CONTENT_HEIGHT_DIFF = 0;
-var CONTENT_WIDTH_DIFF = 0;
-function selectTab(idx) {
-  var ct = TABS[CURRENT_TAB];
-  ct.className = ct.className.replace(/\s*tab-current\s*/, ' ');
-  ct = TABS[CURRENT_TAB = idx];
-  ct.className += ' tab-current';
-  for (var i = TABS.length; --i >= 0;) {
-    var area = document.getElementById("tab-area-" + i);
-    if (CURRENT_TAB == i) {
-      area.style.display = "block";
-    } else {
-      area.style.display = "none";
-    }
-  }
-  document.body.style.visibility = "hidden";
-  document.body.style.visibility = "visible";
-  document.cookie = "HTMLAREA-ABOUT-TAB=" + idx;
-}
-var editor = null;
-function initDocument() {
-  editor = window.dialogArguments;
-  HTMLArea = window.opener.HTMLArea;
-
-  var plugins = document.getElementById("plugins");
-  var j = 0;
-  var html = "<table width='99%' cellpadding='0' style='margin-top: 1em; collapse-borders: collapse; border: 1px solid #8b8;'>" +
-	  "<thead><tr>" +
-	  "<td>Name</td>" +
-	  "<td>Developer</td>" +
-	  "<td>Sponsored by</td>" +
-	  "<td>License<sup>*</sup></td>" +
-	  "</tr></thead><tbody>";
-  for (var i in editor.plugins) {
-    var info = editor.plugins[i];
-    html += "<tr><td>" + info.name + " v" + info.version + "</td>" + 
-            "<td><a href='" + info.developer_url + "' target='_blank' title='Visit developer website'>" +
-	    info.developer + "</a></td>" +
-	    "<td><a href='" + info.sponsor_url + "' target='_blank' title='Visit sponsor website'>" +
-	    info.sponsor + "</a></td>" +
-	    "<td>" + info.license + "</td></tr>";
-    ++j;
-  }
-
-  if (j) {
-          html += "</tbody></table>" +
-		  "<p><sup>*</sup> License \"htmlArea\" means that the plugin is distributed under the same terms " +
-		  "as HTMLArea itself.  Such plugins are likely to be those included in the official " +
-		  "HTMLArea distribution</p>";
-	  plugins.innerHTML = "<p>The following plugins have been loaded.</p>" + html;
-  } else {
-	  plugins.innerHTML = "<p>No plugins have been loaded</p>";
-  }
-
-  plugins.innerHTML += "<p>User agent reports:<br/>" + navigator.userAgent + "</p>";
-
-  var content = document.getElementById("content");
-  if (window.innerHeight) {
-    CONTENT_HEIGHT_DIFF = window.innerHeight - 250;
-    CONTENT_WIDTH_DIFF = window.innerWidth - content.offsetWidth;
-  } else {
-    CONTENT_HEIGHT_DIFF = document.body.offsetHeight - 250;
-    CONTENT_WIDTH_DIFF = document.body.offsetWidth - 400;
-  }
-  window.onresize();
-  var bar = document.getElementById("tabbar");
-  j = 0;
-  for (var i = bar.firstChild; i; i = i.nextSibling) {
-    TABS.push(i);
-    i.__msh_tab = j;
-    i.onmousedown = function(ev) { selectTab(this.__msh_tab); HTMLArea._stopEvent(ev || window.event); };
-    var area = document.getElementById("tab-area-" + j);
-    if (/tab-current/.test(i.className)) {
-      CURRENT_TAB = j;
-      area.style.display = "block";
-    } else {
-      area.style.display = "none";
-    }
-    ++j;
-  }
-  if (document.cookie.match(/HTMLAREA-ABOUT-TAB=([0-9]+)/))
-    selectTab(RegExp.$1);
-}
-window.onresize = function() {
-  var content = document.getElementById("content");
-  if (window.innerHeight) {
-    content.style.height = (window.innerHeight - CONTENT_HEIGHT_DIFF) + "px";
-    content.style.width = (window.innerWidth - CONTENT_WIDTH_DIFF) + "px";
-  } else {
-    content.style.height = (document.body.offsetHeight - CONTENT_HEIGHT_DIFF) + "px";
-    //content.style.width = (document.body.offsetWidth - CONTENT_WIDTH_DIFF) + "px";
-  }
-}
-</script>
-<style>
-  html,body,textarea,table { font-family: tahoma,verdana,arial; font-size: 11px;
-padding: 0px; margin: 0px; }
-  tt { font-size: 120%; }
-  body { padding: 0px; background: #cea; color: 000; }
-  a:link, a:visited { color: #00f; }
-  a:hover { color: #f00; }
-  a:active { color: #f80; }
-  button { font: 11px tahoma,verdana,sans-serif; background-color: #cea;
-      border-width: 1px; }
-
-  p { margin: 0.5em 0px; }
-
-  h1 { font: bold 130% georgia,"times new roman",serif; margin: 0px; border-bottom: 1px solid #6a6; }
-  h2 { font: bold 110% georgia,"times new roman",serif; margin: 0.7em 0px; }
-
-  thead {
-    font-weight: bold;
-    background-color: #dfb;
-  }
-
-  .logo, .logo-hover {
-    white-space: nowrap;
-    background-color: #8f4; color: #040; padding: 3px; border-bottom: 1px solid #555;
-    height: 5em;
-  }
-  .logo .brand, .logo-hover .brand {
-    margin-left: 0.5em; margin-right: 0.5em; padding-bottom: 0.1em;
-    font-family: impact,'arial black',arial,sans-serif; font-size: 28px;
-    border-bottom: 1px solid #595; text-align: center;
-    cursor: pointer;
-  }
-  .logo-hover {
-    background-color: #fff;
-  }
-  .logo-hover .brand {
-    color: #800;
-    border-color: #04f;
-  }
-  .logo .letter, .logo-hover .letter { position: relative; font-family: monospace; }
-  .logo .letter1 { top: 0.1em; }
-  .logo .letter2 { top: 0.05em; }
-  .logo .letter3 { top: -0.05em; }
-  .logo .letter4 { top: -0.1em; }
-
-  .logo-hover .letter1 { top: -0.1em; }
-  .logo-hover .letter2 { top: -0.05em; }
-  .logo-hover .letter3 { top: 0.05em; }
-  .logo-hover .letter4 { top: 0.1em; }
-  .logo .version, .logo-hover .version { font-family: georgia,"times new roman",serif; }
-  .logo .release {
-    font-size: 90%; margin-bottom: 1em;
-    text-align: center; color: #484;
-  }
-  .logo .visit { display: none; }
-  .logo-hover .release { display: none; }
-  .logo-hover .visit {
-    font-size: 90%; margin-bottom: 1em;
-    text-align: center; color: #448;
-  }
-  .buttons {
-    text-align: right; padding: 3px; background-color: #8f4;
-    border-top: 1px solid #555;
-  }
-  #tabbar {
-    position: relative;
-    left: 10px;
-  }
-  .tab {
-    color: #454;
-    cursor: pointer;
-    margin-left: -5px;
-    float: left; position: relative;
-    border: 1px solid #555;
-    top: -3px; left: -2px;
-    padding: 2px 10px 3px 10px;
-    border-top: none; background-color: #9b7;
-    -moz-border-radius: 0px 0px 4px 4px;
-    z-index: 0;
-  }
-  .tab-current {
-    color: #000;
-    top: -4px;
-    background-color: #cea;
-    padding: 3px 10px 4px 10px;
-    z-index: 10;
-  }
-  table.sponsors { border-top: 1px solid #aca; }
-  table.sponsors td {
-    border-bottom: 1px solid #aca; vertical-align: top;
-  }
-  table.sponsors tr td { padding: 2px 0px; }
-  table.sponsors tr td.sponsor { text-align: right; padding-right: 0.3em; white-space: nowrap; }
-  li, ol, ul { margin-top: 0px; margin-bottom: 0px; }
-</style></head>
-<body onload="__dlg_init(); initDocument();"
-><table cellspacing="0" cellpadding="0" style="border-collapse: collapse;
-      width: 100%; height: 100%;">
-
-<tr style="height: 1em"><td id="tdheader">
-
-<div class="logo">
-<div class="brand"
-onmouseover="this.parentNode.className='logo-hover';"
-onmouseout="this.parentNode.className='logo';"
-onclick="window.open('http://dynarch.com/htmlarea/');">
-<span class="letter letter1">&lt;H</span><span
-class="letter letter2">T</span><span
-class="letter letter3">M</span><span
-class="letter letter4">L</span>Area <span class="letter">/&gt;</span>
-<span class="version">3.0 <span style="position: relative; top: -0.6em; font-size: 50%; font-weight: normal">[ rev. rc1 ]</span></span></div>
-<div class="release">Compiled on Mar  1, 2004 19:37 GMT</div>
-<div class="visit">Go to http://dynarch.com/htmlarea/ [latest milestone release]</div>
-</div>
-
-</td></tr>
-<tr><td id="tdcontent" style="padding: 0.5em;">
-
-<div style="overflow: auto; height: 250px;" id="content">
-<div id="tab-areas">
-
-<div id="tab-area-0">
-
-  <h1>HTMLArea</h1>
-  
-  <p>A free WYSIWYG editor replacement for <tt>&lt;textarea&gt;</tt> fields.<br />
-  For Mozilla 1.3+ (any platform) or Internet Explorer 5.5+ (Windows).
-  </p>
-
-  <p style="text-align: center"
-  >&copy; 2002-2004 <a href="http://interactivetools.com" target="_blank">interactivetools.com</a>, inc.<br />
-  &copy; 2003-2004 <a href="http://dynarch.com" target="_blank">dynarch.com</a> LLC.<br />
-  All Rights Reserved.</p>
-
-  <h2>Project resources</h2>
-
-  <ul>
-  <li><a href="http://sourceforge.net/projects/itools-htmlarea/" target="_blank"
-  >Project page</a> (@ sourceforge.net)</li>
-  <li><a href="http://sourceforge.net/cvs/?group_id=69750" target="_blank"
-  >Anonymous CVS access</a> (@ sourceforge.net)</li>
-  <li><a href="http://sourceforge.net/tracker/?atid=525656&group_id=69750&func=browse" target="_blank"
-  >Bug system</a> (@ sourceforge.net)</li>
-  <li><a href="http://www.interactivetools.com/forum/gforum.cgi?forum=14;" target="_blank"
-  >Forum</a> (@ interactivetools.com)</li>
-  <li><a href="http://www.dynarch.com/htmlarea/" target="_blank"
-  >Last public release</a> (@ dynarch.com)</li>
-  </ul>
-
-  <p>
-  For download section please see the <a href="http://sourceforge.net/projects/itools-htmlarea/" target="_blank"
-  >project page @ SourceForge</a>.
-  </p>
-
-<p style="margin-top: 1em; text-align: center;">Version 3.0 developed and maintained by <a
-href="http://dynarch.com/mishoo/" title="http://dynarch.com/mishoo/" target="_blank">Mihai Bazon</a> / <a
-href="http://dynarch.com" title="http://dynarch.com/" target="_blank">dynarch.com</a></p>
-
-</div>
-
-<div id="tab-area-1">
-<h1>Thank you</h1>
-
-  <p>
-  <a href="http://dynarch.com" target="_blank">dynarch.com</a> would like to thank the following
-  companies/persons for their <em>donations</em> to support development of HTMLArea (listed alphabetically):
-  </p>
-
-  <ul>
-    <li><a href="http://www.neomedia.ro">Neomedia</a> (Romania)</li>
-    <li><a href="http://www.os3.it" target="_blank">OS3</a> (Italy)</li>
-    <li><a href="http://www.softwerk.net">SoftWerk</a> (Italy)</li>
-  </ul>
-
-  <p>Also many thanks to all people at InteractiveTools.com
-  <a href="http://www.interactivetools.com/forum/gforum.cgi?forum=14;">HTMLArea forums</a> for
-  contributing translations, feedback, bug reports and fixes.</p>
-
-  <p>
-  Last but not least, this project wouldn't have existed without
-  <a href="http://interactivetools.com" target="_blank">InteractiveTools.com</a>.
-  </p>
-
-</div>
-
-<div id="tab-area-2">
-<h1>htmlArea License (based on BSD license)</h1>
-
-<p style="text-align: center">© 2002-2004, interactivetools.com, inc.<br />
-  © 2003-2004 dynarch.com LLC<br />
-  All rights reserved.</p>
-
-<p>
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-</p>
-
-<ol>
-<li>
-Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer.
-</li>
-
-<li>
-Redistributions in binary form must reproduce the above copyright notice,
-this list of conditions and the following disclaimer in the documentation
-and/or other materials provided with the distribution.
-</li>
-
-<li>
-Neither the name of interactivetools.com, inc. nor the names of its
-contributors may be used to endorse or promote products derived from this
-software without specific prior written permission.
-</li>
-</ol>
-
-<p>
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
-LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGE.
-</p>
-
-</div>
-
-<div id="tab-area-3">
-<h1>Plugins</h1>
-<div id="plugins">
-</div>
-</div>
-
-</div></div>
-
-
-</tr></td>
-<tr style="height: 1em"><td id="tdfooter">
-
-
-<div class="buttons">
-<div id="tabbar"
-><div class="tab tab-current"
->About</div><div class="tab"
->Thanks</div><div class="tab"
->License</div><div class="tab"
->Plugins</div></div>
-<button type="button" onclick="__dlg_close(null);">I agree it's cool</button>
-</div>
-
-</td></tr></table>
-
-</body></html>
-
-
+<!--
+
+(c) dynarch.com, 2003-2005
+Author: Mihai Bazon, http://dynarch.com/mishoo
+Distributed as part of HTMLArea 3.0
+
+"You are not expected to understand this...  I don't neither."
+
+                      (from The Linux Kernel Source Code,
+                            ./arch/x86_64/ia32/ptrace.c:90)
+
+;-)
+
+-->
+
+<html style="height: 100%">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+<title>About HTMLArea</title>
+<script type="text/javascript" src="popup.js"></script>
+<script type="text/javascript">
+window.resizeTo(450, 250);
+var TABS = [];
+var CURRENT_TAB = 0;
+var CONTENT_HEIGHT_DIFF = 0;
+var CONTENT_WIDTH_DIFF = 0;
+function selectTab(idx) {
+  var ct = TABS[CURRENT_TAB];
+  ct.className = ct.className.replace(/\s*tab-current\s*/, ' ');
+  ct = TABS[CURRENT_TAB = idx];
+  ct.className += ' tab-current';
+  for (var i = TABS.length; --i >= 0;) {
+    var area = document.getElementById("tab-area-" + i);
+    if (CURRENT_TAB == i) {
+      area.style.display = "block";
+    } else {
+      area.style.display = "none";
+    }
+  }
+  document.body.style.visibility = "hidden";
+  document.body.style.visibility = "visible";
+  document.cookie = "HTMLAREA-ABOUT-TAB=" + idx;
+}
+var editor = null;
+function initDocument() {
+  editor = window.dialogArguments;
+  HTMLArea = window.opener.HTMLArea;
+
+  var plugins = document.getElementById("plugins");
+  var j = 0;
+  var html = "<table width='99%' cellpadding='0' style='margin-top: 1em; collapse-borders: collapse; border: 1px solid #8b8;'>" +
+	  "<thead><tr>" +
+	  "<td>Name</td>" +
+	  "<td>Developer</td>" +
+	  "<td>Sponsored by</td>" +
+	  "<td>License<sup>*</sup></td>" +
+	  "</tr></thead><tbody>";
+  for (var i in editor.plugins) {
+    var info = editor.plugins[i];
+    html += "<tr><td>" + info.name + " v" + info.version + "</td>" +
+            "<td><a href='" + info.developer_url + "' target='_blank' title='Visit developer website'>" +
+	    info.developer + "</a></td>" +
+	    "<td><a href='" + info.sponsor_url + "' target='_blank' title='Visit sponsor website'>" +
+	    info.sponsor + "</a></td>" +
+	    "<td>" + info.license + "</td></tr>";
+    ++j;
+  }
+
+  if (j) {
+          html += "</tbody></table>" +
+		  "<p><sup>*</sup> License \"htmlArea\" means that the plugin is distributed under the same terms " +
+		  "as HTMLArea itself.  Such plugins are likely to be those included in the official " +
+		  "HTMLArea distribution</p>";
+	  plugins.innerHTML = "<p>The following plugins have been loaded.</p>" + html;
+  } else {
+	  plugins.innerHTML = "<p>No plugins have been loaded</p>";
+  }
+
+  plugins.innerHTML += "<p>User agent reports:<br/>" + navigator.userAgent + "</p>";
+
+  var content = document.getElementById("content");
+  if (window.innerHeight) {
+    CONTENT_HEIGHT_DIFF = window.innerHeight - 250;
+    CONTENT_WIDTH_DIFF = window.innerWidth - content.offsetWidth;
+  } else {
+    CONTENT_HEIGHT_DIFF = document.body.offsetHeight - 250;
+    CONTENT_WIDTH_DIFF = document.body.offsetWidth - 400;
+  }
+  window.onresize();
+  var bar = document.getElementById("tabbar");
+  j = 0;
+  for (var i = bar.firstChild; i; i = i.nextSibling) {
+    TABS.push(i);
+    i.__msh_tab = j;
+    i.onmousedown = function(ev) { selectTab(this.__msh_tab); HTMLArea._stopEvent(ev || window.event); };
+    var area = document.getElementById("tab-area-" + j);
+    if (/tab-current/.test(i.className)) {
+      CURRENT_TAB = j;
+      area.style.display = "block";
+    } else {
+      area.style.display = "none";
+    }
+    ++j;
+  }
+  if (document.cookie.match(/HTMLAREA-ABOUT-TAB=([0-9]+)/))
+    selectTab(RegExp.$1);
+}
+window.onresize = function() {
+  var content = document.getElementById("content");
+  if (window.innerHeight) {
+    content.style.height = (window.innerHeight - CONTENT_HEIGHT_DIFF) + "px";
+    content.style.width = (window.innerWidth - CONTENT_WIDTH_DIFF) + "px";
+  } else {
+    content.style.height = (document.body.offsetHeight - CONTENT_HEIGHT_DIFF) + "px";
+    //content.style.width = (document.body.offsetWidth - CONTENT_WIDTH_DIFF) + "px";
+  }
+}
+</script>
+<style>
+  html,body,textarea,table { font-family: tahoma,verdana,arial; font-size: 11px;
+padding: 0px; margin: 0px; }
+  tt { font-size: 120%; }
+  body { padding: 0px; background: #cea; color: 000; }
+  a:link, a:visited { color: #00f; }
+  a:hover { color: #f00; }
+  a:active { color: #f80; }
+  button { font: 11px tahoma,verdana,sans-serif; background-color: #cea;
+      border-width: 1px; }
+
+  p { margin: 0.5em 0px; }
+
+  h1 { font: bold 130% georgia,"times new roman",serif; margin: 0px; border-bottom: 1px solid #6a6; }
+  h2 { font: bold 110% georgia,"times new roman",serif; margin: 0.7em 0px; }
+
+  thead {
+    font-weight: bold;
+    background-color: #dfb;
+  }
+
+  .logo, .logo-hover {
+    white-space: nowrap;
+    background-color: #8f4; color: #040; padding: 3px; border-bottom: 1px solid #555;
+    height: 5em;
+  }
+  .logo .brand, .logo-hover .brand {
+    margin-left: 0.5em; margin-right: 0.5em; padding-bottom: 0.1em;
+    font-family: impact,'arial black',arial,sans-serif; font-size: 28px;
+    border-bottom: 1px solid #595; text-align: center;
+    cursor: pointer;
+  }
+  .logo-hover {
+    background-color: #fff;
+  }
+  .logo-hover .brand {
+    color: #800;
+    border-color: #04f;
+  }
+  .logo .letter, .logo-hover .letter { position: relative; font-family: monospace; }
+  .logo .letter1 { top: 0.1em; }
+  .logo .letter2 { top: 0.05em; }
+  .logo .letter3 { top: -0.05em; }
+  .logo .letter4 { top: -0.1em; }
+
+  .logo-hover .letter1 { top: -0.1em; }
+  .logo-hover .letter2 { top: -0.05em; }
+  .logo-hover .letter3 { top: 0.05em; }
+  .logo-hover .letter4 { top: 0.1em; }
+  .logo .version, .logo-hover .version { font-family: georgia,"times new roman",serif; }
+  .logo .release {
+    font-size: 90%; margin-bottom: 1em;
+    text-align: center; color: #484;
+  }
+  .logo .visit { display: none; }
+  .logo-hover .release { display: none; }
+  .logo-hover .visit {
+    font-size: 90%; margin-bottom: 1em;
+    text-align: center; color: #448;
+  }
+  .buttons {
+    text-align: right; padding: 3px; background-color: #8f4;
+    border-top: 1px solid #555;
+  }
+  #tabbar {
+    position: relative;
+    left: 10px;
+  }
+  .tab {
+    color: #454;
+    cursor: pointer;
+    margin-left: -5px;
+    float: left; position: relative;
+    border: 1px solid #555;
+    top: -3px; left: -2px;
+    padding: 2px 10px 3px 10px;
+    border-top: none; background-color: #9b7;
+    -moz-border-radius: 0px 0px 4px 4px;
+    z-index: 0;
+  }
+  .tab-current {
+    color: #000;
+    top: -4px;
+    background-color: #cea;
+    padding: 3px 10px 4px 10px;
+    z-index: 10;
+  }
+  table.sponsors { border-top: 1px solid #aca; }
+  table.sponsors td {
+    border-bottom: 1px solid #aca; vertical-align: top;
+  }
+  table.sponsors tr td { padding: 2px 0px; }
+  table.sponsors tr td.sponsor { text-align: right; padding-right: 0.3em; white-space: nowrap; }
+  li, ol, ul { margin-top: 0px; margin-bottom: 0px; }
+</style></head>
+<body onload="__dlg_init(); initDocument();"
+><table cellspacing="0" cellpadding="0" style="border-collapse: collapse;
+      width: 100%; height: 100%;">
+
+<tr style="height: 1em"><td id="tdheader">
+
+<div class="logo">
+<div class="brand"
+onmouseover="this.parentNode.className='logo-hover';"
+onmouseout="this.parentNode.className='logo';"
+onclick="window.open('http://www.htmlarea.com/');">
+<span class="letter letter1">&lt;H</span><span
+class="letter letter2">T</span><span
+class="letter letter3">M</span><span
+class="letter letter4">L</span>Area <span class="letter">/&gt;</span>
+<span class="version"></span></div>
+<div class="release">Compiled on Jan , 2005 23:43 GMT</div>
+<div class="visit">Go to http://www.htmlarea.com/ [latest milestone release]</div>
+</div>
+
+</td></tr>
+<tr><td id="tdcontent" style="padding: 0.5em;">
+
+<div style="overflow: auto; height: 250px;" id="content">
+<div id="tab-areas">
+
+<div id="tab-area-0">
+
+  <h1>HTMLArea</h1>
+
+  <p>A free WYSIWYG editor replacement for <tt>&lt;textarea&gt;</tt> fields.<br />
+  For Mozilla 1.3+ (any platform) or Internet Explorer 5.5+ (Windows).
+  </p>
+
+  <p style="text-align: center"
+  >© 2002-2004 <a href="http://interactivetools.com" target="_blank">interactivetools.com</a>, inc.<br />
+  © 2003-2005 <a href="http://dynarch.com" target="_blank">dynarch.com</a> LLC.<br />
+  All Rights Reserved.</p>
+
+  <h2>Project resources</h2>
+
+  <ul>
+  <li><a href="http://sourceforge.net/projects/itools-htmlarea/" target="_blank"
+  >Project page</a> (@ sourceforge.net)</li>
+  <li><a href="http://sourceforge.net/cvs/?group_id=69750" target="_blank"
+  >Anonymous CVS access</a> (@ sourceforge.net)</li>
+  <li><a href="http://sourceforge.net/tracker/?atid=525656&group_id=69750&func=browse" target="_blank"
+  >Bug system</a> (@ sourceforge.net)</li>
+  <li><a href="http://www.htmlarea.com/forum/" target="_blank"
+  >Forum</a> (@ interactivetools.com)</li>
+  <li><a href="http://www.htmlarea.com/" target="_blank"
+  >Last public release</a></li>
+  </ul>
+
+  <p>
+  For download section please see the <a href="http://sourceforge.net/projects/itools-htmlarea/" target="_blank"
+  >project page @ SourceForge</a>.
+  </p>
+
+</div>
+
+<div id="tab-area-1">
+<h1>Thank you</h1>
+
+  <p>
+  <a href="http://dynarch.com" target="_blank">dynarch.com</a> would like to thank the following
+  companies/persons for their <em>donations</em> to support development of HTMLArea (listed alphabetically):
+  </p>
+
+  <ul>
+    <li><a href="http://www.computerlove.co.uk" target="_blank">Code Computer Love Ltd.</a> (UK)</li>
+    <li><a href="http://www.neomedia.ro" target="_blank">Neomedia</a> (Romania)</li>
+    <li><a href="http://www.os3.it" target="_blank">OS3</a> (Italy)</li>
+    <li><a href="http://www.softwerk.net" target="_blank">SoftWerk</a> (Italy)</li>
+  </ul>
+
+  <p>Also many thanks to all people at InteractiveTools.com
+  <a href="http://www.htmlarea.com/forum/">HTMLArea forums</a> for
+  contributing translations, feedback, bug reports and fixes.</p>
+
+  <p>
+  Last but not least, this project wouldn't have existed without
+  <a href="http://interactivetools.com" target="_blank">InteractiveTools.com</a>.
+  </p>
+
+</div>
+
+<div id="tab-area-2">
+<h1>htmlArea License (based on BSD license)</h1>
+
+<p style="text-align: center">© 2002-2004, interactivetools.com, inc.<br />
+  © 2003-2004 dynarch.com LLC<br />
+  All rights reserved.</p>
+
+<p>
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+</p>
+
+<ol>
+<li>
+Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+</li>
+
+<li>
+Redistributions in binary form must reproduce the above copyright notice,
+this list of conditions and the following disclaimer in the documentation
+and/or other materials provided with the distribution.
+</li>
+
+<li>
+Neither the name of interactivetools.com, inc. nor the names of its
+contributors may be used to endorse or promote products derived from this
+software without specific prior written permission.
+</li>
+</ol>
+
+<p>
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
+</p>
+
+</div>
+
+<div id="tab-area-3">
+<h1>Plugins</h1>
+<div id="plugins">
+</div>
+</div>
+
+</div></div>
+
+
+</tr></td>
+<tr style="height: 1em"><td id="tdfooter">
+
+
+<div class="buttons">
+<div id="tabbar"
+><div class="tab tab-current"
+>About</div><div class="tab"
+>Thanks</div><div class="tab"
+>License</div><div class="tab"
+>Plugins</div></div>
+<button type="button" onclick="__dlg_close(null);">I agree it's cool</button>
+</div>
+
+</td></tr></table>
+
+</body></html>
+
+

Modified: plog/trunk/js/htmlarea/popups/blank.html
===================================================================
--- plog/trunk/js/htmlarea/popups/blank.html	2005-02-05 13:57:52 UTC (rev 948)
+++ plog/trunk/js/htmlarea/popups/blank.html	2005-02-05 15:29:38 UTC (rev 949)
@@ -1,2 +1,2 @@
-<html>
+<html>
 </html>
\ No newline at end of file

Modified: plog/trunk/js/htmlarea/popups/custom2.html
===================================================================
--- plog/trunk/js/htmlarea/popups/custom2.html	2005-02-05 13:57:52 UTC (rev 948)
+++ plog/trunk/js/htmlarea/popups/custom2.html	2005-02-05 15:29:38 UTC (rev 949)
@@ -1,35 +1,35 @@
-<html style="width:300px; Height: 60px;">
- <head>
-  <title>Select Phrase</title>
-<script language="javascript">
-
-var myTitle = window.dialogArguments;
-document.title = myTitle;
-
-
-function returnSelected() {
-  var idx  = document.all.textPulldown.selectedIndex;
-  var text = document.all.textPulldown[idx].text;
-
-  window.returnValue = text;          // set return value
-  window.close();                     // close dialog
-}
-
-</script>
-</head>
-<body bgcolor="#FFFFFF" topmargin=15 leftmargin=0>
-
-<form method=get onSubmit="Set(document.all.ColorHex.value); return false;">
-<div align=center>
-
-<select name="textPulldown">
-<option>The quick brown</option>
-<option>fox jumps over</option>
-<option>the lazy dog.</option>
-</select>
-
-<input type="button" value=" Go " onClick="returnSelected()">
-
-</div>
-</form>
+<html style="width:300px; Height: 60px;">
+ <head>
+  <title>Select Phrase</title>
+<script language="javascript">
+
+var myTitle = window.dialogArguments;
+document.title = myTitle;
+
+
+function returnSelected() {
+  var idx  = document.all.textPulldown.selectedIndex;
+  var text = document.all.textPulldown[idx].text;
+
+  window.returnValue = text;          // set return value
+  window.close();                     // close dialog
+}
+
+</script>
+</head>
+<body bgcolor="#FFFFFF" topmargin=15 leftmargin=0>
+
+<form method=get onSubmit="Set(document.all.ColorHex.value); return false;">
+<div align=center>
+
+<select name="textPulldown">
+<option>The quick brown</option>
+<option>fox jumps over</option>
+<option>the lazy dog.</option>
+</select>
+
+<input type="button" value=" Go " onClick="returnSelected()">
+
+</div>
+</form>
 </body></html>
\ No newline at end of file

Modified: plog/trunk/js/htmlarea/popups/editor_help.html
===================================================================
--- plog/trunk/js/htmlarea/popups/editor_help.html	2005-02-05 13:57:52 UTC (rev 948)
+++ plog/trunk/js/htmlarea/popups/editor_help.html	2005-02-05 15:29:38 UTC (rev 949)
@@ -1,16 +1,16 @@
-<html>
- <head>
-  <title>Editor Help</title>
-  <style>
-    body, td, p, div { font-family: arial; font-size: x-small; }
-  </style>
- </head>
-<body>
-
-<h2>Editor Help<hr></h2>
-
-Todo...
-
-
-</body>
+<html>
+ <head>
+  <title>Editor Help</title>
+  <style>
+    body, td, p, div { font-family: arial; font-size: x-small; }
+  </style>
+ </head>
+<body>
+
+<h2>Editor Help<hr></h2>
+
+Todo...
+
+
+</body>
 </html>
\ No newline at end of file

Modified: plog/trunk/js/htmlarea/popups/fullscreen.html
===================================================================
--- plog/trunk/js/htmlarea/popups/fullscreen.html	2005-02-05 13:57:52 UTC (rev 948)
+++ plog/trunk/js/htmlarea/popups/fullscreen.html	2005-02-05 15:29:38 UTC (rev 949)
@@ -1,133 +1,139 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
-<html>
-  <head>
-    <title>Fullscreen HTMLArea</title>
-    <script type="text/javascript">
-      _editor_url = window.opener._editor_url;
-      _editor_lang = window.opener._editor_lang;
-      var BASE = window.opener.document.baseURI || window.opener.document.URL;
-      var head = document.getElementsByTagName("head")[0];
-      var base = document.createElement("base");
-      base.href = BASE;
-      head.appendChild(base);
-    </script>
-
-    <script type="text/javascript" src="../htmlarea.js"></script>
-
-    <script type="text/javascript">
-	// load HTMLArea scripts that are present in the opener frame
-	var scripts = window.opener.HTMLArea._scripts;
-	for (var i = 4; i < scripts.length; ++i) {
-           document.write("<scr" + "ipt type='text/javascript' src='" + scripts[i] + "'></scr" + "ipt>");
-        }
-    </script>
-
-    <!-- browser takes a coffee break here -->
-    <script type="text/javascript">
-var parent_object  = null;
-var editor	   = null;	// to be initialized later [ function init() ]
-
-/* ---------------------------------------------------------------------- *\
-   Function    : 
-   Description : 
-\* ---------------------------------------------------------------------- */
-
-function _CloseOnEsc(ev) {
-	ev || (ev = window.event);
-	if (ev.keyCode == 27) {
-		// update_parent();
-		window.close();
-		return;
-	}
-}
-
-/* ---------------------------------------------------------------------- *\
-   Function    : resize_editor
-   Description : resize the editor when the user resizes the popup
-\* ---------------------------------------------------------------------- */
-
-function resize_editor() {  // resize editor to fix window
-	var newHeight;
-	if (document.all) {
-		// IE
-		newHeight = document.body.offsetHeight - editor._toolbar.offsetHeight;
-		if (newHeight < 0) { newHeight = 0; }
-	} else {
-		// Gecko
-		newHeight = window.innerHeight - editor._toolbar.offsetHeight;
-	}
-	if (editor.config.statusBar) {
-		newHeight -= editor._statusBar.offsetHeight;
-	}
-	editor._textArea.style.height = editor._iframe.style.height = newHeight + "px";
-}
-
-/* ---------------------------------------------------------------------- *\
-   Function    : init
-   Description : run this code on page load
-\* ---------------------------------------------------------------------- */
-
-function init() {
-	parent_object	   = opener.HTMLArea._object;
-	var config	   = HTMLArea.cloneObject( parent_object.config );
-	config.width	   = "100%";
-	config.height	   = "auto";
-
-	// change maximize button to minimize button
-	config.btnList["popupeditor"] = [ 'Minimize Editor', _editor_url + 'images/fullscreen_minimize.gif', true,
-					  function() { window.close(); } ];
-
-	// generate editor and resize it
-	editor = new HTMLArea("editor", config);
-
-	// register the plugins, if any
-	for (var i in parent_object.plugins) {
-		var plugin = parent_object.plugins[i];
-		editor.registerPlugin2(plugin.name, plugin.args);
-	}
-	// and restore the original toolbar
-        config.toolbar = parent_object.config.toolbar;
-	editor.generate();
-	editor._iframe.style.width = "100%";
-	editor._textArea.style.width = "100%";
-	resize_editor();
-
-	editor.doctype = parent_object.doctype;
-
-	// set child window contents and event handlers, after a small delay
-	setTimeout(function() {
-			   editor.setHTML(parent_object.getInnerHTML());
-
-			   // switch mode if needed
-			   if (parent_object._mode == "textmode") { editor.setMode("textmode"); }
-
-			   // continuously update parent editor window
-			   setInterval(update_parent, 500);
-
-			   // setup event handlers
-			   document.body.onkeypress = _CloseOnEsc;
-			   editor._doc.body.onkeypress = _CloseOnEsc;
-			   editor._textArea.onkeypress = _CloseOnEsc;
-			   window.onresize = resize_editor;
-		   }, 333);			 // give it some time to meet the new frame
-}
-
-/* ---------------------------------------------------------------------- *\
-   Function    : update_parent
-   Description : update parent window editor field with contents from child window
-   \* ---------------------------------------------------------------------- */
-
-function update_parent() {
-	// use the fast version
-	parent_object.setHTML(editor.getInnerHTML());
-}
-
-    </script>
-    <style type="text/css"> html, body { height: 100%; margin: 0px; border: 0px; background-color: buttonface; } </style>
-  </head>
-  <body scroll="no" onload="setTimeout(function(){init();}, 500)" onunload="update_parent()">
-    <form style="margin: 0px; border: 1px solid; border-color: threedshadow threedhighlight threedhighlight threedshadow;">
-      <textarea name="editor" id="editor" style="width:100%; height:300px">&nbsp;</textarea>
-    </form>
-  </body>
-</html>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<html>
+  <head>
+    <title>Fullscreen HTMLArea</title>
+    <script type="text/javascript">
+      _editor_url = window.opener._editor_url || '../';
+      _editor_lang = window.opener._editor_lang;
+      _editor_css = window.opener._editor_css;
+      var BASE = window.opener.document.baseURI || window.opener.document.URL;
+      var head = document.getElementsByTagName("head")[0];
+      var base = document.createElement("base");
+      base.href = BASE;
+      head.appendChild(base);
+    </script>
+
+    <script type="text/javascript">
+        document.write('<scr' + 'ipt type="text/javascript" src="' + _editor_url + 'htmlarea.js"></scr' + 'ipt>');
+    </script>
+    <script type="text/javascript">
+	// load HTMLArea scripts that are present in the opener frame
+	var scripts = window.opener.HTMLArea._scripts;
+	for (var i = 3; i < scripts.length; ++i) {
+           //document.write("<scr" + "ipt type='text/javascript' src='" + scripts[i] + "'></scr" + "ipt>");
+           HTMLArea.loadScript(scripts[i]);
+        }
+    </script>
+
+    <!-- browser takes a coffee break here -->
+    <script type="text/javascript">
+var parent_object  = null;
+var editor	   = null;	// to be initialized later [ function init() ]
+
+/* ---------------------------------------------------------------------- *\
+   Function    : 
+   Description : 
+\* ---------------------------------------------------------------------- */
+
+function _CloseOnEsc(ev) {
+	ev || (ev = window.event) || (ev = editor._iframe.contentWindow.event);
+	if (ev.keyCode == 27) {
+		// update_parent();
+		window.close();
+		return;
+	}
+}
+
+/* ---------------------------------------------------------------------- *\
+   Function    : resize_editor
+   Description : resize the editor when the user resizes the popup
+\* ---------------------------------------------------------------------- */
+
+function resize_editor() {  // resize editor to fix window
+	var newHeight;
+	if (document.all) {
+		// IE
+		newHeight = document.body.offsetHeight - editor._toolbar.offsetHeight;
+		if (newHeight < 0) { newHeight = 0; }
+	} else {
+		// Gecko
+		newHeight = window.innerHeight - editor._toolbar.offsetHeight;
+	}
+	if (editor.config.statusBar) {
+		newHeight -= editor._statusBar.offsetHeight;
+	}
+	editor._textArea.style.height = editor._iframe.style.height = newHeight - (HTMLArea.is_gecko ? 8 : 0) + "px";
+}
+
+/* ---------------------------------------------------------------------- *\
+   Function    : init
+   Description : run this code on page load
+\* ---------------------------------------------------------------------- */
+
+function init() {
+	parent_object	   = opener.HTMLArea._object;
+	var config	   = HTMLArea.cloneObject( parent_object.config );
+	config.width	   = "100%";
+	config.height	   = "auto";
+
+	// change maximize button to minimize button
+	config.btnList["popupeditor"] = [ 'Minimize Editor', _editor_url + 'images/fullscreen_minimize.gif', true,
+					  function() { window.close(); } ];
+
+	// generate editor and resize it
+	editor = new HTMLArea("editor", config);
+
+	// register the plugins, if any
+	for (var i in parent_object.plugins) {
+		var plugin = parent_object.plugins[i];
+		try {
+			eval(plugin.name);
+			editor.registerPlugin2(plugin.name, plugin.args);
+		} catch(e) {};
+	}
+	// and restore the original toolbar
+        config.toolbar = parent_object.config.toolbar;
+	editor.generate();
+	editor._iframe.style.width = "100%";
+	editor._textArea.style.width = "100%";
+	resize_editor();
+
+	editor.doctype = parent_object.doctype;
+
+	// set child window contents and event handlers, after a small delay
+	setTimeout(function() {
+			   editor.setHTML(parent_object.getInnerHTML());
+
+			   // switch mode if needed
+			   if (parent_object._mode == "textmode") { editor.setMode("textmode"); }
+
+			   // continuously update parent editor window
+			   setInterval(update_parent, 500);
+
+			   // setup event handlers
+			   document.body.onkeypress = _CloseOnEsc;
+			   editor._doc.body.onkeypress = _CloseOnEsc;
+			   editor._textArea.onkeypress = _CloseOnEsc;
+			   window.onresize = resize_editor;
+		   }, 333);			 // give it some time to meet the new frame
+}
+
+/* ---------------------------------------------------------------------- *\
+   Function    : update_parent
+   Description : update parent window editor field with contents from child window
+   \* ---------------------------------------------------------------------- */
+
+function update_parent() {
+	// use the fast version
+	parent_object.setHTML(editor.getInnerHTML());
+}
+
+    </script>
+    <style type="text/css"> html, body { height: 100%; margin: 0px; border: 0px; background-color: buttonface; } </style>
+  </head>
+  <body scroll="no" onload="HTMLArea.onload = init; HTMLArea.init();" onunload="update_parent()">
+    <form style="margin: 0px; border: 1px solid; border-color: threedshadow threedhighlight threedhighlight threedshadow;">
+      <textarea name="editor" id="editor" style="width:100%; height:300px">&nbsp;</textarea>
+    </form>
+  </body>
+</html>

Modified: plog/trunk/js/htmlarea/popups/insert_image.html
===================================================================
--- plog/trunk/js/htmlarea/popups/insert_image.html	2005-02-05 13:57:52 UTC (rev 948)
+++ plog/trunk/js/htmlarea/popups/insert_image.html	2005-02-05 15:29:38 UTC (rev 949)
@@ -1,191 +1,191 @@
-<html>
-
-<head>
-  <title>Insert Image</title>
-
-<script type="text/javascript" src="popup.js"></script>
-
-<script type="text/javascript">
-
-window.resizeTo(400, 100);
-
-function Init() {
-  __dlg_init();
-  var param = window.dialogArguments;
-  if (param) {
-      document.getElementById("f_url").value = param["f_url"];
-      document.getElementById("f_alt").value = param["f_alt"];
-      document.getElementById("f_border").value = param["f_border"];
-      document.getElementById("f_align").value = param["f_align"];
-      document.getElementById("f_vert").value = param["f_vert"];
-      document.getElementById("f_horiz").value = param["f_horiz"];
-      window.ipreview.location.replace(param.f_url);
-  }
-  document.getElementById("f_url").focus();
-};
-
-function onOK() {
-  var required = {
-    "f_url": "You must enter the URL"
-  };
-  for (var i in required) {
-    var el = document.getElementById(i);
-    if (!el.value) {
-      alert(required[i]);
-      el.focus();
-      return false;
-    }
-  }
-  // pass data back to the calling window
-  var fields = ["f_url", "f_alt", "f_align", "f_border",
-                "f_horiz", "f_vert"];
-  var param = new Object();
-  for (var i in fields) {
-    var id = fields[i];
-    var el = document.getElementById(id);
-    param[id] = el.value;
-  }
-  __dlg_close(param);
-  return false;
-};
-
-function onCancel() {
-  __dlg_close(null);
-  return false;
-};
-
-function onPreview() {
-  var f_url = document.getElementById("f_url");
-  var url = f_url.value;
-  if (!url) {
-    alert("You have to enter an URL first");
-    f_url.focus();
-    return false;
-  }
-  window.ipreview.location.replace(url);
-  return false;
-};
-</script>
-
-<style type="text/css">
-html, body {
-  background: ButtonFace;
-  color: ButtonText;
-  font: 11px Tahoma,Verdana,sans-serif;
-  margin: 0px;
-  padding: 0px;
-}
-body { padding: 5px; }
-table {
-  font: 11px Tahoma,Verdana,sans-serif;
-}
-form p {
-  margin-top: 5px;
-  margin-bottom: 5px;
-}
-.fl { width: 9em; float: left; padding: 2px 5px; text-align: right; }
-.fr { width: 6em; float: left; padding: 2px 5px; text-align: right; }
-fieldset { padding: 0px 10px 5px 5px; }
-select, input, button { font: 11px Tahoma,Verdana,sans-serif; }
-button { width: 70px; }
-.space { padding: 2px; }
-
-.title { background: #ddf; color: #000; font-weight: bold; font-size: 120%; padding: 3px 10px; margin-bottom: 10px;
-border-bottom: 1px solid black; letter-spacing: 2px;
-}
-form { padding: 0px; margin: 0px; }
-</style>
-
-</head>
-
-<body onload="Init()">
-
-<div class="title">Insert Image</div>
-<!--- new stuff --->
-<form action="" method="get">
-<table border="0" width="100%" style="padding: 0px; margin: 0px">
-  <tbody>
-
-  <tr>
-    <td style="width: 7em; text-align: right">Image URL:</td>
-    <td><input type="text" name="url" id="f_url" style="width:75%"
-      title="Enter the image URL here" />
-      <button name="preview" onclick="return onPreview();"
-      title="Preview the image in a new window">Preview</button>
-    </td>
-  </tr>
-  <tr>
-    <td style="width: 7em; text-align: right">Alternate text:</td>
-    <td><input type="text" name="alt" id="f_alt" style="width:100%"
-      title="For browsers that don't support images" /></td>
-  </tr>
-
-  </tbody>
-</table>
-
-<p />
-
-<fieldset style="float: left; margin-left: 5px;">
-<legend>Layout</legend>
-
-<div class="space"></div>
-
-<div class="fl">Alignment:</div>
-<select size="1" name="align" id="f_align"
-  title="Positioning of this image">
-  <option value=""                             >Not set</option>
-  <option value="left"                         >Left</option>
-  <option value="right"                        >Right</option>
-  <option value="texttop"                      >Texttop</option>
-  <option value="absmiddle"                    >Absmiddle</option>
-  <option value="baseline" selected="1"        >Baseline</option>
-  <option value="absbottom"                    >Absbottom</option>
-  <option value="bottom"                       >Bottom</option>
-  <option value="middle"                       >Middle</option>
-  <option value="top"                          >Top</option>
-</select>
-
-<p />
-
-<div class="fl">Border thickness:</div>
-<input type="text" name="border" id="f_border" size="5"
-title="Leave empty for no border" />
-
-<div class="space"></div>
-
-</fieldset>
-
-<fieldset style="float:right; margin-right: 5px;">
-<legend>Spacing</legend>
-
-<div class="space"></div>
-
-<div class="fr">Horizontal:</div>
-<input type="text" name="horiz" id="f_horiz" size="5"
-title="Horizontal padding" />
-
-<p />
-
-<div class="fr">Vertical:</div>
-<input type="text" name="vert" id="f_vert" size="5"
-title="Vertical padding" />
-
-<div class="space"></div>
-
-</fieldset>
-<br clear="all" />
-<table width="100%" style="margin-bottom: 0.2em">
- <tr>
-  <td valign="bottom">
-    Image Preview:<br />
-    <iframe name="ipreview" id="ipreview" frameborder="0" style="border : 1px solid gray;" height="200" width="300" src=""></iframe>
-  </td>
-  <td valign="bottom" style="text-align: right">
-    <button type="button" name="ok" onclick="return onOK();">OK</button><br>
-    <button type="button" name="cancel" onclick="return onCancel();">Cancel</button>
-  </td>
- </tr>
-</table>
-</form>
-</body>
-</html>
+<html>
+
+<head>
+  <title>Insert Image</title>
+
+<script type="text/javascript" src="popup.js"></script>
+
+<script type="text/javascript">
+
+window.resizeTo(400, 100);
+
+function Init() {
+  __dlg_init();
+  var param = window.dialogArguments;
+  if (param) {
+      document.getElementById("f_url").value = param["f_url"];
+      document.getElementById("f_alt").value = param["f_alt"];
+      document.getElementById("f_border").value = param["f_border"];
+      document.getElementById("f_align").value = param["f_align"];
+      document.getElementById("f_vert").value = param["f_vert"];
+      document.getElementById("f_horiz").value = param["f_horiz"];
+      window.ipreview.location.replace(param.f_url);
+  }
+  document.getElementById("f_url").focus();
+};
+
+function onOK() {
+  var required = {
+    "f_url": "You must enter the URL"
+  };
+  for (var i in required) {
+    var el = document.getElementById(i);
+    if (!el.value) {
+      alert(required[i]);
+      el.focus();
+      return false;
+    }
+  }
+  // pass data back to the calling window
+  var fields = ["f_url", "f_alt", "f_align", "f_border",
+                "f_horiz", "f_vert"];
+  var param = new Object();
+  for (var i in fields) {
+    var id = fields[i];
+    var el = document.getElementById(id);
+    param[id] = el.value;
+  }
+  __dlg_close(param);
+  return false;
+};
+
+function onCancel() {
+  __dlg_close(null);
+  return false;
+};
+
+function onPreview() {
+  var f_url = document.getElementById("f_url");
+  var url = f_url.value;
+  if (!url) {
+    alert("You have to enter an URL first");
+    f_url.focus();
+    return false;
+  }
+  window.ipreview.location.replace(url);
+  return false;
+};
+</script>
+
+<style type="text/css">
+html, body {
+  background: ButtonFace;
+  color: ButtonText;
+  font: 11px Tahoma,Verdana,sans-serif;
+  margin: 0px;
+  padding: 0px;
+}
+body { padding: 5px; }
+table {
+  font: 11px Tahoma,Verdana,sans-serif;
+}
+form p {
+  margin-top: 5px;
+  margin-bottom: 5px;
+}
+.fl { width: 9em; float: left; padding: 2px 5px; text-align: right; }
+.fr { width: 6em; float: left; padding: 2px 5px; text-align: right; }
+fieldset { padding: 0px 10px 5px 5px; }
+select, input, button { font: 11px Tahoma,Verdana,sans-serif; }
+button { width: 70px; }
+.space { padding: 2px; }
+
+.title { background: #ddf; color: #000; font-weight: bold; font-size: 120%; padding: 3px 10px; margin-bottom: 10px;
+border-bottom: 1px solid black; letter-spacing: 2px;
+}
+form { padding: 0px; margin: 0px; }
+</style>
+
+</head>
+
+<body onload="Init()">
+
+<div class="title">Insert Image</div>
+<!--- new stuff --->
+<form action="" method="get">
+<table border="0" width="100%" style="padding: 0px; margin: 0px">
+  <tbody>
+
+  <tr>
+    <td style="width: 7em; text-align: right">Image URL:</td>
+    <td><input type="text" name="url" id="f_url" style="width:75%"
+      title="Enter the image URL here" />
+      <button name="preview" onclick="return onPreview();"
+      title="Preview the image in a new window">Preview</button>
+    </td>
+  </tr>
+  <tr>
+    <td style="width: 7em; text-align: right">Alternate text:</td>
+    <td><input type="text" name="alt" id="f_alt" style="width:100%"
+      title="For browsers that don't support images" /></td>
+  </tr>
+
+  </tbody>
+</table>
+
+<p />
+
+<fieldset style="float: left; margin-left: 5px;">
+<legend>Layout</legend>
+
+<div class="space"></div>
+
+<div class="fl">Alignment:</div>
+<select size="1" name="align" id="f_align"
+  title="Positioning of this image">
+  <option value=""                             >Not set</option>
+  <option value="left"                         >Left</option>
+  <option value="right"                        >Right</option>
+  <option value="texttop"                      >Texttop</option>
+  <option value="absmiddle"                    >Absmiddle</option>
+  <option value="baseline" selected="1"        >Baseline</option>
+  <option value="absbottom"                    >Absbottom</option>
+  <option value="bottom"                       >Bottom</option>
+  <option value="middle"                       >Middle</option>
+  <option value="top"                          >Top</option>
+</select>
+
+<p />
+
+<div class="fl">Border thickness:</div>
+<input type="text" name="border" id="f_border" size="5"
+title="Leave empty for no border" />
+
+<div class="space"></div>
+
+</fieldset>
+
+<fieldset style="float:right; margin-right: 5px;">
+<legend>Spacing</legend>
+
+<div class="space"></div>
+
+<div class="fr">Horizontal:</div>
+<input type="text" name="horiz" id="f_horiz" size="5"
+title="Horizontal padding" />
+
+<p />
+
+<div class="fr">Vertical:</div>
+<input type="text" name="vert" id="f_vert" size="5"
+title="Vertical padding" />
+
+<div class="space"></div>
+
+</fieldset>
+<br clear="all" />
+<table width="100%" style="margin-bottom: 0.2em">
+ <tr>
+  <td valign="bottom">
+    Image Preview:<br />
+    <iframe name="ipreview" id="ipreview" frameborder="0" style="border : 1px solid gray;" height="200" width="300" src=""></iframe>
+  </td>
+  <td valign="bottom" style="text-align: right">
+    <button type="button" name="ok" onclick="return onOK();">OK</button><br>
+    <button type="button" name="cancel" onclick="return onCancel();">Cancel</button>
+  </td>
+ </tr>
+</table>
+</form>
+</body>
+</html>

Modified: plog/trunk/js/htmlarea/popups/insert_table.html
===================================================================
--- plog/trunk/js/htmlarea/popups/insert_table.html	2005-02-05 13:57:52 UTC (rev 948)
+++ plog/trunk/js/htmlarea/popups/insert_table.html	2005-02-05 15:29:38 UTC (rev 949)
@@ -1,174 +1,175 @@
-<html>
-
-<head>
-  <title>Insert Table</title>
-
-<script type="text/javascript" src="popup.js"></script>
-
-<script type="text/javascript">
-
-window.resizeTo(400, 100);
-
-function Init() {
-  __dlg_init();
-  document.getElementById("f_rows").focus();
-};
-
-function onOK() {
-  var required = {
-    "f_rows": "You must enter a number of rows",
-    "f_cols": "You must enter a number of columns"
-  };
-  for (var i in required) {
-    var el = document.getElementById(i);
-    if (!el.value) {
-      alert(required[i]);
-      el.focus();
-      return false;
-    }
-  }
-  var fields = ["f_rows", "f_cols", "f_width", "f_unit",
-                "f_align", "f_border", "f_spacing", "f_padding"];
-  var param = new Object();
-  for (var i in fields) {
-    var id = fields[i];
-    var el = document.getElementById(id);
-    param[id] = el.value;
-  }
-  __dlg_close(param);
-  return false;
-};
-
-function onCancel() {
-  __dlg_close(null);
-  return false;
-};
-
-</script>
-
-<style type="text/css">
-html, body {
-  background: ButtonFace;
-  color: ButtonText;
-  font: 11px Tahoma,Verdana,sans-serif;
-  margin: 0px;
-  padding: 0px;
-}
-body { padding: 5px; }
-table {
-  font: 11px Tahoma,Verdana,sans-serif;
-}
-form p {
-  margin-top: 5px;
-  margin-bottom: 5px;
-}
-.fl { width: 9em; float: left; padding: 2px 5px; text-align: right; }
-.fr { width: 7em; float: left; padding: 2px 5px; text-align: right; }
-fieldset { padding: 0px 10px 5px 5px; }
-select, input, button { font: 11px Tahoma,Verdana,sans-serif; }
-button { width: 70px; }
-.space { padding: 2px; }
-
-.title { background: #ddf; color: #000; font-weight: bold; font-size: 120%; padding: 3px 10px; margin-bottom: 10px;
-border-bottom: 1px solid black; letter-spacing: 2px;
-}
-form { padding: 0px; margin: 0px; }
-</style>
-
-</head>
-
-<body onload="Init()">
-
-<div class="title">Insert Table</div>
-
-<form action="" method="get">
-<table border="0" style="padding: 0px; margin: 0px">
-  <tbody>
-
-  <tr>
-    <td style="width: 4em; text-align: right">Rows:</td>
-    <td><input type="text" name="rows" id="f_rows" size="5" title="Number of rows" value="2" /></td>
-    <td></td>
-    <td></td>
-    <td></td>
-  </tr>
-  <tr>
-    <td style="width: 4em; text-align: right">Cols:</td>
-    <td><input type="text" name="cols" id="f_cols" size="5" title="Number of columns" value="4" /></td>
-    <td style="width: 4em; text-align: right">Width:</td>
-    <td><input type="text" name="width" id="f_width" size="5" title="Width of the table" value="100" /></td>
-    <td><select size="1" name="unit" id="f_unit" title="Width unit">
-      <option value="%" selected="1"  >Percent</option>
-      <option value="px"              >Pixels</option>
-      <option value="em"              >Em</option>
-    </select></td>
-  </tr>
-
-  </tbody>
-</table>
-
-<p />
-
-<fieldset style="float: left; margin-left: 5px;">
-<legend>Layout</legend>
-
-<div class="space"></div>
-
-<div class="fl">Alignment:</div>
-<select size="1" name="align" id="f_align"
-  title="Positioning of this image">
-  <option value="" selected="1"                >Not set</option>
-  <option value="left"                         >Left</option>
-  <option value="right"                        >Right</option>
-  <option value="texttop"                      >Texttop</option>
-  <option value="absmiddle"                    >Absmiddle</option>
-  <option value="baseline"                     >Baseline</option>
-  <option value="absbottom"                    >Absbottom</option>
-  <option value="bottom"                       >Bottom</option>
-  <option value="middle"                       >Middle</option>
-  <option value="top"                          >Top</option>
-</select>
-
-<p />
-
-<div class="fl">Border thickness:</div>
-<input type="text" name="border" id="f_border" size="5" value="1"
-title="Leave empty for no border" />
-<!--
-<p />
-
-<div class="fl">Collapse borders:</div>
-<input type="checkbox" name="collapse" id="f_collapse" />
--->
-<div class="space"></div>
-
-</fieldset>
-
-<fieldset style="float:right; margin-right: 5px;">
-<legend>Spacing</legend>
-
-<div class="space"></div>
-
-<div class="fr">Cell spacing:</div>
-<input type="text" name="spacing" id="f_spacing" size="5" value="1"
-title="Space between adjacent cells" />
-
-<p />
-
-<div class="fr">Cell padding:</div>
-<input type="text" name="padding" id="f_padding" size="5" value="1"
-title="Space between content and border in cell" />
-
-<div class="space"></div>
-
-</fieldset>
-
-<div style="margin-top: 85px; border-top: 1px solid #999; padding: 2px; text-align: right;">
-<button type="button" name="ok" onclick="return onOK();">OK</button>
-<button type="button" name="cancel" onclick="return onCancel();">Cancel</button>
-</div>
-
-</form>
-
-</body>
-</html>
+<html>
+
+<head>
+  <title>Insert Table</title>
+
+<script type="text/javascript" src="popup.js"></script>
+
+<script type="text/javascript">
+
+window.resizeTo(400, 100);
+
+function Init() {
+  i18n = window.opener.HTMLArea.I18N.dialogs; // load the HTMLArea plugin and lang file
+  __dlg_translate(i18n);
+  __dlg_init();
+  document.getElementById("f_rows").focus();
+};
+
+function onOK() {
+  var required = {
+    "f_rows": "You must enter a number of rows",
+    "f_cols": "You must enter a number of columns"
+  };
+  for (var i in required) {
+    var el = document.getElementById(i);
+    if (!el.value) {
+      alert(required[i]);
+      el.focus();
+      return false;
+    }
+  }
+  var fields = ["f_rows", "f_cols", "f_width", "f_unit", "f_fixed",
+                "f_align", "f_border", "f_spacing", "f_padding"];
+  var param = new Object();
+  for (var i in fields) {
+    var id = fields[i];
+    var el = document.getElementById(id);
+    param[id] = (el.type == "checkbox") ? el.checked : el.value;
+  }
+  __dlg_close(param);
+  return false;
+};
+
+function onCancel() {
+  __dlg_close(null);
+  return false;
+};
+
+</script>
+
+<style type="text/css">
+html, body {
+  background: ButtonFace;
+  color: ButtonText;
+  font: 11px Tahoma,Verdana,sans-serif;
+  margin: 0px;
+  padding: 0px;
+}
+body { padding: 5px; }
+table {
+  font: 11px Tahoma,Verdana,sans-serif;
+}
+form p {
+  margin-top: 5px;
+  margin-bottom: 5px;
+}
+.fl { width: 9em; float: left; padding: 2px 5px; text-align: right; }
+.fr { width: 7em; float: left; padding: 2px 5px; text-align: right; }
+fieldset { padding: 0px 10px 5px 5px; }
+select, input, button { font: 11px Tahoma,Verdana,sans-serif; }
+button { width: 70px; }
+.space { padding: 2px; }
+
+.title { background: #ddf; color: #000; font-weight: bold; font-size: 120%; padding: 3px 10px; margin-bottom: 10px;
+border-bottom: 1px solid black; letter-spacing: 2px;
+}
+form { padding: 0px; margin: 0px; }
+</style>
+
+</head>
+
+<body onload="Init()">
+
+<div class="title">Insert Table</div>
+
+<form action="" method="get">
+<table border="0" style="padding: 0px; margin: 0px">
+  <tbody>
+
+  <tr>
+    <td style="width: 4em; text-align: right">Rows:</td>
+    <td><input type="text" name="rows" id="f_rows" size="5" title="Number of rows" value="2" /></td>
+    <td style="width: 4em; text-align: right">Width:</td>
+    <td><input type="text" name="width" id="f_width" size="5" title="Width of the table" value="100" /></td>
+    <td><select size="1" name="unit" id="f_unit" title="Width unit">
+      <option value="%" selected="1"  >Percent</option>
+      <option value="px"              >Pixels</option>
+      <option value="em"              >Em</option>
+    </select></td>
+  </tr>
+  <tr>
+    <td style="width: 4em; text-align: right">Cols:</td>
+    <td><input type="text" name="cols" id="f_cols" size="5" title="Number of columns" value="4" /></td>
+    <td style="text-align: right"><input type="checkbox" checked="checked" name="fixed" id="f_fixed" /></td>
+    <td colspan="2"><label for="f_fixed"
+    >Fixed width columns</label></td>
+  </tr>
+  </tbody>
+</table>
+
+<p />
+
+<fieldset style="float: left; margin-left: 5px;">
+<legend>Layout</legend>
+
+<div class="space"></div>
+
+<div class="fl">Alignment:</div>
+<select size="1" name="align" id="f_align"
+  title="Positioning of this table">
+  <option value="" selected="1"                >Not set</option>
+  <option value="left"                         >Left</option>
+  <option value="right"                        >Right</option>
+  <option value="texttop"                      >Texttop</option>
+  <option value="absmiddle"                    >Absmiddle</option>
+  <option value="baseline"                     >Baseline</option>
+  <option value="absbottom"                    >Absbottom</option>
+  <option value="bottom"                       >Bottom</option>
+  <option value="middle"                       >Middle</option>
+  <option value="top"                          >Top</option>
+</select>
+
+<p />
+
+<div class="fl">Border thickness:</div>
+<input type="text" name="border" id="f_border" size="5" value="1"
+title="Leave empty for no border" />
+<!--
+<p />
+
+<div class="fl">Collapse borders:</div>
+<input type="checkbox" name="collapse" id="f_collapse" />
+-->
+<div class="space"></div>
+
+</fieldset>
+
+<fieldset style="float:right; margin-right: 5px;">
+<legend>Spacing</legend>
+
+<div class="space"></div>
+
+<div class="fr">Cell spacing:</div>
+<input type="text" name="spacing" id="f_spacing" size="5" value="1"
+title="Space between adjacent cells" />
+
+<p />
+
+<div class="fr">Cell padding:</div>
+<input type="text" name="padding" id="f_padding" size="5" value="1"
+title="Space between content and border in cell" />
+
+<div class="space"></div>
+
+</fieldset>
+
+<div style="margin-top: 85px; border-top: 1px solid #999; padding: 2px; text-align: right;">
+<button type="button" name="ok" onclick="return onOK();">OK</button>
+<button type="button" name="cancel" onclick="return onCancel();">Cancel</button>
+</div>
+
+</form>
+
+</body>
+</html>

Modified: plog/trunk/js/htmlarea/popups/link.html
===================================================================
--- plog/trunk/js/htmlarea/popups/link.html	2005-02-05 13:57:52 UTC (rev 948)
+++ plog/trunk/js/htmlarea/popups/link.html	2005-02-05 15:29:38 UTC (rev 949)
@@ -1,144 +1,155 @@
-<html>
-
-<head>
-  <title>Insert/Modify Link</title>
-  <script type="text/javascript" src="popup.js"></script>
-  <script type="text/javascript">
-    window.resizeTo(400, 200);
-
-I18N = window.opener.HTMLArea.I18N.dialogs;
-
-function i18n(str) {
-  //return (I18N[str] || str);
-  //OSCAR: this doesn't work
-  return(I18N != null ? I18N[str] : str);
-};
-
-function onTargetChanged() {
-  var f = document.getElementById("f_other_target");
-  if (this.value == "_other") {
-    f.style.visibility = "visible";
-    f.select();
-    f.focus();
-  } else f.style.visibility = "hidden";
-};
-
-function Init() {
-  __dlg_translate(I18N);
-  __dlg_init();
-  var param = window.dialogArguments;
-  var target_select = document.getElementById("f_target");
-  if (param) {
-      document.getElementById("f_href").value = param["f_href"];
-      document.getElementById("f_title").value = param["f_title"];
-      comboSelectValue(target_select, param["f_target"]);
-      if (target_select.value != param.f_target) {
-        var opt = document.createElement("option");
-        opt.value = param.f_target;
-        opt.innerHTML = opt.value;
-        target_select.appendChild(opt);
-        opt.selected = true;
-      }
-  }
-  var opt = document.createElement("option");
-  opt.value = "_other";
-  opt.innerHTML = i18n("Other");
-  target_select.appendChild(opt);
-  target_select.onchange = onTargetChanged;
-  document.getElementById("f_href").focus();
-  document.getElementById("f_href").select();
-};
-
-function onOK() {
-  var required = {
-    "f_href": i18n("You must enter the URL where this link points to")
-  };
-  for (var i in required) {
-    var el = document.getElementById(i);
-    if (!el.value) {
-      alert(required[i]);
-      el.focus();
-      return false;
-    }
-  }
-  // pass data back to the calling window
-  var fields = ["f_href", "f_title", "f_target" ];
-  var param = new Object();
-  for (var i in fields) {
-    var id = fields[i];
-    var el = document.getElementById(id);
-    param[id] = el.value;
-  }
-  if (param.f_target == "_other")
-    param.f_target = document.getElementById("f_other_target").value;
-  __dlg_close(param);
-  return false;
-};
-
-function onCancel() {
-  __dlg_close(null);
-  return false;
-};
-
-</script>
-
-<style type="text/css">
-html, body {
-  background: ButtonFace;
-  color: ButtonText;
-  font: 11px Tahoma,Verdana,sans-serif;
-  margin: 0px;
-  padding: 0px;
-}
-body { padding: 5px; }
-table {
-  font: 11px Tahoma,Verdana,sans-serif;
-}
-select, input, button { font: 11px Tahoma,Verdana,sans-serif; }
-button { width: 70px; }
-table .label { text-align: right; width: 8em; }
-
-.title { background: #ddf; color: #000; font-weight: bold; font-size: 120%; padding: 3px 10px; margin-bottom: 10px;
-border-bottom: 1px solid black; letter-spacing: 2px;
-}
-
-#buttons {
-      margin-top: 1em; border-top: 1px solid #999;
-      padding: 2px; text-align: right;
-}
-</style>
-
-</head>
-
-<body onload="Init()">
-<div class="title">Insert/Modify Link</div>
-
-<table border="0" style="width: 100%;">
-  <tr>
-    <td class="label">URL:</td>
-    <td><input type="text" id="f_href" style="width: 100%" /></td>
-  </tr>
-  <tr>
-    <td class="label">Title (tooltip):</td>
-    <td><input type="text" id="f_title" style="width: 100%" /></td>
-  </tr>
-  <tr>
-    <td class="label">Target:</td>
-    <td><select id="f_target">
-      <option value="">None (use implicit)</option>
-      <option value="_blank">New window (_blank)</option>
-      <option value="_self">Same frame (_self)</option>
-      <option value="_top">Top frame (_top)</option>
-    </select>
-    <input type="text" name="f_other_target" id="f_other_target" size="10" style="visibility: hidden" />
-    </td>
-  </tr>
-</table>
-
-<div id="buttons">
-  <button type="button" name="ok" onclick="return onOK();">OK</button>
-  <button type="button" name="cancel" onclick="return onCancel();">Cancel</button>
-</div>
-
-</body>
-</html>
+<html>
+
+<head>
+  <title>Insert/Modify Link</title>
+  <script type="text/javascript" src="popup.js"></script>
+  <script type="text/javascript">
+    window.resizeTo(400, 200);
+
+I18N = window.opener.HTMLArea.I18N.dialogs;
+
+function i18n(str) {
+  return (I18N[str] || str);
+};
+
+function onTargetChanged() {
+  var f = document.getElementById("f_other_target");
+  if (this.value == "_other") {
+    f.style.visibility = "visible";
+    f.select();
+    f.focus();
+  } else f.style.visibility = "hidden";
+};
+
+function Init() {
+  __dlg_translate(I18N);
+  __dlg_init();
+  var param = window.dialogArguments;
+  var target_select = document.getElementById("f_target");
+  var use_target = true;
+  if (param) {
+    if ( typeof param["f_usetarget"] != "undefined" ) {
+      use_target = param["f_usetarget"];
+    }
+    if ( typeof param["f_href"] != "undefined" ) {
+      document.getElementById("f_href").value = param["f_href"];
+      document.getElementById("f_title").value = param["f_title"];
+      comboSelectValue(target_select, param["f_target"]);
+      if (target_select.value != param.f_target) {
+        var opt = document.createElement("option");
+        opt.value = param.f_target;
+        opt.innerHTML = opt.value;
+        target_select.appendChild(opt);
+        opt.selected = true;
+      }
+    }
+  }
+  if (! use_target) {
+    document.getElementById("f_target_label").style.visibility = "hidden";
+    document.getElementById("f_target").style.visibility = "hidden";
+    document.getElementById("f_target_other").style.visibility = "hidden";
+  }
+  var opt = document.createElement("option");
+  opt.value = "_other";
+  opt.innerHTML = i18n("Other");
+  target_select.appendChild(opt);
+  target_select.onchange = onTargetChanged;
+  document.getElementById("f_href").focus();
+  document.getElementById("f_href").select();
+};
+
+function onOK() {
+  var required = {
+    // f_href shouldn't be required or otherwise removing the link by entering an empty
+    // url isn't possible anymore.
+    // "f_href": i18n("You must enter the URL where this link points to")
+  };
+  for (var i in required) {
+    var el = document.getElementById(i);
+    if (!el.value) {
+      alert(required[i]);
+      el.focus();
+      return false;
+    }
+  }
+  // pass data back to the calling window
+  var fields = ["f_href", "f_title", "f_target" ];
+  var param = new Object();
+  for (var i in fields) {
+    var id = fields[i];
+    var el = document.getElementById(id);
+    param[id] = el.value;
+  }
+  if (param.f_target == "_other")
+    param.f_target = document.getElementById("f_other_target").value;
+  __dlg_close(param);
+  return false;
+};
+
+function onCancel() {
+  __dlg_close(null);
+  return false;
+};
+
+</script>
+
+<style type="text/css">
+html, body {
+  background: ButtonFace;
+  color: ButtonText;
+  font: 11px Tahoma,Verdana,sans-serif;
+  margin: 0px;
+  padding: 0px;
+}
+body { padding: 5px; }
+table {
+  font: 11px Tahoma,Verdana,sans-serif;
+}
+select, input, button { font: 11px Tahoma,Verdana,sans-serif; }
+button { width: 70px; }
+table .label { text-align: right; width: 8em; }
+
+.title { background: #ddf; color: #000; font-weight: bold; font-size: 120%; padding: 3px 10px; margin-bottom: 10px;
+border-bottom: 1px solid black; letter-spacing: 2px;
+}
+
+#buttons {
+      margin-top: 1em; border-top: 1px solid #999;
+      padding: 2px; text-align: right;
+}
+</style>
+
+</head>
+
+<body onload="Init()">
+<div class="title">Insert/Modify Link</div>
+<form>
+<table border="0" style="width: 100%;">
+  <tr>
+    <td class="label">URL:</td>
+    <td><input type="text" id="f_href" style="width: 100%" /></td>
+  </tr>
+  <tr>
+    <td class="label">Title (tooltip):</td>
+    <td><input type="text" id="f_title" style="width: 100%" /></td>
+  </tr>
+  <tr>
+    <td class="label"><span id="f_target_label">Target:</span></td>
+    <td><select id="f_target">
+      <option value="">None (use implicit)</option>
+      <option value="_blank">New window (_blank)</option>
+      <option value="_self">Same frame (_self)</option>
+      <option value="_top">Top frame (_top)</option>
+    </select>
+    <input type="text" name="f_other_target" id="f_other_target" size="10" style="visibility: hidden" />
+    </td>
+  </tr>
+</table>
+
+<div id="buttons">
+  <button type="submit" name="ok" onclick="return onOK();">OK</button>
+  <button type="button" name="cancel" onclick="return onCancel();">Cancel</button>
+</div>
+</form>
+</body>
+</html>

Modified: plog/trunk/js/htmlarea/popups/old-fullscreen.html
===================================================================
--- plog/trunk/js/htmlarea/popups/old-fullscreen.html	2005-02-05 13:57:52 UTC (rev 948)
+++ plog/trunk/js/htmlarea/popups/old-fullscreen.html	2005-02-05 15:29:38 UTC (rev 949)
@@ -1,131 +1,131 @@
-<html>
-<head><title>Fullscreen Editor</title>
-<style type="text/css"> body {	margin: 0px; border: 0px; background-color: buttonface; } </style>
-
-<script>
-
-// if we pass the "window" object as a argument and then set opener to
-// equal that we can refer to dialogWindows and popupWindows the same way
-if (window.dialogArguments) { opener = window.dialogArguments; }
-
-var _editor_url = "../";
-document.write('<scr'+'ipt src="' +_editor_url+ 'editor.js" language="Javascript1.2"></scr'+'ipt>');
-
-var parent_objname = location.search.substring(1,location.search.length);  // parent editor objname
-var parent_config  = opener.document.all[parent_objname].config;
-
-var config         = cloneObject( parent_config );
-var objname        = 'editor'; // name of this editor
-
-//  DOMViewerObj = config;
-//  DOMViewerName = 'config';
-//  window.open('/innerHTML/domviewer.htm');  
-
-/* ---------------------------------------------------------------------- *\
-  Function    : 
-  Description : 
-\* ---------------------------------------------------------------------- */
-
-function _CloseOnEsc() {
-  if (event.keyCode == 27) {
-    update_parent();
-    window.close();
-    return;
-  }
-}
-
-/* ---------------------------------------------------------------------- *\
-  Function    : cloneObject
-  Description : copy an object by value instead of by reference
-  Usage       : var newObj = cloneObject(oldObj);
-\* ---------------------------------------------------------------------- */
-
-function cloneObject(obj) {
-  var newObj          = new Object; 
-
-  // check for array objects
-  if (obj.constructor.toString().indexOf('function Array(') == 1) {
-    newObj = obj.constructor();
-  }
-
-  for (var n in obj) {
-    var node = obj[n];
-    if (typeof node == 'object') { newObj[n] = cloneObject(node); }
-    else                         { newObj[n] = node; }
-  }
-  
-  return newObj;
-}
-
-/* ---------------------------------------------------------------------- *\
-  Function    : resize_editor
-  Description : resize the editor when the user resizes the popup
-\* ---------------------------------------------------------------------- */
-
-function resize_editor() {  // resize editor to fix window
-  var editor = document.all['_editor_editor'];
-
-  newWidth  = document.body.offsetWidth;
-  newHeight = document.body.offsetHeight - editor.offsetTop;
-
-  if (newWidth < 0) { newWidth = 0; }
-  if (newHeight < 0) { newHeight = 0; }
-
-  editor.style.width  = newWidth;
-  editor.style.height = newHeight;
-}
-
-/* ---------------------------------------------------------------------- *\
-  Function    : init
-  Description : run this code on page load
-\* ---------------------------------------------------------------------- */
-
-function init() {
-  // change maximize button to minimize button
-  config.btnList["popupeditor"] = ['popupeditor', 'Minimize Editor',  'update_parent(); window.close();', 'fullscreen_minimize.gif'];
-
-  // set htmlmode button to refer to THIS editor
-  config.btnList["htmlmode"]    = ['HtmlMode',    'View HTML Source', 'editor_setmode(\'editor\')',  'ed_html.gif'];
-
-  // change image url to be relative to current path
-  config.imgURL = "../images/";
-  
-  // generate editor and resize it
-  editor_generate('editor', config);
-  resize_editor();
-
-  // switch mode if needed
-  if (parent_config.mode == 'textedit') { editor_setmode(objname, 'textedit'); }
-
-  // set child window contents
-  var parentHTML = opener.editor_getHTML(parent_objname);
-  editor_setHTML(objname, parentHTML);
-
-  // continuously update parent editor window
-  window.setInterval(update_parent, 333);
-
-  // setup event handlers
-  document.body.onkeypress = _CloseOnEsc;
-  window.onresize = resize_editor;
-}
-
-/* ---------------------------------------------------------------------- *\
-  Function    : update_parent
-  Description : update parent window editor field with contents from child window
-\* ---------------------------------------------------------------------- */
-
-function update_parent() {
-  var childHTML = editor_getHTML(objname);
-  opener.editor_setHTML(parent_objname, childHTML);
-}
-
-
-</script>
-</head>
-<body scroll="no" onload="init()" onunload="update_parent()">
-
-<div style="margin: 0 0 0 0; border-width: 1; border-style: solid; border-color: threedshadow threedhighlight threedhighlight threedshadow; "></div>
-
-<textarea name="editor" style="width:100%; height:300px"></textarea><br>
-
+<html>
+<head><title>Fullscreen Editor</title>
+<style type="text/css"> body {	margin: 0px; border: 0px; background-color: buttonface; } </style>
+
+<script>
+
+// if we pass the "window" object as a argument and then set opener to
+// equal that we can refer to dialogWindows and popupWindows the same way
+if (window.dialogArguments) { opener = window.dialogArguments; }
+
+var _editor_url = "../";
+document.write('<scr'+'ipt src="' +_editor_url+ 'editor.js" language="Javascript1.2"></scr'+'ipt>');
+
+var parent_objname = location.search.substring(1,location.search.length);  // parent editor objname
+var parent_config  = opener.document.all[parent_objname].config;
+
+var config         = cloneObject( parent_config );
+var objname        = 'editor'; // name of this editor
+
+//  DOMViewerObj = config;
+//  DOMViewerName = 'config';
+//  window.open('/innerHTML/domviewer.htm');  
+
+/* ---------------------------------------------------------------------- *\
+  Function    : 
+  Description : 
+\* ---------------------------------------------------------------------- */
+
+function _CloseOnEsc() {
+  if (event.keyCode == 27) {
+    update_parent();
+    window.close();
+    return;
+  }
+}
+
+/* ---------------------------------------------------------------------- *\
+  Function    : cloneObject
+  Description : copy an object by value instead of by reference
+  Usage       : var newObj = cloneObject(oldObj);
+\* ---------------------------------------------------------------------- */
+
+function cloneObject(obj) {
+  var newObj          = new Object; 
+
+  // check for array objects
+  if (obj.constructor.toString().indexOf('function Array(') == 1) {
+    newObj = obj.constructor();
+  }
+
+  for (var n in obj) {
+    var node = obj[n];
+    if (typeof node == 'object') { newObj[n] = cloneObject(node); }
+    else                         { newObj[n] = node; }
+  }
+  
+  return newObj;
+}
+
+/* ---------------------------------------------------------------------- *\
+  Function    : resize_editor
+  Description : resize the editor when the user resizes the popup
+\* ---------------------------------------------------------------------- */
+
+function resize_editor() {  // resize editor to fix window
+  var editor = document.all['_editor_editor'];
+
+  newWidth  = document.body.offsetWidth;
+  newHeight = document.body.offsetHeight - editor.offsetTop;
+
+  if (newWidth < 0) { newWidth = 0; }
+  if (newHeight < 0) { newHeight = 0; }
+
+  editor.style.width  = newWidth;
+  editor.style.height = newHeight;
+}
+
+/* ---------------------------------------------------------------------- *\
+  Function    : init
+  Description : run this code on page load
+\* ---------------------------------------------------------------------- */
+
+function init() {
+  // change maximize button to minimize button
+  config.btnList["popupeditor"] = ['popupeditor', 'Minimize Editor',  'update_parent(); window.close();', 'fullscreen_minimize.gif'];
+
+  // set htmlmode button to refer to THIS editor
+  config.btnList["htmlmode"]    = ['HtmlMode',    'View HTML Source', 'editor_setmode(\'editor\')',  'ed_html.gif'];
+
+  // change image url to be relative to current path
+  config.imgURL = "../images/";
+  
+  // generate editor and resize it
+  editor_generate('editor', config);
+  resize_editor();
+
+  // switch mode if needed
+  if (parent_config.mode == 'textedit') { editor_setmode(objname, 'textedit'); }
+
+  // set child window contents
+  var parentHTML = opener.editor_getHTML(parent_objname);
+  editor_setHTML(objname, parentHTML);
+
+  // continuously update parent editor window
+  window.setInterval(update_parent, 333);
+
+  // setup event handlers
+  document.body.onkeypress = _CloseOnEsc;
+  window.onresize = resize_editor;
+}
+
+/* ---------------------------------------------------------------------- *\
+  Function    : update_parent
+  Description : update parent window editor field with contents from child window
+\* ---------------------------------------------------------------------- */
+
+function update_parent() {
+  var childHTML = editor_getHTML(objname);
+  opener.editor_setHTML(parent_objname, childHTML);
+}
+
+
+</script>
+</head>
+<body scroll="no" onload="init()" onunload="update_parent()">
+
+<div style="margin: 0 0 0 0; border-width: 1; border-style: solid; border-color: threedshadow threedhighlight threedhighlight threedshadow; "></div>
+
+<textarea name="editor" style="width:100%; height:300px"></textarea><br>
+
 </body></html>
\ No newline at end of file

Modified: plog/trunk/js/htmlarea/popups/old_insert_image.html
===================================================================
--- plog/trunk/js/htmlarea/popups/old_insert_image.html	2005-02-05 13:57:52 UTC (rev 948)
+++ plog/trunk/js/htmlarea/popups/old_insert_image.html	2005-02-05 15:29:38 UTC (rev 949)
@@ -1,206 +1,206 @@
-<!-- based on insimage.dlg -->
-
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD W3 HTML 3.2//EN">
-<HTML  id=dlgImage STYLE="width: 432px; height: 194px; ">
-<HEAD>
-<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
-<meta http-equiv="MSThemeCompatible" content="Yes">
-<TITLE>Insert Image</TITLE>
-<style>
-  html, body, button, div, input, select, fieldset { font-family: MS Shell Dlg; font-size: 8pt; position: absolute; };
-</style>
-<SCRIPT defer>
-
-function _CloseOnEsc() {
-  if (event.keyCode == 27) { window.close(); return; }
-}
-
-function _getTextRange(elm) {
-  var r = elm.parentTextEdit.createTextRange();
-  r.moveToElementText(elm);
-  return r;
-}
-
-window.onerror = HandleError
-
-function HandleError(message, url, line) {
-  var str = "An error has occurred in this dialog." + "\n\n"
-  + "Error: " + line + "\n" + message;
-  alert(str);
-  window.close();
-  return true;
-}
-
-function Init() {
-  var elmSelectedImage;
-  var htmlSelectionControl = "Control";
-  var globalDoc = window.dialogArguments;
-  var grngMaster = globalDoc.selection.createRange();
-  
-  // event handlers  
-  document.body.onkeypress = _CloseOnEsc;
-  btnOK.onclick = new Function("btnOKClick()");
-
-  txtFileName.fImageLoaded = false;
-  txtFileName.intImageWidth = 0;
-  txtFileName.intImageHeight = 0;
-
-  if (globalDoc.selection.type == htmlSelectionControl) {
-    if (grngMaster.length == 1) {
-      elmSelectedImage = grngMaster.item(0);
-      if (elmSelectedImage.tagName == "IMG") {
-        txtFileName.fImageLoaded = true;
-        if (elmSelectedImage.src) {
-          txtFileName.value          = elmSelectedImage.src.replace(/^[^*]*(\*\*\*)/, "$1");  // fix placeholder src values that editor converted to abs paths
-          txtFileName.intImageHeight = elmSelectedImage.height;
-          txtFileName.intImageWidth  = elmSelectedImage.width;
-          txtVertical.value          = elmSelectedImage.vspace;
-          txtHorizontal.value        = elmSelectedImage.hspace;
-          txtBorder.value            = elmSelectedImage.border;
-          txtAltText.value           = elmSelectedImage.alt;
-          selAlignment.value         = elmSelectedImage.align;
-        }
-      }
-    }
-  }
-  txtFileName.value = txtFileName.value || "http://";
-  txtFileName.focus();
-}
-
-function _isValidNumber(txtBox) {
-  var val = parseInt(txtBox);
-  if (isNaN(val) || val < 0 || val > 999) { return false; }
-  return true;
-}
-
-function btnOKClick() {
-  var elmImage;
-  var intAlignment;
-  var htmlSelectionControl = "Control";
-  var globalDoc = window.dialogArguments;
-  var grngMaster = globalDoc.selection.createRange();
-  
-  // error checking
-
-  if (!txtFileName.value || txtFileName.value == "http://") { 
-    alert("Image URL must be specified.");
-    txtFileName.focus();
-    return;
-  }
-  if (txtHorizontal.value && !_isValidNumber(txtHorizontal.value)) {
-    alert("Horizontal spacing must be a number between 0 and 999.");
-    txtHorizontal.focus();
-    return;
-  }
-  if (txtBorder.value && !_isValidNumber(txtBorder.value)) {
-    alert("Border thickness must be a number between 0 and 999.");
-    txtBorder.focus();
-    return;
-  }
-  if (txtVertical.value && !_isValidNumber(txtVertical.value)) {
-    alert("Vertical spacing must be a number between 0 and 999.");
-    txtVertical.focus();
-    return;
-  }
-
-  // delete selected content and replace with image
-  if (globalDoc.selection.type == htmlSelectionControl && !txtFileName.fImageLoaded) {
-    grngMaster.execCommand('Delete');
-    grngMaster = globalDoc.selection.createRange();
-  }
-    
-  idstr = "\" id=\"556e697175657e537472696e67";     // new image creation ID
-  if (!txtFileName.fImageLoaded) {
-    grngMaster.execCommand("InsertImage", false, idstr);
-    elmImage = globalDoc.all['556e697175657e537472696e67'];
-    elmImage.removeAttribute("id");
-    elmImage.removeAttribute("src");
-    grngMaster.moveStart("character", -1);
-  } else {
-    elmImage = grngMaster.item(0);
-    if (elmImage.src != txtFileName.value) {
-      grngMaster.execCommand('Delete');
-      grngMaster = globalDoc.selection.createRange();
-      grngMaster.execCommand("InsertImage", false, idstr);
-      elmImage = globalDoc.all['556e697175657e537472696e67'];
-      elmImage.removeAttribute("id");
-      elmImage.removeAttribute("src");
-      grngMaster.moveStart("character", -1);
-      txtFileName.fImageLoaded = false;
-    }
-    grngMaster = _getTextRange(elmImage);
-  }
-
-  if (txtFileName.fImageLoaded) {
-    elmImage.style.width = txtFileName.intImageWidth;
-    elmImage.style.height = txtFileName.intImageHeight;
-  }
-
-  if (txtFileName.value.length > 2040) {
-    txtFileName.value = txtFileName.value.substring(0,2040);
-  }
-  
-  elmImage.src = txtFileName.value;
-  
-  if (txtHorizontal.value != "") { elmImage.hspace = parseInt(txtHorizontal.value); }
-  else                           { elmImage.hspace = 0; }
-
-  if (txtVertical.value != "") { elmImage.vspace = parseInt(txtVertical.value); }
-  else                         { elmImage.vspace = 0; }
-  
-  elmImage.alt = txtAltText.value;
-
-  if (txtBorder.value != "") { elmImage.border = parseInt(txtBorder.value); }
-  else                       { elmImage.border = 0; }
-
-  elmImage.align = selAlignment.value;
-  grngMaster.collapse(false);
-  grngMaster.select();
-  window.close();
-}
-</SCRIPT>
-</HEAD>
-<BODY id=bdy onload="Init()" style="background: threedface; color: windowtext;" scroll=no>
-
-<DIV id=divFileName style="left: 0.98em; top: 1.2168em; width: 7em; height: 1.2168em; ">Image URL:</DIV>
-<INPUT ID=txtFileName type=text style="left: 8.54em; top: 1.0647em; width: 21.5em;height: 2.1294em; " tabIndex=10 onfocus="select()">
-
-<DIV id=divAltText style="left: 0.98em; top: 4.1067em; width: 6.58em; height: 1.2168em; ">Alternate Text:</DIV>
-<INPUT type=text ID=txtAltText tabIndex=15 style="left: 8.54em; top: 3.8025em; width: 21.5em; height: 2.1294em; " onfocus="select()">
-
-<FIELDSET id=fldLayout style="left: .9em; top: 7.1em; width: 17.08em; height: 7.6em;">
-<LEGEND id=lgdLayout>Layout</LEGEND>
-</FIELDSET>
-
-<FIELDSET id=fldSpacing style="left: 18.9em; top: 7.1em; width: 11em; height: 7.6em;">
-<LEGEND id=lgdSpacing>Spacing</LEGEND>
-</FIELDSET>
-
-<DIV id=divAlign style="left: 1.82em; top: 9.126em; width: 4.76em; height: 1.2168em; ">Alignment:</DIV>
-<SELECT size=1 ID=selAlignment tabIndex=20 style="left: 10.36em; top: 8.8218em; width: 6.72em; height: 1.2168em; ">
-<OPTION id=optNotSet value=""> Not set </OPTION>
-<OPTION id=optLeft value=left> Left </OPTION>
-<OPTION id=optRight value=right> Right </OPTION>
-<OPTION id=optTexttop value=textTop> Texttop </OPTION>
-<OPTION id=optAbsMiddle value=absMiddle> Absmiddle </OPTION>
-<OPTION id=optBaseline value=baseline SELECTED> Baseline </OPTION>
-<OPTION id=optAbsBottom value=absBottom> Absbottom </OPTION>
-<OPTION id=optBottom value=bottom> Bottom </OPTION>
-<OPTION id=optMiddle value=middle> Middle </OPTION>
-<OPTION id=optTop value=top> Top </OPTION>
-</SELECT>
-
-<DIV id=divHoriz style="left: 19.88em; top: 9.126em; width: 4.76em; height: 1.2168em; ">Horizontal:</DIV>
-<INPUT ID=txtHorizontal style="left: 24.92em; top: 8.8218em; width: 4.2em; height: 2.1294em; ime-mode: disabled;" type=text size=3 maxlength=3 value="" tabIndex=25 onfocus="select()">
-
-<DIV id=divBorder style="left: 1.82em; top: 12.0159em; width: 8.12em; height: 1.2168em; ">Border Thickness:</DIV>
-<INPUT ID=txtBorder style="left: 10.36em; top: 11.5596em; width: 6.72em; height: 2.1294em; ime-mode: disabled;" type=text size=3 maxlength=3 value="" tabIndex=21 onfocus="select()">
-
-<DIV id=divVert style="left: 19.88em; top: 12.0159em; width: 3.64em; height: 1.2168em; ">Vertical:</DIV>
-<INPUT ID=txtVertical style="left: 24.92em; top: 11.5596em; width: 4.2em; height: 2.1294em; ime-mode: disabled;" type=text size=3 maxlength=3 value="" tabIndex=30 onfocus="select()">
-
-<BUTTON ID=btnOK style="left: 31.36em; top: 1.0647em; width: 7em; height: 2.2em; " type=submit tabIndex=40>OK</BUTTON>
-<BUTTON ID=btnCancel style="left: 31.36em; top: 3.6504em; width: 7em; height: 2.2em; " type=reset tabIndex=45 onClick="window.close();">Cancel</BUTTON>
-
-</BODY>
+<!-- based on insimage.dlg -->
+
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD W3 HTML 3.2//EN">
+<HTML  id=dlgImage STYLE="width: 432px; height: 194px; ">
+<HEAD>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<meta http-equiv="MSThemeCompatible" content="Yes">
+<TITLE>Insert Image</TITLE>
+<style>
+  html, body, button, div, input, select, fieldset { font-family: MS Shell Dlg; font-size: 8pt; position: absolute; };
+</style>
+<SCRIPT defer>
+
+function _CloseOnEsc() {
+  if (event.keyCode == 27) { window.close(); return; }
+}
+
+function _getTextRange(elm) {
+  var r = elm.parentTextEdit.createTextRange();
+  r.moveToElementText(elm);
+  return r;
+}
+
+window.onerror = HandleError
+
+function HandleError(message, url, line) {
+  var str = "An error has occurred in this dialog." + "\n\n"
+  + "Error: " + line + "\n" + message;
+  alert(str);
+  window.close();
+  return true;
+}
+
+function Init() {
+  var elmSelectedImage;
+  var htmlSelectionControl = "Control";
+  var globalDoc = window.dialogArguments;
+  var grngMaster = globalDoc.selection.createRange();
+  
+  // event handlers  
+  document.body.onkeypress = _CloseOnEsc;
+  btnOK.onclick = new Function("btnOKClick()");
+
+  txtFileName.fImageLoaded = false;
+  txtFileName.intImageWidth = 0;
+  txtFileName.intImageHeight = 0;
+
+  if (globalDoc.selection.type == htmlSelectionControl) {
+    if (grngMaster.length == 1) {
+      elmSelectedImage = grngMaster.item(0);
+      if (elmSelectedImage.tagName == "IMG") {
+        txtFileName.fImageLoaded = true;
+        if (elmSelectedImage.src) {
+          txtFileName.value          = elmSelectedImage.src.replace(/^[^*]*(\*\*\*)/, "$1");  // fix placeholder src values that editor converted to abs paths
+          txtFileName.intImageHeight = elmSelectedImage.height;
+          txtFileName.intImageWidth  = elmSelectedImage.width;
+          txtVertical.value          = elmSelectedImage.vspace;
+          txtHorizontal.value        = elmSelectedImage.hspace;
+          txtBorder.value            = elmSelectedImage.border;
+          txtAltText.value           = elmSelectedImage.alt;
+          selAlignment.value         = elmSelectedImage.align;
+        }
+      }
+    }
+  }
+  txtFileName.value = txtFileName.value || "http://";
+  txtFileName.focus();
+}
+
+function _isValidNumber(txtBox) {
+  var val = parseInt(txtBox);
+  if (isNaN(val) || val < 0 || val > 999) { return false; }
+  return true;
+}
+
+function btnOKClick() {
+  var elmImage;
+  var intAlignment;
+  var htmlSelectionControl = "Control";
+  var globalDoc = window.dialogArguments;
+  var grngMaster = globalDoc.selection.createRange();
+  
+  // error checking
+
+  if (!txtFileName.value || txtFileName.value == "http://") { 
+    alert("Image URL must be specified.");
+    txtFileName.focus();
+    return;
+  }
+  if (txtHorizontal.value && !_isValidNumber(txtHorizontal.value)) {
+    alert("Horizontal spacing must be a number between 0 and 999.");
+    txtHorizontal.focus();
+    return;
+  }
+  if (txtBorder.value && !_isValidNumber(txtBorder.value)) {
+    alert("Border thickness must be a number between 0 and 999.");
+    txtBorder.focus();
+    return;
+  }
+  if (txtVertical.value && !_isValidNumber(txtVertical.value)) {
+    alert("Vertical spacing must be a number between 0 and 999.");
+    txtVertical.focus();
+    return;
+  }
+
+  // delete selected content and replace with image
+  if (globalDoc.selection.type == htmlSelectionControl && !txtFileName.fImageLoaded) {
+    grngMaster.execCommand('Delete');
+    grngMaster = globalDoc.selection.createRange();
+  }
+    
+  idstr = "\" id=\"556e697175657e537472696e67";     // new image creation ID
+  if (!txtFileName.fImageLoaded) {
+    grngMaster.execCommand("InsertImage", false, idstr);
+    elmImage = globalDoc.all['556e697175657e537472696e67'];
+    elmImage.removeAttribute("id");
+    elmImage.removeAttribute("src");
+    grngMaster.moveStart("character", -1);
+  } else {
+    elmImage = grngMaster.item(0);
+    if (elmImage.src != txtFileName.value) {
+      grngMaster.execCommand('Delete');
+      grngMaster = globalDoc.selection.createRange();
+      grngMaster.execCommand("InsertImage", false, idstr);
+      elmImage = globalDoc.all['556e697175657e537472696e67'];
+      elmImage.removeAttribute("id");
+      elmImage.removeAttribute("src");
+      grngMaster.moveStart("character", -1);
+      txtFileName.fImageLoaded = false;
+    }
+    grngMaster = _getTextRange(elmImage);
+  }
+
+  if (txtFileName.fImageLoaded) {
+    elmImage.style.width = txtFileName.intImageWidth;
+    elmImage.style.height = txtFileName.intImageHeight;
+  }
+
+  if (txtFileName.value.length > 2040) {
+    txtFileName.value = txtFileName.value.substring(0,2040);
+  }
+  
+  elmImage.src = txtFileName.value;
+  
+  if (txtHorizontal.value != "") { elmImage.hspace = parseInt(txtHorizontal.value); }
+  else                           { elmImage.hspace = 0; }
+
+  if (txtVertical.value != "") { elmImage.vspace = parseInt(txtVertical.value); }
+  else                         { elmImage.vspace = 0; }
+  
+  elmImage.alt = txtAltText.value;
+
+  if (txtBorder.value != "") { elmImage.border = parseInt(txtBorder.value); }
+  else                       { elmImage.border = 0; }
+
+  elmImage.align = selAlignment.value;
+  grngMaster.collapse(false);
+  grngMaster.select();
+  window.close();
+}
+</SCRIPT>
+</HEAD>
+<BODY id=bdy onload="Init()" style="background: threedface; color: windowtext;" scroll=no>
+
+<DIV id=divFileName style="left: 0.98em; top: 1.2168em; width: 7em; height: 1.2168em; ">Image URL:</DIV>
+<INPUT ID=txtFileName type=text style="left: 8.54em; top: 1.0647em; width: 21.5em;height: 2.1294em; " tabIndex=10 onfocus="select()">
+
+<DIV id=divAltText style="left: 0.98em; top: 4.1067em; width: 6.58em; height: 1.2168em; ">Alternate Text:</DIV>
+<INPUT type=text ID=txtAltText tabIndex=15 style="left: 8.54em; top: 3.8025em; width: 21.5em; height: 2.1294em; " onfocus="select()">
+
+<FIELDSET id=fldLayout style="left: .9em; top: 7.1em; width: 17.08em; height: 7.6em;">
+<LEGEND id=lgdLayout>Layout</LEGEND>
+</FIELDSET>
+
+<FIELDSET id=fldSpacing style="left: 18.9em; top: 7.1em; width: 11em; height: 7.6em;">
+<LEGEND id=lgdSpacing>Spacing</LEGEND>
+</FIELDSET>
+
+<DIV id=divAlign style="left: 1.82em; top: 9.126em; width: 4.76em; height: 1.2168em; ">Alignment:</DIV>
+<SELECT size=1 ID=selAlignment tabIndex=20 style="left: 10.36em; top: 8.8218em; width: 6.72em; height: 1.2168em; ">
+<OPTION id=optNotSet value=""> Not set </OPTION>
+<OPTION id=optLeft value=left> Left </OPTION>
+<OPTION id=optRight value=right> Right </OPTION>
+<OPTION id=optTexttop value=textTop> Texttop </OPTION>
+<OPTION id=optAbsMiddle value=absMiddle> Absmiddle </OPTION>
+<OPTION id=optBaseline value=baseline SELECTED> Baseline </OPTION>
+<OPTION id=optAbsBottom value=absBottom> Absbottom </OPTION>
+<OPTION id=optBottom value=bottom> Bottom </OPTION>
+<OPTION id=optMiddle value=middle> Middle </OPTION>
+<OPTION id=optTop value=top> Top </OPTION>
+</SELECT>
+
+<DIV id=divHoriz style="left: 19.88em; top: 9.126em; width: 4.76em; height: 1.2168em; ">Horizontal:</DIV>
+<INPUT ID=txtHorizontal style="left: 24.92em; top: 8.8218em; width: 4.2em; height: 2.1294em; ime-mode: disabled;" type=text size=3 maxlength=3 value="" tabIndex=25 onfocus="select()">
+
+<DIV id=divBorder style="left: 1.82em; top: 12.0159em; width: 8.12em; height: 1.2168em; ">Border Thickness:</DIV>
+<INPUT ID=txtBorder style="left: 10.36em; top: 11.5596em; width: 6.72em; height: 2.1294em; ime-mode: disabled;" type=text size=3 maxlength=3 value="" tabIndex=21 onfocus="select()">
+
+<DIV id=divVert style="left: 19.88em; top: 12.0159em; width: 3.64em; height: 1.2168em; ">Vertical:</DIV>
+<INPUT ID=txtVertical style="left: 24.92em; top: 11.5596em; width: 4.2em; height: 2.1294em; ime-mode: disabled;" type=text size=3 maxlength=3 value="" tabIndex=30 onfocus="select()">
+
+<BUTTON ID=btnOK style="left: 31.36em; top: 1.0647em; width: 7em; height: 2.2em; " type=submit tabIndex=40>OK</BUTTON>
+<BUTTON ID=btnCancel style="left: 31.36em; top: 3.6504em; width: 7em; height: 2.2em; " type=reset tabIndex=45 onClick="window.close();">Cancel</BUTTON>
+
+</BODY>
 </HTML>
\ No newline at end of file

Modified: plog/trunk/js/htmlarea/popups/popup.js
===================================================================
--- plog/trunk/js/htmlarea/popups/popup.js	2005-02-05 13:57:52 UTC (rev 948)
+++ plog/trunk/js/htmlarea/popups/popup.js	2005-02-05 15:29:38 UTC (rev 949)
@@ -1,113 +1,114 @@
-// htmlArea v3.0 - Copyright (c) 2002, 2003 interactivetools.com, inc.
-// This copyright notice MUST stay intact for use (see license.txt).
-//
-// Portions (c) dynarch.com, 2003
-//
-// 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.
-//   http://dynarch.com/mishoo
-//
-// $Id: popup.js,v 1.8 2003/12/05 09:19:01 mishoo Exp $
-
-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 comboSelectValue(c, val) {
-	var ops = c.getElementsByTagName("option");
-	for (var i = ops.length; --i >= 0;) {
-		var op = ops[i];
-		op.selected = (op.value == val);
-	}
-	c.value = val;
-};
-
-function __dlg_onclose() {
-	opener.Dialog._return(null);
-};
-
-function __dlg_init(bottom) {
-	var body = document.body;
-	var body_height = 0;
-	if (typeof bottom == "undefined") {
-		var div = document.createElement("div");
-		body.appendChild(div);
-		var pos = getAbsolutePos(div);
-		body_height = pos.y;
-	} else {
-		var pos = getAbsolutePos(bottom);
-		body_height = pos.y + bottom.offsetHeight;
-	}
-	window.dialogArguments = opener.Dialog._arguments;
-	if (!document.all) {
-		window.sizeToContent();
-		window.sizeToContent();	// for reasons beyond understanding,
-					// only if we call it twice we get the
-					// correct size.
-		window.addEventListener("unload", __dlg_onclose, true);
-		// center on parent
-		var x = opener.screenX + (opener.outerWidth - window.outerWidth) / 2;
-		var y = opener.screenY + (opener.outerHeight - window.outerHeight) / 2;
-		window.moveTo(x, y);
-		window.innerWidth = body.offsetWidth + 5;
-		window.innerHeight = body_height + 2;
-	} else {
-		// window.dialogHeight = body.offsetHeight + 50 + "px";
-		// window.dialogWidth = body.offsetWidth + "px";
-		window.resizeTo(body.offsetWidth, body_height);
-		var ch = body.clientHeight;
-		var cw = body.clientWidth;
-		window.resizeBy(body.offsetWidth - cw, body_height - ch);
-		var W = body.offsetWidth;
-		var H = 2 * body_height - ch;
-		var x = (screen.availWidth - W) / 2;
-		var y = (screen.availHeight - H) / 2;
-		window.moveTo(x, y);
-	}
-	document.body.onkeypress = __dlg_close_on_esc;
-};
-
-function __dlg_translate(i18n) {
-	var types = ["span", "option", "td", "button", "div"];
-	for (var type in types) {
-		var spans = document.getElementsByTagName(types[type]);
-		for (var i = spans.length; --i >= 0;) {
-			var span = spans[i];
-			if (span.firstChild && span.firstChild.data) {
-				//var txt = i18n[span.firstChild.data];
-				//OSCAR:this doesn't work!!
-				var txt = (i18n != null ? i18n[span.firstChild.data] : span.firstChild.data);
-				if (txt)
-					span.firstChild.data = txt;
-			}
-		}
-	}
-	//OSCAR: this doesn't work!
-	//var txt = i18n[document.title];
-	var txt = (i18n != null ? i18n[document.title] : document.title);
-	if (txt)
-		document.title = txt;
-};
-
-// closes the dialog and passes the return info upper.
-function __dlg_close(val) {
-	opener.Dialog._return(val);
-	window.close();
-};
-
-function __dlg_close_on_esc(ev) {
-	ev || (ev = window.event);
-	if (ev.keyCode == 27) {
-		window.close();
-		return false;
-	}
-	return true;
-};
+// htmlArea v3.0 - Copyright (c) 2002, 2003 interactivetools.com, inc.
+// This copyright notice MUST stay intact for use (see license.txt).
+//
+// Portions (c) dynarch.com, 2003
+//
+// A free WYSIWYG editor replacement for <textarea> fields.
+// For full source code and docs, visit http://www.htmlarea.com/
+//
+// Version 3.0 developed by Mihai Bazon.
+//   http://dynarch.com/mishoo
+//
+// $Id: popup.js,v 1.12 2005/01/24 18:29:48 itools Exp $
+
+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 comboSelectValue(c, val) {
+	var ops = c.getElementsByTagName("option");
+	for (var i = ops.length; --i >= 0;) {
+		var op = ops[i];
+		op.selected = (op.value == val);
+	}
+	c.value = val;
+};
+
+function __dlg_onclose() {
+	opener.Dialog._return(null);
+};
+
+function __dlg_init(bottom) {
+	var body = document.body;
+	var body_height = 0;
+	if (typeof bottom == "undefined") {
+		var div = document.createElement("div");
+		body.appendChild(div);
+		var pos = getAbsolutePos(div);
+		body_height = pos.y;
+	} else {
+		var pos = getAbsolutePos(bottom);
+		body_height = pos.y + bottom.offsetHeight;
+	}
+	window.dialogArguments = opener.Dialog._arguments;
+	if (!document.all) {
+		window.sizeToContent();
+		window.sizeToContent();	// for reasons beyond understanding,
+					// only if we call it twice we get the
+					// correct size.
+		window.addEventListener("unload", __dlg_onclose, true);
+		window.innerWidth = body.offsetWidth + 5;
+		window.innerHeight = body_height + 2;
+		// center on parent
+		var x = opener.screenX + (opener.outerWidth - window.outerWidth) / 2;
+		var y = opener.screenY + (opener.outerHeight - window.outerHeight) / 2;
+		window.moveTo(x, y);
+	} else {
+		// window.dialogHeight = body.offsetHeight + 50 + "px";
+		// window.dialogWidth = body.offsetWidth + "px";
+		window.resizeTo(body.offsetWidth, body_height);
+		var ch = body.clientHeight;
+		var cw = body.clientWidth;
+		window.resizeBy(body.offsetWidth - cw, body_height - ch);
+		var W = body.offsetWidth;
+		var H = 2 * body_height - ch;
+		var x = (screen.availWidth - W) / 2;
+		var y = (screen.availHeight - H) / 2;
+		window.moveTo(x, y);
+	}
+	document.body.onkeypress = __dlg_close_on_esc;
+};
+
+function __dlg_translate(i18n) {
+	var types = ["input", "select", "legend", "span", "option", "td", "button", "div"];
+	for (var type = 0; type < types.length; ++type) {
+		var spans = document.getElementsByTagName(types[type]);
+		for (var i = spans.length; --i >= 0;) {
+			var span = spans[i];
+			if (span.firstChild && span.firstChild.data) {
+				var txt = i18n[span.firstChild.data];
+				if (txt)
+					span.firstChild.data = txt;
+			}
+                        if (span.title) {
+				var txt = i18n[span.title];
+				if (txt)
+					span.title = txt;
+                        }
+		}
+	}
+	var txt = i18n[document.title];
+	if (txt)
+		document.title = txt;
+};
+
+// closes the dialog and passes the return info upper.
+function __dlg_close(val) {
+	opener.Dialog._return(val);
+	window.close();
+};
+
+function __dlg_close_on_esc(ev) {
+	ev || (ev = window.event);
+	if (ev.keyCode == 27) {
+		window.close();
+		return false;
+	}
+	return true;
+};

Modified: plog/trunk/js/htmlarea/popups/select_color.html
===================================================================
--- plog/trunk/js/htmlarea/popups/select_color.html	2005-02-05 13:57:52 UTC (rev 948)
+++ plog/trunk/js/htmlarea/popups/select_color.html	2005-02-05 15:29:38 UTC (rev 949)
@@ -1,347 +1,347 @@
-<!-- note: this version of the color picker is optimized for IE 5.5+ only -->
-
-<html><head><title>Select Color</title>
-
-<script type="text/javascript" src="popup.js"></script>
-
-<script type="text/javascript">
-
-window.resizeTo(240, 182);
-function _CloseOnEsc() {
-  if (event.keyCode == 27) { window.close(); return; }
-}
-
-function Init() {                                                       // run on page load
-  __dlg_init();    // <!-- this can be found in popup.js -->
-  document.body.onkeypress = _CloseOnEsc;
-
-  var color = window.dialogArguments;
-  color = ValidateColor(color) || '000000';
-  View(color);                                                          // set default color
-}
-
-function View(color) {                  // preview color
-  document.getElementById("ColorPreview").style.backgroundColor = '#' + color;
-  document.getElementById("ColorHex").value = '#' + color;
-}
-
-function Set(string) {                   // select color
-  var color = ValidateColor(string);
-  if (color == null) { alert("Invalid color code: " + string); }        // invalid color
-  else {                                                                // valid color
-    View(color);                          // show selected color
-    __dlg_close(color);
-  }
-}
-
-function ValidateColor(string) {                // return valid color code
-  string = string || '';
-  string = string + "";
-  string = string.toUpperCase();
-  var chars = '0123456789ABCDEF';
-  var out   = '';
-
-  for (var i=0; i<string.length; i++) {             // remove invalid color chars
-    var schar = string.charAt(i);
-    if (chars.indexOf(schar) != -1) { out += schar; }
-  }
-
-  if (out.length != 6) { return null; }            // check length
-  return out;
-}
-
-</script>
-</head>
-<body style="background:ButtonFace; margin:0px; padding:0px" onload="Init()">
-
-<form method="get" style="margin:0px; padding:0px" onSubmit="Set(document.getElementById('ColorHex').value); return false;">
-<table border="0px" cellspacing="0px" cellpadding="4" width="100%">
- <tr>
-  <td style="background:buttonface" valign=center><div style="background-color: #000000; padding: 1; height: 21px; width: 50px"><div id="ColorPreview" style="height: 100%; width: 100%"></div></div></td>
-  <td style="background:buttonface" valign=center><input type="text" name="ColorHex"
-    id="ColorHex" value="" size=15 style="font-size: 12px"></td>
-  <td style="background:buttonface" width=100%></td>
- </tr>
-</table>
-</form>
-
-<table border="0" cellspacing="1px" cellpadding="0px" width="100%" bgcolor="#000000" style="cursor: hand;">
-<tr>
-<td bgcolor=#000000 onMouseOver=View('000000') onClick=Set('000000') height="10px" width="10px"></td>
-<td bgcolor=#000000 onMouseOver=View('000000') onClick=Set('000000') height="10px" width="10px"></td>
-<td bgcolor=#000000 onMouseOver=View('000000') onClick=Set('000000') height="10px" width="10px"></td>
-<td bgcolor=#000000 onMouseOver=View('000000') onClick=Set('000000') height="10px" width="10px"></td>
-<td bgcolor=#003300 onMouseOver=View('003300') onClick=Set('003300') height="10px" width="10px"></td>
-<td bgcolor=#006600 onMouseOver=View('006600') onClick=Set('006600') height="10px" width="10px"></td>
-<td bgcolor=#009900 onMouseOver=View('009900') onClick=Set('009900') height="10px" width="10px"></td>
-<td bgcolor=#00CC00 onMouseOver=View('00CC00') onClick=Set('00CC00') height="10px" width="10px"></td>
-<td bgcolor=#00FF00 onMouseOver=View('00FF00') onClick=Set('00FF00') height="10px" width="10px"></td>
-<td bgcolor=#330000 onMouseOver=View('330000') onClick=Set('330000') height="10px" width="10px"></td>
-<td bgcolor=#333300 onMouseOver=View('333300') onClick=Set('333300') height="10px" width="10px"></td>
-<td bgcolor=#336600 onMouseOver=View('336600') onClick=Set('336600') height="10px" width="10px"></td>
-<td bgcolor=#339900 onMouseOver=View('339900') onClick=Set('339900') height="10px" width="10px"></td>
-<td bgcolor=#33CC00 onMouseOver=View('33CC00') onClick=Set('33CC00') height="10px" width="10px"></td>
-<td bgcolor=#33FF00 onMouseOver=View('33FF00') onClick=Set('33FF00') height="10px" width="10px"></td>
-<td bgcolor=#660000 onMouseOver=View('660000') onClick=Set('660000') height="10px" width="10px"></td>
-<td bgcolor=#663300 onMouseOver=View('663300') onClick=Set('663300') height="10px" width="10px"></td>
-<td bgcolor=#666600 onMouseOver=View('666600') onClick=Set('666600') height="10px" width="10px"></td>
-<td bgcolor=#669900 onMouseOver=View('669900') onClick=Set('669900') height="10px" width="10px"></td>
-<td bgcolor=#66CC00 onMouseOver=View('66CC00') onClick=Set('66CC00') height="10px" width="10px"></td>
-<td bgcolor=#66FF00 onMouseOver=View('66FF00') onClick=Set('66FF00') height="10px" width="10px"></td>
-</tr>
-<tr>
-<td bgcolor=#000000 onMouseOver=View('000000') onClick=Set('000000') height="10px" width="10px"></td>
-<td bgcolor=#333333 onMouseOver=View('333333') onClick=Set('333333') height="10px" width="10px"></td>
-<td bgcolor=#000000 onMouseOver=View('000000') onClick=Set('000000') height="10px" width="10px"></td>
-<td bgcolor=#000033 onMouseOver=View('000033') onClick=Set('000033') height="10px" width="10px"></td>
-<td bgcolor=#003333 onMouseOver=View('003333') onClick=Set('003333') height="10px" width="10px"></td>
-<td bgcolor=#006633 onMouseOver=View('006633') onClick=Set('006633') height="10px" width="10px"></td>
-<td bgcolor=#009933 onMouseOver=View('009933') onClick=Set('009933') height="10px" width="10px"></td>
-<td bgcolor=#00CC33 onMouseOver=View('00CC33') onClick=Set('00CC33') height="10px" width="10px"></td>
-<td bgcolor=#00FF33 onMouseOver=View('00FF33') onClick=Set('00FF33') height="10px" width="10px"></td>
-<td bgcolor=#330033 onMouseOver=View('330033') onClick=Set('330033') height="10px" width="10px"></td>
-<td bgcolor=#333333 onMouseOver=View('333333') onClick=Set('333333') height="10px" width="10px"></td>
-<td bgcolor=#336633 onMouseOver=View('336633') onClick=Set('336633') height="10px" width="10px"></td>
-<td bgcolor=#339933 onMouseOver=View('339933') onClick=Set('339933') height="10px" width="10px"></td>
-<td bgcolor=#33CC33 onMouseOver=View('33CC33') onClick=Set('33CC33') height="10px" width="10px"></td>
-<td bgcolor=#33FF33 onMouseOver=View('33FF33') onClick=Set('33FF33') height="10px" width="10px"></td>
-<td bgcolor=#660033 onMouseOver=View('660033') onClick=Set('660033') height="10px" width="10px"></td>
-<td bgcolor=#663333 onMouseOver=View('663333') onClick=Set('663333') height="10px" width="10px"></td>
-<td bgcolor=#666633 onMouseOver=View('666633') onClick=Set('666633') height="10px" width="10px"></td>
-<td bgcolor=#669933 onMouseOver=View('669933') onClick=Set('669933') height="10px" width="10px"></td>
-<td bgcolor=#66CC33 onMouseOver=View('66CC33') onClick=Set('66CC33') height="10px" width="10px"></td>
-<td bgcolor=#66FF33 onMouseOver=View('66FF33') onClick=Set('66FF33') height="10px" width="10px"></td>
-</tr>
-<tr>
-<td bgcolor=#000000 onMouseOver=View('000000') onClick=Set('000000') height="10px" width="10px"></td>
-<td bgcolor=#666666 onMouseOver=View('666666') onClick=Set('666666') height="10px" width="10px"></td>
-<td bgcolor=#000000 onMouseOver=View('000000') onClick=Set('000000') height="10px" width="10px"></td>
-<td bgcolor=#000066 onMouseOver=View('000066') onClick=Set('000066') height="10px" width="10px"></td>
-<td bgcolor=#003366 onMouseOver=View('003366') onClick=Set('003366') height="10px" width="10px"></td>
-<td bgcolor=#006666 onMouseOver=View('006666') onClick=Set('006666') height="10px" width="10px"></td>
-<td bgcolor=#009966 onMouseOver=View('009966') onClick=Set('009966') height="10px" width="10px"></td>
-<td bgcolor=#00CC66 onMouseOver=View('00CC66') onClick=Set('00CC66') height="10px" width="10px"></td>
-<td bgcolor=#00FF66 onMouseOver=View('00FF66') onClick=Set('00FF66') height="10px" width="10px"></td>
-<td bgcolor=#330066 onMouseOver=View('330066') onClick=Set('330066') height="10px" width="10px"></td>
-<td bgcolor=#333366 onMouseOver=View('333366') onClick=Set('333366') height="10px" width="10px"></td>
-<td bgcolor=#336666 onMouseOver=View('336666') onClick=Set('336666') height="10px" width="10px"></td>
-<td bgcolor=#339966 onMouseOver=View('339966') onClick=Set('339966') height="10px" width="10px"></td>
-<td bgcolor=#33CC66 onMouseOver=View('33CC66') onClick=Set('33CC66') height="10px" width="10px"></td>
-<td bgcolor=#33FF66 onMouseOver=View('33FF66') onClick=Set('33FF66') height="10px" width="10px"></td>
-<td bgcolor=#660066 onMouseOver=View('660066') onClick=Set('660066') height="10px" width="10px"></td>
-<td bgcolor=#663366 onMouseOver=View('663366') onClick=Set('663366') height="10px" width="10px"></td>
-<td bgcolor=#666666 onMouseOver=View('666666') onClick=Set('666666') height="10px" width="10px"></td>
-<td bgcolor=#669966 onMouseOver=View('669966') onClick=Set('669966') height="10px" width="10px"></td>
-<td bgcolor=#66CC66 onMouseOver=View('66CC66') onClick=Set('66CC66') height="10px" width="10px"></td>
-<td bgcolor=#66FF66 onMouseOver=View('66FF66') onClick=Set('66FF66') height="10px" width="10px"></td>
-</tr>
-<tr>
-<td bgcolor=#000000 onMouseOver=View('000000') onClick=Set('000000') height="10px" width="10px"></td>
-<td bgcolor=#999999 onMouseOver=View('999999') onClick=Set('999999') height="10px" width="10px"></td>
-<td bgcolor=#000000 onMouseOver=View('000000') onClick=Set('000000') height="10px" width="10px"></td>
-<td bgcolor=#000099 onMouseOver=View('000099') onClick=Set('000099') height="10px" width="10px"></td>
-<td bgcolor=#003399 onMouseOver=View('003399') onClick=Set('003399') height="10px" width="10px"></td>
-<td bgcolor=#006699 onMouseOver=View('006699') onClick=Set('006699') height="10px" width="10px"></td>
-<td bgcolor=#009999 onMouseOver=View('009999') onClick=Set('009999') height="10px" width="10px"></td>
-<td bgcolor=#00CC99 onMouseOver=View('00CC99') onClick=Set('00CC99') height="10px" width="10px"></td>
-<td bgcolor=#00FF99 onMouseOver=View('00FF99') onClick=Set('00FF99') height="10px" width="10px"></td>
-<td bgcolor=#330099 onMouseOver=View('330099') onClick=Set('330099') height="10px" width="10px"></td>
-<td bgcolor=#333399 onMouseOver=View('333399') onClick=Set('333399') height="10px" width="10px"></td>
-<td bgcolor=#336699 onMouseOver=View('336699') onClick=Set('336699') height="10px" width="10px"></td>
-<td bgcolor=#339999 onMouseOver=View('339999') onClick=Set('339999') height="10px" width="10px"></td>
-<td bgcolor=#33CC99 onMouseOver=View('33CC99') onClick=Set('33CC99') height="10px" width="10px"></td>
-<td bgcolor=#33FF99 onMouseOver=View('33FF99') onClick=Set('33FF99') height="10px" width="10px"></td>
-<td bgcolor=#660099 onMouseOver=View('660099') onClick=Set('660099') height="10px" width="10px"></td>
-<td bgcolor=#663399 onMouseOver=View('663399') onClick=Set('663399') height="10px" width="10px"></td>
-<td bgcolor=#666699 onMouseOver=View('666699') onClick=Set('666699') height="10px" width="10px"></td>
-<td bgcolor=#669999 onMouseOver=View('669999') onClick=Set('669999') height="10px" width="10px"></td>
-<td bgcolor=#66CC99 onMouseOver=View('66CC99') onClick=Set('66CC99') height="10px" width="10px"></td>
-<td bgcolor=#66FF99 onMouseOver=View('66FF99') onClick=Set('66FF99') height="10px" width="10px"></td>
-</tr>
-<tr>
-<td bgcolor=#000000 onMouseOver=View('000000') onClick=Set('000000') height="10px" width="10px"></td>
-<td bgcolor=#CCCCCC onMouseOver=View('CCCCCC') onClick=Set('CCCCCC') height="10px" width="10px"></td>
-<td bgcolor=#000000 onMouseOver=View('000000') onClick=Set('000000') height="10px" width="10px"></td>
-<td bgcolor=#0000CC onMouseOver=View('0000CC') onClick=Set('0000CC') height="10px" width="10px"></td>
-<td bgcolor=#0033CC onMouseOver=View('0033CC') onClick=Set('0033CC') height="10px" width="10px"></td>
-<td bgcolor=#0066CC onMouseOver=View('0066CC') onClick=Set('0066CC') height="10px" width="10px"></td>
-<td bgcolor=#0099CC onMouseOver=View('0099CC') onClick=Set('0099CC') height="10px" width="10px"></td>
-<td bgcolor=#00CCCC onMouseOver=View('00CCCC') onClick=Set('00CCCC') height="10px" width="10px"></td>
-<td bgcolor=#00FFCC onMouseOver=View('00FFCC') onClick=Set('00FFCC') height="10px" width="10px"></td>
-<td bgcolor=#3300CC onMouseOver=View('3300CC') onClick=Set('3300CC') height="10px" width="10px"></td>
-<td bgcolor=#3333CC onMouseOver=View('3333CC') onClick=Set('3333CC') height="10px" width="10px"></td>
-<td bgcolor=#3366CC onMouseOver=View('3366CC') onClick=Set('3366CC') height="10px" width="10px"></td>
-<td bgcolor=#3399CC onMouseOver=View('3399CC') onClick=Set('3399CC') height="10px" width="10px"></td>
-<td bgcolor=#33CCCC onMouseOver=View('33CCCC') onClick=Set('33CCCC') height="10px" width="10px"></td>
-<td bgcolor=#33FFCC onMouseOver=View('33FFCC') onClick=Set('33FFCC') height="10px" width="10px"></td>
-<td bgcolor=#6600CC onMouseOver=View('6600CC') onClick=Set('6600CC') height="10px" width="10px"></td>
-<td bgcolor=#6633CC onMouseOver=View('6633CC') onClick=Set('6633CC') height="10px" width="10px"></td>
-<td bgcolor=#6666CC onMouseOver=View('6666CC') onClick=Set('6666CC') height="10px" width="10px"></td>
-<td bgcolor=#6699CC onMouseOver=View('6699CC') onClick=Set('6699CC') height="10px" width="10px"></td>
-<td bgcolor=#66CCCC onMouseOver=View('66CCCC') onClick=Set('66CCCC') height="10px" width="10px"></td>
-<td bgcolor=#66FFCC onMouseOver=View('66FFCC') onClick=Set('66FFCC') height="10px" width="10px"></td>
-</tr>
-<tr>
-<td bgcolor=#000000 onMouseOver=View('000000') onClick=Set('000000') height="10px" width="10px"></td>
-<td bgcolor=#FFFFFF onMouseOver=View('FFFFFF') onClick=Set('FFFFFF') height="10px" width="10px"></td>
-<td bgcolor=#000000 onMouseOver=View('000000') onClick=Set('000000') height="10px" width="10px"></td>
-<td bgcolor=#0000FF onMouseOver=View('0000FF') onClick=Set('0000FF') height="10px" width="10px"></td>
-<td bgcolor=#0033FF onMouseOver=View('0033FF') onClick=Set('0033FF') height="10px" width="10px"></td>
-<td bgcolor=#0066FF onMouseOver=View('0066FF') onClick=Set('0066FF') height="10px" width="10px"></td>
-<td bgcolor=#0099FF onMouseOver=View('0099FF') onClick=Set('0099FF') height="10px" width="10px"></td>
-<td bgcolor=#00CCFF onMouseOver=View('00CCFF') onClick=Set('00CCFF') height="10px" width="10px"></td>
-<td bgcolor=#00FFFF onMouseOver=View('00FFFF') onClick=Set('00FFFF') height="10px" width="10px"></td>
-<td bgcolor=#3300FF onMouseOver=View('3300FF') onClick=Set('3300FF') height="10px" width="10px"></td>
-<td bgcolor=#3333FF onMouseOver=View('3333FF') onClick=Set('3333FF') height="10px" width="10px"></td>
-<td bgcolor=#3366FF onMouseOver=View('3366FF') onClick=Set('3366FF') height="10px" width="10px"></td>
-<td bgcolor=#3399FF onMouseOver=View('3399FF') onClick=Set('3399FF') height="10px" width="10px"></td>
-<td bgcolor=#33CCFF onMouseOver=View('33CCFF') onClick=Set('33CCFF') height="10px" width="10px"></td>
-<td bgcolor=#33FFFF onMouseOver=View('33FFFF') onClick=Set('33FFFF') height="10px" width="10px"></td>
-<td bgcolor=#6600FF onMouseOver=View('6600FF') onClick=Set('6600FF') height="10px" width="10px"></td>
-<td bgcolor=#6633FF onMouseOver=View('6633FF') onClick=Set('6633FF') height="10px" width="10px"></td>
-<td bgcolor=#6666FF onMouseOver=View('6666FF') onClick=Set('6666FF') height="10px" width="10px"></td>
-<td bgcolor=#6699FF onMouseOver=View('6699FF') onClick=Set('6699FF') height="10px" width="10px"></td>
-<td bgcolor=#66CCFF onMouseOver=View('66CCFF') onClick=Set('66CCFF') height="10px" width="10px"></td>
-<td bgcolor=#66FFFF onMouseOver=View('66FFFF') onClick=Set('66FFFF') height="10px" width="10px"></td>
-</tr>
-<tr>
-<td bgcolor=#000000 onMouseOver=View('000000') onClick=Set('000000') height="10px" width="10px"></td>
-<td bgcolor=#FF0000 onMouseOver=View('FF0000') onClick=Set('FF0000') height="10px" width="10px"></td>
-<td bgcolor=#000000 onMouseOver=View('000000') onClick=Set('000000') height="10px" width="10px"></td>
-<td bgcolor=#990000 onMouseOver=View('990000') onClick=Set('990000') height="10px" width="10px"></td>
-<td bgcolor=#993300 onMouseOver=View('993300') onClick=Set('993300') height="10px" width="10px"></td>
-<td bgcolor=#996600 onMouseOver=View('996600') onClick=Set('996600') height="10px" width="10px"></td>
-<td bgcolor=#999900 onMouseOver=View('999900') onClick=Set('999900') height="10px" width="10px"></td>
-<td bgcolor=#99CC00 onMouseOver=View('99CC00') onClick=Set('99CC00') height="10px" width="10px"></td>
-<td bgcolor=#99FF00 onMouseOver=View('99FF00') onClick=Set('99FF00') height="10px" width="10px"></td>
-<td bgcolor=#CC0000 onMouseOver=View('CC0000') onClick=Set('CC0000') height="10px" width="10px"></td>
-<td bgcolor=#CC3300 onMouseOver=View('CC3300') onClick=Set('CC3300') height="10px" width="10px"></td>
-<td bgcolor=#CC6600 onMouseOver=View('CC6600') onClick=Set('CC6600') height="10px" width="10px"></td>
-<td bgcolor=#CC9900 onMouseOver=View('CC9900') onClick=Set('CC9900') height="10px" width="10px"></td>
-<td bgcolor=#CCCC00 onMouseOver=View('CCCC00') onClick=Set('CCCC00') height="10px" width="10px"></td>
-<td bgcolor=#CCFF00 onMouseOver=View('CCFF00') onClick=Set('CCFF00') height="10px" width="10px"></td>
-<td bgcolor=#FF0000 onMouseOver=View('FF0000') onClick=Set('FF0000') height="10px" width="10px"></td>
-<td bgcolor=#FF3300 onMouseOver=View('FF3300') onClick=Set('FF3300') height="10px" width="10px"></td>
-<td bgcolor=#FF6600 onMouseOver=View('FF6600') onClick=Set('FF6600') height="10px" width="10px"></td>
-<td bgcolor=#FF9900 onMouseOver=View('FF9900') onClick=Set('FF9900') height="10px" width="10px"></td>
-<td bgcolor=#FFCC00 onMouseOver=View('FFCC00') onClick=Set('FFCC00') height="10px" width="10px"></td>
-<td bgcolor=#FFFF00 onMouseOver=View('FFFF00') onClick=Set('FFFF00') height="10px" width="10px"></td>
-</tr>
-<tr>
-<td bgcolor=#000000 onMouseOver=View('000000') onClick=Set('000000') height="10px" width="10px"></td>
-<td bgcolor=#00FF00 onMouseOver=View('00FF00') onClick=Set('00FF00') height="10px" width="10px"></td>
-<td bgcolor=#000000 onMouseOver=View('000000') onClick=Set('000000') height="10px" width="10px"></td>
-<td bgcolor=#990033 onMouseOver=View('990033') onClick=Set('990033') height="10px" width="10px"></td>
-<td bgcolor=#993333 onMouseOver=View('993333') onClick=Set('993333') height="10px" width="10px"></td>
-<td bgcolor=#996633 onMouseOver=View('996633') onClick=Set('996633') height="10px" width="10px"></td>
-<td bgcolor=#999933 onMouseOver=View('999933') onClick=Set('999933') height="10px" width="10px"></td>
-<td bgcolor=#99CC33 onMouseOver=View('99CC33') onClick=Set('99CC33') height="10px" width="10px"></td>
-<td bgcolor=#99FF33 onMouseOver=View('99FF33') onClick=Set('99FF33') height="10px" width="10px"></td>
-<td bgcolor=#CC0033 onMouseOver=View('CC0033') onClick=Set('CC0033') height="10px" width="10px"></td>
-<td bgcolor=#CC3333 onMouseOver=View('CC3333') onClick=Set('CC3333') height="10px" width="10px"></td>
-<td bgcolor=#CC6633 onMouseOver=View('CC6633') onClick=Set('CC6633') height="10px" width="10px"></td>
-<td bgcolor=#CC9933 onMouseOver=View('CC9933') onClick=Set('CC9933') height="10px" width="10px"></td>
-<td bgcolor=#CCCC33 onMouseOver=View('CCCC33') onClick=Set('CCCC33') height="10px" width="10px"></td>
-<td bgcolor=#CCFF33 onMouseOver=View('CCFF33') onClick=Set('CCFF33') height="10px" width="10px"></td>
-<td bgcolor=#FF0033 onMouseOver=View('FF0033') onClick=Set('FF0033') height="10px" width="10px"></td>
-<td bgcolor=#FF3333 onMouseOver=View('FF3333') onClick=Set('FF3333') height="10px" width="10px"></td>
-<td bgcolor=#FF6633 onMouseOver=View('FF6633') onClick=Set('FF6633') height="10px" width="10px"></td>
-<td bgcolor=#FF9933 onMouseOver=View('FF9933') onClick=Set('FF9933') height="10px" width="10px"></td>
-<td bgcolor=#FFCC33 onMouseOver=View('FFCC33') onClick=Set('FFCC33') height="10px" width="10px"></td>
-<td bgcolor=#FFFF33 onMouseOver=View('FFFF33') onClick=Set('FFFF33') height="10px" width="10px"></td>
-</tr>
-<tr>
-<td bgcolor=#000000 onMouseOver=View('000000') onClick=Set('000000') height="10px" width="10px"></td>
-<td bgcolor=#0000FF onMouseOver=View('0000FF') onClick=Set('0000FF') height="10px" width="10px"></td>
-<td bgcolor=#000000 onMouseOver=View('000000') onClick=Set('000000') height="10px" width="10px"></td>
-<td bgcolor=#990066 onMouseOver=View('990066') onClick=Set('990066') height="10px" width="10px"></td>
-<td bgcolor=#993366 onMouseOver=View('993366') onClick=Set('993366') height="10px" width="10px"></td>
-<td bgcolor=#996666 onMouseOver=View('996666') onClick=Set('996666') height="10px" width="10px"></td>
-<td bgcolor=#999966 onMouseOver=View('999966') onClick=Set('999966') height="10px" width="10px"></td>
-<td bgcolor=#99CC66 onMouseOver=View('99CC66') onClick=Set('99CC66') height="10px" width="10px"></td>
-<td bgcolor=#99FF66 onMouseOver=View('99FF66') onClick=Set('99FF66') height="10px" width="10px"></td>
-<td bgcolor=#CC0066 onMouseOver=View('CC0066') onClick=Set('CC0066') height="10px" width="10px"></td>
-<td bgcolor=#CC3366 onMouseOver=View('CC3366') onClick=Set('CC3366') height="10px" width="10px"></td>
-<td bgcolor=#CC6666 onMouseOver=View('CC6666') onClick=Set('CC6666') height="10px" width="10px"></td>
-<td bgcolor=#CC9966 onMouseOver=View('CC9966') onClick=Set('CC9966') height="10px" width="10px"></td>
-<td bgcolor=#CCCC66 onMouseOver=View('CCCC66') onClick=Set('CCCC66') height="10px" width="10px"></td>
-<td bgcolor=#CCFF66 onMouseOver=View('CCFF66') onClick=Set('CCFF66') height="10px" width="10px"></td>
-<td bgcolor=#FF0066 onMouseOver=View('FF0066') onClick=Set('FF0066') height="10px" width="10px"></td>
-<td bgcolor=#FF3366 onMouseOver=View('FF3366') onClick=Set('FF3366') height="10px" width="10px"></td>
-<td bgcolor=#FF6666 onMouseOver=View('FF6666') onClick=Set('FF6666') height="10px" width="10px"></td>
-<td bgcolor=#FF9966 onMouseOver=View('FF9966') onClick=Set('FF9966') height="10px" width="10px"></td>
-<td bgcolor=#FFCC66 onMouseOver=View('FFCC66') onClick=Set('FFCC66') height="10px" width="10px"></td>
-<td bgcolor=#FFFF66 onMouseOver=View('FFFF66') onClick=Set('FFFF66') height="10px" width="10px"></td>
-</tr>
-<tr>
-<td bgcolor=#000000 onMouseOver=View('000000') onClick=Set('000000') height="10px" width="10px"></td>
-<td bgcolor=#FFFF00 onMouseOver=View('FFFF00') onClick=Set('FFFF00') height="10px" width="10px"></td>
-<td bgcolor=#000000 onMouseOver=View('000000') onClick=Set('000000') height="10px" width="10px"></td>
-<td bgcolor=#990099 onMouseOver=View('990099') onClick=Set('990099') height="10px" width="10px"></td>
-<td bgcolor=#993399 onMouseOver=View('993399') onClick=Set('993399') height="10px" width="10px"></td>
-<td bgcolor=#996699 onMouseOver=View('996699') onClick=Set('996699') height="10px" width="10px"></td>
-<td bgcolor=#999999 onMouseOver=View('999999') onClick=Set('999999') height="10px" width="10px"></td>
-<td bgcolor=#99CC99 onMouseOver=View('99CC99') onClick=Set('99CC99') height="10px" width="10px"></td>
-<td bgcolor=#99FF99 onMouseOver=View('99FF99') onClick=Set('99FF99') height="10px" width="10px"></td>
-<td bgcolor=#CC0099 onMouseOver=View('CC0099') onClick=Set('CC0099') height="10px" width="10px"></td>
-<td bgcolor=#CC3399 onMouseOver=View('CC3399') onClick=Set('CC3399') height="10px" width="10px"></td>
-<td bgcolor=#CC6699 onMouseOver=View('CC6699') onClick=Set('CC6699') height="10px" width="10px"></td>
-<td bgcolor=#CC9999 onMouseOver=View('CC9999') onClick=Set('CC9999') height="10px" width="10px"></td>
-<td bgcolor=#CCCC99 onMouseOver=View('CCCC99') onClick=Set('CCCC99') height="10px" width="10px"></td>
-<td bgcolor=#CCFF99 onMouseOver=View('CCFF99') onClick=Set('CCFF99') height="10px" width="10px"></td>
-<td bgcolor=#FF0099 onMouseOver=View('FF0099') onClick=Set('FF0099') height="10px" width="10px"></td>
-<td bgcolor=#FF3399 onMouseOver=View('FF3399') onClick=Set('FF3399') height="10px" width="10px"></td>
-<td bgcolor=#FF6699 onMouseOver=View('FF6699') onClick=Set('FF6699') height="10px" width="10px"></td>
-<td bgcolor=#FF9999 onMouseOver=View('FF9999') onClick=Set('FF9999') height="10px" width="10px"></td>
-<td bgcolor=#FFCC99 onMouseOver=View('FFCC99') onClick=Set('FFCC99') height="10px" width="10px"></td>
-<td bgcolor=#FFFF99 onMouseOver=View('FFFF99') onClick=Set('FFFF99') height="10px" width="10px"></td>
-</tr>
-<tr>
-<td bgcolor=#000000 onMouseOver=View('000000') onClick=Set('000000') height="10px" width="10px"></td>
-<td bgcolor=#00FFFF onMouseOver=View('00FFFF') onClick=Set('00FFFF') height="10px" width="10px"></td>
-<td bgcolor=#000000 onMouseOver=View('000000') onClick=Set('000000') height="10px" width="10px"></td>
-<td bgcolor=#9900CC onMouseOver=View('9900CC') onClick=Set('9900CC') height="10px" width="10px"></td>
-<td bgcolor=#9933CC onMouseOver=View('9933CC') onClick=Set('9933CC') height="10px" width="10px"></td>
-<td bgcolor=#9966CC onMouseOver=View('9966CC') onClick=Set('9966CC') height="10px" width="10px"></td>
-<td bgcolor=#9999CC onMouseOver=View('9999CC') onClick=Set('9999CC') height="10px" width="10px"></td>
-<td bgcolor=#99CCCC onMouseOver=View('99CCCC') onClick=Set('99CCCC') height="10px" width="10px"></td>
-<td bgcolor=#99FFCC onMouseOver=View('99FFCC') onClick=Set('99FFCC') height="10px" width="10px"></td>
-<td bgcolor=#CC00CC onMouseOver=View('CC00CC') onClick=Set('CC00CC') height="10px" width="10px"></td>
-<td bgcolor=#CC33CC onMouseOver=View('CC33CC') onClick=Set('CC33CC') height="10px" width="10px"></td>
-<td bgcolor=#CC66CC onMouseOver=View('CC66CC') onClick=Set('CC66CC') height="10px" width="10px"></td>
-<td bgcolor=#CC99CC onMouseOver=View('CC99CC') onClick=Set('CC99CC') height="10px" width="10px"></td>
-<td bgcolor=#CCCCCC onMouseOver=View('CCCCCC') onClick=Set('CCCCCC') height="10px" width="10px"></td>
-<td bgcolor=#CCFFCC onMouseOver=View('CCFFCC') onClick=Set('CCFFCC') height="10px" width="10px"></td>
-<td bgcolor=#FF00CC onMouseOver=View('FF00CC') onClick=Set('FF00CC') height="10px" width="10px"></td>
-<td bgcolor=#FF33CC onMouseOver=View('FF33CC') onClick=Set('FF33CC') height="10px" width="10px"></td>
-<td bgcolor=#FF66CC onMouseOver=View('FF66CC') onClick=Set('FF66CC') height="10px" width="10px"></td>
-<td bgcolor=#FF99CC onMouseOver=View('FF99CC') onClick=Set('FF99CC') height="10px" width="10px"></td>
-<td bgcolor=#FFCCCC onMouseOver=View('FFCCCC') onClick=Set('FFCCCC') height="10px" width="10px"></td>
-<td bgcolor=#FFFFCC onMouseOver=View('FFFFCC') onClick=Set('FFFFCC') height="10px" width="10px"></td>
-</tr>
-<tr>
-<td bgcolor=#000000 onMouseOver=View('000000') onClick=Set('000000') height="10px" width="10px"></td>
-<td bgcolor=#FF00FF onMouseOver=View('FF00FF') onClick=Set('FF00FF') height="10px" width="10px"></td>
-<td bgcolor=#000000 onMouseOver=View('000000') onClick=Set('000000') height="10px" width="10px"></td>
-<td bgcolor=#9900FF onMouseOver=View('9900FF') onClick=Set('9900FF') height="10px" width="10px"></td>
-<td bgcolor=#9933FF onMouseOver=View('9933FF') onClick=Set('9933FF') height="10px" width="10px"></td>
-<td bgcolor=#9966FF onMouseOver=View('9966FF') onClick=Set('9966FF') height="10px" width="10px"></td>
-<td bgcolor=#9999FF onMouseOver=View('9999FF') onClick=Set('9999FF') height="10px" width="10px"></td>
-<td bgcolor=#99CCFF onMouseOver=View('99CCFF') onClick=Set('99CCFF') height="10px" width="10px"></td>
-<td bgcolor=#99FFFF onMouseOver=View('99FFFF') onClick=Set('99FFFF') height="10px" width="10px"></td>
-<td bgcolor=#CC00FF onMouseOver=View('CC00FF') onClick=Set('CC00FF') height="10px" width="10px"></td>
-<td bgcolor=#CC33FF onMouseOver=View('CC33FF') onClick=Set('CC33FF') height="10px" width="10px"></td>
-<td bgcolor=#CC66FF onMouseOver=View('CC66FF') onClick=Set('CC66FF') height="10px" width="10px"></td>
-<td bgcolor=#CC99FF onMouseOver=View('CC99FF') onClick=Set('CC99FF') height="10px" width="10px"></td>
-<td bgcolor=#CCCCFF onMouseOver=View('CCCCFF') onClick=Set('CCCCFF') height="10px" width="10px"></td>
-<td bgcolor=#CCFFFF onMouseOver=View('CCFFFF') onClick=Set('CCFFFF') height="10px" width="10px"></td>
-<td bgcolor=#FF00FF onMouseOver=View('FF00FF') onClick=Set('FF00FF') height="10px" width="10px"></td>
-<td bgcolor=#FF33FF onMouseOver=View('FF33FF') onClick=Set('FF33FF') height="10px" width="10px"></td>
-<td bgcolor=#FF66FF onMouseOver=View('FF66FF') onClick=Set('FF66FF') height="10px" width="10px"></td>
-<td bgcolor=#FF99FF onMouseOver=View('FF99FF') onClick=Set('FF99FF') height="10px" width="10px"></td>
-<td bgcolor=#FFCCFF onMouseOver=View('FFCCFF') onClick=Set('FFCCFF') height="10px" width="10px"></td>
-<td bgcolor=#FFFFFF onMouseOver=View('FFFFFF') onClick=Set('FFFFFF') height="10px" width="10px"></td>
-</tr>
-</table>
-
-</body></html>
+<!-- note: this version of the color picker is optimized for IE 5.5+ only -->
+
+<html><head><title>Select Color</title>
+
+<script type="text/javascript" src="popup.js"></script>
+
+<script type="text/javascript">
+
+window.resizeTo(240, 182);
+function _CloseOnEsc() {
+  if (event.keyCode == 27) { window.close(); return; }
+}
+
+function Init() {                                                       // run on page load
+  __dlg_init();    // <!-- this can be found in popup.js -->
+  document.body.onkeypress = _CloseOnEsc;
+
+  var color = window.dialogArguments;
+  color = ValidateColor(color) || '000000';
+  View(color);                                                          // set default color
+}
+
+function View(color) {                  // preview color
+  document.getElementById("ColorPreview").style.backgroundColor = '#' + color;
+  document.getElementById("ColorHex").value = '#' + color;
+}
+
+function Set(string) {                   // select color
+  var color = ValidateColor(string);
+  if (color == null) { alert("Invalid color code: " + string); }        // invalid color
+  else {                                                                // valid color
+    View(color);                          // show selected color
+    __dlg_close(color);
+  }
+}
+
+function ValidateColor(string) {                // return valid color code
+  string = string || '';
+  string = string + "";
+  string = string.toUpperCase();
+  var chars = '0123456789ABCDEF';
+  var out   = '';
+
+  for (var i=0; i<string.length; i++) {             // remove invalid color chars
+    var schar = string.charAt(i);
+    if (chars.indexOf(schar) != -1) { out += schar; }
+  }
+
+  if (out.length != 6) { return null; }            // check length
+  return out;
+}
+
+</script>
+</head>
+<body style="background:ButtonFace; margin:0px; padding:0px" onload="Init()">
+
+<form method="get" style="margin:0px; padding:0px" onSubmit="Set(document.getElementById('ColorHex').value); return false;">
+<table border="0px" cellspacing="0px" cellpadding="4" width="100%">
+ <tr>
+  <td style="background:buttonface" valign=center><div style="background-color: #000000; padding: 1; height: 21px; width: 50px"><div id="ColorPreview" style="height: 100%; width: 100%"></div></div></td>
+  <td style="background:buttonface" valign=center><input type="text" name="ColorHex"
+    id="ColorHex" value="" size=15 style="font-size: 12px"></td>
+  <td style="background:buttonface" width=100%></td>
+ </tr>
+</table>
+</form>
+
+<table border="0" cellspacing="1px" cellpadding="0px" width="100%" bgcolor="#000000" style="cursor: hand;">
+<tr>
+<td bgcolor=#000000 onMouseOver=View('000000') onClick=Set('000000') height="10px" width="10px"></td>
+<td bgcolor=#000000 onMouseOver=View('000000') onClick=Set('000000') height="10px" width="10px"></td>
+<td bgcolor=#000000 onMouseOver=View('000000') onClick=Set('000000') height="10px" width="10px"></td>
+<td bgcolor=#000000 onMouseOver=View('000000') onClick=Set('000000') height="10px" width="10px"></td>
+<td bgcolor=#003300 onMouseOver=View('003300') onClick=Set('003300') height="10px" width="10px"></td>
+<td bgcolor=#006600 onMouseOver=View('006600') onClick=Set('006600') height="10px" width="10px"></td>
+<td bgcolor=#009900 onMouseOver=View('009900') onClick=Set('009900') height="10px" width="10px"></td>
+<td bgcolor=#00CC00 onMouseOver=View('00CC00') onClick=Set('00CC00') height="10px" width="10px"></td>
+<td bgcolor=#00FF00 onMouseOver=View('00FF00') onClick=Set('00FF00') height="10px" width="10px"></td>
+<td bgcolor=#330000 onMouseOver=View('330000') onClick=Set('330000') height="10px" width="10px"></td>
+<td bgcolor=#333300 onMouseOver=View('333300') onClick=Set('333300') height="10px" width="10px"></td>
+<td bgcolor=#336600 onMouseOver=View('336600') onClick=Set('336600') height="10px" width="10px"></td>
+<td bgcolor=#339900 onMouseOver=View('339900') onClick=Set('339900') height="10px" width="10px"></td>
+<td bgcolor=#33CC00 onMouseOver=View('33CC00') onClick=Set('33CC00') height="10px" width="10px"></td>
+<td bgcolor=#33FF00 onMouseOver=View('33FF00') onClick=Set('33FF00') height="10px" width="10px"></td>
+<td bgcolor=#660000 onMouseOver=View('660000') onClick=Set('660000') height="10px" width="10px"></td>
+<td bgcolor=#663300 onMouseOver=View('663300') onClick=Set('663300') height="10px" width="10px"></td>
+<td bgcolor=#666600 onMouseOver=View('666600') onClick=Set('666600') height="10px" width="10px"></td>
+<td bgcolor=#669900 onMouseOver=View('669900') onClick=Set('669900') height="10px" width="10px"></td>
+<td bgcolor=#66CC00 onMouseOver=View('66CC00') onClick=Set('66CC00') height="10px" width="10px"></td>
+<td bgcolor=#66FF00 onMouseOver=View('66FF00') onClick=Set('66FF00') height="10px" width="10px"></td>
+</tr>
+<tr>
+<td bgcolor=#000000 onMouseOver=View('000000') onClick=Set('000000') height="10px" width="10px"></td>
+<td bgcolor=#333333 onMouseOver=View('333333') onClick=Set('333333') height="10px" width="10px"></td>
+<td bgcolor=#000000 onMouseOver=View('000000') onClick=Set('000000') height="10px" width="10px"></td>
+<td bgcolor=#000033 onMouseOver=View('000033') onClick=Set('000033') height="10px" width="10px"></td>
+<td bgcolor=#003333 onMouseOver=View('003333') onClick=Set('003333') height="10px" width="10px"></td>
+<td bgcolor=#006633 onMouseOver=View('006633') onClick=Set('006633') height="10px" width="10px"></td>
+<td bgcolor=#009933 onMouseOver=View('009933') onClick=Set('009933') height="10px" width="10px"></td>
+<td bgcolor=#00CC33 onMouseOver=View('00CC33') onClick=Set('00CC33') height="10px" width="10px"></td>
+<td bgcolor=#00FF33 onMouseOver=View('00FF33') onClick=Set('00FF33') height="10px" width="10px"></td>
+<td bgcolor=#330033 onMouseOver=View('330033') onClick=Set('330033') height="10px" width="10px"></td>
+<td bgcolor=#333333 onMouseOver=View('333333') onClick=Set('333333') height="10px" width="10px"></td>
+<td bgcolor=#336633 onMouseOver=View('336633') onClick=Set('336633') height="10px" width="10px"></td>
+<td bgcolor=#339933 onMouseOver=View('339933') onClick=Set('339933') height="10px" width="10px"></td>
+<td bgcolor=#33CC33 onMouseOver=View('33CC33') onClick=Set('33CC33') height="10px" width="10px"></td>
+<td bgcolor=#33FF33 onMouseOver=View('33FF33') onClick=Set('33FF33') height="10px" width="10px"></td>
+<td bgcolor=#660033 onMouseOver=View('660033') onClick=Set('660033') height="10px" width="10px"></td>
+<td bgcolor=#663333 onMouseOver=View('663333') onClick=Set('663333') height="10px" width="10px"></td>
+<td bgcolor=#666633 onMouseOver=View('666633') onClick=Set('666633') height="10px" width="10px"></td>
+<td bgcolor=#669933 onMouseOver=View('669933') onClick=Set('669933') height="10px" width="10px"></td>
+<td bgcolor=#66CC33 onMouseOver=View('66CC33') onClick=Set('66CC33') height="10px" width="10px"></td>
+<td bgcolor=#66FF33 onMouseOver=View('66FF33') onClick=Set('66FF33') height="10px" width="10px"></td>
+</tr>
+<tr>
+<td bgcolor=#000000 onMouseOver=View('000000') onClick=Set('000000') height="10px" width="10px"></td>
+<td bgcolor=#666666 onMouseOver=View('666666') onClick=Set('666666') height="10px" width="10px"></td>
+<td bgcolor=#000000 onMouseOver=View('000000') onClick=Set('000000') height="10px" width="10px"></td>
+<td bgcolor=#000066 onMouseOver=View('000066') onClick=Set('000066') height="10px" width="10px"></td>
+<td bgcolor=#003366 onMouseOver=View('003366') onClick=Set('003366') height="10px" width="10px"></td>
+<td bgcolor=#006666 onMouseOver=View('006666') onClick=Set('006666') height="10px" width="10px"></td>
+<td bgcolor=#009966 onMouseOver=View('009966') onClick=Set('009966') height="10px" width="10px"></td>
+<td bgcolor=#00CC66 onMouseOver=View('00CC66') onClick=Set('00CC66') height="10px" width="10px"></td>
+<td bgcolor=#00FF66 onMouseOver=View('00FF66') onClick=Set('00FF66') height="10px" width="10px"></td>
+<td bgcolor=#330066 onMouseOver=View('330066') onClick=Set('330066') height="10px" width="10px"></td>
+<td bgcolor=#333366 onMouseOver=View('333366') onClick=Set('333366') height="10px" width="10px"></td>
+<td bgcolor=#336666 onMouseOver=View('336666') onClick=Set('336666') height="10px" width="10px"></td>
+<td bgcolor=#339966 onMouseOver=View('339966') onClick=Set('339966') height="10px" width="10px"></td>
+<td bgcolor=#33CC66 onMouseOver=View('33CC66') onClick=Set('33CC66') height="10px" width="10px"></td>
+<td bgcolor=#33FF66 onMouseOver=View('33FF66') onClick=Set('33FF66') height="10px" width="10px"></td>
+<td bgcolor=#660066 onMouseOver=View('660066') onClick=Set('660066') height="10px" width="10px"></td>
+<td bgcolor=#663366 onMouseOver=View('663366') onClick=Set('663366') height="10px" width="10px"></td>
+<td bgcolor=#666666 onMouseOver=View('666666') onClick=Set('666666') height="10px" width="10px"></td>
+<td bgcolor=#669966 onMouseOver=View('669966') onClick=Set('669966') height="10px" width="10px"></td>
+<td bgcolor=#66CC66 onMouseOver=View('66CC66') onClick=Set('66CC66') height="10px" width="10px"></td>
+<td bgcolor=#66FF66 onMouseOver=View('66FF66') onClick=Set('66FF66') height="10px" width="10px"></td>
+</tr>
+<tr>
+<td bgcolor=#000000 onMouseOver=View('000000') onClick=Set('000000') height="10px" width="10px"></td>
+<td bgcolor=#999999 onMouseOver=View('999999') onClick=Set('999999') height="10px" width="10px"></td>
+<td bgcolor=#000000 onMouseOver=View('000000') onClick=Set('000000') height="10px" width="10px"></td>
+<td bgcolor=#000099 onMouseOver=View('000099') onClick=Set('000099') height="10px" width="10px"></td>
+<td bgcolor=#003399 onMouseOver=View('003399') onClick=Set('003399') height="10px" width="10px"></td>
+<td bgcolor=#006699 onMouseOver=View('006699') onClick=Set('006699') height="10px" width="10px"></td>
+<td bgcolor=#009999 onMouseOver=View('009999') onClick=Set('009999') height="10px" width="10px"></td>
+<td bgcolor=#00CC99 onMouseOver=View('00CC99') onClick=Set('00CC99') height="10px" width="10px"></td>
+<td bgcolor=#00FF99 onMouseOver=View('00FF99') onClick=Set('00FF99') height="10px" width="10px"></td>
+<td bgcolor=#330099 onMouseOver=View('330099') onClick=Set('330099') height="10px" width="10px"></td>
+<td bgcolor=#333399 onMouseOver=View('333399') onClick=Set('333399') height="10px" width="10px"></td>
+<td bgcolor=#336699 onMouseOver=View('336699') onClick=Set('336699') height="10px" width="10px"></td>
+<td bgcolor=#339999 onMouseOver=View('339999') onClick=Set('339999') height="10px" width="10px"></td>
+<td bgcolor=#33CC99 onMouseOver=View('33CC99') onClick=Set('33CC99') height="10px" width="10px"></td>
+<td bgcolor=#33FF99 onMouseOver=View('33FF99') onClick=Set('33FF99') height="10px" width="10px"></td>
+<td bgcolor=#660099 onMouseOver=View('660099') onClick=Set('660099') height="10px" width="10px"></td>
+<td bgcolor=#663399 onMouseOver=View('663399') onClick=Set('663399') height="10px" width="10px"></td>
+<td bgcolor=#666699 onMouseOver=View('666699') onClick=Set('666699') height="10px" width="10px"></td>
+<td bgcolor=#669999 onMouseOver=View('669999') onClick=Set('669999') height="10px" width="10px"></td>
+<td bgcolor=#66CC99 onMouseOver=View('66CC99') onClick=Set('66CC99') height="10px" width="10px"></td>
+<td bgcolor=#66FF99 onMouseOver=View('66FF99') onClick=Set('66FF99') height="10px" width="10px"></td>
+</tr>
+<tr>
+<td bgcolor=#000000 onMouseOver=View('000000') onClick=Set('000000') height="10px" width="10px"></td>
+<td bgcolor=#CCCCCC onMouseOver=View('CCCCCC') onClick=Set('CCCCCC') height="10px" width="10px"></td>
+<td bgcolor=#000000 onMouseOver=View('000000') onClick=Set('000000') height="10px" width="10px"></td>
+<td bgcolor=#0000CC onMouseOver=View('0000CC') onClick=Set('0000CC') height="10px" width="10px"></td>
+<td bgcolor=#0033CC onMouseOver=View('0033CC') onClick=Set('0033CC') height="10px" width="10px"></td>
+<td bgcolor=#0066CC onMouseOver=View('0066CC') onClick=Set('0066CC') height="10px" width="10px"></td>
+<td bgcolor=#0099CC onMouseOver=View('0099CC') onClick=Set('0099CC') height="10px" width="10px"></td>
+<td bgcolor=#00CCCC onMouseOver=View('00CCCC') onClick=Set('00CCCC') height="10px" width="10px"></td>
+<td bgcolor=#00FFCC onMouseOver=View('00FFCC') onClick=Set('00FFCC') height="10px" width="10px"></td>
+<td bgcolor=#3300CC onMouseOver=View('3300CC') onClick=Set('3300CC') height="10px" width="10px"></td>
+<td bgcolor=#3333CC onMouseOver=View('3333CC') onClick=Set('3333CC') height="10px" width="10px"></td>
+<td bgcolor=#3366CC onMouseOver=View('3366CC') onClick=Set('3366CC') height="10px" width="10px"></td>
+<td bgcolor=#3399CC onMouseOver=View('3399CC') onClick=Set('3399CC') height="10px" width="10px"></td>
+<td bgcolor=#33CCCC onMouseOver=View('33CCCC') onClick=Set('33CCCC') height="10px" width="10px"></td>
+<td bgcolor=#33FFCC onMouseOver=View('33FFCC') onClick=Set('33FFCC') height="10px" width="10px"></td>
+<td bgcolor=#6600CC onMouseOver=View('6600CC') onClick=Set('6600CC') height="10px" width="10px"></td>
+<td bgcolor=#6633CC onMouseOver=View('6633CC') onClick=Set('6633CC') height="10px" width="10px"></td>
+<td bgcolor=#6666CC onMouseOver=View('6666CC') onClick=Set('6666CC') height="10px" width="10px"></td>
+<td bgcolor=#6699CC onMouseOver=View('6699CC') onClick=Set('6699CC') height="10px" width="10px"></td>
+<td bgcolor=#66CCCC onMouseOver=View('66CCCC') onClick=Set('66CCCC') height="10px" width="10px"></td>
+<td bgcolor=#66FFCC onMouseOver=View('66FFCC') onClick=Set('66FFCC') height="10px" width="10px"></td>
+</tr>
+<tr>
+<td bgcolor=#000000 onMouseOver=View('000000') onClick=Set('000000') height="10px" width="10px"></td>
+<td bgcolor=#FFFFFF onMouseOver=View('FFFFFF') onClick=Set('FFFFFF') height="10px" width="10px"></td>
+<td bgcolor=#000000 onMouseOver=View('000000') onClick=Set('000000') height="10px" width="10px"></td>
+<td bgcolor=#0000FF onMouseOver=View('0000FF') onClick=Set('0000FF') height="10px" width="10px"></td>
+<td bgcolor=#0033FF onMouseOver=View('0033FF') onClick=Set('0033FF') height="10px" width="10px"></td>
+<td bgcolor=#0066FF onMouseOver=View('0066FF') onClick=Set('0066FF') height="10px" width="10px"></td>
+<td bgcolor=#0099FF onMouseOver=View('0099FF') onClick=Set('0099FF') height="10px" width="10px"></td>
+<td bgcolor=#00CCFF onMouseOver=View('00CCFF') onClick=Set('00CCFF') height="10px" width="10px"></td>
+<td bgcolor=#00FFFF onMouseOver=View('00FFFF') onClick=Set('00FFFF') height="10px" width="10px"></td>
+<td bgcolor=#3300FF onMouseOver=View('3300FF') onClick=Set('3300FF') height="10px" width="10px"></td>
+<td bgcolor=#3333FF onMouseOver=View('3333FF') onClick=Set('3333FF') height="10px" width="10px"></td>
+<td bgcolor=#3366FF onMouseOver=View('3366FF') onClick=Set('3366FF') height="10px" width="10px"></td>
+<td bgcolor=#3399FF onMouseOver=View('3399FF') onClick=Set('3399FF') height="10px" width="10px"></td>
+<td bgcolor=#33CCFF onMouseOver=View('33CCFF') onClick=Set('33CCFF') height="10px" width="10px"></td>
+<td bgcolor=#33FFFF onMouseOver=View('33FFFF') onClick=Set('33FFFF') height="10px" width="10px"></td>
+<td bgcolor=#6600FF onMouseOver=View('6600FF') onClick=Set('6600FF') height="10px" width="10px"></td>
+<td bgcolor=#6633FF onMouseOver=View('6633FF') onClick=Set('6633FF') height="10px" width="10px"></td>
+<td bgcolor=#6666FF onMouseOver=View('6666FF') onClick=Set('6666FF') height="10px" width="10px"></td>
+<td bgcolor=#6699FF onMouseOver=View('6699FF') onClick=Set('6699FF') height="10px" width="10px"></td>
+<td bgcolor=#66CCFF onMouseOver=View('66CCFF') onClick=Set('66CCFF') height="10px" width="10px"></td>
+<td bgcolor=#66FFFF onMouseOver=View('66FFFF') onClick=Set('66FFFF') height="10px" width="10px"></td>
+</tr>
+<tr>
+<td bgcolor=#000000 onMouseOver=View('000000') onClick=Set('000000') height="10px" width="10px"></td>
+<td bgcolor=#FF0000 onMouseOver=View('FF0000') onClick=Set('FF0000') height="10px" width="10px"></td>
+<td bgcolor=#000000 onMouseOver=View('000000') onClick=Set('000000') height="10px" width="10px"></td>
+<td bgcolor=#990000 onMouseOver=View('990000') onClick=Set('990000') height="10px" width="10px"></td>
+<td bgcolor=#993300 onMouseOver=View('993300') onClick=Set('993300') height="10px" width="10px"></td>
+<td bgcolor=#996600 onMouseOver=View('996600') onClick=Set('996600') height="10px" width="10px"></td>
+<td bgcolor=#999900 onMouseOver=View('999900') onClick=Set('999900') height="10px" width="10px"></td>
+<td bgcolor=#99CC00 onMouseOver=View('99CC00') onClick=Set('99CC00') height="10px" width="10px"></td>
+<td bgcolor=#99FF00 onMouseOver=View('99FF00') onClick=Set('99FF00') height="10px" width="10px"></td>
+<td bgcolor=#CC0000 onMouseOver=View('CC0000') onClick=Set('CC0000') height="10px" width="10px"></td>
+<td bgcolor=#CC3300 onMouseOver=View('CC3300') onClick=Set('CC3300') height="10px" width="10px"></td>
+<td bgcolor=#CC6600 onMouseOver=View('CC6600') onClick=Set('CC6600') height="10px" width="10px"></td>
+<td bgcolor=#CC9900 onMouseOver=View('CC9900') onClick=Set('CC9900') height="10px" width="10px"></td>
+<td bgcolor=#CCCC00 onMouseOver=View('CCCC00') onClick=Set('CCCC00') height="10px" width="10px"></td>
+<td bgcolor=#CCFF00 onMouseOver=View('CCFF00') onClick=Set('CCFF00') height="10px" width="10px"></td>
+<td bgcolor=#FF0000 onMouseOver=View('FF0000') onClick=Set('FF0000') height="10px" width="10px"></td>
+<td bgcolor=#FF3300 onMouseOver=View('FF3300') onClick=Set('FF3300') height="10px" width="10px"></td>
+<td bgcolor=#FF6600 onMouseOver=View('FF6600') onClick=Set('FF6600') height="10px" width="10px"></td>
+<td bgcolor=#FF9900 onMouseOver=View('FF9900') onClick=Set('FF9900') height="10px" width="10px"></td>
+<td bgcolor=#FFCC00 onMouseOver=View('FFCC00') onClick=Set('FFCC00') height="10px" width="10px"></td>
+<td bgcolor=#FFFF00 onMouseOver=View('FFFF00') onClick=Set('FFFF00') height="10px" width="10px"></td>
+</tr>
+<tr>
+<td bgcolor=#000000 onMouseOver=View('000000') onClick=Set('000000') height="10px" width="10px"></td>
+<td bgcolor=#00FF00 onMouseOver=View('00FF00') onClick=Set('00FF00') height="10px" width="10px"></td>
+<td bgcolor=#000000 onMouseOver=View('000000') onClick=Set('000000') height="10px" width="10px"></td>
+<td bgcolor=#990033 onMouseOver=View('990033') onClick=Set('990033') height="10px" width="10px"></td>
+<td bgcolor=#993333 onMouseOver=View('993333') onClick=Set('993333') height="10px" width="10px"></td>
+<td bgcolor=#996633 onMouseOver=View('996633') onClick=Set('996633') height="10px" width="10px"></td>
+<td bgcolor=#999933 onMouseOver=View('999933') onClick=Set('999933') height="10px" width="10px"></td>
+<td bgcolor=#99CC33 onMouseOver=View('99CC33') onClick=Set('99CC33') height="10px" width="10px"></td>
+<td bgcolor=#99FF33 onMouseOver=View('99FF33') onClick=Set('99FF33') height="10px" width="10px"></td>
+<td bgcolor=#CC0033 onMouseOver=View('CC0033') onClick=Set('CC0033') height="10px" width="10px"></td>
+<td bgcolor=#CC3333 onMouseOver=View('CC3333') onClick=Set('CC3333') height="10px" width="10px"></td>
+<td bgcolor=#CC6633 onMouseOver=View('CC6633') onClick=Set('CC6633') height="10px" width="10px"></td>
+<td bgcolor=#CC9933 onMouseOver=View('CC9933') onClick=Set('CC9933') height="10px" width="10px"></td>
+<td bgcolor=#CCCC33 onMouseOver=View('CCCC33') onClick=Set('CCCC33') height="10px" width="10px"></td>
+<td bgcolor=#CCFF33 onMouseOver=View('CCFF33') onClick=Set('CCFF33') height="10px" width="10px"></td>
+<td bgcolor=#FF0033 onMouseOver=View('FF0033') onClick=Set('FF0033') height="10px" width="10px"></td>
+<td bgcolor=#FF3333 onMouseOver=View('FF3333') onClick=Set('FF3333') height="10px" width="10px"></td>
+<td bgcolor=#FF6633 onMouseOver=View('FF6633') onClick=Set('FF6633') height="10px" width="10px"></td>
+<td bgcolor=#FF9933 onMouseOver=View('FF9933') onClick=Set('FF9933') height="10px" width="10px"></td>
+<td bgcolor=#FFCC33 onMouseOver=View('FFCC33') onClick=Set('FFCC33') height="10px" width="10px"></td>
+<td bgcolor=#FFFF33 onMouseOver=View('FFFF33') onClick=Set('FFFF33') height="10px" width="10px"></td>
+</tr>
+<tr>
+<td bgcolor=#000000 onMouseOver=View('000000') onClick=Set('000000') height="10px" width="10px"></td>
+<td bgcolor=#0000FF onMouseOver=View('0000FF') onClick=Set('0000FF') height="10px" width="10px"></td>
+<td bgcolor=#000000 onMouseOver=View('000000') onClick=Set('000000') height="10px" width="10px"></td>
+<td bgcolor=#990066 onMouseOver=View('990066') onClick=Set('990066') height="10px" width="10px"></td>
+<td bgcolor=#993366 onMouseOver=View('993366') onClick=Set('993366') height="10px" width="10px"></td>
+<td bgcolor=#996666 onMouseOver=View('996666') onClick=Set('996666') height="10px" width="10px"></td>
+<td bgcolor=#999966 onMouseOver=View('999966') onClick=Set('999966') height="10px" width="10px"></td>
+<td bgcolor=#99CC66 onMouseOver=View('99CC66') onClick=Set('99CC66') height="10px" width="10px"></td>
+<td bgcolor=#99FF66 onMouseOver=View('99FF66') onClick=Set('99FF66') height="10px" width="10px"></td>
+<td bgcolor=#CC0066 onMouseOver=View('CC0066') onClick=Set('CC0066') height="10px" width="10px"></td>
+<td bgcolor=#CC3366 onMouseOver=View('CC3366') onClick=Set('CC3366') height="10px" width="10px"></td>
+<td bgcolor=#CC6666 onMouseOver=View('CC6666') onClick=Set('CC6666') height="10px" width="10px"></td>
+<td bgcolor=#CC9966 onMouseOver=View('CC9966') onClick=Set('CC9966') height="10px" width="10px"></td>
+<td bgcolor=#CCCC66 onMouseOver=View('CCCC66') onClick=Set('CCCC66') height="10px" width="10px"></td>
+<td bgcolor=#CCFF66 onMouseOver=View('CCFF66') onClick=Set('CCFF66') height="10px" width="10px"></td>
+<td bgcolor=#FF0066 onMouseOver=View('FF0066') onClick=Set('FF0066') height="10px" width="10px"></td>
+<td bgcolor=#FF3366 onMouseOver=View('FF3366') onClick=Set('FF3366') height="10px" width="10px"></td>
+<td bgcolor=#FF6666 onMouseOver=View('FF6666') onClick=Set('FF6666') height="10px" width="10px"></td>
+<td bgcolor=#FF9966 onMouseOver=View('FF9966') onClick=Set('FF9966') height="10px" width="10px"></td>
+<td bgcolor=#FFCC66 onMouseOver=View('FFCC66') onClick=Set('FFCC66') height="10px" width="10px"></td>
+<td bgcolor=#FFFF66 onMouseOver=View('FFFF66') onClick=Set('FFFF66') height="10px" width="10px"></td>
+</tr>
+<tr>
+<td bgcolor=#000000 onMouseOver=View('000000') onClick=Set('000000') height="10px" width="10px"></td>
+<td bgcolor=#FFFF00 onMouseOver=View('FFFF00') onClick=Set('FFFF00') height="10px" width="10px"></td>
+<td bgcolor=#000000 onMouseOver=View('000000') onClick=Set('000000') height="10px" width="10px"></td>
+<td bgcolor=#990099 onMouseOver=View('990099') onClick=Set('990099') height="10px" width="10px"></td>
+<td bgcolor=#993399 onMouseOver=View('993399') onClick=Set('993399') height="10px" width="10px"></td>
+<td bgcolor=#996699 onMouseOver=View('996699') onClick=Set('996699') height="10px" width="10px"></td>
+<td bgcolor=#999999 onMouseOver=View('999999') onClick=Set('999999') height="10px" width="10px"></td>
+<td bgcolor=#99CC99 onMouseOver=View('99CC99') onClick=Set('99CC99') height="10px" width="10px"></td>
+<td bgcolor=#99FF99 onMouseOver=View('99FF99') onClick=Set('99FF99') height="10px" width="10px"></td>
+<td bgcolor=#CC0099 onMouseOver=View('CC0099') onClick=Set('CC0099') height="10px" width="10px"></td>
+<td bgcolor=#CC3399 onMouseOver=View('CC3399') onClick=Set('CC3399') height="10px" width="10px"></td>
+<td bgcolor=#CC6699 onMouseOver=View('CC6699') onClick=Set('CC6699') height="10px" width="10px"></td>
+<td bgcolor=#CC9999 onMouseOver=View('CC9999') onClick=Set('CC9999') height="10px" width="10px"></td>
+<td bgcolor=#CCCC99 onMouseOver=View('CCCC99') onClick=Set('CCCC99') height="10px" width="10px"></td>
+<td bgcolor=#CCFF99 onMouseOver=View('CCFF99') onClick=Set('CCFF99') height="10px" width="10px"></td>
+<td bgcolor=#FF0099 onMouseOver=View('FF0099') onClick=Set('FF0099') height="10px" width="10px"></td>
+<td bgcolor=#FF3399 onMouseOver=View('FF3399') onClick=Set('FF3399') height="10px" width="10px"></td>
+<td bgcolor=#FF6699 onMouseOver=View('FF6699') onClick=Set('FF6699') height="10px" width="10px"></td>
+<td bgcolor=#FF9999 onMouseOver=View('FF9999') onClick=Set('FF9999') height="10px" width="10px"></td>
+<td bgcolor=#FFCC99 onMouseOver=View('FFCC99') onClick=Set('FFCC99') height="10px" width="10px"></td>
+<td bgcolor=#FFFF99 onMouseOver=View('FFFF99') onClick=Set('FFFF99') height="10px" width="10px"></td>
+</tr>
+<tr>
+<td bgcolor=#000000 onMouseOver=View('000000') onClick=Set('000000') height="10px" width="10px"></td>
+<td bgcolor=#00FFFF onMouseOver=View('00FFFF') onClick=Set('00FFFF') height="10px" width="10px"></td>
+<td bgcolor=#000000 onMouseOver=View('000000') onClick=Set('000000') height="10px" width="10px"></td>
+<td bgcolor=#9900CC onMouseOver=View('9900CC') onClick=Set('9900CC') height="10px" width="10px"></td>
+<td bgcolor=#9933CC onMouseOver=View('9933CC') onClick=Set('9933CC') height="10px" width="10px"></td>
+<td bgcolor=#9966CC onMouseOver=View('9966CC') onClick=Set('9966CC') height="10px" width="10px"></td>
+<td bgcolor=#9999CC onMouseOver=View('9999CC') onClick=Set('9999CC') height="10px" width="10px"></td>
+<td bgcolor=#99CCCC onMouseOver=View('99CCCC') onClick=Set('99CCCC') height="10px" width="10px"></td>
+<td bgcolor=#99FFCC onMouseOver=View('99FFCC') onClick=Set('99FFCC') height="10px" width="10px"></td>
+<td bgcolor=#CC00CC onMouseOver=View('CC00CC') onClick=Set('CC00CC') height="10px" width="10px"></td>
+<td bgcolor=#CC33CC onMouseOver=View('CC33CC') onClick=Set('CC33CC') height="10px" width="10px"></td>
+<td bgcolor=#CC66CC onMouseOver=View('CC66CC') onClick=Set('CC66CC') height="10px" width="10px"></td>
+<td bgcolor=#CC99CC onMouseOver=View('CC99CC') onClick=Set('CC99CC') height="10px" width="10px"></td>
+<td bgcolor=#CCCCCC onMouseOver=View('CCCCCC') onClick=Set('CCCCCC') height="10px" width="10px"></td>
+<td bgcolor=#CCFFCC onMouseOver=View('CCFFCC') onClick=Set('CCFFCC') height="10px" width="10px"></td>
+<td bgcolor=#FF00CC onMouseOver=View('FF00CC') onClick=Set('FF00CC') height="10px" width="10px"></td>
+<td bgcolor=#FF33CC onMouseOver=View('FF33CC') onClick=Set('FF33CC') height="10px" width="10px"></td>
+<td bgcolor=#FF66CC onMouseOver=View('FF66CC') onClick=Set('FF66CC') height="10px" width="10px"></td>
+<td bgcolor=#FF99CC onMouseOver=View('FF99CC') onClick=Set('FF99CC') height="10px" width="10px"></td>
+<td bgcolor=#FFCCCC onMouseOver=View('FFCCCC') onClick=Set('FFCCCC') height="10px" width="10px"></td>
+<td bgcolor=#FFFFCC onMouseOver=View('FFFFCC') onClick=Set('FFFFCC') height="10px" width="10px"></td>
+</tr>
+<tr>
+<td bgcolor=#000000 onMouseOver=View('000000') onClick=Set('000000') height="10px" width="10px"></td>
+<td bgcolor=#FF00FF onMouseOver=View('FF00FF') onClick=Set('FF00FF') height="10px" width="10px"></td>
+<td bgcolor=#000000 onMouseOver=View('000000') onClick=Set('000000') height="10px" width="10px"></td>
+<td bgcolor=#9900FF onMouseOver=View('9900FF') onClick=Set('9900FF') height="10px" width="10px"></td>
+<td bgcolor=#9933FF onMouseOver=View('9933FF') onClick=Set('9933FF') height="10px" width="10px"></td>
+<td bgcolor=#9966FF onMouseOver=View('9966FF') onClick=Set('9966FF') height="10px" width="10px"></td>
+<td bgcolor=#9999FF onMouseOver=View('9999FF') onClick=Set('9999FF') height="10px" width="10px"></td>
+<td bgcolor=#99CCFF onMouseOver=View('99CCFF') onClick=Set('99CCFF') height="10px" width="10px"></td>
+<td bgcolor=#99FFFF onMouseOver=View('99FFFF') onClick=Set('99FFFF') height="10px" width="10px"></td>
+<td bgcolor=#CC00FF onMouseOver=View('CC00FF') onClick=Set('CC00FF') height="10px" width="10px"></td>
+<td bgcolor=#CC33FF onMouseOver=View('CC33FF') onClick=Set('CC33FF') height="10px" width="10px"></td>
+<td bgcolor=#CC66FF onMouseOver=View('CC66FF') onClick=Set('CC66FF') height="10px" width="10px"></td>
+<td bgcolor=#CC99FF onMouseOver=View('CC99FF') onClick=Set('CC99FF') height="10px" width="10px"></td>
+<td bgcolor=#CCCCFF onMouseOver=View('CCCCFF') onClick=Set('CCCCFF') height="10px" width="10px"></td>
+<td bgcolor=#CCFFFF onMouseOver=View('CCFFFF') onClick=Set('CCFFFF') height="10px" width="10px"></td>
+<td bgcolor=#FF00FF onMouseOver=View('FF00FF') onClick=Set('FF00FF') height="10px" width="10px"></td>
+<td bgcolor=#FF33FF onMouseOver=View('FF33FF') onClick=Set('FF33FF') height="10px" width="10px"></td>
+<td bgcolor=#FF66FF onMouseOver=View('FF66FF') onClick=Set('FF66FF') height="10px" width="10px"></td>
+<td bgcolor=#FF99FF onMouseOver=View('FF99FF') onClick=Set('FF99FF') height="10px" width="10px"></td>
+<td bgcolor=#FFCCFF onMouseOver=View('FFCCFF') onClick=Set('FFCCFF') height="10px" width="10px"></td>
+<td bgcolor=#FFFFFF onMouseOver=View('FFFFFF') onClick=Set('FFFFFF') height="10px" width="10px"></td>
+</tr>
+</table>
+
+</body></html>

Modified: plog/trunk/js/htmlarea/popupwin.js
===================================================================
--- plog/trunk/js/htmlarea/popupwin.js	2005-02-05 13:57:52 UTC (rev 948)
+++ plog/trunk/js/htmlarea/popupwin.js	2005-02-05 15:29:38 UTC (rev 949)
@@ -1,139 +1,139 @@
-// (c) dynarch.com 2003-2004
-// Distributed under the same terms as HTMLArea itself.
-
-function PopupWin(editor, title, handler, initFunction) {
-	this.editor = editor;
-	this.handler = handler;
-	var dlg = window.open("", "__ha_dialog",
-			      "toolbar=no,menubar=no,personalbar=no,width=600,height=600,left=20,top=40" +
-			      "scrollbars=no,resizable=no");
-	this.window = dlg;
-	var doc = dlg.document;
-	this.doc = doc;
-	var self = this;
-
-	var base = document.baseURI || document.URL;
-	if (base && base.match(/(.*)\/([^\/]+)/)) {
-		base = RegExp.$1 + "/";
-	}
-	if (typeof _editor_url != "undefined" && !/^\//.test(_editor_url)) {
-		// _editor_url doesn't start with '/' which means it's relative
-		// FIXME: there's a problem here, it could be http:// which
-		// doesn't start with slash but it's not relative either.
-		base += _editor_url;
-	} else
-		base = _editor_url;
-	if (!/\/$/.test(base)) {
-		// base does not end in slash, add it now
-		base += '/';
-	}
-	this.baseURL = base;
-
-	doc.open();
-	var html = "<html><head><title>" + title + "</title>\n";
-	// html += "<base href='" + base + "htmlarea.js' />\n";
-	html += "<style type='text/css'>@import url(" + base + "htmlarea.css);</style></head>\n";
-	html += "<body class='dialog popupwin' id='--HA-body'></body></html>";
-	doc.write(html);
-	doc.close();
-
-	// sometimes I Hate Mozilla... ;-(
-	function init2() {
-		var body = doc.body;
-		if (!body) {
-			setTimeout(init2, 25);
-			return false;
-		}
-		dlg.title = title;
-		doc.documentElement.style.padding = "0px";
-		doc.documentElement.style.margin = "0px";
-		var content = doc.createElement("div");
-		content.className = "content";
-		self.content = content;
-		body.appendChild(content);
-		self.element = body;
-		initFunction(self);
-		dlg.focus();
-	};
-	init2();
-};
-
-PopupWin.prototype.callHandler = function() {
-	var tags = ["input", "textarea", "select"];
-	var params = new Object();
-	for (var ti in tags) {
-		var tag = tags[ti];
-		var els = this.content.getElementsByTagName(tag);
-		for (var j = 0; j < els.length; ++j) {
-			var el = els[j];
-			var val = el.value;
-			if (el.tagName.toLowerCase() == "input") {
-				if (el.type == "checkbox") {
-					val = el.checked;
-				}
-			}
-			params[el.name] = val;
-		}
-	}
-	this.handler(this, params);
-	return false;
-};
-
-PopupWin.prototype.close = function() {
-	this.window.close();
-};
-
-PopupWin.prototype.addButtons = function() {
-	var self = this;
-	var div = this.doc.createElement("div");
-	this.content.appendChild(div);
-	div.className = "buttons";
-	for (var i = 0; i < arguments.length; ++i) {
-		var btn = arguments[i];
-		var button = this.doc.createElement("button");
-		div.appendChild(button);
-		button.innerHTML = HTMLArea.I18N.buttons[btn];
-		switch (btn) {
-		    case "ok":
-			button.onclick = function() {
-				self.callHandler();
-				self.close();
-				return false;
-			};
-			break;
-		    case "cancel":
-			button.onclick = function() {
-				self.close();
-				return false;
-			};
-			break;
-		}
-	}
-};
-
-PopupWin.prototype.showAtElement = function() {
-	var self = this;
-	// Mozilla needs some time to realize what's goin' on..
-	setTimeout(function() {
-		var w = self.content.offsetWidth + 4;
-		var h = self.content.offsetHeight + 4;
-		// size to content -- that's fuckin' buggy in all fuckin' browsers!!!
-		// so that we set a larger size for the dialog window and then center
-		// the element inside... phuck!
-
-		// center...
-		var el = self.content;
-		var s = el.style;
-		// s.width = el.offsetWidth + "px";
-		// s.height = el.offsetHeight + "px";
-		s.position = "absolute";
-		s.left = (w - el.offsetWidth) / 2 + "px";
-		s.top = (h - el.offsetHeight) / 2 + "px";
-		if (HTMLArea.is_gecko) {
-			self.window.innerWidth = w;
-			self.window.innerHeight = h;
-		} else {
-			self.window.resizeTo(w + 8, h + 35);
-		}
-	}, 25);
-};
+// (c) dynarch.com 2003-2005
+// Distributed under the same terms as HTMLArea itself.
+
+function PopupWin(editor, title, handler, initFunction) {
+	this.editor = editor;
+	this.handler = handler;
+	var dlg = window.open("", "__ha_dialog",
+			      "toolbar=no,menubar=no,personalbar=no,width=600,height=600,left=20,top=40" +
+			      "scrollbars=no,resizable=no");
+	this.window = dlg;
+	var doc = dlg.document;
+	this.doc = doc;
+	var self = this;
+
+	var base = document.baseURI || document.URL;
+	if (base && base.match(/(.*)\/([^\/]+)/)) {
+		base = RegExp.$1 + "/";
+	}
+	if (typeof _editor_url != "undefined" && !/^\//.test(_editor_url) && !/http:\/\//.test(_editor_url)) {
+		// _editor_url doesn't start with '/' which means it's relative
+		// FIXME: there's a problem here, it could be http:// which
+		// doesn't start with slash but it's not relative either.
+		base += _editor_url;
+	} else
+		base = _editor_url;
+	if (!/\/$/.test(base)) {
+		// base does not end in slash, add it now
+		base += '/';
+	}
+	this.baseURL = base;
+
+	doc.open();
+	var html = "<html><head><title>" + title + "</title>\n";
+	// html += "<base href='" + base + "htmlarea.js' />\n";
+	html += "<style type='text/css'>@import url(" + base + "htmlarea.css);</style></head>\n";
+	html += "<body class='dialog popupwin' id='--HA-body'></body></html>";
+	doc.write(html);
+	doc.close();
+
+	// sometimes I Hate Mozilla... ;-(
+	function init2() {
+		var body = doc.body;
+		if (!body) {
+			setTimeout(init2, 25);
+			return false;
+		}
+		dlg.title = title;
+		doc.documentElement.style.padding = "0px";
+		doc.documentElement.style.margin = "0px";
+		var content = doc.createElement("div");
+		content.className = "content";
+		self.content = content;
+		body.appendChild(content);
+		self.element = body;
+		initFunction(self);
+		dlg.focus();
+	};
+	init2();
+};
+
+PopupWin.prototype.callHandler = function() {
+	var tags = ["input", "textarea", "select"];
+	var params = new Object();
+	for (var ti = tags.length; --ti >= 0;) {
+		var tag = tags[ti];
+		var els = this.content.getElementsByTagName(tag);
+		for (var j = 0; j < els.length; ++j) {
+			var el = els[j];
+			var val = el.value;
+			if (el.tagName.toLowerCase() == "input") {
+				if (el.type == "checkbox") {
+					val = el.checked;
+				}
+			}
+			params[el.name] = val;
+		}
+	}
+	this.handler(this, params);
+	return false;
+};
+
+PopupWin.prototype.close = function() {
+	this.window.close();
+};
+
+PopupWin.prototype.addButtons = function() {
+	var self = this;
+	var div = this.doc.createElement("div");
+	this.content.appendChild(div);
+	div.className = "buttons";
+	for (var i = 0; i < arguments.length; ++i) {
+		var btn = arguments[i];
+		var button = this.doc.createElement("button");
+		div.appendChild(button);
+		button.innerHTML = HTMLArea.I18N.buttons[btn];
+		switch (btn) {
+		    case "ok":
+			button.onclick = function() {
+				self.callHandler();
+				self.close();
+				return false;
+			};
+			break;
+		    case "cancel":
+			button.onclick = function() {
+				self.close();
+				return false;
+			};
+			break;
+		}
+	}
+};
+
+PopupWin.prototype.showAtElement = function() {
+	var self = this;
+	// Mozilla needs some time to realize what's goin' on..
+	setTimeout(function() {
+		var w = self.content.offsetWidth + 4;
+		var h = self.content.offsetHeight + 4;
+		// size to content -- that's fuckin' buggy in all fuckin' browsers!!!
+		// so that we set a larger size for the dialog window and then center
+		// the element inside... phuck!
+
+		// center...
+		var el = self.content;
+		var s = el.style;
+		// s.width = el.offsetWidth + "px";
+		// s.height = el.offsetHeight + "px";
+		s.position = "absolute";
+		s.left = (w - el.offsetWidth) / 2 + "px";
+		s.top = (h - el.offsetHeight) / 2 + "px";
+		if (HTMLArea.is_gecko) {
+			self.window.innerWidth = w;
+			self.window.innerHeight = h;
+		} else {
+			self.window.resizeTo(w + 8, h + 35);
+		}
+	}, 25);
+};




More information about the pLog-svn mailing list