You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@roller.apache.org by sn...@apache.org on 2006/10/08 21:54:16 UTC

svn commit: r454197 [26/29] - in /incubator/roller/trunk/web: WEB-INF/classes/ roller-ui/authoring/editors/ roller-ui/authoring/editors/xinha/ roller-ui/authoring/editors/xinha/conf/ roller-ui/authoring/editors/xinha/contrib/ roller-ui/authoring/editor...

Added: incubator/roller/trunk/web/roller-ui/authoring/editors/xinha/plugins/Stylist/stylist.js
URL: http://svn.apache.org/viewvc/incubator/roller/trunk/web/roller-ui/authoring/editors/xinha/plugins/Stylist/stylist.js?view=auto&rev=454197
==============================================================================
--- incubator/roller/trunk/web/roller-ui/authoring/editors/xinha/plugins/Stylist/stylist.js (added)
+++ incubator/roller/trunk/web/roller-ui/authoring/editors/xinha/plugins/Stylist/stylist.js Sun Oct  8 12:53:13 2006
@@ -0,0 +1,542 @@
+/**
+ * Add an empty css_style to Config object's prototype
+ *  the format is { '.className' : 'Description' }
+ */
+
+HTMLArea.Config.prototype.css_style = { };
+
+/**
+ * This method loads an external stylesheet and uses it in the stylist
+ */
+HTMLArea.Config.prototype.stylistLoadStylesheet = function(url, altnames)
+{
+  if(!altnames) altnames = { };
+  var newStyles = HTMLArea.ripStylesFromCSSFile(url);
+  for(var i in newStyles)
+  {
+    if(altnames[i])
+    {
+      this.css_style[i] = altnames[i];
+    }
+    else
+    {
+      this.css_style[i] = newStyles[i];
+    }
+  }
+  this.pageStyleSheets[this.pageStyleSheets.length] = url;
+};
+
+/**
+ * This method takes raw style definitions and uses them in the stylist
+ */
+HTMLArea.Config.prototype.stylistLoadStyles = function(styles, altnames)
+{
+  if(!altnames) altnames = { };
+  var newStyles = HTMLArea.ripStylesFromCSSString(styles);
+  for(var i in newStyles)
+  {
+    if(altnames[i])
+    {
+      this.css_style[i] = altnames[i];
+    }
+    else
+    {
+      this.css_style[i] = newStyles[i];
+    }
+  }
+  this.pageStyle += styles;
+};
+
+
+
+/**
+ * Fill the stylist panel with styles that may be applied to the current selection.  Styles
+ * are supplied in the css_style property of the HTMLArea.Config object, which is in the format
+ * { '.className' : 'Description' }
+ * classes that are defined on a specific tag (eg 'a.email_link') are only shown in the panel
+ *    when an element of that type is selected.
+ * classes that are defined with selectors/psuedoclasses (eg 'a.email_link:hover') are never
+ *    shown (if you have an 'a.email_link' without the pseudoclass it will be shown of course)
+ * multiple classes (eg 'a.email_link.staff_member') are shown as a single class, and applied
+ *    to the element as multiple classes (class="email_link staff_member")
+ * you may click a class name in the stylist panel to add it, and click again to remove it
+ * you may add multiple classes to any element
+ * spans will be added where no single _and_entire_ element is selected
+ */
+HTMLArea.prototype._fillStylist = function()
+{
+  if(!this._stylist) return false;
+  this._stylist.innerHTML = '<h1>'+HTMLArea._lc('Styles', 'Stylist')+'</h1>';
+
+  var may_apply = true;
+  var sel       = this._getSelection();
+
+  // What is applied
+  // var applied = this._getAncestorsClassNames(this._getSelection());
+
+  // Get an active element
+  var active_elem = this._activeElement(sel);
+
+  for(var x in this.config.css_style)
+  {
+    var tag   = null;
+    var className = x.trim();
+    var applicable = true;
+    var apply_to   = active_elem;
+
+    if(applicable && /[^a-zA-Z0-9_.-]/.test(className))
+    {
+      applicable = false; // Only basic classes are accepted, no selectors, etc.. presumed
+                          // that if you have a.foo:visited you'll also have a.foo
+      // alert('complex');
+    }
+
+    if(className.indexOf('.') < 0)
+    {
+      // No class name, just redefines a tag
+      applicable = false;
+    }
+
+    if(applicable && (className.indexOf('.') > 0))
+    {
+      // requires specific html tag
+      tag = className.substring(0, className.indexOf('.')).toLowerCase();
+      className = className.substring(className.indexOf('.'), className.length);
+
+      // To apply we must have an ancestor tag that is the right type
+      if(active_elem != null && active_elem.tagName.toLowerCase() == tag)
+      {
+        applicable = true;
+        apply_to = active_elem;
+      }
+      else
+      {
+        if(this._getFirstAncestor(this._getSelection(), [tag]) != null)
+        {
+          applicable = true;
+          apply_to = this._getFirstAncestor(this._getSelection(), [tag]);
+        }
+        else
+        {
+          // alert (this._getFirstAncestor(this._getSelection(), tag));
+          // If we don't have an ancestor, but it's a div/span/p/hx stle, we can make one
+          if(( tag == 'div' || tag == 'span' || tag == 'p'
+              || (tag.substr(0,1) == 'h' && tag.length == 2 && tag != 'hr')))
+          {
+            if(!this._selectionEmpty(this._getSelection()))
+            {
+              applicable = true;
+              apply_to = 'new';
+            }
+            else
+            {
+              // See if we can get a paragraph or header that can be converted
+              apply_to = this._getFirstAncestor(sel, ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'h7']);
+              if(apply_to != null)
+              {
+                applicable = true;
+              }
+            }
+          }
+          else
+          {
+            applicable = false;
+          }
+        }
+      }
+    }
+
+    if(applicable)
+    {
+      // Remove the first .
+      className = className.substring(className.indexOf('.'), className.length);
+
+      // Replace any futher ones with spaces (for multiple class definitions)
+      className = className.replace('.', ' ');
+
+      if(apply_to == null)
+      {
+        if(this._selectionEmpty(this._getSelection()))
+        {
+          // Get the previous element and apply to that
+          apply_to = this._getFirstAncestor(this._getSelection(), null);
+        }
+        else
+        {
+          apply_to = 'new';
+          tag      = 'span';
+        }
+      }
+    }
+
+    var applied    = (this._ancestorsWithClasses(sel, tag, className).length > 0 ? true : false);
+    var applied_to = this._ancestorsWithClasses(sel, tag, className);
+
+    if(applicable)
+    {
+      var anch = document.createElement('a');
+      anch._stylist_className = className.trim();
+      anch._stylist_applied   = applied;
+      anch._stylist_appliedTo = applied_to;
+      anch._stylist_applyTo = apply_to;
+      anch._stylist_applyTag = tag;
+
+      anch.innerHTML = this.config.css_style[x];
+      anch.href = 'javascript:void(0)';
+      var editor = this;
+      anch.onclick = function()
+      {
+        if(this._stylist_applied == true)
+        {
+          editor._stylistRemoveClasses(this._stylist_className, this._stylist_appliedTo);
+        }
+        else
+        {
+          editor._stylistAddClasses(this._stylist_applyTo, this._stylist_applyTag, this._stylist_className);
+        }
+        return false;
+      }
+
+      anch.style.display = 'block';
+      anch.style.paddingLeft = '3px';
+      anch.style.paddingTop = '1px';
+      anch.style.paddingBottom = '1px';
+      anch.style.textDecoration = 'none';
+
+      if(applied)
+      {
+        anch.style.background = 'Highlight';
+        anch.style.color = 'HighlightText';
+      }
+
+      this._stylist.appendChild(anch);
+    }
+  }
+};
+
+
+/**
+ * Add the given classes (space seperated list) to the currently selected element
+ * (will add a span if none selected)
+ */
+HTMLArea.prototype._stylistAddClasses = function(el, tag, classes)
+  {
+    if(el == 'new')
+    {
+      this.insertHTML('<' + tag + ' class="' + classes + '">' + this.getSelectedHTML() + '</' + tag + '>');
+    }
+    else
+    {
+      if(tag != null && el.tagName.toLowerCase() != tag)
+      {
+        // Have to change the tag!
+        var new_el = this.switchElementTag(el, tag);
+
+        if(typeof el._stylist_usedToBe != 'undefined')
+        {
+          new_el._stylist_usedToBe = el._stylist_usedToBe;
+          new_el._stylist_usedToBe[new_el._stylist_usedToBe.length] = {'tagName' : el.tagName, 'className' : el.getAttribute('class')};
+        }
+        else
+        {
+          new_el._stylist_usedToBe = [{'tagName' : el.tagName, 'className' : el.getAttribute('class')}];
+        }
+
+        HTMLArea.addClasses(new_el, classes);
+      }
+      else
+      {
+        HTMLArea._addClasses(el, classes);
+      }
+    }
+    this.focusEditor();
+    this.updateToolbar();
+  };
+
+/**
+ * Remove the given classes (space seperated list) from the given elements (array of elements)
+ */
+HTMLArea.prototype._stylistRemoveClasses = function(classes, from)
+  {
+    for(var x = 0; x < from.length; x++)
+    {
+      this._stylistRemoveClassesFull(from[x], classes);
+    }
+    this.focusEditor();
+    this.updateToolbar();
+  };
+
+HTMLArea.prototype._stylistRemoveClassesFull = function(el, classes)
+{
+  if(el != null)
+  {
+    var thiers = el.className.trim().split(' ');
+    var new_thiers = [ ];
+    var ours   = classes.split(' ');
+    for(var x = 0; x < thiers.length; x++)
+    {
+      var exists = false;
+      for(var i = 0; exists == false && i < ours.length; i++)
+      {
+        if(ours[i] == thiers[x])
+        {
+          exists = true;
+        }
+      }
+      if(exists == false)
+      {
+        new_thiers[new_thiers.length] = thiers[x];
+      }
+    }
+
+    if(new_thiers.length == 0 && el._stylist_usedToBe && el._stylist_usedToBe.length > 0 && el._stylist_usedToBe[el._stylist_usedToBe.length - 1].className != null)
+    {
+      // Revert back to what we were IF the classes are identical
+      var last_el = el._stylist_usedToBe[el._stylist_usedToBe.length - 1];
+      var last_classes = HTMLArea.arrayFilter(last_el.className.trim().split(' '), function(c) { if (c == null || c.trim() == '') { return false;} return true; });
+
+      if(
+        (new_thiers.length == 0)
+        ||
+        (
+        HTMLArea.arrayContainsArray(new_thiers, last_classes)
+        && HTMLArea.arrayContainsArray(last_classes, new_thiers)
+        )
+      )
+      {
+        el = this.switchElementTag(el, last_el.tagName);
+        new_thiers = last_classes;
+      }
+      else
+      {
+        // We can't rely on the remembered tags any more
+        el._stylist_usedToBe = [ ];
+      }
+    }
+
+    if(     new_thiers.length > 0
+        ||  el.tagName.toLowerCase() != 'span'
+        || (el.id && el.id != '')
+      )
+    {
+      el.className = new_thiers.join(' ').trim();
+    }
+    else
+    {
+      // Must be a span with no classes and no id, so we can splice it out
+      var prnt = el.parentNode;
+      var childs = el.childNodes;
+      for(var x = 0; x < childs.length; x++)
+      {
+        prnt.insertBefore(childs[x], el);
+      }
+      prnt.removeChild(el);
+    }
+  }
+};
+
+/**
+ * Change the tag of an element
+ */
+HTMLArea.prototype.switchElementTag = function(el, tag)
+{
+  var prnt = el.parentNode;
+  var new_el = this._doc.createElement(tag);
+
+  if(HTMLArea.is_ie || el.hasAttribute('id'))    new_el.setAttribute('id', el.getAttribute('id'));
+  if(HTMLArea.is_ie || el.hasAttribute('style')) new_el.setAttribute('style', el.getAttribute('style'));
+
+  var childs = el.childNodes;
+  for(var x = 0; x < childs.length; x++)
+  {
+    new_el.appendChild(childs[x].cloneNode(true));
+  }
+
+  prnt.insertBefore(new_el, el);
+  new_el._stylist_usedToBe = [el.tagName];
+  prnt.removeChild(el);
+  this.selectNodeContents(new_el);
+  return new_el;
+};
+
+HTMLArea.prototype._getAncestorsClassNames = function(sel)
+{
+  // Scan upwards to find a block level element that we can change or apply to
+  var prnt = this._activeElement(sel);
+  if(prnt == null)
+  {
+    prnt = (HTMLArea.is_ie ? this._createRange(sel).parentElement() : this._createRange(sel).commonAncestorContainer);
+  }
+
+  var classNames = [ ];
+  while(prnt)
+  {
+    if(prnt.nodeType == 1)
+    {
+      var classes = prnt.className.trim().split(' ');
+      for(var x = 0; x < classes.length; x++)
+      {
+        classNames[classNames.length] = classes[x];
+      }
+
+      if(prnt.tagName.toLowerCase() == 'body') break;
+      if(prnt.tagName.toLowerCase() == 'table'  ) break;
+    }
+      prnt = prnt.parentNode;
+  }
+
+  return classNames;
+};
+
+HTMLArea.prototype._ancestorsWithClasses = function(sel, tag, classes)
+{
+  var ancestors = [ ];
+  var prnt = this._activeElement(sel);
+  if(prnt == null)
+  {
+    try
+    {
+      prnt = (HTMLArea.is_ie ? this._createRange(sel).parentElement() : this._createRange(sel).commonAncestorContainer);
+    }
+    catch(e)
+    {
+      return ancestors;
+    }
+  }
+  var search_classes = classes.trim().split(' ');
+
+  while(prnt)
+  {
+    if(prnt.nodeType == 1)
+    {
+      if(tag == null || prnt.tagName.toLowerCase() == tag)
+      {
+        var classes = prnt.className.trim().split(' ');
+        var found_all = true;
+        for(var i = 0; i < search_classes.length; i++)
+        {
+          var found_class = false;
+          for(var x = 0; x < classes.length; x++)
+          {
+            if(search_classes[i] == classes[x])
+            {
+              found_class = true;
+              break;
+            }
+          }
+
+          if(!found_class)
+          {
+            found_all = false;
+            break;
+          }
+        }
+
+        if(found_all) ancestors[ancestors.length] = prnt;
+      }
+      if(prnt.tagName.toLowerCase() == 'body')    break;
+      if(prnt.tagName.toLowerCase() == 'table'  ) break;
+    }
+    prnt = prnt.parentNode;
+  }
+
+  return ancestors;
+};
+
+
+HTMLArea.ripStylesFromCSSFile = function(URL)
+{
+  var css = HTMLArea._geturlcontent(URL);
+  return HTMLArea.ripStylesFromCSSString(css);
+};
+
+HTMLArea.ripStylesFromCSSString = function(css)
+{
+  // We are only interested in the selectors, the rules are not important
+  //  so we'll drop out all coments and rules
+  RE_comment = /\/\*(.|\r|\n)*?\*\//g;
+  RE_rule    = /\{(.|\r|\n)*?\}/g;
+  css = css.replace(RE_comment, '');
+  css = css.replace(RE_rule, ',');
+
+  // And split on commas
+  css = css.split(',');
+
+  // And add those into our structure
+  var selectors = { };
+  for(var x = 0; x < css.length; x++)
+  {
+    if(css[x].trim())
+    {
+      selectors[css[x].trim()] = css[x].trim();
+    }
+  }
+
+
+  return selectors;
+};
+
+// Make our right side panel and insert appropriatly
+function Stylist(editor, args)
+{
+  this.editor = editor;
+  editor._stylist = null; // This needs to be changes to be Stylist::_stylist sometime
+  editor._stylist = editor.addPanel('right');
+  HTMLArea.addClass(editor._stylist, 'stylist');
+
+  var stylist = this;
+  editor.notifyOn('modechange',
+                  function(e,args)
+                  {
+                    switch(args.mode)
+                    {
+                      case 'text':
+                      {
+                        editor.hidePanel(editor._stylist);
+                        break;
+                      }
+                      case 'wysiwyg':
+                      {
+                        editor.showPanel(editor._stylist);
+                        break;
+                      }
+                    }
+                  }
+                  );
+}
+
+Stylist._pluginInfo =
+{
+  name     : "Stylist",
+  version  : "1.0",
+  developer: "James Sleeman",
+  developer_url: "http://www.gogo.co.nz/",
+  c_owner      : "Gogo Internet Services",
+  license      : "htmlArea",
+  sponsor      : "Gogo Internet Services",
+  sponsor_url  : "http://www.gogo.co.nz/"
+};
+
+Stylist.prototype.onGenerate = function()
+{
+  var editor = this.editor;
+  if(typeof editor.config.css_style == 'undefined' || HTMLArea.objectProperties(editor.config.css_style).length == 0)
+  {
+    editor.removePanel(editor._stylist);
+    editor._stylist = null;
+  }
+};
+
+Stylist.prototype.onUpdateToolbar = function()
+{
+  if(this.editor._stylist)
+  {
+    if(this._timeoutID)
+    {
+      window.clearTimeout(this._timeoutID);
+    }
+
+    var e = this.editor;
+    this._timeoutID = window.setTimeout(function() { e._fillStylist(); }, 250);
+  }
+};
\ No newline at end of file

Added: incubator/roller/trunk/web/roller-ui/authoring/editors/xinha/plugins/SuperClean/dialog.html
URL: http://svn.apache.org/viewvc/incubator/roller/trunk/web/roller-ui/authoring/editors/xinha/plugins/SuperClean/dialog.html?view=auto&rev=454197
==============================================================================
--- incubator/roller/trunk/web/roller-ui/authoring/editors/xinha/plugins/SuperClean/dialog.html (added)
+++ incubator/roller/trunk/web/roller-ui/authoring/editors/xinha/plugins/SuperClean/dialog.html Sun Oct  8 12:53:13 2006
@@ -0,0 +1,9 @@
+<h1 id="[h1]"><l10n>Clean up HTML</l10n></h1>
+<div style="margin-left: 10px;">
+    <l10n>Please select from the following cleaning options...</l10n>
+    <!--filters-->
+  <div style="margin-top: 10px;">
+    <input type="button" id="[ok]"     value="_(OK)"     />
+    <input type="button" id="[cancel]" value="_(CANCEL)" />
+  </div>
+</div>
\ No newline at end of file

Added: incubator/roller/trunk/web/roller-ui/authoring/editors/xinha/plugins/SuperClean/filters/paragraph.js
URL: http://svn.apache.org/viewvc/incubator/roller/trunk/web/roller-ui/authoring/editors/xinha/plugins/SuperClean/filters/paragraph.js?view=auto&rev=454197
==============================================================================
--- incubator/roller/trunk/web/roller-ui/authoring/editors/xinha/plugins/SuperClean/filters/paragraph.js (added)
+++ incubator/roller/trunk/web/roller-ui/authoring/editors/xinha/plugins/SuperClean/filters/paragraph.js Sun Oct  8 12:53:13 2006
@@ -0,0 +1,6 @@
+function(html) {
+  html = html.replace(/<\s*p[^>]*>/gi, '');
+  html = html.replace(/<\/\s*p\s*>/gi, '');
+  html = html.trim();
+  return html;
+} 
\ No newline at end of file

Added: incubator/roller/trunk/web/roller-ui/authoring/editors/xinha/plugins/SuperClean/filters/word.js
URL: http://svn.apache.org/viewvc/incubator/roller/trunk/web/roller-ui/authoring/editors/xinha/plugins/SuperClean/filters/word.js?view=auto&rev=454197
==============================================================================
--- incubator/roller/trunk/web/roller-ui/authoring/editors/xinha/plugins/SuperClean/filters/word.js (added)
+++ incubator/roller/trunk/web/roller-ui/authoring/editors/xinha/plugins/SuperClean/filters/word.js Sun Oct  8 12:53:13 2006
@@ -0,0 +1,53 @@
+function(html) {
+    // Remove HTML comments
+	html = html.replace(/<!--[\w\s\d@{}:.;,'"%!#_=&|?~()[*+\/\-\]]*-->/gi, "" );
+	html = html.replace(/<!--[^\0]*-->/gi, '');
+    // Remove all HTML tags
+	html = html.replace(/<\/?\s*HTML[^>]*>/gi, "" );
+    // Remove all BODY tags
+    html = html.replace(/<\/?\s*BODY[^>]*>/gi, "" );
+    // Remove all META tags
+	html = html.replace(/<\/?\s*META[^>]*>/gi, "" );
+    // Remove all SPAN tags
+	html = html.replace(/<\/?\s*SPAN[^>]*>/gi, "" );
+	// Remove all FONT tags
+    html = html.replace(/<\/?\s*FONT[^>]*>/gi, "");
+    // Remove all IFRAME tags.
+    html = html.replace(/<\/?\s*IFRAME[^>]*>/gi, "");
+    // Remove all STYLE tags & content
+	html = html.replace(/<\/?\s*STYLE[^>]*>(.|[\n\r\t])*<\/\s*STYLE\s*>/gi, "" );
+    // Remove all TITLE tags & content
+	html = html.replace(/<\s*TITLE[^>]*>(.|[\n\r\t])*<\/\s*TITLE\s*>/gi, "" );
+	// Remove javascript
+    html = html.replace(/<\s*SCRIPT[^>]*>[^\0]*<\/\s*SCRIPT\s*>/gi, "");
+    // Remove all HEAD tags & content
+	html = html.replace(/<\s*HEAD[^>]*>(.|[\n\r\t])*<\/\s*HEAD\s*>/gi, "" );
+	// Remove Class attributes
+	html = html.replace(/<\s*(\w[^>]*) class=([^ |>]*)([^>]*)/gi, "<$1$3") ;
+	// Remove Style attributes
+	html = html.replace(/<\s*(\w[^>]*) style="([^"]*)"([^>]*)/gi, "<$1$3") ;
+	// Remove Lang attributes
+	html = html.replace(/<\s*(\w[^>]*) lang=([^ |>]*)([^>]*)/gi, "<$1$3") ;
+	// Remove XML elements and declarations
+	html = html.replace(/<\\?\?xml[^>]*>/gi, "") ;
+	// Remove Tags with XML namespace declarations: <o:p></o:p>
+	html = html.replace(/<\/?\w+:[^>]*>/gi, "") ;
+	// Replace the &nbsp;
+	html = html.replace(/&nbsp;/, " " );
+
+	// Transform <p><br /></p> to <br>
+	//html = html.replace(/<\s*p[^>]*>\s*<\s*br\s*\/>\s*<\/\s*p[^>]*>/gi, "<br>");
+	html = html.replace(/<\s*p[^>]*><\s*br\s*\/?>\s*<\/\s*p[^>]*>/gi, "<br>");
+	
+	// Remove <P> 
+	html = html.replace(/<\s*p[^>]*>/gi, "");
+	
+	// Replace </p> with <br>
+	html = html.replace(/<\/\s*p[^>]*>/gi, "<br>");
+	
+	// Remove any <br> at the end
+	html = html.replace(/(\s*<br>\s*)*$/, "");
+	
+	html = html.trim();
+	return html;
+} 
\ No newline at end of file

Added: incubator/roller/trunk/web/roller-ui/authoring/editors/xinha/plugins/SuperClean/img/ed_superclean.gif
URL: http://svn.apache.org/viewvc/incubator/roller/trunk/web/roller-ui/authoring/editors/xinha/plugins/SuperClean/img/ed_superclean.gif?view=auto&rev=454197
==============================================================================
Binary file - no diff available.

Propchange: incubator/roller/trunk/web/roller-ui/authoring/editors/xinha/plugins/SuperClean/img/ed_superclean.gif
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: incubator/roller/trunk/web/roller-ui/authoring/editors/xinha/plugins/SuperClean/lang/de.js
URL: http://svn.apache.org/viewvc/incubator/roller/trunk/web/roller-ui/authoring/editors/xinha/plugins/SuperClean/lang/de.js?view=auto&rev=454197
==============================================================================
--- incubator/roller/trunk/web/roller-ui/authoring/editors/xinha/plugins/SuperClean/lang/de.js (added)
+++ incubator/roller/trunk/web/roller-ui/authoring/editors/xinha/plugins/SuperClean/lang/de.js Sun Oct  8 12:53:13 2006
@@ -0,0 +1,17 @@
+// I18N constants
+// LANG: "de", ENCODING: UTF-8
+// translated: Raimund Meyer xinha@ray-of-light.org
+{
+  "Clean up HTML": "HTML säubern",
+  "Please select from the following cleaning options...": "Bitte Optionen auswählen...",
+  "General tidy up and correction of some problems.": "Allgemeines aufräumen und Korrektur einiger Probleme.",
+  "Clean bad HTML from Microsoft Word": "Schlechtes HTML aus Microsoft Word aufräumen",
+  "Remove custom typefaces (font \"styles\").": "Schriftarten entfernen (font face).",
+  "Remove custom font sizes.": "Schriftgrößen entfernen (font size).",
+  "Remove custom text colors.": "Schriftfarben entfernen (font color).",
+  "Remove lang attributes.": "Sprachattribute entfernen.",
+  "Go": "Go",
+  "Cancel": "Abbrechen",
+  "Tidy failed.  Check your HTML for syntax errors.": "Säubern fehlgeschlagen. Überprüfen Sie Ihren Code auf Fehler.",
+  "You don't have anything to tidy!": "Es gibt nichts zu säubern...!"
+};

Added: incubator/roller/trunk/web/roller-ui/authoring/editors/xinha/plugins/SuperClean/lang/fr.js
URL: http://svn.apache.org/viewvc/incubator/roller/trunk/web/roller-ui/authoring/editors/xinha/plugins/SuperClean/lang/fr.js?view=auto&rev=454197
==============================================================================
--- incubator/roller/trunk/web/roller-ui/authoring/editors/xinha/plugins/SuperClean/lang/fr.js (added)
+++ incubator/roller/trunk/web/roller-ui/authoring/editors/xinha/plugins/SuperClean/lang/fr.js Sun Oct  8 12:53:13 2006
@@ -0,0 +1,16 @@
+// I18N constants
+// LANG: "fr", ENCODING: UTF-8
+{
+  "Clean up HTML": "Nettoyer le code HTML",
+  "Please select from the following cleaning options...": "Veuillez sélectionner une option de nettoyage.",
+  "General tidy up and correction of some problems.": "Nettoyage générique et correction des problèmes mineurs.",
+  "Clean bad HTML from Microsoft Word": "Nettoyer les balises HTML de Microsoft Word",
+  "Remove custom typefaces (font \"styles\").": "Supprimer les polices personalisées (font \"styles\").",
+  "Remove custom font sizes.": "Supprimer les tailles de polices personnalisées.",
+  "Remove custom text colors.": "Supprimer les couleurs de texte personalisées.",
+  "Remove lang attributes.": "Supprimer les attributs de langue.",
+  "Go": "Commencer",
+  "Cancel": "Annuler",
+  "Tidy failed.  Check your HTML for syntax errors.": "Tidy a échoué. Vérifier la syntaxe HTML.",
+  "You don't have anything to tidy!": "Rien à transmettre à tidy !"
+};
\ No newline at end of file

Added: incubator/roller/trunk/web/roller-ui/authoring/editors/xinha/plugins/SuperClean/lang/nb.js
URL: http://svn.apache.org/viewvc/incubator/roller/trunk/web/roller-ui/authoring/editors/xinha/plugins/SuperClean/lang/nb.js?view=auto&rev=454197
==============================================================================
--- incubator/roller/trunk/web/roller-ui/authoring/editors/xinha/plugins/SuperClean/lang/nb.js (added)
+++ incubator/roller/trunk/web/roller-ui/authoring/editors/xinha/plugins/SuperClean/lang/nb.js Sun Oct  8 12:53:13 2006
@@ -0,0 +1,17 @@
+// I18N constants
+// LANG: "nb", ENCODING: UTF-8
+// translated: Kim Steinhaug, http://www.steinhaug.com/, kim@steinhaug.com
+{
+  "Clean up HTML": "Vask HTML kode",
+  "Please select from the following cleaning options...": "Vennligst velg blandt de forskjellige mulighetene å vaske/ rydde i HTML koden",
+  "General tidy up and correction of some problems.": "Generell opprydding i HTML koden samt korrigering av typiske feil",
+  "Clean bad HTML from Microsoft Word": "Vask HTML kode for feil og problemer etter Microsoft Word",
+  "Remove custom typefaces (font \"styles\").": "Fjerne egendefinerte skrifttyper (font face)",
+  "Remove custom font sizes.": "Fjerne egendefinerte skriftstørrelser (font size)",
+  "Remove custom text colors.": "Fjerne egendefinerte skriftfarger (font color)",
+  "Remove lang attributes.": "Fjerne lang-attributter.",
+  "Go": "Utfør",
+  "Cancel": "Avbryt",
+  "Tidy failed.  Check your HTML for syntax errors.": "Tidy (Programmet som retter HTML koden) feilet. Vennligst se over HTML koden for feil.",
+  "You don't have anything to tidy!": "Det finnes ingen HTML kode å vaske!"
+};
\ No newline at end of file

Added: incubator/roller/trunk/web/roller-ui/authoring/editors/xinha/plugins/SuperClean/lang/no.js
URL: http://svn.apache.org/viewvc/incubator/roller/trunk/web/roller-ui/authoring/editors/xinha/plugins/SuperClean/lang/no.js?view=auto&rev=454197
==============================================================================
--- incubator/roller/trunk/web/roller-ui/authoring/editors/xinha/plugins/SuperClean/lang/no.js (added)
+++ incubator/roller/trunk/web/roller-ui/authoring/editors/xinha/plugins/SuperClean/lang/no.js Sun Oct  8 12:53:13 2006
@@ -0,0 +1,17 @@
+// I18N constants
+// LANG: "no", ENCODING: UTF-8
+// translated: Kim Steinhaug, http://www.steinhaug.com/, kim@steinhaug.com
+{
+  "Clean up HTML": "Vask HTML kode",
+  "Please select from the following cleaning options...": "Vennligst velg blandt de forskjellige mulighetene å vaske/ rydde i HTML koden",
+  "General tidy up and correction of some problems.": "Generell opprydding i HTML koden samt korrigering av typiske feil",
+  "Clean bad HTML from Microsoft Word": "Vask HTML kode for feil og problemer etter Microsoft Word",
+  "Remove custom typefaces (font \"styles\").": "Fjerne egendefinerte skrifttyper (font face)",
+  "Remove custom font sizes.": "Fjerne egendefinerte skriftstørrelser (font size)",
+  "Remove custom text colors.": "Fjerne egendefinerte skriftfarger (font color)",
+  "Remove lang attributes.": "Fjerne lang-attributter.",
+  "Go": "Utfør",
+  "Cancel": "Avbryt",
+  "Tidy failed.  Check your HTML for syntax errors.": "Tidy (Programmet som retter HTML koden) feilet. Vennligst se over HTML koden for feil.",
+  "You don't have anything to tidy!": "Det finnes ingen HTML kode å vaske!"
+};
\ No newline at end of file

Added: incubator/roller/trunk/web/roller-ui/authoring/editors/xinha/plugins/SuperClean/super-clean.js
URL: http://svn.apache.org/viewvc/incubator/roller/trunk/web/roller-ui/authoring/editors/xinha/plugins/SuperClean/super-clean.js?view=auto&rev=454197
==============================================================================
--- incubator/roller/trunk/web/roller-ui/authoring/editors/xinha/plugins/SuperClean/super-clean.js (added)
+++ incubator/roller/trunk/web/roller-ui/authoring/editors/xinha/plugins/SuperClean/super-clean.js Sun Oct  8 12:53:13 2006
@@ -0,0 +1,322 @@
+// Make our right side panel and insert appropriatly
+function SuperClean(editor, args)
+{
+  this.editor = editor;
+  var superclean = this;
+  editor._superclean_on = false;
+  editor.config.registerButton('superclean', this._lc("Clean up HTML"), editor.imgURL('ed_superclean.gif', 'SuperClean'), true, function(e, objname, obj) { superclean._superClean(null, obj); });
+
+  // See if we can find 'killword' and replace it with superclean
+  editor.config.addToolbarElement("superclean", "killword", 0);
+}
+
+SuperClean._pluginInfo =
+{
+  name     : "SuperClean",
+  version  : "1.0",
+  developer: "James Sleeman, Niko Sams",
+  developer_url: "http://www.gogo.co.nz/",
+  c_owner      : "Gogo Internet Services",
+  license      : "htmlArea",
+  sponsor      : "Gogo Internet Services",
+  sponsor_url  : "http://www.gogo.co.nz/"
+};
+
+SuperClean.prototype._lc = function(string) {
+    return HTMLArea._lc(string, 'SuperClean');
+};
+
+/** superClean combines HTMLTidy, Word Cleaning and font stripping into a single function
+ *  it works a bit differently in how it asks for parameters */
+
+SuperClean.prototype._superClean = function(opts, obj)
+{
+  var superclean = this;
+
+  // Do the clean if we got options
+  var doOK = function()
+  {
+    var opts = superclean._dialog.hide();
+    var editor = superclean.editor;
+
+    if(opts.word_clean) editor._wordClean();
+    var D = editor.getInnerHTML();
+
+    for(var filter in editor.config.SuperClean.filters)
+    {
+      if(filter=='tidy' || filter=='word_clean') continue;
+      if(opts[filter])
+      {
+        D = SuperClean.filterFunctions[filter](D, editor);
+      }
+    }
+
+    D = D.replace(/(style|class)="\s*"/gi, '');
+    D = D.replace(/<(font|span)\s*>/gi, '');
+
+    editor.setHTML(D);
+
+    if(opts.tidy)
+    {
+      HTMLArea._postback(editor.config.SuperClean.tidy_handler, {'content' : editor.getInnerHTML()},
+                         function(javascriptResponse) { eval(javascriptResponse) });
+    }
+    return true;
+  }
+
+  if(this.editor.config.SuperClean.show_dialog)
+  {
+    var inputs = {};
+    this._dialog.show(inputs, doOK);
+  }
+  else
+  {
+    var editor = this.editor;
+    var html = editor.getInnerHTML();
+    for(var filter in editor.config.SuperClean.filters)
+    {
+      if(filter=='tidy') continue; //call tidy last
+      html = SuperClean.filterFunctions[filter](html, editor);
+    }
+
+    html = html.replace(/(style|class)="\s*"/gi, '');
+    html = html.replace(/<(font|span)\s*>/gi, '');
+
+    editor.setHTML(html);
+
+    if(editor.config.SuperClean.filters.tidy)
+    {
+      SuperClean.filterFunctions.tidy(html, editor);
+    }
+  }
+};
+
+HTMLArea.Config.prototype.SuperClean =
+{
+  // set to the URL of a handler for html tidy, this handler
+  //  (see tidy.php for an example) must that a single post variable
+  //  "content" which contains the HTML to tidy, and return javascript like
+  //  editor.setHTML('<strong>Tidied Html</strong>')
+  // it's called through XMLHTTPRequest
+  'tidy_handler': _editor_url + 'plugins/SuperClean/tidy.php',
+
+  //avaliable filters (these are built-in filters)
+  // You can either use
+  //    'filter_name' : "Label/Description String"
+  // or 'filter_name' : {label: "Label", checked: true/false, filterFunction: function(html) { ... return html;} }
+  // filterFunction in the second format above is optional.
+
+  'filters': { 'tidy': HTMLArea._lc('General tidy up and correction of some problems.', 'SuperClean'),
+               'word_clean': HTMLArea._lc('Clean bad HTML from Microsoft Word', 'SuperClean'),
+               'remove_faces': HTMLArea._lc('Remove custom typefaces (font "styles").', 'SuperClean'),
+               'remove_sizes': HTMLArea._lc('Remove custom font sizes.', 'SuperClean'),
+               'remove_colors': HTMLArea._lc('Remove custom text colors.', 'SuperClean'),
+               'remove_lang': HTMLArea._lc('Remove lang attributes.', 'SuperClean'),
+               'remove_fancy_quotes': {label:HTMLArea._lc('Replace directional quote marks with non-directional quote marks.', 'SuperClean'), checked:false}
+  //additional custom filters (defined in plugins/SuperClean/filters/word.js)
+               //'paragraph': 'remove paragraphs'},
+               //'word': 'exteded Word-Filter' },
+              },
+  //if false all filters are applied, if true a dialog asks what filters should be used
+  'show_dialog': true
+};
+
+SuperClean.filterFunctions = { };
+SuperClean.filterFunctions.remove_colors = function(D)
+{
+  D = D.replace(/color="?[^" >]*"?/gi, '');
+  // { (stops jedit's fold breaking)
+  D = D.replace(/([^-])color:[^;}"']+;?/gi, '$1');
+  return(D);
+};
+SuperClean.filterFunctions.remove_sizes = function(D)
+{
+  D = D.replace(/size="?[^" >]*"?/gi, '');
+  // { (stops jedit's fold breaking)
+  D = D.replace(/font-size:[^;}"']+;?/gi, '');
+  return(D);
+};
+SuperClean.filterFunctions.remove_faces = function(D)
+{
+  D = D.replace(/face="?[^" >]*"?/gi, '');
+  // { (stops jedit's fold breaking)
+  D = D.replace(/font-family:[^;}"']+;?/gi, '');
+  return(D);
+};
+SuperClean.filterFunctions.remove_lang = function(D)
+{
+  D = D.replace(/lang="?[^" >]*"?/gi, '');
+  return(D);
+};
+SuperClean.filterFunctions.word_clean = function(html, editor)
+{
+  editor.setHTML(html);
+  editor._wordClean();
+  return editor.getInnerHTML();
+};
+
+SuperClean.filterFunctions.remove_fancy_quotes = function(D)
+{
+  D = D.replace(new RegExp(String.fromCharCode(8216),"g"),"'");
+  D = D.replace(new RegExp(String.fromCharCode(8217),"g"),"'");
+  D = D.replace(new RegExp(String.fromCharCode(8218),"g"),"'");
+  D = D.replace(new RegExp(String.fromCharCode(8219),"g"),"'");
+  D = D.replace(new RegExp(String.fromCharCode(8220),"g"),"\"");
+  D = D.replace(new RegExp(String.fromCharCode(8221),"g"),"\"");
+  D = D.replace(new RegExp(String.fromCharCode(8222),"g"),"\"");
+  D = D.replace(new RegExp(String.fromCharCode(8223),"g"),"\"");
+  return D;
+};
+
+SuperClean.filterFunctions.tidy = function(html, editor)
+{
+  HTMLArea._postback(editor.config.SuperClean.tidy_handler, {'content' : html},
+                      function(javascriptResponse) { eval(javascriptResponse) });
+};
+
+
+
+SuperClean.prototype.onGenerate = function()
+{
+  if(this.editor.config.SuperClean.show_dialog && !this._dialog)
+  {
+    this._dialog = new SuperClean.Dialog(this);
+  }
+  if(this.editor.config.tidy_handler)
+  {
+    //for backwards compatibility
+    this.editor.config.SuperClean.tidy_handler = this.editor.config.tidy_handler;
+    this.editor.config.tidy_handler = null;
+  }
+  if(!this.editor.config.SuperClean.tidy_handler && this.editor.config.filters.tidy) {
+    //unset tidy-filter if no tidy_handler
+    this.editor.config.filters.tidy = null;
+  }
+
+  var sc = this;
+  //load the filter-functions
+  for(var filter in this.editor.config.SuperClean.filters)
+  {
+    if(!SuperClean.filterFunctions[filter])
+    {
+      var filtDetail = this.editor.config.SuperClean.filters[filter];
+      if(typeof filtDetail.filterFunction != 'undefined')
+      {
+        SuperClean.filterFunctions[filter] = filterFunction;
+      }
+      else
+      {
+        HTMLArea._getback(_editor_url + 'plugins/SuperClean/filters/'+filter+'.js',
+                      function(func) {
+                        eval('SuperClean.filterFunctions.'+filter+'='+func+';');
+                        sc.onGenerate();
+                      });
+      }
+      return;
+    }
+  }
+};
+// Inline Dialog for SuperClean
+
+
+SuperClean.Dialog = function (SuperClean)
+{
+  var  lDialog = this;
+  this.Dialog_nxtid = 0;
+  this.SuperClean = SuperClean;
+  this.id = { }; // This will be filled below with a replace, nifty
+
+  this.ready = false;
+  this.files  = false;
+  this.html   = false;
+  this.dialog = false;
+
+  // load the dTree script
+  this._prepareDialog();
+
+};
+
+SuperClean.Dialog.prototype._prepareDialog = function()
+{
+  var lDialog = this;
+  var SuperClean = this.SuperClean;
+
+  if(this.html == false)
+  {
+    HTMLArea._getback(_editor_url + 'plugins/SuperClean/dialog.html', function(txt) { lDialog.html = txt; lDialog._prepareDialog(); });
+    return;
+  }
+
+  var htmlFilters = "";
+  for(var filter in this.SuperClean.editor.config.SuperClean.filters)
+  {
+    htmlFilters += "    <div>\n";
+    var filtDetail = this.SuperClean.editor.config.SuperClean.filters[filter];
+    if(typeof filtDetail.label == 'undefined')
+    {
+      htmlFilters += "        <input type=\"checkbox\" name=\"["+filter+"]\" id=\"["+filter+"]\" checked />\n";
+      htmlFilters += "        <label for=\"["+filter+"]\">"+this.SuperClean.editor.config.SuperClean.filters[filter]+"</label>\n";
+    }
+    else
+    {
+      htmlFilters += "        <input type=\"checkbox\" name=\"["+filter+"]\" id=\"["+filter+"]\" " + (filtDetail.checked ? "checked" : "") + " />\n";
+      htmlFilters += "        <label for=\"["+filter+"]\">"+filtDetail.label+"</label>\n";
+    }
+    htmlFilters += "    </div>\n";
+  }
+  this.html = this.html.replace('<!--filters-->', htmlFilters);
+
+  var html = this.html;
+
+  // Now we have everything we need, so we can build the dialog.
+  var dialog = this.dialog = new HTMLArea.Dialog(SuperClean.editor, this.html, 'SuperClean');
+
+  this.ready = true;
+};
+
+SuperClean.Dialog.prototype._lc = SuperClean.prototype._lc;
+
+SuperClean.Dialog.prototype.show = function(inputs, ok, cancel)
+{
+  if(!this.ready)
+  {
+    var lDialog = this;
+    window.setTimeout(function() {lDialog.show(inputs,ok,cancel);},100);
+    return;
+  }
+
+  // Connect the OK and Cancel buttons
+  var dialog = this.dialog;
+  var lDialog = this;
+  if(ok)
+  {
+    this.dialog.getElementById('ok').onclick = ok;
+  }
+  else
+  {
+    this.dialog.getElementById('ok').onclick = function() {lDialog.hide();};
+  }
+
+  if(cancel)
+  {
+    this.dialog.getElementById('cancel').onclick = cancel;
+  }
+  else
+  {
+    this.dialog.getElementById('cancel').onclick = function() { lDialog.hide()};
+  }
+
+  // Show the dialog
+  this.SuperClean.editor.disableToolbar(['fullscreen','SuperClean']);
+
+  this.dialog.show(inputs);
+
+  // Init the sizes
+  this.dialog.onresize();
+};
+
+SuperClean.Dialog.prototype.hide = function()
+{
+  this.SuperClean.editor.enableToolbar();
+  return this.dialog.hide();
+};
\ No newline at end of file

Added: incubator/roller/trunk/web/roller-ui/authoring/editors/xinha/plugins/SuperClean/tidy.php
URL: http://svn.apache.org/viewvc/incubator/roller/trunk/web/roller-ui/authoring/editors/xinha/plugins/SuperClean/tidy.php?view=auto&rev=454197
==============================================================================
--- incubator/roller/trunk/web/roller-ui/authoring/editors/xinha/plugins/SuperClean/tidy.php (added)
+++ incubator/roller/trunk/web/roller-ui/authoring/editors/xinha/plugins/SuperClean/tidy.php Sun Oct  8 12:53:13 2006
@@ -0,0 +1,179 @@
+<?php
+  /** This PHP file is intended for use with XMLHTTPRequest from an HTMLArea
+   * it requrns javascript to set the htmlarea html with tidied html that is
+   * submitted in a $_POST parameter called 'content'
+   */
+
+  if(get_magic_quotes_gpc())
+  {
+    // trigger_error('Magic Quotes GPC is on, cleaning GPC.', E_USER_NOTICE);
+    $to_clean = array(&$_GET, &$_POST, &$_REQUEST, &$_COOKIE);
+    while(count($to_clean))
+    {
+      $cleaning =& $to_clean[array_pop(array_keys($to_clean))];
+      unset($to_clean[array_pop(array_keys($to_clean))]);
+      foreach(array_keys($cleaning) as $k)
+      {
+        if(is_array($cleaning[$k]))
+        {
+          $to_clean[] =& $cleaning[$k];
+        }
+        else
+        {
+          $cleaning[$k] = stripslashes($cleaning[$k]);
+        }
+      }
+    }
+  }
+
+  header('Content-Type: text/javascript; charset=utf-8');
+
+  /** Function to POST some data to a URL */
+  function PostIt($DataStream, $URL)
+  {
+
+//  Strip http:// from the URL if present
+    $URL = ereg_replace("^http://", "", $URL);
+
+//  Separate into Host and URI
+    $Host = substr($URL, 0, strpos($URL, "/"));
+    $URI = strstr($URL, "/");
+
+//  Form up the request body
+    $ReqBody = "";
+    while (list($key, $val) = each($DataStream)) {
+      if ($ReqBody) $ReqBody.= "&";
+      $ReqBody.= $key."=".urlencode($val);
+    }
+    $ContentLength = strlen($ReqBody);
+
+//  Generate the request header
+    $ReqHeader =
+      "POST $URI HTTP/1.0\n".
+      "Host: $Host\n".
+      "User-Agent: PostIt\n".
+      "Content-Type: application/x-www-form-urlencoded\n".
+      "Content-Length: $ContentLength\n\n".
+      "$ReqBody\n";
+
+//     echo $ReqHeader;
+
+
+//  Open the connection to the host
+    $socket = fsockopen($Host, 80, &$errno, &$errstr);
+    if (!$socket) {
+      $result = "($errno) $errstr";
+      return $Result;
+    }
+
+    fputs($socket, $ReqHeader);
+
+    $result = '';
+    while(!feof($socket))
+    {
+      $result .= fgets($socket);
+    }
+    return $result;
+  }
+
+
+  function js_encode($string)
+  {
+    static $strings = "\\,\",',%,&,<,>,{,},@,\n,\r";
+
+    if(!is_array($strings))
+    {
+      $tr = array();
+      foreach(explode(',', $strings) as $chr)
+      {
+        $tr[$chr] = sprintf('\x%02X', ord($chr));
+      }
+      $strings = $tr;
+    }
+
+    return strtr($string, $strings);
+  }
+
+  // Any errors would screq up our javascript
+  error_reporting(E_NONE);
+  ini_set('display_errors', false);
+
+  if(trim(@$_REQUEST['content']))
+  {
+    // PHP's urldecode doesn't understand %uHHHH for unicode
+    $_REQUEST['content'] = preg_replace('/%u([a-f0-9]{4,4})/ei', 'utf8_chr(0x$1)', $_REQUEST['content']);
+    function utf8_chr($num)
+    {
+      if($num<128)return chr($num);
+      if($num<1024)return chr(($num>>6)+192).chr(($num&63)+128);
+      if($num<32768)return chr(($num>>12)+224).chr((($num>>6)&63)+128).chr(($num&63)+128);
+      if($num<2097152)return chr(($num>>18)+240).chr((($num>>12)&63)+128).chr((($num>>6)&63)+128) .chr(($num&63)+128);
+      return '';
+    }
+    ob_start();
+      passthru("echo " .  escapeshellarg($_REQUEST['content']) . " | tidy -q -i -u -wrap 9999 -utf8 -bare -asxhtml 2>/dev/null", $result);
+      $content = ob_get_contents();
+    ob_end_clean();
+
+    if(!strlen($content))
+    {
+      // Tidy on the local machine failed, try a post
+      $res_1
+        = PostIt(
+          array
+            (
+              '_function' => 'tidy',
+              '_html'   => $_REQUEST['content'],
+              'char-encoding' => 'utf8',
+              '_output'       => 'warn',
+              'indent'        => 'auto',
+              'wrap'          => 9999,
+              'break-before-br' => 'y',
+              'bare'          => 'n',
+              'word-2000'     => 'n',
+              'drop-empty-paras' => 'y',
+              'drop-font-tags' => 'n',
+
+            ),
+          'http://infohound.net/tidy/tidy.pl');
+
+      if(preg_match('/<a href="([^"]+)" title="Save the tidied HTML/', $res_1, $m))
+      {
+        $tgt = strtr($m[1], array_flip(get_html_translation_table(HTML_ENTITIES)));
+        $content = implode('', file('http://infohound.net/tidy/' . $tgt));
+      }
+    }
+
+    if(strlen($content) && ! preg_match('/<\/body>/i', $_REQUEST['content']))
+    {
+      if( preg_match('/<body[^>]*>(.*)<\/body>/is', $content, $matches) )
+      {
+        $content = $matches[1];
+      }
+    }
+    elseif(!strlen($content))
+    {
+      $content = $_REQUEST['content'];
+    }
+
+    if($content)
+    {
+      ?>
+      editor.setHTML('<?php echo js_encode($content) ?>');
+      <?php
+    }
+    else
+    {
+      ?>
+      alert(this._lc('Tidy failed.  Check your HTML for syntax errors.'));
+      <?php
+    }
+  }
+  else
+  {
+    ?>
+    alert(this._lc("You don't have anything to tidy!"));
+    <?php
+  }
+
+?>

Added: incubator/roller/trunk/web/roller-ui/authoring/editors/xinha/plugins/TableOperations/img/cell-delete.gif
URL: http://svn.apache.org/viewvc/incubator/roller/trunk/web/roller-ui/authoring/editors/xinha/plugins/TableOperations/img/cell-delete.gif?view=auto&rev=454197
==============================================================================
Binary file - no diff available.

Propchange: incubator/roller/trunk/web/roller-ui/authoring/editors/xinha/plugins/TableOperations/img/cell-delete.gif
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: incubator/roller/trunk/web/roller-ui/authoring/editors/xinha/plugins/TableOperations/img/cell-insert-after.gif
URL: http://svn.apache.org/viewvc/incubator/roller/trunk/web/roller-ui/authoring/editors/xinha/plugins/TableOperations/img/cell-insert-after.gif?view=auto&rev=454197
==============================================================================
Binary file - no diff available.

Propchange: incubator/roller/trunk/web/roller-ui/authoring/editors/xinha/plugins/TableOperations/img/cell-insert-after.gif
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: incubator/roller/trunk/web/roller-ui/authoring/editors/xinha/plugins/TableOperations/img/cell-insert-before.gif
URL: http://svn.apache.org/viewvc/incubator/roller/trunk/web/roller-ui/authoring/editors/xinha/plugins/TableOperations/img/cell-insert-before.gif?view=auto&rev=454197
==============================================================================
Binary file - no diff available.

Propchange: incubator/roller/trunk/web/roller-ui/authoring/editors/xinha/plugins/TableOperations/img/cell-insert-before.gif
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: incubator/roller/trunk/web/roller-ui/authoring/editors/xinha/plugins/TableOperations/img/cell-merge.gif
URL: http://svn.apache.org/viewvc/incubator/roller/trunk/web/roller-ui/authoring/editors/xinha/plugins/TableOperations/img/cell-merge.gif?view=auto&rev=454197
==============================================================================
Binary file - no diff available.

Propchange: incubator/roller/trunk/web/roller-ui/authoring/editors/xinha/plugins/TableOperations/img/cell-merge.gif
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: incubator/roller/trunk/web/roller-ui/authoring/editors/xinha/plugins/TableOperations/img/cell-prop.gif
URL: http://svn.apache.org/viewvc/incubator/roller/trunk/web/roller-ui/authoring/editors/xinha/plugins/TableOperations/img/cell-prop.gif?view=auto&rev=454197
==============================================================================
Binary file - no diff available.

Propchange: incubator/roller/trunk/web/roller-ui/authoring/editors/xinha/plugins/TableOperations/img/cell-prop.gif
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: incubator/roller/trunk/web/roller-ui/authoring/editors/xinha/plugins/TableOperations/img/cell-split.gif
URL: http://svn.apache.org/viewvc/incubator/roller/trunk/web/roller-ui/authoring/editors/xinha/plugins/TableOperations/img/cell-split.gif?view=auto&rev=454197
==============================================================================
Binary file - no diff available.

Propchange: incubator/roller/trunk/web/roller-ui/authoring/editors/xinha/plugins/TableOperations/img/cell-split.gif
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: incubator/roller/trunk/web/roller-ui/authoring/editors/xinha/plugins/TableOperations/img/col-delete.gif
URL: http://svn.apache.org/viewvc/incubator/roller/trunk/web/roller-ui/authoring/editors/xinha/plugins/TableOperations/img/col-delete.gif?view=auto&rev=454197
==============================================================================
Binary file - no diff available.

Propchange: incubator/roller/trunk/web/roller-ui/authoring/editors/xinha/plugins/TableOperations/img/col-delete.gif
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: incubator/roller/trunk/web/roller-ui/authoring/editors/xinha/plugins/TableOperations/img/col-insert-after.gif
URL: http://svn.apache.org/viewvc/incubator/roller/trunk/web/roller-ui/authoring/editors/xinha/plugins/TableOperations/img/col-insert-after.gif?view=auto&rev=454197
==============================================================================
Binary file - no diff available.

Propchange: incubator/roller/trunk/web/roller-ui/authoring/editors/xinha/plugins/TableOperations/img/col-insert-after.gif
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: incubator/roller/trunk/web/roller-ui/authoring/editors/xinha/plugins/TableOperations/img/col-insert-before.gif
URL: http://svn.apache.org/viewvc/incubator/roller/trunk/web/roller-ui/authoring/editors/xinha/plugins/TableOperations/img/col-insert-before.gif?view=auto&rev=454197
==============================================================================
Binary file - no diff available.

Propchange: incubator/roller/trunk/web/roller-ui/authoring/editors/xinha/plugins/TableOperations/img/col-insert-before.gif
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: incubator/roller/trunk/web/roller-ui/authoring/editors/xinha/plugins/TableOperations/img/col-split.gif
URL: http://svn.apache.org/viewvc/incubator/roller/trunk/web/roller-ui/authoring/editors/xinha/plugins/TableOperations/img/col-split.gif?view=auto&rev=454197
==============================================================================
Binary file - no diff available.

Propchange: incubator/roller/trunk/web/roller-ui/authoring/editors/xinha/plugins/TableOperations/img/col-split.gif
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: incubator/roller/trunk/web/roller-ui/authoring/editors/xinha/plugins/TableOperations/img/row-delete.gif
URL: http://svn.apache.org/viewvc/incubator/roller/trunk/web/roller-ui/authoring/editors/xinha/plugins/TableOperations/img/row-delete.gif?view=auto&rev=454197
==============================================================================
Binary file - no diff available.

Propchange: incubator/roller/trunk/web/roller-ui/authoring/editors/xinha/plugins/TableOperations/img/row-delete.gif
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: incubator/roller/trunk/web/roller-ui/authoring/editors/xinha/plugins/TableOperations/img/row-insert-above.gif
URL: http://svn.apache.org/viewvc/incubator/roller/trunk/web/roller-ui/authoring/editors/xinha/plugins/TableOperations/img/row-insert-above.gif?view=auto&rev=454197
==============================================================================
Binary file - no diff available.

Propchange: incubator/roller/trunk/web/roller-ui/authoring/editors/xinha/plugins/TableOperations/img/row-insert-above.gif
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: incubator/roller/trunk/web/roller-ui/authoring/editors/xinha/plugins/TableOperations/img/row-insert-under.gif
URL: http://svn.apache.org/viewvc/incubator/roller/trunk/web/roller-ui/authoring/editors/xinha/plugins/TableOperations/img/row-insert-under.gif?view=auto&rev=454197
==============================================================================
Binary file - no diff available.

Propchange: incubator/roller/trunk/web/roller-ui/authoring/editors/xinha/plugins/TableOperations/img/row-insert-under.gif
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: incubator/roller/trunk/web/roller-ui/authoring/editors/xinha/plugins/TableOperations/img/row-prop.gif
URL: http://svn.apache.org/viewvc/incubator/roller/trunk/web/roller-ui/authoring/editors/xinha/plugins/TableOperations/img/row-prop.gif?view=auto&rev=454197
==============================================================================
Binary file - no diff available.

Propchange: incubator/roller/trunk/web/roller-ui/authoring/editors/xinha/plugins/TableOperations/img/row-prop.gif
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: incubator/roller/trunk/web/roller-ui/authoring/editors/xinha/plugins/TableOperations/img/row-split.gif
URL: http://svn.apache.org/viewvc/incubator/roller/trunk/web/roller-ui/authoring/editors/xinha/plugins/TableOperations/img/row-split.gif?view=auto&rev=454197
==============================================================================
Binary file - no diff available.

Propchange: incubator/roller/trunk/web/roller-ui/authoring/editors/xinha/plugins/TableOperations/img/row-split.gif
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: incubator/roller/trunk/web/roller-ui/authoring/editors/xinha/plugins/TableOperations/img/table-prop.gif
URL: http://svn.apache.org/viewvc/incubator/roller/trunk/web/roller-ui/authoring/editors/xinha/plugins/TableOperations/img/table-prop.gif?view=auto&rev=454197
==============================================================================
Binary file - no diff available.

Propchange: incubator/roller/trunk/web/roller-ui/authoring/editors/xinha/plugins/TableOperations/img/table-prop.gif
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: incubator/roller/trunk/web/roller-ui/authoring/editors/xinha/plugins/TableOperations/lang/cz.js
URL: http://svn.apache.org/viewvc/incubator/roller/trunk/web/roller-ui/authoring/editors/xinha/plugins/TableOperations/lang/cz.js?view=auto&rev=454197
==============================================================================
--- incubator/roller/trunk/web/roller-ui/authoring/editors/xinha/plugins/TableOperations/lang/cz.js (added)
+++ incubator/roller/trunk/web/roller-ui/authoring/editors/xinha/plugins/TableOperations/lang/cz.js Sun Oct  8 12:53:13 2006
@@ -0,0 +1,79 @@
+// I18N constants
+// LANG: "cz", ENCODING: UTF-8
+// Author: Jiri Löw, <ji...@jirilow.com>
+{
+  "Align": "Zarovnání",
+  "All four sides": "Všechny čtyři strany",
+  "Background": "Pozadí",
+  "Baseline": "Základní linka",
+  "Border": "Obrys",
+  "Borders": "Obrysy",
+  "Bottom": "Dolů",
+  "Style [CSS]": "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í",
+  "Delete cell": "Smazat buňku",
+  "Insert cell after": "Vložit buňku za",
+  "Insert cell before": "Vložit buňku před",
+  "Merge cells": "Spojit buňky",
+  "Cell properties": "Vlastnosti buňky",
+  "Split cell": "Rozdělit buňku",
+  "Delete column": "Smazat sloupec",
+  "Insert column after": "Vložit sloupec za",
+  "Insert column before": "Vložit sloupec před",
+  "Split column": "Rozdělit sloupec",
+  "Delete row": "Smazat řádek",
+  "Insert row before": "Smazat řádek nad",
+  "Insert row after": "Smazat řádek pod",
+  "Row properties": "Vlastnosti řádku",
+  "Split row": "Rozdělit řádek",
+  "Table properties": "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",
+  "HTMLArea cowardly refuses to delete the last cell in row.": "HTMLArea zbaběle odmítá smazat poslední buňku v řádku.",
+  "HTMLArea cowardly refuses to delete the last column in table.": "HTMLArea zbaběle odmítá smazat poslední sloupec v tabulce.",
+  "HTMLArea cowardly refuses to delete the last row in table.": "HTMLArea zbaběle odmítá smazat poslední řádek v tabulce.",
+  "percent": "procent",
+  "pixels": "pixelů"
+};

Added: incubator/roller/trunk/web/roller-ui/authoring/editors/xinha/plugins/TableOperations/lang/da.js
URL: http://svn.apache.org/viewvc/incubator/roller/trunk/web/roller-ui/authoring/editors/xinha/plugins/TableOperations/lang/da.js?view=auto&rev=454197
==============================================================================
--- incubator/roller/trunk/web/roller-ui/authoring/editors/xinha/plugins/TableOperations/lang/da.js (added)
+++ incubator/roller/trunk/web/roller-ui/authoring/editors/xinha/plugins/TableOperations/lang/da.js Sun Oct  8 12:53:13 2006
@@ -0,0 +1,79 @@
+// I18N constants
+// LANG: "da", ENCODING: UTF-8
+// Author: Steen Sønderup, <st...@soenderup.com>
+{
+  "Align": "Placer",
+  "All four sides": "Alle fire sider",
+  "Background": "Baggrund",
+  "Baseline": "Bundlinie",
+  "Border": "Kant",
+  "Borders": "Kanter",
+  "Bottom": "Bund",
+  "Style [CSS]": "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",
+  "Delete cell": "Slet celle",
+  "Insert cell after": "Indsæt celle efter",
+  "Insert cell before": "Indsæt celle før",
+  "Merge cells": "Sammensæt celler",
+  "Cell properties": "Celle egenskaber",
+  "Split cell": "Opdel celle",
+  "Delete column": "Slet kollonne",
+  "Insert column after": "Indsæt kolonne efter",
+  "Insert column before": "Indsæt kolonne før",
+  "Split column": "Opdel kolonne",
+  "Delete row": "Slet række",
+  "Insert row before": "Indsæt række før",
+  "Insert row after": "Indsæt række efter",
+  "Row properties": "Række egenskaber",
+  "Split row": "Opdel række",
+  "Table properties": "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",
+  "HTMLArea cowardly refuses to delete the last cell in row.": "Du kan ikke slette den sidste celle i en række.",
+  "HTMLArea cowardly refuses to delete the last column in table.": "Du kan ikke slette den sidste kolonne i en tabel.",
+  "HTMLArea cowardly refuses to delete the last row in table.": "Du kan ikke slette den sidste række i en tabel.",
+  "percent": "procent",
+  "pixels": "pixel"
+};

Added: incubator/roller/trunk/web/roller-ui/authoring/editors/xinha/plugins/TableOperations/lang/de.js
URL: http://svn.apache.org/viewvc/incubator/roller/trunk/web/roller-ui/authoring/editors/xinha/plugins/TableOperations/lang/de.js?view=auto&rev=454197
==============================================================================
--- incubator/roller/trunk/web/roller-ui/authoring/editors/xinha/plugins/TableOperations/lang/de.js (added)
+++ incubator/roller/trunk/web/roller-ui/authoring/editors/xinha/plugins/TableOperations/lang/de.js Sun Oct  8 12:53:13 2006
@@ -0,0 +1,81 @@
+// I18N constants
+// LANG: "de", ENCODING: UTF-8
+// translated: Raimund Meyer xinha@ray-of-light.org
+{
+  "Align": "Ausrichtung",
+  "All four sides": "Alle 4 Seiten",
+  "Background": "Hintergrund",
+  "Baseline": "Grundlinie",
+  "Border": "Rahmen",
+  "Borders": "Rahmen",
+  "Bottom": "Unten",
+  "Style [CSS]": "Style [CSS]",
+  "Caption": "Überschrift",
+  "Cell Properties": "Zellenoptionen",
+  "Center": "Zentriert",
+  "Char": "Zeichen",
+  "Collapsed borders": "Rahmen fallen zusammen",
+  "Color": "Farbe",
+  "Description": "Beschreibung",
+  "FG Color": "Vordergrundfarbe",
+  "Float": "Float",
+  "Frames": "Rahmen",
+  "Height": "Höhe",
+  "How many columns would you like to merge?": "Wieviele Spalten wollen Sie verbinden?",
+  "How many rows would you like to merge?": "Wieviele Zeilen wollen Sie verbinden?",
+  "Image URL": "Bild-URL",
+  "Justify": "Blocksatz",
+  "Layout": "Layout",
+  "Left": "Links",
+  "Margin": "Rand",
+  "Middle": "Mitte",
+  "No rules": "Keine Gitterlinien",
+  "No sides": "Keine Ränder",
+  "None": "Keine",
+  "Padding": "Innenabstand",
+  "Please click into some cell": "Bitte eine Zelle auswählen",
+  "Right": "Rechts",
+  "Row Properties": "Zeilenoptionen",
+  "Rules will appear between all rows and columns": "Linien zwischen Zeilen und Spalten",
+  "Rules will appear between columns only": "Linien zwischen Spalten",
+  "Rules will appear between rows only": "Linien zwischen  Zeilen",
+  "Rules": "Linien",
+  "Spacing and padding": "Abstände",
+  "Spacing": "Abstand",
+  "Summary": "Zusammenfassung",
+  "Delete cell": "Zelle löschen",
+  "Insert cell after": "Zelle einfügen nach",
+  "Insert cell before": "Zelle einfügen vor",
+  "Merge cells": "Zellen zusammenfügen",
+  "Cell properties": "Zellenoptionen",
+  "Split cell": "Zellen teilen",
+  "Delete column": "Spalte löschen",
+  "Insert column after": "Spalte einfügen nach",
+  "Insert column before": "Spalte einfügen vor",
+  "Split column": "Spalte teilen",
+  "Delete row": "Reihe loeschen",
+  "Insert row before": "Reihe einfügen vor",
+  "Insert row after": "Reihe einfügen nach",
+  "Row properties": "Reiheneinstellungen",
+  "Split row": "Reihen aufteilen",
+  "Table properties": "Tabellenoptionen",
+  "Table Properties": "Tabellenoptionen",
+  "Text align": "Textausrichtung",
+  "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 entfernen",
+  "Vertical align": "Vertikale Ausrichtung",
+  "Width": "Breite",
+  "HTMLArea cowardly refuses to delete the last cell in row.": "Letzte Zelle in dieser Zeile kann nicht gelöscht werden",
+  "HTMLArea cowardly refuses to delete the last column in table.": "Letzte Spalte in dieser Tabelle kann nicht gelöscht werden",
+  "HTMLArea cowardly refuses to delete the last row in table.": "Letzte Reihe in dieser Tabelle kann nicht gelöscht werden",
+  "percent": "%",
+  "pixels": "Pixel",
+  "OK": "OK",
+  "Cancel": "Abbrechen"
+};

Added: incubator/roller/trunk/web/roller-ui/authoring/editors/xinha/plugins/TableOperations/lang/el.js
URL: http://svn.apache.org/viewvc/incubator/roller/trunk/web/roller-ui/authoring/editors/xinha/plugins/TableOperations/lang/el.js?view=auto&rev=454197
==============================================================================
--- incubator/roller/trunk/web/roller-ui/authoring/editors/xinha/plugins/TableOperations/lang/el.js (added)
+++ incubator/roller/trunk/web/roller-ui/authoring/editors/xinha/plugins/TableOperations/lang/el.js Sun Oct  8 12:53:13 2006
@@ -0,0 +1,79 @@
+// I18N constants
+// LANG: "el", ENCODING: UTF-8
+// Author: Dimitris Glezos, dimitris@glezos.com
+{
+  "Align": "Στοίχηση",
+  "All four sides": "Και οι 4 πλευρές",
+  "Background": "Φόντο",
+  "Baseline": "Baseline",
+  "Border": "Περίγραμμα",
+  "Borders": "Περιγράμματα",
+  "Bottom": "Κάτω μέρος",
+  "Style [CSS]": "Στυλ [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": "Σύνοψη",
+  "Delete cell": "Διαγραφή κελιού",
+  "Insert cell after": "Εισαγωγή κελιού μετά",
+  "Insert cell before": "Εισαγωγή κελιού πριν",
+  "Merge cells": "Συγχώνευση κελιών",
+  "Cell properties": "Ιδιότητες κελιού",
+  "Split cell": "Διαίρεση κελιού",
+  "Delete column": "Διαγραφή στήλης",
+  "Insert column after": "Εισαγωγή στήλης μετά",
+  "Insert column before": "Εισαγωγή στήλης πριν",
+  "Split column": "Διαίρεση στήλης",
+  "Delete row": "Διαγραφή γραμμής",
+  "Insert row before": "Εισαγωγή γραμμής μετά",
+  "Insert row after": "Εισαγωγή γραμμής πριν",
+  "Row properties": "Ιδιότητες γραμμής",
+  "Split row": "Διαίρεση γραμμής",
+  "Table properties": "Ιδιότητες πίνακα",
+  "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": "Πλάτος",
+  "HTMLArea cowardly refuses to delete the last cell in row.": "Δεν μπορεί να διαγραφεί το τελευταίο κελί σε μια γραμμή.",
+  "HTMLArea cowardly refuses to delete the last column in table.": "Δεν μπορεί να διαγραφεί η τελευταία στήλη σε ένα πίνακα.",
+  "HTMLArea cowardly refuses to delete the last row in table.": "Δεν μπορεί να διαγραφεί η τελευταία γραμμή σε ένα πίνακα.",
+  "percent": "τοις εκατόν",
+  "pixels": "pixels"
+};

Added: incubator/roller/trunk/web/roller-ui/authoring/editors/xinha/plugins/TableOperations/lang/fi.js
URL: http://svn.apache.org/viewvc/incubator/roller/trunk/web/roller-ui/authoring/editors/xinha/plugins/TableOperations/lang/fi.js?view=auto&rev=454197
==============================================================================
--- incubator/roller/trunk/web/roller-ui/authoring/editors/xinha/plugins/TableOperations/lang/fi.js (added)
+++ incubator/roller/trunk/web/roller-ui/authoring/editors/xinha/plugins/TableOperations/lang/fi.js Sun Oct  8 12:53:13 2006
@@ -0,0 +1,68 @@
+// I18N constants
+// LANG: "fi", ENCODING: UTF-8
+{
+  "Align": "Kohdistus",
+  "All four sides": "Kaikki neljä sivua",
+  "Background": "Tausta",
+  "Baseline": "Takaraja",
+  "Border": "Reuna",
+  "Borders": "Reunat",
+  "Bottom": "Alle",
+  "Style [CSS]": "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",
+  "Delete cell": "Poista solu",
+  "Insert cell after": "Lisää solu perään",
+  "Insert cell before": "Lisää solu ennen",
+  "Merge cells": "Yhdistä solut",
+  "Cell properties": "Solun asetukset",
+  "Split cell": "Jaa solu",
+  "Delete column": "Poista sarake",
+  "Insert column after": "Lisää sarake perään",
+  "Insert column before": "Lisää sarake ennen",
+  "Split column": "Jaa sarake",
+  "Delete row": "Poista rivi",
+  "Insert row before": "Lisää rivi yläpuolelle",
+  "Insert row after": "Lisää rivi alapuolelle",
+  "Row properties": "Rivin asetukset",
+  "Split row": "Jaa rivi",
+  "Table properties": "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",
+  "HTMLArea cowardly refuses to delete the last cell in row.": "Ei voida poistaa viimeistä solua rivistä.",
+  "HTMLArea cowardly refuses to delete the last column in table.": "Ei voida poistaa viimeistä saraketta taulusta.",
+  "HTMLArea cowardly refuses to delete the last row in table.": "Ei voida poistaa viimeistä riviä taulusta.",
+  "percent": "prosenttia",
+  "pixels": "pikseliä"
+};

Added: incubator/roller/trunk/web/roller-ui/authoring/editors/xinha/plugins/TableOperations/lang/fr.js
URL: http://svn.apache.org/viewvc/incubator/roller/trunk/web/roller-ui/authoring/editors/xinha/plugins/TableOperations/lang/fr.js?view=auto&rev=454197
==============================================================================
--- incubator/roller/trunk/web/roller-ui/authoring/editors/xinha/plugins/TableOperations/lang/fr.js (added)
+++ incubator/roller/trunk/web/roller-ui/authoring/editors/xinha/plugins/TableOperations/lang/fr.js Sun Oct  8 12:53:13 2006
@@ -0,0 +1,78 @@
+// I18N constants
+// LANG: "fr", ENCODING: UTF-8
+{
+  "Align": "Aligner",
+  "All four sides": "Quatre cotés",
+  "Background": "Arrière plan",
+  "Baseline": "Ligne de base",
+  "Border": "Bordure",
+  "Borders": "Bordures",
+  "Bottom": "Bas",
+  "Style [CSS]": "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": "Aucune règle",
+  "No sides": "Aucun côté",
+  "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": "Règles entre les rangées et les cellules",
+  "Rules will appear between columns only": "Règles entre les colonnes seulement",
+  "Rules will appear between rows only": "Règles entre les rangées seulement",
+  "Rules": "Les règles",
+  "Spacing and padding": "Espacement et remplissage",
+  "Spacing": "Espacement",
+  "Summary": "Sommaire",
+  "Delete cell": "Supprimer une cellule",
+  "Insert cell after": "Insérer une cellule après",
+  "Insert cell before": "Insérer une cellule avant",
+  "Merge cells": "Fusionner les cellules",
+  "Cell properties": "Cell properties",
+  "Split cell": "Diviser la cellule",
+  "Delete column": "Supprimer la colonne",
+  "Insert column after": "Insérer une colonne après",
+  "Insert column before": "Insérer une colonne avant",
+  "Split column": "Diviser une colonne",
+  "Delete row": "Supprimer une rangée",
+  "Insert row before": "Insérer une rangée avant",
+  "Insert row after": "Insérer une rangée après",
+  "Row properties": "Propriétés de rangée",
+  "Split row": "Diviser la rangée",
+  "Table properties": "Propriétés de table",
+  "Table Properties": "Propriétés de table",
+  "Text align": "Alignement",
+  "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": "Vertical",
+  "Width": "Longeur",
+  "HTMLArea cowardly refuses to delete the last cell in row.": "Il est impossible de supprimer la dernière cellule de la rangée.",
+  "HTMLArea cowardly refuses to delete the last column in table.": "Il est impossible de supprimer la dernière colonne de la table.",
+  "HTMLArea cowardly refuses to delete the last row in table.": "Il est impossible de supprimer la dernière rangée de la table",
+  "percent": "%",
+  "pixels": "pixels"
+};
\ No newline at end of file

Added: incubator/roller/trunk/web/roller-ui/authoring/editors/xinha/plugins/TableOperations/lang/he.js
URL: http://svn.apache.org/viewvc/incubator/roller/trunk/web/roller-ui/authoring/editors/xinha/plugins/TableOperations/lang/he.js?view=auto&rev=454197
==============================================================================
--- incubator/roller/trunk/web/roller-ui/authoring/editors/xinha/plugins/TableOperations/lang/he.js (added)
+++ incubator/roller/trunk/web/roller-ui/authoring/editors/xinha/plugins/TableOperations/lang/he.js Sun Oct  8 12:53:13 2006
@@ -0,0 +1,79 @@
+// I18N constants
+// LANG: "he", ENCODING: UTF-8
+// Author: Liron Newman, http://www.eesh.net, <plastish at ultinet dot org>
+{
+  "Align": "ישור",
+  "All four sides": "כל ארבעת הצדדים",
+  "Background": "רקע",
+  "Baseline": "קו בסיס",
+  "Border": "גבול",
+  "Borders": "גבולות",
+  "Bottom": "תחתון",
+  "Style [CSS]": "סגנון [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": "סיכום",
+  "Delete cell": "מחק תא",
+  "Insert cell after": "הכנס תא אחרי",
+  "Insert cell before": "הכנס תא לפני",
+  "Merge cells": "מזג תאים",
+  "Cell properties": "מאפייני תא",
+  "Split cell": "פצל תא",
+  "Delete column": "מחק טור",
+  "Insert column after": "הכנס טור אחרי",
+  "Insert column before": "הכנס טור לפני",
+  "Split column": "פצל טור",
+  "Delete row": "מחק שורה",
+  "Insert row before": "הכנס שורה לפני",
+  "Insert row after": "הכנס שורה אחרי",
+  "Row properties": "מאפייני שורה",
+  "Split row": "פצל שורה",
+  "Table properties": "מאפייני טבלה",
+  "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": "רוחב",
+  "HTMLArea cowardly refuses to delete the last cell in row.": "HTMLArea מסרב בפחדנות למחוק את התא האחרון בשורה.",
+  "HTMLArea cowardly refuses to delete the last column in table.": "HTMLArea מסרב בפחדנות למחוק את הטור האחרון בטבלה.",
+  "HTMLArea cowardly refuses to delete the last row in table.": "HTMLArea מסרב בפחדנות למחוק את השורה האחרונה בטבלה.",
+  "percent": "אחוז",
+  "pixels": "פיקסלים"
+};