* Added feature #7667: htmlArea RTE: Usability improvements in table operations
authorStanislas Rolland <typo3@sjbr.ca>
Tue, 26 Feb 2008 05:22:55 +0000 (05:22 +0000)
committerStanislas Rolland <typo3@sjbr.ca>
Tue, 26 Feb 2008 05:22:55 +0000 (05:22 +0000)
git-svn-id: https://svn.typo3.org/TYPO3v4/Core/trunk@3288 709f56b5-9817-0410-a4d7-c38de5d9e867

27 files changed:
ChangeLog
typo3/sysext/rtehtmlarea/ChangeLog
typo3/sysext/rtehtmlarea/class.tx_rtehtmlarea_base.php
typo3/sysext/rtehtmlarea/doc/manual.sxw
typo3/sysext/rtehtmlarea/ext_emconf.php
typo3/sysext/rtehtmlarea/extensions/TYPO3Color/class.tx_rtehtmlarea_typo3color.php
typo3/sysext/rtehtmlarea/extensions/TableOperations/class.tx_rtehtmlarea_tableoperations.php
typo3/sysext/rtehtmlarea/extensions/TableOperations/skin/htmlarea.css
typo3/sysext/rtehtmlarea/extensions/TableOperations/skin/images/col-prop.gif [new file with mode: 0644]
typo3/sysext/rtehtmlarea/extensions/TableOperations/skin/images/table-restyle.gif [new file with mode: 0644]
typo3/sysext/rtehtmlarea/htmlarea/htmlarea-gecko.js
typo3/sysext/rtehtmlarea/htmlarea/htmlarea.js
typo3/sysext/rtehtmlarea/htmlarea/plugins/BlockElements/block-elements.js
typo3/sysext/rtehtmlarea/htmlarea/plugins/BlockStyle/block-style.js
typo3/sysext/rtehtmlarea/htmlarea/plugins/ContextMenu/context-menu.js
typo3/sysext/rtehtmlarea/htmlarea/plugins/ContextMenu/locallang.xml
typo3/sysext/rtehtmlarea/htmlarea/plugins/TYPO3Color/typo3color.js
typo3/sysext/rtehtmlarea/htmlarea/plugins/TableOperations/locallang.xml
typo3/sysext/rtehtmlarea/htmlarea/plugins/TableOperations/table-operations.js
typo3/sysext/rtehtmlarea/htmlarea/skins/default/htmlarea-edited-content.css
typo3/sysext/rtehtmlarea/htmlarea/skins/default/htmlarea.css
typo3/sysext/rtehtmlarea/htmlarea/skins/default/images/TableOperations/col-prop.gif [new file with mode: 0644]
typo3/sysext/rtehtmlarea/htmlarea/skins/default/images/TableOperations/table-restyle.gif [new file with mode: 0644]
typo3/sysext/t3skin/rtehtmlarea/htmlarea-edited-content.css
typo3/sysext/t3skin/rtehtmlarea/htmlarea.css
typo3/sysext/t3skin/rtehtmlarea/images/TableOperations/col-prop.gif [new file with mode: 0644]
typo3/sysext/t3skin/rtehtmlarea/images/TableOperations/table-restyle.gif [new file with mode: 0644]

index 970defb..6a718b0 100755 (executable)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2008-02-26  Stanislas Rolland  <stanislas.rolland@fructifor.ca>
+
+       * Added feature #7667: htmlArea RTE: Usability improvements in table operations
+
 2007-11-22  Ernesto Baschny  <ernst@cron-it.de>
 
        * Follow-up on bug #1697 (bug #7626): Timezone handling in datetime/time fields was broken, causing time to jump +serverTZ on each record saving.
 2007-11-22  Ernesto Baschny  <ernst@cron-it.de>
 
        * Follow-up on bug #1697 (bug #7626): Timezone handling in datetime/time fields was broken, causing time to jump +serverTZ on each record saving.
index 9810cd4..ff58ff3 100644 (file)
@@ -1,3 +1,7 @@
+2008-02-26  Stanislas Rolland  <stanislas.rolland@fructifor.ca>
+
+       * Added feature #7667: htmlArea RTE: Usability improvements in table operations
+
 2008-02-20  Stanislas Rolland  <stanislas.rolland@fructifor.ca>
 
        * Fixed bug #7602: htmlArea RTE: Make the use of extended inline elements configurable
 2008-02-20  Stanislas Rolland  <stanislas.rolland@fructifor.ca>
 
        * Fixed bug #7602: htmlArea RTE: Make the use of extended inline elements configurable
index 7effd02..eba754e 100644 (file)
@@ -539,8 +539,8 @@ class tx_rtehtmlarea_base extends t3lib_rteapi {
                        bar, textcolor, bgcolor, textindicator,
                        bar, emoticon, insertcharacter, line, link, unlink, image, table,' . (($this->thisConfig['hideTableOperationsInToolbar'] && is_array($this->thisConfig['buttons.']) && is_array($this->thisConfig['buttons.']['toggleborders.']) && $this->thisConfig['buttons.']['toggleborders.']['keepInToolbar']) ? ' toggleborders,': '') . ' user, acronym, bar, findreplace, spellcheck,
                        bar, chMode, inserttag, removeformat, bar, copy, cut, paste, bar, undo, redo, bar, showhelp, about, linebreak, 
                        bar, textcolor, bgcolor, textindicator,
                        bar, emoticon, insertcharacter, line, link, unlink, image, table,' . (($this->thisConfig['hideTableOperationsInToolbar'] && is_array($this->thisConfig['buttons.']) && is_array($this->thisConfig['buttons.']['toggleborders.']) && $this->thisConfig['buttons.']['toggleborders.']['keepInToolbar']) ? ' toggleborders,': '') . ' user, acronym, bar, findreplace, spellcheck,
                        bar, chMode, inserttag, removeformat, bar, copy, cut, paste, bar, undo, redo, bar, showhelp, about, linebreak, 
-                       ' . ($this->thisConfig['hideTableOperationsInToolbar'] ? '': 'bar, toggleborders,') . ' bar, tableproperties, bar, rowproperties, rowinsertabove, rowinsertunder, rowdelete, rowsplit, bar,
-                       columninsertbefore, columninsertafter, columndelete, columnsplit, bar,
+                       ' . ($this->thisConfig['hideTableOperationsInToolbar'] ? '': 'bar, toggleborders,') . ' bar, tableproperties, tablerestyle, bar, rowproperties, rowinsertabove, rowinsertunder, rowdelete, rowsplit, bar,
+                       columnproperties, columninsertbefore, columninsertafter, columndelete, columnsplit, bar,
                        cellproperties, cellinsertbefore, cellinsertafter, celldelete, cellsplit, cellmerge';
                
                        // Special toolbar for Mozilla Wamcom on Mac OS 9
                        cellproperties, cellinsertbefore, cellinsertafter, celldelete, cellsplit, cellmerge';
                
                        // Special toolbar for Mozilla Wamcom on Mac OS 9
@@ -551,8 +551,8 @@ class tx_rtehtmlarea_base extends t3lib_rteapi {
                                bar, orderedlist, unorderedlist, outdent, indent, bar, textcolor, bgcolor, textindicator, bar, emoticon,
                                insertcharacter, line, link, unlink, image, table, user, acronym, bar, findreplace, spellcheck, bar, chMode, inserttag,
                                removeformat, bar, copy, cut, paste, bar, undo, redo, bar, showhelp, about, linebreak,
                                bar, orderedlist, unorderedlist, outdent, indent, bar, textcolor, bgcolor, textindicator, bar, emoticon,
                                insertcharacter, line, link, unlink, image, table, user, acronym, bar, findreplace, spellcheck, bar, chMode, inserttag,
                                removeformat, bar, copy, cut, paste, bar, undo, redo, bar, showhelp, about, linebreak,
-                               bar, toggleborders, bar, tableproperties, bar, rowproperties, rowinsertabove, rowinsertunder, rowdelete, rowsplit, bar,
-                               columninsertbefore, columninsertafter, columndelete, columnsplit, bar,
+                               bar, toggleborders, bar, tableproperties, tablerestyle, bar, rowproperties, rowinsertabove, rowinsertunder, rowdelete, rowsplit, bar,
+                               columnproperties, columninsertbefore, columninsertafter, columndelete, columnsplit, bar,
                                cellproperties, cellinsertbefore, cellinsertafter, celldelete, cellsplit, cellmerge'
                                : 'bar, blockstylelabel, blockstyle, space, textstylelabel, textstyle, linebreak,
                                bar, fontstyle, space, fontsize, space, formatblock, insertparagraphbefore, insertparagraphafter, blockquote, bar, bold, italic, underline, strikethrough,
                                cellproperties, cellinsertbefore, cellinsertafter, celldelete, cellsplit, cellmerge'
                                : 'bar, blockstylelabel, blockstyle, space, textstylelabel, textstyle, linebreak,
                                bar, fontstyle, space, fontsize, space, formatblock, insertparagraphbefore, insertparagraphafter, blockquote, bar, bold, italic, underline, strikethrough,
@@ -560,8 +560,8 @@ class tx_rtehtmlarea_base extends t3lib_rteapi {
                                orderedlist, unorderedlist, outdent, indent, bar, textcolor, bgcolor, textindicator, bar, emoticon,
                                insertcharacter, line, link, unlink, image, table, user, acronym, linebreak, bar, findreplace, spellcheck, bar, chMode, inserttag,
                                removeformat, bar, copy, cut, paste, bar, undo, redo, bar, showhelp, about, linebreak,
                                orderedlist, unorderedlist, outdent, indent, bar, textcolor, bgcolor, textindicator, bar, emoticon,
                                insertcharacter, line, link, unlink, image, table, user, acronym, linebreak, bar, findreplace, spellcheck, bar, chMode, inserttag,
                                removeformat, bar, copy, cut, paste, bar, undo, redo, bar, showhelp, about, linebreak,
-                               bar, toggleborders, bar, tableproperties, bar, rowproperties, rowinsertabove, rowinsertunder, rowdelete, rowsplit, bar,
-                               columninsertbefore, columninsertafter, columndelete, columnsplit, bar,
+                               bar, toggleborders, bar, tableproperties, tablerestyle, bar, rowproperties, rowinsertabove, rowinsertunder, rowdelete, rowsplit, bar,
+                               columnproperties, columninsertbefore, columninsertafter, columndelete, columnsplit, bar,
                                cellproperties, cellinsertbefore, cellinsertafter, celldelete, cellsplit, cellmerge';
                }
                
                                cellproperties, cellinsertbefore, cellinsertafter, celldelete, cellsplit, cellmerge';
                }
                
@@ -737,8 +737,7 @@ class tx_rtehtmlarea_base extends t3lib_rteapi {
                        };
                        RTEarea = new Array();
                        RTEarea[0] = new Object();
                        };
                        RTEarea = new Array();
                        RTEarea[0] = new Object();
-                       RTEarea[0]["version"] = "' . $TYPO3_CONF_VARS['EXTCONF'][$this->ID]['version'] . '";
-                       RTEarea[0]["popupwin"] = "' . $this->writeTemporaryFile('EXT:' . $this->ID . '/htmlarea/popupwin.js', "popupwin") . '";'
+                       RTEarea[0]["version"] = "' . $TYPO3_CONF_VARS['EXTCONF'][$this->ID]['version'] . '";'
                        . (($this->client['BROWSER'] == 'msie') ? ('
                        RTEarea[0]["htmlarea-ie"] = "' . $this->writeTemporaryFile('EXT:' . $this->ID . '/htmlarea/htmlarea-ie.js', "htmlarea-ie") . '";')
                        : ('
                        . (($this->client['BROWSER'] == 'msie') ? ('
                        RTEarea[0]["htmlarea-ie"] = "' . $this->writeTemporaryFile('EXT:' . $this->ID . '/htmlarea/htmlarea-ie.js', "htmlarea-ie") . '";')
                        : ('
@@ -810,7 +809,8 @@ class tx_rtehtmlarea_base extends t3lib_rteapi {
                        RTEarea['.$RTEcounter.'].id = "RTEarea'.$RTEcounter.'";
                        RTEarea['.$RTEcounter.'].enableWordClean = ' . (trim($this->thisConfig['enableWordClean'])?'true':'false') . ';
                        RTEarea['.$RTEcounter.']["htmlRemoveComments"] = ' . (trim($this->thisConfig['removeComments'])?'true':'false') . ';
                        RTEarea['.$RTEcounter.'].id = "RTEarea'.$RTEcounter.'";
                        RTEarea['.$RTEcounter.'].enableWordClean = ' . (trim($this->thisConfig['enableWordClean'])?'true':'false') . ';
                        RTEarea['.$RTEcounter.']["htmlRemoveComments"] = ' . (trim($this->thisConfig['removeComments'])?'true':'false') . ';
-                       RTEarea['.$RTEcounter.']["disableEnterParagraphs"] = ' . (trim($this->thisConfig['disableEnterParagraphs'])?'true':'false') . ';
+                       RTEarea['.$RTEcounter.'].disableEnterParagraphs = ' . (trim($this->thisConfig['disableEnterParagraphs'])?'true':'false') . ';
+                       RTEarea['.$RTEcounter.'].disableObjectResizing = ' . (trim($this->thisConfig['disableObjectResizing'])?'true':'false') . ';
                        RTEarea['.$RTEcounter.']["removeTrailingBR"] = ' . (trim($this->thisConfig['removeTrailingBR'])?'true':'false') . ';
                        RTEarea['.$RTEcounter.']["useCSS"] = ' . (trim($this->thisConfig['useCSS'])?'true':'false') . ';
                        RTEarea['.$RTEcounter.']["keepButtonGroupTogether"] = ' . (trim($this->thisConfig['keepButtonGroupTogether'])?'true':'false') . ';
                        RTEarea['.$RTEcounter.']["removeTrailingBR"] = ' . (trim($this->thisConfig['removeTrailingBR'])?'true':'false') . ';
                        RTEarea['.$RTEcounter.']["useCSS"] = ' . (trim($this->thisConfig['useCSS'])?'true':'false') . ';
                        RTEarea['.$RTEcounter.']["keepButtonGroupTogether"] = ' . (trim($this->thisConfig['keepButtonGroupTogether'])?'true':'false') . ';
@@ -845,67 +845,8 @@ class tx_rtehtmlarea_base extends t3lib_rteapi {
                        foreach ($this->thisConfig['buttons.'] as $buttonIndex => $conf) {
                                $button = substr($buttonIndex, 0, -1);
                                if (in_array($button,$this->toolbar)) {
                        foreach ($this->thisConfig['buttons.'] as $buttonIndex => $conf) {
                                $button = substr($buttonIndex, 0, -1);
                                if (in_array($button,$this->toolbar)) {
-                                       $indexButton = 0;
                                        $configureRTEInJavascriptString .= '
                                        $configureRTEInJavascriptString .= '
-                       RTEarea['.$RTEcounter.'].buttons.'.$button.' = {';
-                                       if (is_array($conf)) {
-                                               foreach ($conf as $propertyName => $conf1) {
-                                                       $property = $propertyName;
-                                                       if ($indexButton) {
-                                                               $configureRTEInJavascriptString .= ', ';
-                                                       }
-                                                       if (is_array($conf1)) {
-                                                               $property = substr($property, 0, -1);
-                                                               $indexProperty = 0;
-                                                               $configureRTEInJavascriptString .= '"'.$property.'" : {';
-                                                               foreach ($conf1 as $property1Name => $conf2) {
-                                                                       $property1 = $property1Name;
-                                                                       if ($indexProperty) {
-                                                                               $configureRTEInJavascriptString .= ', ';
-                                                                       }
-                                                                       if (is_array($conf2)) {
-                                                                               $property1 = substr($property1, 0, -1);
-                                                                               $indexProperty1 = 0;
-                                                                               $configureRTEInJavascriptString .= '"'.$property1.'" : {';
-                                                                               foreach ($conf2 as $property2Name => $conf3) {
-                                                                                       $property2 = $property2Name;
-                                                                                       if ($indexProperty1) {
-                                                                                               $configureRTEInJavascriptString .= ', ';
-                                                                                       }
-                                                                                       if (is_array($conf3)) {
-                                                                                               $property2 = substr($property2, 0, -1);
-                                                                                               $indexProperty2 = 0;
-                                                                                               $configureRTEInJavascriptString .= '"'.$property2.'" : {';
-                                                                                               foreach($conf3 as $property3Name => $conf4) {
-                                                                                                       $property3 = $property3Name;
-                                                                                                       if ($indexProperty2) {
-                                                                                                               $configureRTEInJavascriptString .= ', ';
-                                                                                                       }
-                                                                                                       if (!is_array($conf4)) {
-                                                                                                               $configureRTEInJavascriptString .= '"'.$property3.'" : '.($conf4?'"'.$conf4.'"':'false');
-                                                                                                       }
-                                                                                                       $indexProperty2++;
-                                                                                               }
-                                                                                               $configureRTEInJavascriptString .= '}';
-                                                                                       } else {
-                                                                                               $configureRTEInJavascriptString .= '"'.$property2.'" : '.($conf3?'"'.$conf3.'"':'false');                                                                                               
-                                                                                       }
-                                                                                       $indexProperty1++;
-                                                                               }
-                                                                               $configureRTEInJavascriptString .= '}';
-                                                                       } else {
-                                                                               $configureRTEInJavascriptString .= '"'.$property1.'" : '.($conf2?'"'.$conf2.'"':'false');
-                                                                       }
-                                                                       $indexProperty++;
-                                                               }
-                                                               $configureRTEInJavascriptString .= '}';
-                                                       } else {
-                                                               $configureRTEInJavascriptString .= '"'.$property.'" : '.($conf1?'"'.$conf1.'"':'false');
-                                                       }
-                                                       $indexButton++;
-                                               }
-                                       }
-                                       $configureRTEInJavascriptString .= '};';
+                       RTEarea['.$RTEcounter.'].buttons.'.$button.' = ' . $this->buildNestedJSArray($conf) . ';';
                                }
                        }
                }
                                }
                        }
                }
@@ -1058,9 +999,12 @@ class tx_rtehtmlarea_base extends t3lib_rteapi {
                
                $linebreak = $TYPO3_CONF_VARS['EXTCONF'][$this->ID]['enableCompressedScripts'] ? '' : chr(10);
                $index = 0;
                
                $linebreak = $TYPO3_CONF_VARS['EXTCONF'][$this->ID]['enableCompressedScripts'] ? '' : chr(10);
                $index = 0;
+               $indexNoShow = 0;
+               $indexAlternating = 0;
                $JSClassesLabelsArray = 'HTMLArea.classesLabels = { ' . $linebreak;
                $JSClassesValuesArray = 'HTMLArea.classesValues = { ' . $linebreak;
                $JSClassesNoShowArray = 'HTMLArea.classesNoShow = { ' . $linebreak;
                $JSClassesLabelsArray = 'HTMLArea.classesLabels = { ' . $linebreak;
                $JSClassesValuesArray = 'HTMLArea.classesValues = { ' . $linebreak;
                $JSClassesNoShowArray = 'HTMLArea.classesNoShow = { ' . $linebreak;
+               $JSClassesAlternatingArray = 'HTMLArea.classesAlternating = { ' . $linebreak;
                $JSClassesXORArray = 'HTMLArea.classesXOR = { ' . $linebreak;
                
                        // Scanning the list of classes if specified in the RTE config
                $JSClassesXORArray = 'HTMLArea.classesXOR = { ' . $linebreak;
                
                        // Scanning the list of classes if specified in the RTE config
@@ -1069,13 +1013,20 @@ class tx_rtehtmlarea_base extends t3lib_rteapi {
                        foreach ($RTEProperties['classes.'] as $className => $conf) {
                                $className = substr($className,0,-1);
                                $classLabel = $this->getPageConfigLabel($conf['name']);
                        foreach ($RTEProperties['classes.'] as $className => $conf) {
                                $className = substr($className,0,-1);
                                $classLabel = $this->getPageConfigLabel($conf['name']);
-                               $JSClassesLabelsArray .= (($index)?',':'') . '"' . $className . '": ' . $classLabel . $linebreak;
-                               $JSClassesValuesArray .= (($index)?',':'') . '"' . $className . '":"' . str_replace('"', '\"', str_replace('\\\'', '\'', $conf['value'])) . '"' . $linebreak;
-                               $JSClassesNoShowArray .= (($index)?',':'') . '"' . $className . '":' . ($conf['noShow']?'true':'false') . $linebreak;
+                               $JSClassesLabelsArray .= ($index?',':'') . '"' . $className . '": ' . $classLabel . $linebreak;
+                               $JSClassesValuesArray .= ($index?',':'') . '"' . $className . '":"' . str_replace('"', '\"', str_replace('\\\'', '\'', $conf['value'])) . '"' . $linebreak;
+                               if ($conf['noShow']) {
+                                       $JSClassesNoShowArray .= ($indexNoShow?',':'') . '"' . $className . '":' . ($conf['noShow']?'true':'false') . $linebreak;
+                                       $indexNoShow++;
+                               }
+                               if (is_array($conf['alternating.'])) {
+                                       $JSClassesAlternatingArray .= ($indexAlternating?',':'') . '"' . $className . '":' . (is_array($conf['alternating.']) ? $this->buildNestedJSArray($conf['alternating.']) : ' "false"') . $linebreak;
+                                       $indexAlternating++;
+                               }
                                if (is_array($RTEProperties['mutuallyExclusiveClasses.']))  {
                                        foreach ($RTEProperties['mutuallyExclusiveClasses.'] as $listName => $conf) {
                                                if (t3lib_div::inList($conf, $className)) {
                                if (is_array($RTEProperties['mutuallyExclusiveClasses.']))  {
                                        foreach ($RTEProperties['mutuallyExclusiveClasses.'] as $listName => $conf) {
                                                if (t3lib_div::inList($conf, $className)) {
-                                                       $JSClassesXORArray .= (($index)?',':'') . '"' . $className . '": /^(' . implode('|', t3lib_div::trimExplode(',', t3lib_div::rmFromList($className, $conf), 1)) . ')$/i' . $linebreak;
+                                                       $JSClassesXORArray .= ($index?',':'') . '"' . $className . '": /^(' . implode('|', t3lib_div::trimExplode(',', t3lib_div::rmFromList($className, $conf), 1)) . ')$/i' . $linebreak;
                                                        break;
                                                }
                                        }
                                                        break;
                                                }
                                        }
@@ -1086,9 +1037,81 @@ class tx_rtehtmlarea_base extends t3lib_rteapi {
                $JSClassesLabelsArray .= '};' . $linebreak;
                $JSClassesValuesArray .= '};' . $linebreak;
                $JSClassesNoShowArray .= '};' . $linebreak;
                $JSClassesLabelsArray .= '};' . $linebreak;
                $JSClassesValuesArray .= '};' . $linebreak;
                $JSClassesNoShowArray .= '};' . $linebreak;
+               $JSClassesAlternatingArray .= '};' . $linebreak;
                $JSClassesXORArray .= '};' . $linebreak;
                
                $JSClassesXORArray .= '};' . $linebreak;
                
-               return $JSClassesLabelsArray . $JSClassesValuesArray . $JSClassesNoShowArray . $JSClassesXORArray;
+               return $JSClassesLabelsArray . $JSClassesValuesArray . $JSClassesNoShowArray . $JSClassesAlternatingArray . $JSClassesXORArray;
+       }
+       
+       /**
+        * Translate Page TS Config array in JS nested array definition
+        *
+        * @param       array           $conf: Page TSConfig configuration array
+        *
+        * @return      string          nested JS array definition
+        */
+       function buildNestedJSArray($conf) {
+               $configureRTEInJavascriptString = '{';
+               $index = 0;
+               if (is_array($conf)) {
+                       foreach ($conf as $propertyName => $conf1) {
+                               $property = $propertyName;
+                               if ($index) {
+                                       $configureRTEInJavascriptString .= ', ';
+                               }
+                               if (is_array($conf1)) {
+                                       $property = substr($property, 0, -1);
+                                       $indexProperty = 0;
+                                       $configureRTEInJavascriptString .= '"'.$property.'" : {';
+                                       foreach ($conf1 as $property1Name => $conf2) {
+                                               $property1 = $property1Name;
+                                               if ($indexProperty) {
+                                                       $configureRTEInJavascriptString .= ', ';
+                                               }
+                                               if (is_array($conf2)) {
+                                                       $property1 = substr($property1, 0, -1);
+                                                       $indexProperty1 = 0;
+                                                       $configureRTEInJavascriptString .= '"'.$property1.'" : {';
+                                                       foreach ($conf2 as $property2Name => $conf3) {
+                                                               $property2 = $property2Name;
+                                                               if ($indexProperty1) {
+                                                                       $configureRTEInJavascriptString .= ', ';
+                                                               }
+                                                               if (is_array($conf3)) {
+                                                                       $property2 = substr($property2, 0, -1);
+                                                                       $indexProperty2 = 0;
+                                                                       $configureRTEInJavascriptString .= '"'.$property2.'" : {';
+                                                                       foreach($conf3 as $property3Name => $conf4) {
+                                                                               $property3 = $property3Name;
+                                                                               if ($indexProperty2) {
+                                                                                       $configureRTEInJavascriptString .= ', ';
+                                                                               }
+                                                                               if (!is_array($conf4)) {
+                                                                                       $configureRTEInJavascriptString .= '"'.$property3.'" : '.($conf4?'"'.$conf4.'"':'false');
+                                                                               }
+                                                                               $indexProperty2++;
+                                                                       }
+                                                                       $configureRTEInJavascriptString .= '}';
+                                                               } else {
+                                                                       $configureRTEInJavascriptString .= '"'.$property2.'" : '.($conf3?'"'.$conf3.'"':'false');                                                                                               
+                                                               }
+                                                               $indexProperty1++;
+                                                       }
+                                                       $configureRTEInJavascriptString .= '}';
+                                               } else {
+                                                       $configureRTEInJavascriptString .= '"'.$property1.'" : '.($conf2?'"'.$conf2.'"':'false');
+                                               }
+                                               $indexProperty++;
+                                       }
+                                       $configureRTEInJavascriptString .= '}';
+                               } else {
+                                       $configureRTEInJavascriptString .= '"'.$property.'" : '.($conf1?'"'.$conf1.'"':'false');
+                               }
+                               $index++;
+                       }
+               }
+               $configureRTEInJavascriptString .= '}';
+               return $configureRTEInJavascriptString;
        }
        
        /**
        }
        
        /**
index e2dc52b..18211c5 100644 (file)
Binary files a/typo3/sysext/rtehtmlarea/doc/manual.sxw and b/typo3/sysext/rtehtmlarea/doc/manual.sxw differ
index 0c5d0d1..87ded3f 100644 (file)
@@ -3,7 +3,7 @@
 ########################################################################
 # Extension Manager/Repository config file for ext: "rtehtmlarea"
 #
 ########################################################################
 # Extension Manager/Repository config file for ext: "rtehtmlarea"
 #
-# Auto generated 19-02-2008 22:51
+# Auto generated 25-02-2008 22:22
 #
 # Manual updates:
 # Only the data in the array - anything else is removed by next write.
 #
 # Manual updates:
 # Only the data in the array - anything else is removed by next write.
@@ -32,12 +32,12 @@ $EM_CONF[$_EXTKEY] = array(
        'author_company' => 'Fructifor Inc.',
        'CGLcompliance' => '',
        'CGLcompliance_note' => '',
        'author_company' => 'Fructifor Inc.',
        'CGLcompliance' => '',
        'CGLcompliance_note' => '',
-       'version' => '1.7.1',
-       '_md5_values_when_last_written' => 'a:414:{s:9:"ChangeLog";s:4:"4dd9";s:29:"class.tx_rtehtmlarea_base.php";s:4:"00c6";s:27:"class.tx_rtehtmlareaapi.php";s:4:"4476";s:21:"ext_conf_template.txt";s:4:"c214";s:12:"ext_icon.gif";s:4:"2f41";s:17:"ext_localconf.php";s:4:"e28b";s:14:"ext_tables.php";s:4:"4f9c";s:14:"ext_tables.sql";s:4:"2d74";s:13:"locallang.xml";s:4:"3cca";s:16:"locallang_db.xml";s:4:"a2a2";s:7:"tca.php";s:4:"3756";s:32:"pi1/class.tx_rtehtmlarea_pi1.php";s:4:"c05e";s:17:"pi1/locallang.xml";s:4:"2e58";s:16:"mod2/acronym.php";s:4:"7e21";s:37:"mod2/class.tx_rtehtmlarea_acronym.php";s:4:"a955";s:41:"mod2/class.tx_rtehtmlarea_acronym_mod.php";s:4:"1e3f";s:14:"mod2/clear.gif";s:4:"cc11";s:13:"mod2/conf.php";s:4:"f442";s:18:"mod2/locallang.xml";s:4:"7dee";s:29:"htmlarea/HTMLAREA_LICENSE.txt";s:4:"a10f";s:26:"htmlarea/htmlarea-gecko.js";s:4:"b61d";s:23:"htmlarea/htmlarea-ie.js";s:4:"ca96";s:20:"htmlarea/htmlarea.js";s:4:"6c9d";s:30:"htmlarea/locallang_dialogs.xml";s:4:"eba4";s:26:"htmlarea/locallang_msg.xml";s:4:"7b6f";s:31:"htmlarea/locallang_tooltips.xml";s:4:"ce8c";s:20:"htmlarea/popupwin.js";s:4:"d0c9";s:50:"htmlarea/skins/default/htmlarea-edited-content.css";s:4:"1cd4";s:35:"htmlarea/skins/default/htmlarea.css";s:4:"7cea";s:42:"htmlarea/skins/default/images/ed_about.gif";s:4:"2763";s:42:"htmlarea/skins/default/images/ed_blank.gif";s:4:"0208";s:45:"htmlarea/skins/default/images/ed_color_bg.gif";s:4:"c6e2";s:45:"htmlarea/skins/default/images/ed_color_fg.gif";s:4:"5d7f";s:41:"htmlarea/skins/default/images/ed_copy.gif";s:4:"4f55";s:43:"htmlarea/skins/default/images/ed_custom.gif";s:4:"e7b2";s:40:"htmlarea/skins/default/images/ed_cut.gif";s:4:"1b00";s:43:"htmlarea/skins/default/images/ed_delete.gif";s:4:"926b";s:41:"htmlarea/skins/default/images/ed_help.gif";s:4:"e7fc";s:39:"htmlarea/skins/default/images/ed_hr.gif";s:4:"f384";s:41:"htmlarea/skins/default/images/ed_html.gif";s:4:"fa6e";s:42:"htmlarea/skins/default/images/ed_image.gif";s:4:"c0f0";s:50:"htmlarea/skins/default/images/ed_left_to_right.gif";s:4:"1a1f";s:41:"htmlarea/skins/default/images/ed_link.gif";s:4:"db9a";s:48:"htmlarea/skins/default/images/ed_list_bullet.gif";s:4:"5620";s:45:"htmlarea/skins/default/images/ed_list_num.gif";s:4:"eb1c";s:42:"htmlarea/skins/default/images/ed_paste.gif";s:4:"fbd2";s:41:"htmlarea/skins/default/images/ed_redo.gif";s:4:"e9e8";s:50:"htmlarea/skins/default/images/ed_right_to_left.gif";s:4:"2a38";s:41:"htmlarea/skins/default/images/ed_save.gif";s:4:"07ad";s:47:"htmlarea/skins/default/images/ed_splitblock.gif";s:4:"503e";s:45:"htmlarea/skins/default/images/ed_splitcel.gif";s:4:"2c04";s:41:"htmlarea/skins/default/images/ed_undo.gif";s:4:"b9ba";s:43:"htmlarea/skins/default/images/ed_unlink.gif";s:4:"86c4";s:53:"htmlarea/skins/default/images/fullscreen_maximize.gif";s:4:"2118";s:53:"htmlarea/skins/default/images/fullscreen_minimize.gif";s:4:"91d6";s:46:"htmlarea/skins/default/images/insert_table.gif";s:4:"c01b";s:58:"htmlarea/skins/default/images/BlockElements/blockquote.gif";s:4:"34dc";s:54:"htmlarea/skins/default/images/BlockElements/indent.gif";s:4:"57df";s:68:"htmlarea/skins/default/images/BlockElements/insertParagraphAfter.gif";s:4:"e335";s:69:"htmlarea/skins/default/images/BlockElements/insertParagraphBefore.gif";s:4:"9c42";s:61:"htmlarea/skins/default/images/BlockElements/justifyCenter.gif";s:4:"420d";s:59:"htmlarea/skins/default/images/BlockElements/justifyFull.gif";s:4:"b129";s:59:"htmlarea/skins/default/images/BlockElements/justifyLeft.gif";s:4:"3799";s:60:"htmlarea/skins/default/images/BlockElements/justifyRight.gif";s:4:"0662";s:55:"htmlarea/skins/default/images/BlockElements/outdent.gif";s:4:"4786";s:52:"htmlarea/skins/default/images/Acronym/ed_acronym.gif";s:4:"1eaa";s:57:"htmlarea/skins/default/images/CharacterMap/ed_charmap.gif";s:4:"af19";s:54:"htmlarea/skins/default/images/UserElements/ed_user.gif";s:4:"bbb4";s:54:"htmlarea/skins/default/images/QuickTag/ed_quicktag.gif";s:4:"a463";s:58:"htmlarea/skins/default/images/SelectColor/CO-forecolor.gif";s:4:"dbc8";s:60:"htmlarea/skins/default/images/SelectColor/CO-hilitecolor.gif";s:4:"d97c";s:55:"htmlarea/skins/default/images/RemoveFormat/ed_clean.gif";s:4:"2a0f";s:53:"htmlarea/skins/default/images/FindReplace/ed_find.gif";s:4:"827f";s:61:"htmlarea/skins/default/images/TableOperations/cell-delete.gif";s:4:"f371";s:67:"htmlarea/skins/default/images/TableOperations/cell-insert-after.gif";s:4:"2dd2";s:60:"htmlarea/skins/default/images/TableOperations/cell-merge.gif";s:4:"a2d2";s:59:"htmlarea/skins/default/images/TableOperations/cell-prop.gif";s:4:"ca41";s:60:"htmlarea/skins/default/images/TableOperations/cell-split.gif";s:4:"d87c";s:60:"htmlarea/skins/default/images/TableOperations/col-delete.gif";s:4:"da78";s:66:"htmlarea/skins/default/images/TableOperations/col-insert-after.gif";s:4:"80d8";s:67:"htmlarea/skins/default/images/TableOperations/col-insert-before.gif";s:4:"d47d";s:59:"htmlarea/skins/default/images/TableOperations/col-split.gif";s:4:"eacc";s:62:"htmlarea/skins/default/images/TableOperations/insert_table.gif";s:4:"c1db";s:60:"htmlarea/skins/default/images/TableOperations/row-delete.gif";s:4:"a289";s:66:"htmlarea/skins/default/images/TableOperations/row-insert-above.gif";s:4:"1ef1";s:66:"htmlarea/skins/default/images/TableOperations/row-insert-after.gif";s:4:"5e98";s:66:"htmlarea/skins/default/images/TableOperations/row-insert-under.gif";s:4:"9ad6";s:58:"htmlarea/skins/default/images/TableOperations/row-prop.gif";s:4:"5344";s:59:"htmlarea/skins/default/images/TableOperations/row-split.gif";s:4:"a712";s:60:"htmlarea/skins/default/images/TableOperations/table-prop.gif";s:4:"0a5c";s:64:"htmlarea/skins/default/images/TableOperations/toggle-borders.gif";s:4:"50cb";s:59:"htmlarea/skins/default/images/TYPO3ViewHelp/module_help.gif";s:4:"a500";s:56:"htmlarea/skins/default/images/InsertSmiley/ed_smiley.gif";s:4:"c331";s:56:"htmlarea/skins/default/images/TYPO3Browsers/ed_image.gif";s:4:"c0f0";s:55:"htmlarea/skins/default/images/TYPO3Browsers/ed_link.gif";s:4:"db9a";s:57:"htmlarea/skins/default/images/TYPO3Browsers/ed_unlink.gif";s:4:"86c4";s:58:"htmlarea/skins/default/images/SpellChecker/spell-check.gif";s:4:"6e0a";s:61:"htmlarea/skins/default/images/InlineElements/bidioverride.gif";s:4:"f38b";s:52:"htmlarea/skins/default/images/InlineElements/big.gif";s:4:"779b";s:53:"htmlarea/skins/default/images/InlineElements/bold.gif";s:4:"06ac";s:57:"htmlarea/skins/default/images/InlineElements/citation.gif";s:4:"b6eb";s:53:"htmlarea/skins/default/images/InlineElements/code.gif";s:4:"6057";s:59:"htmlarea/skins/default/images/InlineElements/definition.gif";s:4:"692d";s:60:"htmlarea/skins/default/images/InlineElements/deletedtext.gif";s:4:"4eec";s:57:"htmlarea/skins/default/images/InlineElements/emphasis.gif";s:4:"04c9";s:61:"htmlarea/skins/default/images/InlineElements/insertedtext.gif";s:4:"a624";s:55:"htmlarea/skins/default/images/InlineElements/italic.gif";s:4:"be83";s:57:"htmlarea/skins/default/images/InlineElements/keyboard.gif";s:4:"53ac";s:59:"htmlarea/skins/default/images/InlineElements/monospaced.gif";s:4:"78c0";s:58:"htmlarea/skins/default/images/InlineElements/quotation.gif";s:4:"7c62";s:55:"htmlarea/skins/default/images/InlineElements/sample.gif";s:4:"667c";s:54:"htmlarea/skins/default/images/InlineElements/small.gif";s:4:"e013";s:53:"htmlarea/skins/default/images/InlineElements/span.gif";s:4:"0dfa";s:62:"htmlarea/skins/default/images/InlineElements/strikethrough.gif";s:4:"73b1";s:55:"htmlarea/skins/default/images/InlineElements/strong.gif";s:4:"7f50";s:58:"htmlarea/skins/default/images/InlineElements/subscript.gif";s:4:"36c0";s:60:"htmlarea/skins/default/images/InlineElements/superscript.gif";s:4:"40c4";s:58:"htmlarea/skins/default/images/InlineElements/underline.gif";s:4:"dfac";s:57:"htmlarea/skins/default/images/InlineElements/variable.gif";s:4:"da61";s:48:"htmlarea/plugins/BlockElements/block-elements.js";s:4:"e016";s:44:"htmlarea/plugins/BlockElements/locallang.xml";s:4:"2f2c";s:35:"htmlarea/plugins/Acronym/acronym.js";s:4:"9895";s:38:"htmlarea/plugins/Acronym/locallang.xml";s:4:"fead";s:46:"htmlarea/plugins/CharacterMap/character-map.js";s:4:"c653";s:43:"htmlarea/plugins/CharacterMap/locallang.xml";s:4:"1feb";s:58:"htmlarea/plugins/CharacterMap/popups/select_character.html";s:4:"a909";s:44:"htmlarea/plugins/DefaultFont/default-font.js";s:4:"8f2d";s:42:"htmlarea/plugins/DefaultFont/locallang.xml";s:4:"a7f8";s:43:"htmlarea/plugins/UserElements/locallang.xml";s:4:"33f9";s:46:"htmlarea/plugins/UserElements/user-elements.js";s:4:"91ca";s:39:"htmlarea/plugins/QuickTag/locallang.xml";s:4:"2f53";s:38:"htmlarea/plugins/QuickTag/quick-tag.js";s:4:"f93b";s:36:"htmlarea/plugins/QuickTag/tag-lib.js";s:4:"ba71";s:46:"htmlarea/plugins/QuickTag/popups/quicktag.html";s:4:"34c7";s:39:"htmlarea/plugins/InlineCSS/inlinecss.js";s:4:"460b";s:40:"htmlarea/plugins/InlineCSS/locallang.xml";s:4:"5dec";s:46:"htmlarea/plugins/TYPO3HtmlParser/locallang.xml";s:4:"8010";s:52:"htmlarea/plugins/TYPO3HtmlParser/typo3html-parser.js";s:4:"af6a";s:42:"htmlarea/plugins/SelectColor/locallang.xml";s:4:"9f9e";s:44:"htmlarea/plugins/SelectColor/select-color.js";s:4:"749b";s:48:"htmlarea/plugins/DefaultInline/default-inline.js";s:4:"9875";s:44:"htmlarea/plugins/DefaultInline/locallang.xml";s:4:"7b16";s:46:"htmlarea/plugins/DefaultImage/default-image.js";s:4:"4f07";s:43:"htmlarea/plugins/DefaultImage/locallang.xml";s:4:"1fdd";s:54:"htmlarea/plugins/DefaultImage/popups/insert_image.html";s:4:"7b8b";s:40:"htmlarea/plugins/TextStyle/locallang.xml";s:4:"ff67";s:40:"htmlarea/plugins/TextStyle/text-style.js";s:4:"2f3f";s:43:"htmlarea/plugins/RemoveFormat/locallang.xml";s:4:"aa85";s:46:"htmlarea/plugins/RemoveFormat/remove-format.js";s:4:"0c90";s:54:"htmlarea/plugins/RemoveFormat/popups/removeformat.html";s:4:"a3b1";s:44:"htmlarea/plugins/FindReplace/find-replace.js";s:4:"ab77";s:41:"htmlarea/plugins/FindReplace/fr_engine.js";s:4:"095f";s:42:"htmlarea/plugins/FindReplace/locallang.xml";s:4:"f836";s:53:"htmlarea/plugins/FindReplace/popups/find_replace.html";s:4:"8d1e";s:41:"htmlarea/plugins/TYPO3Image/locallang.xml";s:4:"ab27";s:41:"htmlarea/plugins/TYPO3Image/typo3image.js";s:4:"3bf5";s:46:"htmlarea/plugins/TableOperations/locallang.xml";s:4:"8377";s:52:"htmlarea/plugins/TableOperations/table-operations.js";s:4:"f6ed";s:57:"htmlarea/plugins/TableOperations/popups/insert_table.html";s:4:"9c35";s:42:"htmlarea/plugins/BlockStyle/block-style.js";s:4:"93c1";s:41:"htmlarea/plugins/BlockStyle/locallang.xml";s:4:"32ed";s:40:"htmlarea/plugins/TYPO3Link/locallang.xml";s:4:"c39b";s:39:"htmlarea/plugins/TYPO3Link/typo3link.js";s:4:"f1ac";s:46:"htmlarea/plugins/InsertSmiley/insert-smiley.js";s:4:"abba";s:43:"htmlarea/plugins/InsertSmiley/locallang.xml";s:4:"ed64";s:46:"htmlarea/plugins/InsertSmiley/smileys/0001.gif";s:4:"4aff";s:46:"htmlarea/plugins/InsertSmiley/smileys/0002.gif";s:4:"02c4";s:46:"htmlarea/plugins/InsertSmiley/smileys/0003.gif";s:4:"834f";s:46:"htmlarea/plugins/InsertSmiley/smileys/0004.gif";s:4:"fb6a";s:46:"htmlarea/plugins/InsertSmiley/smileys/0005.gif";s:4:"2a48";s:46:"htmlarea/plugins/InsertSmiley/smileys/0006.gif";s:4:"f970";s:46:"htmlarea/plugins/InsertSmiley/smileys/0007.gif";s:4:"97ee";s:46:"htmlarea/plugins/InsertSmiley/smileys/0008.gif";s:4:"10a6";s:46:"htmlarea/plugins/InsertSmiley/smileys/0009.gif";s:4:"1907";s:46:"htmlarea/plugins/InsertSmiley/smileys/0010.gif";s:4:"9ee6";s:46:"htmlarea/plugins/InsertSmiley/smileys/0011.gif";s:4:"ae73";s:46:"htmlarea/plugins/InsertSmiley/smileys/0012.gif";s:4:"f058";s:46:"htmlarea/plugins/InsertSmiley/smileys/0013.gif";s:4:"3ed8";s:46:"htmlarea/plugins/InsertSmiley/smileys/0014.gif";s:4:"a948";s:46:"htmlarea/plugins/InsertSmiley/smileys/0015.gif";s:4:"218d";s:46:"htmlarea/plugins/InsertSmiley/smileys/0016.gif";s:4:"3539";s:46:"htmlarea/plugins/InsertSmiley/smileys/0017.gif";s:4:"ee2e";s:46:"htmlarea/plugins/InsertSmiley/smileys/0018.gif";s:4:"8c66";s:46:"htmlarea/plugins/InsertSmiley/smileys/0019.gif";s:4:"ac36";s:46:"htmlarea/plugins/InsertSmiley/smileys/0020.gif";s:4:"71ef";s:54:"htmlarea/plugins/InsertSmiley/popups/insertsmiley.html";s:4:"27dd";s:46:"htmlarea/plugins/DefaultClean/default-clean.js";s:4:"a2d4";s:43:"htmlarea/plugins/DefaultClean/locallang.xml";s:4:"9e62";s:44:"htmlarea/plugins/TYPO3Browsers/locallang.xml";s:4:"89b8";s:47:"htmlarea/plugins/TYPO3Browsers/typo3browsers.js";s:4:"3afe";s:47:"htmlarea/plugins/TYPO3Browsers/img/download.gif";s:4:"f6d9";s:52:"htmlarea/plugins/TYPO3Browsers/img/external_link.gif";s:4:"9e48";s:63:"htmlarea/plugins/TYPO3Browsers/img/external_link_new_window.gif";s:4:"6e8d";s:52:"htmlarea/plugins/TYPO3Browsers/img/internal_link.gif";s:4:"12b9";s:63:"htmlarea/plugins/TYPO3Browsers/img/internal_link_new_window.gif";s:4:"402a";s:43:"htmlarea/plugins/TYPO3Browsers/img/mail.gif";s:4:"d5a2";s:44:"htmlarea/plugins/AboutEditor/about-editor.js";s:4:"34be";s:42:"htmlarea/plugins/AboutEditor/locallang.xml";s:4:"6dab";s:46:"htmlarea/plugins/AboutEditor/popups/about.html";s:4:"0800";s:43:"htmlarea/plugins/SpellChecker/locallang.xml";s:4:"20d8";s:51:"htmlarea/plugins/SpellChecker/spell-check-logic.php";s:4:"b9ad";s:51:"htmlarea/plugins/SpellChecker/spell-check-style.css";s:4:"82bd";s:47:"htmlarea/plugins/SpellChecker/spell-check-ui.js";s:4:"8b56";s:46:"htmlarea/plugins/SpellChecker/spell-checker.js";s:4:"f0c8";s:67:"htmlarea/plugins/SpellChecker/popups/spell-check-ui-iso-8859-1.html";s:4:"8f86";s:56:"htmlarea/plugins/SpellChecker/popups/spell-check-ui.html";s:4:"96d3";s:37:"htmlarea/plugins/Language/language.js";s:4:"d2ac";s:39:"htmlarea/plugins/Language/locallang.xml";s:4:"9ca8";s:50:"htmlarea/plugins/InlineElements/inline-elements.js";s:4:"f48b";s:45:"htmlarea/plugins/InlineElements/locallang.xml";s:4:"6f8c";s:42:"htmlarea/plugins/DynamicCSS/dynamiccss.css";s:4:"8e7b";s:41:"htmlarea/plugins/DynamicCSS/dynamiccss.js";s:4:"1861";s:41:"htmlarea/plugins/DynamicCSS/locallang.xml";s:4:"b6bf";s:52:"htmlarea/plugins/DynamicCSS/img/red_arrow_bullet.gif";s:4:"82d6";s:44:"htmlarea/plugins/DefaultLink/default-link.js";s:4:"09c2";s:42:"htmlarea/plugins/DefaultLink/locallang.xml";s:4:"e233";s:45:"htmlarea/plugins/DefaultLink/popups/link.html";s:4:"21eb";s:44:"htmlarea/plugins/ContextMenu/context-menu.js";s:4:"afce";s:42:"htmlarea/plugins/ContextMenu/locallang.xml";s:4:"59f5";s:46:"htmlarea/plugins/DefaultColor/default-color.js";s:4:"8621";s:43:"htmlarea/plugins/DefaultColor/locallang.xml";s:4:"c8d1";s:54:"htmlarea/plugins/DefaultColor/popups/select_color.html";s:4:"6c3c";s:41:"htmlarea/plugins/TYPO3Color/locallang.xml";s:4:"3d3c";s:41:"htmlarea/plugins/TYPO3Color/typo3color.js";s:4:"43ee";s:26:"htmlarea/popups/about.html";s:4:"48fe";s:26:"htmlarea/popups/blank.html";s:4:"e697";s:32:"htmlarea/popups/editor_help.html";s:4:"398a";s:33:"htmlarea/popups/insert_image.html";s:4:"bfc1";s:33:"htmlarea/popups/insert_table.html";s:4:"983d";s:25:"htmlarea/popups/link.html";s:4:"c122";s:24:"htmlarea/popups/popup.js";s:4:"4861";s:33:"htmlarea/popups/select_color.html";s:4:"ceba";s:46:"mod4/class.tx_rtehtmlarea_dam_browse_media.php";s:4:"6e41";s:42:"mod4/class.tx_rtehtmlarea_select_image.php";s:4:"80dc";s:14:"mod4/clear.gif";s:4:"cc11";s:13:"mod4/conf.php";s:4:"0c60";s:18:"mod4/locallang.xml";s:4:"8995";s:21:"mod4/select_image.php";s:4:"a36c";s:32:"pi2/class.tx_rtehtmlarea_pi2.php";s:4:"c650";s:17:"pi2/locallang.xml";s:4:"a0a7";s:63:"extensions/BlockElements/class.tx_rtehtmlarea_blockelements.php";s:4:"c85a";s:38:"extensions/BlockElements/locallang.xml";s:4:"45f6";s:42:"extensions/BlockElements/skin/htmlarea.css";s:4:"83ce";s:51:"extensions/BlockElements/skin/images/blockquote.gif";s:4:"34dc";s:47:"extensions/BlockElements/skin/images/indent.gif";s:4:"57df";s:58:"extensions/BlockElements/skin/images/insertOrderedList.gif";s:4:"eb1c";s:61:"extensions/BlockElements/skin/images/insertParagraphAfter.gif";s:4:"e335";s:62:"extensions/BlockElements/skin/images/insertParagraphBefore.gif";s:4:"9c42";s:60:"extensions/BlockElements/skin/images/insertUnorderedList.gif";s:4:"5620";s:54:"extensions/BlockElements/skin/images/justifyCenter.gif";s:4:"420d";s:52:"extensions/BlockElements/skin/images/justifyFull.gif";s:4:"b129";s:52:"extensions/BlockElements/skin/images/justifyLeft.gif";s:4:"3799";s:53:"extensions/BlockElements/skin/images/justifyRight.gif";s:4:"0662";s:48:"extensions/BlockElements/skin/images/outdent.gif";s:4:"4786";s:51:"extensions/Acronym/class.tx_rtehtmlarea_acronym.php";s:4:"8021";s:36:"extensions/Acronym/skin/htmlarea.css";s:4:"6cf9";s:42:"extensions/Acronym/skin/images/acronym.gif";s:4:"1eaa";s:61:"extensions/CharacterMap/class.tx_rtehtmlarea_charactermap.php";s:4:"d2a0";s:37:"extensions/CharacterMap/locallang.xml";s:4:"c9d1";s:41:"extensions/CharacterMap/skin/htmlarea.css";s:4:"04d1";s:55:"extensions/CharacterMap/skin/images/insertCharacter.gif";s:4:"af19";s:59:"extensions/DefaultFont/class.tx_rtehtmlarea_defaultfont.php";s:4:"a026";s:36:"extensions/DefaultFont/locallang.xml";s:4:"8c90";s:61:"extensions/UserElements/class.tx_rtehtmlarea_userelements.php";s:4:"82ed";s:41:"extensions/UserElements/skin/htmlarea.css";s:4:"d015";s:44:"extensions/UserElements/skin/images/user.gif";s:4:"bbb4";s:53:"extensions/QuickTag/class.tx_rtehtmlarea_quicktag.php";s:4:"b5f7";s:37:"extensions/QuickTag/skin/htmlarea.css";s:4:"fc28";s:45:"extensions/QuickTag/skin/images/inserttag.gif";s:4:"a463";s:55:"extensions/InlineCSS/class.tx_rtehtmlarea_inlinecss.php";s:4:"710a";s:34:"extensions/InlineCSS/locallang.xml";s:4:"82ed";s:67:"extensions/TYPO3HtmlParser/class.tx_rtehtmlarea_typo3htmlparser.php";s:4:"fe15";s:63:"extensions/DefaultInline/class.tx_rtehtmlarea_defaultinline.php";s:4:"f271";s:38:"extensions/DefaultInline/locallang.xml";s:4:"e592";s:42:"extensions/DefaultInline/skin/htmlarea.css";s:4:"5b38";s:45:"extensions/DefaultInline/skin/images/bold.gif";s:4:"94f2";s:47:"extensions/DefaultInline/skin/images/italic.gif";s:4:"f60c";s:54:"extensions/DefaultInline/skin/images/strikethrough.gif";s:4:"3fd0";s:50:"extensions/DefaultInline/skin/images/subscript.gif";s:4:"cedd";s:52:"extensions/DefaultInline/skin/images/superscript.gif";s:4:"8aea";s:50:"extensions/DefaultInline/skin/images/underline.gif";s:4:"81e6";s:61:"extensions/DefaultImage/class.tx_rtehtmlarea_defaultimage.php";s:4:"32d8";s:41:"extensions/DefaultImage/skin/htmlarea.css";s:4:"eb4c";s:45:"extensions/DefaultImage/skin/images/image.gif";s:4:"c0f0";s:55:"extensions/TextStyle/class.tx_rtehtmlarea_textstyle.php";s:4:"cc5d";s:34:"extensions/TextStyle/locallang.xml";s:4:"23dd";s:61:"extensions/RemoveFormat/class.tx_rtehtmlarea_removeformat.php";s:4:"497d";s:41:"extensions/RemoveFormat/skin/htmlarea.css";s:4:"be33";s:45:"extensions/RemoveFormat/skin/images/clean.gif";s:4:"2a0f";s:59:"extensions/FindReplace/class.tx_rtehtmlarea_findreplace.php";s:4:"8d67";s:40:"extensions/FindReplace/skin/htmlarea.css";s:4:"43cc";s:43:"extensions/FindReplace/skin/images/find.gif";s:4:"827f";s:57:"extensions/TYPO3Image/class.tx_rtehtmlarea_typo3image.php";s:4:"711d";s:39:"extensions/TYPO3Image/skin/htmlarea.css";s:4:"fa33";s:43:"extensions/TYPO3Image/skin/images/image.gif";s:4:"c0f0";s:67:"extensions/TableOperations/class.tx_rtehtmlarea_tableoperations.php";s:4:"8b5c";s:44:"extensions/TableOperations/skin/htmlarea.css";s:4:"9e65";s:54:"extensions/TableOperations/skin/images/cell-delete.gif";s:4:"f371";s:60:"extensions/TableOperations/skin/images/cell-insert-after.gif";s:4:"2dd2";s:61:"extensions/TableOperations/skin/images/cell-insert-before.gif";s:4:"5d13";s:53:"extensions/TableOperations/skin/images/cell-merge.gif";s:4:"cb52";s:52:"extensions/TableOperations/skin/images/cell-prop.gif";s:4:"ca41";s:53:"extensions/TableOperations/skin/images/cell-split.gif";s:4:"0095";s:53:"extensions/TableOperations/skin/images/col-delete.gif";s:4:"da78";s:59:"extensions/TableOperations/skin/images/col-insert-after.gif";s:4:"80d8";s:60:"extensions/TableOperations/skin/images/col-insert-before.gif";s:4:"d47d";s:51:"extensions/TableOperations/skin/images/col-prop.gif";s:4:"5344";s:52:"extensions/TableOperations/skin/images/col-split.gif";s:4:"c168";s:55:"extensions/TableOperations/skin/images/insert_table.gif";s:4:"c01b";s:53:"extensions/TableOperations/skin/images/row-delete.gif";s:4:"a289";s:59:"extensions/TableOperations/skin/images/row-insert-above.gif";s:4:"1ef1";s:59:"extensions/TableOperations/skin/images/row-insert-under.gif";s:4:"9ad6";s:51:"extensions/TableOperations/skin/images/row-prop.gif";s:4:"5344";s:52:"extensions/TableOperations/skin/images/row-split.gif";s:4:"ebfd";s:53:"extensions/TableOperations/skin/images/table-prop.gif";s:4:"0a5c";s:57:"extensions/TableOperations/skin/images/toggle-borders.gif";s:4:"50cb";s:57:"extensions/BlockStyle/class.tx_rtehtmlarea_blockstyle.php";s:4:"a516";s:35:"extensions/BlockStyle/locallang.xml";s:4:"26b8";s:55:"extensions/TYPO3Link/class.tx_rtehtmlarea_typo3link.php";s:4:"6c51";s:38:"extensions/TYPO3Link/skin/htmlarea.css";s:4:"2a46";s:41:"extensions/TYPO3Link/skin/images/link.gif";s:4:"db9a";s:43:"extensions/TYPO3Link/skin/images/unlink.gif";s:4:"86c4";s:61:"extensions/InsertSmiley/class.tx_rtehtmlarea_insertsmiley.php";s:4:"5ad3";s:41:"extensions/InsertSmiley/skin/htmlarea.css";s:4:"fb52";s:46:"extensions/InsertSmiley/skin/images/smiley.gif";s:4:"c331";s:61:"extensions/DefaultClean/class.tx_rtehtmlarea_defaultclean.php";s:4:"59a6";s:59:"extensions/AboutEditor/class.tx_rtehtmlarea_abouteditor.php";s:4:"ec48";s:40:"extensions/AboutEditor/skin/htmlarea.css";s:4:"eb62";s:44:"extensions/AboutEditor/skin/images/about.gif";s:4:"1690";s:61:"extensions/SpellChecker/class.tx_rtehtmlarea_spellchecker.php";s:4:"c300";s:41:"extensions/SpellChecker/skin/htmlarea.css";s:4:"cedf";s:51:"extensions/SpellChecker/skin/images/spell-check.gif";s:4:"6e0a";s:53:"extensions/Language/class.tx_rtehtmlarea_language.php";s:4:"7325";s:37:"extensions/Language/skin/htmlarea.css";s:4:"f6b2";s:49:"extensions/Language/skin/images/left_to_right.gif";s:4:"1a1f";s:49:"extensions/Language/skin/images/right_to_left.gif";s:4:"2a38";s:65:"extensions/InlineElements/class.tx_rtehtmlarea_inlineelements.php";s:4:"4d23";s:39:"extensions/InlineElements/locallang.xml";s:4:"07c6";s:43:"extensions/InlineElements/skin/htmlarea.css";s:4:"978b";s:54:"extensions/InlineElements/skin/images/bidioverride.gif";s:4:"f38b";s:45:"extensions/InlineElements/skin/images/big.gif";s:4:"779b";s:46:"extensions/InlineElements/skin/images/bold.gif";s:4:"06ac";s:50:"extensions/InlineElements/skin/images/citation.gif";s:4:"b6eb";s:46:"extensions/InlineElements/skin/images/code.gif";s:4:"6057";s:52:"extensions/InlineElements/skin/images/definition.gif";s:4:"692d";s:53:"extensions/InlineElements/skin/images/deletedtext.gif";s:4:"4eec";s:50:"extensions/InlineElements/skin/images/emphasis.gif";s:4:"04c9";s:54:"extensions/InlineElements/skin/images/insertedtext.gif";s:4:"a624";s:48:"extensions/InlineElements/skin/images/italic.gif";s:4:"be83";s:50:"extensions/InlineElements/skin/images/keyboard.gif";s:4:"53ac";s:52:"extensions/InlineElements/skin/images/monospaced.gif";s:4:"78c0";s:51:"extensions/InlineElements/skin/images/quotation.gif";s:4:"7c62";s:48:"extensions/InlineElements/skin/images/sample.gif";s:4:"667c";s:47:"extensions/InlineElements/skin/images/small.gif";s:4:"e013";s:46:"extensions/InlineElements/skin/images/span.gif";s:4:"0dfa";s:55:"extensions/InlineElements/skin/images/strikethrough.gif";s:4:"73b1";s:48:"extensions/InlineElements/skin/images/strong.gif";s:4:"7f50";s:51:"extensions/InlineElements/skin/images/subscript.gif";s:4:"36c0";s:53:"extensions/InlineElements/skin/images/superscript.gif";s:4:"40c4";s:51:"extensions/InlineElements/skin/images/underline.gif";s:4:"dfac";s:50:"extensions/InlineElements/skin/images/variable.gif";s:4:"da61";s:57:"extensions/DynamicCSS/class.tx_rtehtmlarea_dynamiccss.php";s:4:"6226";s:35:"extensions/DynamicCSS/locallang.xml";s:4:"26b8";s:59:"extensions/DefaultLink/class.tx_rtehtmlarea_defaultlink.php";s:4:"1c36";s:40:"extensions/DefaultLink/skin/htmlarea.css";s:4:"883b";s:43:"extensions/DefaultLink/skin/images/link.gif";s:4:"db9a";s:45:"extensions/DefaultLink/skin/images/unlink.gif";s:4:"86c4";s:61:"extensions/DefaultColor/class.tx_rtehtmlarea_defaultcolor.php";s:4:"b4ef";s:37:"extensions/DefaultColor/locallang.xml";s:4:"3fb4";s:41:"extensions/DefaultColor/skin/htmlarea.css";s:4:"4759";s:49:"extensions/DefaultColor/skin/images/forecolor.gif";s:4:"dbc8";s:51:"extensions/DefaultColor/skin/images/hilitecolor.gif";s:4:"d97c";s:57:"extensions/TYPO3Color/class.tx_rtehtmlarea_typo3color.php";s:4:"149e";s:35:"extensions/TYPO3Color/locallang.xml";s:4:"377f";s:39:"extensions/TYPO3Color/skin/htmlarea.css";s:4:"fec1";s:47:"extensions/TYPO3Color/skin/images/forecolor.gif";s:4:"dbc8";s:49:"extensions/TYPO3Color/skin/images/hilitecolor.gif";s:4:"d97c";s:21:"mod3/browse_links.php";s:4:"5a04";s:42:"mod3/class.tx_rtehtmlarea_browse_links.php";s:4:"10d0";s:46:"mod3/class.tx_rtehtmlarea_dam_browse_links.php";s:4:"ee35";s:14:"mod3/clear.gif";s:4:"cc11";s:13:"mod3/conf.php";s:4:"2f07";s:18:"mod3/locallang.xml";s:4:"040a";s:34:"mod5/class.tx_rtehtmlarea_user.php";s:4:"7629";s:14:"mod5/clear.gif";s:4:"cc11";s:13:"mod5/conf.php";s:4:"b639";s:18:"mod5/locallang.xml";s:4:"7a78";s:13:"mod5/user.php";s:4:"f39d";s:32:"pi3/class.tx_rtehtmlarea_pi3.php";s:4:"8662";s:14:"doc/manual.sxw";s:4:"4e64";s:40:"mod6/class.tx_rtehtmlarea_parse_html.php";s:4:"4af1";s:13:"mod6/conf.php";s:4:"2b05";s:19:"mod6/parse_html.php";s:4:"1fd0";s:29:"static/clickenlarge/setup.txt";s:4:"5681";s:26:"res/contentcss/default.css";s:4:"7446";s:28:"res/contentcss/locallang.xml";s:4:"ec0e";s:39:"res/contentcss/img/red_arrow_bullet.gif";s:4:"82d6";s:25:"res/demo/pageTSConfig.txt";s:4:"9fc9";s:25:"res/demo/userTSConfig.txt";s:4:"cfd5";s:33:"res/clickenlarge/pageTSConfig.txt";s:4:"90c2";s:28:"res/typical/pageTSConfig.txt";s:4:"5d6c";s:28:"res/typical/userTSConfig.txt";s:4:"1ce2";s:26:"res/image/pageTSConfig.txt";s:4:"ca94";s:25:"res/proc/pageTSConfig.txt";s:4:"44eb";s:29:"res/advanced/pageTSConfig.txt";s:4:"1ab3";s:29:"res/advanced/userTSConfig.txt";s:4:"36b6";s:36:"res/accessibilityicons/locallang.xml";s:4:"8211";s:39:"res/accessibilityicons/pageTSConfig.txt";s:4:"9bcb";s:39:"res/accessibilityicons/img/download.gif";s:4:"f6d9";s:44:"res/accessibilityicons/img/external_link.gif";s:4:"9e48";s:55:"res/accessibilityicons/img/external_link_new_window.gif";s:4:"6e8d";s:44:"res/accessibilityicons/img/internal_link.gif";s:4:"12b9";s:55:"res/accessibilityicons/img/internal_link_new_window.gif";s:4:"402a";s:35:"res/accessibilityicons/img/mail.gif";s:4:"d5a2";}',
+       'version' => '1.7.2',
+       '_md5_values_when_last_written' => 'a:420:{s:9:"ChangeLog";s:4:"1a70";s:29:"class.tx_rtehtmlarea_base.php";s:4:"bf6d";s:27:"class.tx_rtehtmlareaapi.php";s:4:"4476";s:21:"ext_conf_template.txt";s:4:"1a57";s:12:"ext_icon.gif";s:4:"2f41";s:17:"ext_localconf.php";s:4:"da9b";s:14:"ext_tables.php";s:4:"4f9c";s:14:"ext_tables.sql";s:4:"2d74";s:13:"locallang.xml";s:4:"3cca";s:16:"locallang_db.xml";s:4:"a2a2";s:7:"tca.php";s:4:"3756";s:32:"pi2/class.tx_rtehtmlarea_pi2.php";s:4:"c650";s:17:"pi2/locallang.xml";s:4:"a0a7";s:14:"doc/manual.sxw";s:4:"3cee";s:21:"mod3/browse_links.php";s:4:"5a04";s:42:"mod3/class.tx_rtehtmlarea_browse_links.php";s:4:"10d0";s:46:"mod3/class.tx_rtehtmlarea_dam_browse_links.php";s:4:"ee35";s:14:"mod3/clear.gif";s:4:"cc11";s:13:"mod3/conf.php";s:4:"9f3d";s:18:"mod3/locallang.xml";s:4:"040a";s:29:"htmlarea/HTMLAREA_LICENSE.txt";s:4:"a10f";s:26:"htmlarea/htmlarea-gecko.js";s:4:"b665";s:23:"htmlarea/htmlarea-ie.js";s:4:"2703";s:20:"htmlarea/htmlarea.js";s:4:"a9d2";s:30:"htmlarea/locallang_dialogs.xml";s:4:"eba4";s:26:"htmlarea/locallang_msg.xml";s:4:"7b6f";s:31:"htmlarea/locallang_tooltips.xml";s:4:"8b17";s:20:"htmlarea/popupwin.js";s:4:"d0c9";s:50:"htmlarea/skins/default/htmlarea-edited-content.css";s:4:"8f6d";s:35:"htmlarea/skins/default/htmlarea.css";s:4:"f53c";s:42:"htmlarea/skins/default/images/ed_about.gif";s:4:"2763";s:42:"htmlarea/skins/default/images/ed_blank.gif";s:4:"0208";s:45:"htmlarea/skins/default/images/ed_color_bg.gif";s:4:"c6e2";s:45:"htmlarea/skins/default/images/ed_color_fg.gif";s:4:"5d7f";s:41:"htmlarea/skins/default/images/ed_copy.gif";s:4:"4f55";s:43:"htmlarea/skins/default/images/ed_custom.gif";s:4:"e7b2";s:40:"htmlarea/skins/default/images/ed_cut.gif";s:4:"1b00";s:43:"htmlarea/skins/default/images/ed_delete.gif";s:4:"926b";s:41:"htmlarea/skins/default/images/ed_help.gif";s:4:"e7fc";s:39:"htmlarea/skins/default/images/ed_hr.gif";s:4:"f384";s:41:"htmlarea/skins/default/images/ed_html.gif";s:4:"fa6e";s:42:"htmlarea/skins/default/images/ed_image.gif";s:4:"c0f0";s:50:"htmlarea/skins/default/images/ed_left_to_right.gif";s:4:"1a1f";s:41:"htmlarea/skins/default/images/ed_link.gif";s:4:"db9a";s:48:"htmlarea/skins/default/images/ed_list_bullet.gif";s:4:"5620";s:45:"htmlarea/skins/default/images/ed_list_num.gif";s:4:"eb1c";s:42:"htmlarea/skins/default/images/ed_paste.gif";s:4:"fbd2";s:41:"htmlarea/skins/default/images/ed_redo.gif";s:4:"e9e8";s:50:"htmlarea/skins/default/images/ed_right_to_left.gif";s:4:"2a38";s:41:"htmlarea/skins/default/images/ed_save.gif";s:4:"07ad";s:47:"htmlarea/skins/default/images/ed_splitblock.gif";s:4:"503e";s:45:"htmlarea/skins/default/images/ed_splitcel.gif";s:4:"2c04";s:41:"htmlarea/skins/default/images/ed_undo.gif";s:4:"b9ba";s:43:"htmlarea/skins/default/images/ed_unlink.gif";s:4:"86c4";s:53:"htmlarea/skins/default/images/fullscreen_maximize.gif";s:4:"2118";s:53:"htmlarea/skins/default/images/fullscreen_minimize.gif";s:4:"91d6";s:46:"htmlarea/skins/default/images/insert_table.gif";s:4:"c01b";s:59:"htmlarea/skins/default/images/TYPO3ViewHelp/module_help.gif";s:4:"a500";s:61:"htmlarea/skins/default/images/InlineElements/bidioverride.gif";s:4:"f38b";s:52:"htmlarea/skins/default/images/InlineElements/big.gif";s:4:"779b";s:53:"htmlarea/skins/default/images/InlineElements/bold.gif";s:4:"06ac";s:57:"htmlarea/skins/default/images/InlineElements/citation.gif";s:4:"b6eb";s:53:"htmlarea/skins/default/images/InlineElements/code.gif";s:4:"6057";s:59:"htmlarea/skins/default/images/InlineElements/definition.gif";s:4:"692d";s:60:"htmlarea/skins/default/images/InlineElements/deletedtext.gif";s:4:"4eec";s:57:"htmlarea/skins/default/images/InlineElements/emphasis.gif";s:4:"04c9";s:61:"htmlarea/skins/default/images/InlineElements/insertedtext.gif";s:4:"a624";s:55:"htmlarea/skins/default/images/InlineElements/italic.gif";s:4:"be83";s:57:"htmlarea/skins/default/images/InlineElements/keyboard.gif";s:4:"53ac";s:59:"htmlarea/skins/default/images/InlineElements/monospaced.gif";s:4:"78c0";s:58:"htmlarea/skins/default/images/InlineElements/quotation.gif";s:4:"7c62";s:55:"htmlarea/skins/default/images/InlineElements/sample.gif";s:4:"667c";s:54:"htmlarea/skins/default/images/InlineElements/small.gif";s:4:"e013";s:53:"htmlarea/skins/default/images/InlineElements/span.gif";s:4:"0dfa";s:62:"htmlarea/skins/default/images/InlineElements/strikethrough.gif";s:4:"73b1";s:55:"htmlarea/skins/default/images/InlineElements/strong.gif";s:4:"7f50";s:58:"htmlarea/skins/default/images/InlineElements/subscript.gif";s:4:"36c0";s:60:"htmlarea/skins/default/images/InlineElements/superscript.gif";s:4:"40c4";s:58:"htmlarea/skins/default/images/InlineElements/underline.gif";s:4:"dfac";s:57:"htmlarea/skins/default/images/InlineElements/variable.gif";s:4:"da61";s:54:"htmlarea/skins/default/images/QuickTag/ed_quicktag.gif";s:4:"a463";s:58:"htmlarea/skins/default/images/SpellChecker/spell-check.gif";s:4:"6e0a";s:58:"htmlarea/skins/default/images/BlockElements/blockquote.gif";s:4:"34dc";s:54:"htmlarea/skins/default/images/BlockElements/indent.gif";s:4:"57df";s:68:"htmlarea/skins/default/images/BlockElements/insertParagraphAfter.gif";s:4:"e335";s:69:"htmlarea/skins/default/images/BlockElements/insertParagraphBefore.gif";s:4:"9c42";s:61:"htmlarea/skins/default/images/BlockElements/justifyCenter.gif";s:4:"420d";s:59:"htmlarea/skins/default/images/BlockElements/justifyFull.gif";s:4:"b129";s:59:"htmlarea/skins/default/images/BlockElements/justifyLeft.gif";s:4:"3799";s:60:"htmlarea/skins/default/images/BlockElements/justifyRight.gif";s:4:"0662";s:55:"htmlarea/skins/default/images/BlockElements/outdent.gif";s:4:"4786";s:56:"htmlarea/skins/default/images/TYPO3Browsers/ed_image.gif";s:4:"c0f0";s:55:"htmlarea/skins/default/images/TYPO3Browsers/ed_link.gif";s:4:"db9a";s:57:"htmlarea/skins/default/images/TYPO3Browsers/ed_unlink.gif";s:4:"86c4";s:54:"htmlarea/skins/default/images/UserElements/ed_user.gif";s:4:"bbb4";s:58:"htmlarea/skins/default/images/SelectColor/CO-forecolor.gif";s:4:"dbc8";s:60:"htmlarea/skins/default/images/SelectColor/CO-hilitecolor.gif";s:4:"d97c";s:56:"htmlarea/skins/default/images/InsertSmiley/ed_smiley.gif";s:4:"c331";s:52:"htmlarea/skins/default/images/Acronym/ed_acronym.gif";s:4:"1eaa";s:55:"htmlarea/skins/default/images/RemoveFormat/ed_clean.gif";s:4:"2a0f";s:53:"htmlarea/skins/default/images/FindReplace/ed_find.gif";s:4:"827f";s:61:"htmlarea/skins/default/images/TableOperations/cell-delete.gif";s:4:"f371";s:67:"htmlarea/skins/default/images/TableOperations/cell-insert-after.gif";s:4:"2dd2";s:68:"htmlarea/skins/default/images/TableOperations/cell-insert-before.gif";s:4:"5d13";s:60:"htmlarea/skins/default/images/TableOperations/cell-merge.gif";s:4:"a2d2";s:59:"htmlarea/skins/default/images/TableOperations/cell-prop.gif";s:4:"ca41";s:60:"htmlarea/skins/default/images/TableOperations/cell-split.gif";s:4:"d87c";s:60:"htmlarea/skins/default/images/TableOperations/col-delete.gif";s:4:"da78";s:66:"htmlarea/skins/default/images/TableOperations/col-insert-after.gif";s:4:"80d8";s:67:"htmlarea/skins/default/images/TableOperations/col-insert-before.gif";s:4:"d47d";s:58:"htmlarea/skins/default/images/TableOperations/col-prop.gif";s:4:"b178";s:59:"htmlarea/skins/default/images/TableOperations/col-split.gif";s:4:"eacc";s:62:"htmlarea/skins/default/images/TableOperations/insert_table.gif";s:4:"c1db";s:60:"htmlarea/skins/default/images/TableOperations/row-delete.gif";s:4:"a289";s:66:"htmlarea/skins/default/images/TableOperations/row-insert-above.gif";s:4:"1ef1";s:66:"htmlarea/skins/default/images/TableOperations/row-insert-after.gif";s:4:"5e98";s:66:"htmlarea/skins/default/images/TableOperations/row-insert-under.gif";s:4:"9ad6";s:58:"htmlarea/skins/default/images/TableOperations/row-prop.gif";s:4:"5344";s:59:"htmlarea/skins/default/images/TableOperations/row-split.gif";s:4:"a712";s:60:"htmlarea/skins/default/images/TableOperations/table-prop.gif";s:4:"0a5c";s:63:"htmlarea/skins/default/images/TableOperations/table-restyle.gif";s:4:"9284";s:64:"htmlarea/skins/default/images/TableOperations/toggle-borders.gif";s:4:"50cb";s:57:"htmlarea/skins/default/images/CharacterMap/ed_charmap.gif";s:4:"af19";s:50:"htmlarea/plugins/InlineElements/inline-elements.js";s:4:"f48b";s:45:"htmlarea/plugins/InlineElements/locallang.xml";s:4:"6f8c";s:39:"htmlarea/plugins/QuickTag/locallang.xml";s:4:"2f53";s:38:"htmlarea/plugins/QuickTag/quick-tag.js";s:4:"f93b";s:36:"htmlarea/plugins/QuickTag/tag-lib.js";s:4:"ba71";s:46:"htmlarea/plugins/QuickTag/popups/quicktag.html";s:4:"34c7";s:43:"htmlarea/plugins/SpellChecker/locallang.xml";s:4:"20d8";s:51:"htmlarea/plugins/SpellChecker/spell-check-logic.php";s:4:"b9ad";s:51:"htmlarea/plugins/SpellChecker/spell-check-style.css";s:4:"82bd";s:47:"htmlarea/plugins/SpellChecker/spell-check-ui.js";s:4:"8b56";s:46:"htmlarea/plugins/SpellChecker/spell-checker.js";s:4:"f0c8";s:67:"htmlarea/plugins/SpellChecker/popups/spell-check-ui-iso-8859-1.html";s:4:"8f86";s:56:"htmlarea/plugins/SpellChecker/popups/spell-check-ui.html";s:4:"96d3";s:41:"htmlarea/plugins/TYPO3Color/locallang.xml";s:4:"3d3c";s:41:"htmlarea/plugins/TYPO3Color/typo3color.js";s:4:"43ee";s:44:"htmlarea/plugins/AboutEditor/about-editor.js";s:4:"34be";s:42:"htmlarea/plugins/AboutEditor/locallang.xml";s:4:"6dab";s:46:"htmlarea/plugins/AboutEditor/popups/about.html";s:4:"0800";s:46:"htmlarea/plugins/DefaultImage/default-image.js";s:4:"4f07";s:43:"htmlarea/plugins/DefaultImage/locallang.xml";s:4:"1fdd";s:54:"htmlarea/plugins/DefaultImage/popups/insert_image.html";s:4:"7b8b";s:40:"htmlarea/plugins/TextStyle/locallang.xml";s:4:"ff67";s:40:"htmlarea/plugins/TextStyle/text-style.js";s:4:"2f3f";s:46:"htmlarea/plugins/TYPO3HtmlParser/locallang.xml";s:4:"8010";s:52:"htmlarea/plugins/TYPO3HtmlParser/typo3html-parser.js";s:4:"2ac1";s:39:"htmlarea/plugins/InlineCSS/inlinecss.js";s:4:"460b";s:40:"htmlarea/plugins/InlineCSS/locallang.xml";s:4:"5dec";s:48:"htmlarea/plugins/BlockElements/block-elements.js";s:4:"06ca";s:44:"htmlarea/plugins/BlockElements/locallang.xml";s:4:"2f2c";s:42:"htmlarea/plugins/BlockStyle/block-style.js";s:4:"8ce4";s:41:"htmlarea/plugins/BlockStyle/locallang.xml";s:4:"32ed";s:44:"htmlarea/plugins/TYPO3Browsers/locallang.xml";s:4:"89b8";s:47:"htmlarea/plugins/TYPO3Browsers/typo3browsers.js";s:4:"3afe";s:47:"htmlarea/plugins/TYPO3Browsers/img/download.gif";s:4:"f6d9";s:52:"htmlarea/plugins/TYPO3Browsers/img/external_link.gif";s:4:"9e48";s:63:"htmlarea/plugins/TYPO3Browsers/img/external_link_new_window.gif";s:4:"6e8d";s:52:"htmlarea/plugins/TYPO3Browsers/img/internal_link.gif";s:4:"12b9";s:63:"htmlarea/plugins/TYPO3Browsers/img/internal_link_new_window.gif";s:4:"402a";s:43:"htmlarea/plugins/TYPO3Browsers/img/mail.gif";s:4:"d5a2";s:43:"htmlarea/plugins/UserElements/locallang.xml";s:4:"33f9";s:46:"htmlarea/plugins/UserElements/user-elements.js";s:4:"91ca";s:42:"htmlarea/plugins/DynamicCSS/dynamiccss.css";s:4:"8e7b";s:41:"htmlarea/plugins/DynamicCSS/dynamiccss.js";s:4:"1861";s:41:"htmlarea/plugins/DynamicCSS/locallang.xml";s:4:"b6bf";s:52:"htmlarea/plugins/DynamicCSS/img/red_arrow_bullet.gif";s:4:"82d6";s:42:"htmlarea/plugins/SelectColor/locallang.xml";s:4:"9f9e";s:44:"htmlarea/plugins/SelectColor/select-color.js";s:4:"749b";s:44:"htmlarea/plugins/DefaultFont/default-font.js";s:4:"8f2d";s:42:"htmlarea/plugins/DefaultFont/locallang.xml";s:4:"a7f8";s:46:"htmlarea/plugins/InsertSmiley/insert-smiley.js";s:4:"abba";s:43:"htmlarea/plugins/InsertSmiley/locallang.xml";s:4:"ed64";s:54:"htmlarea/plugins/InsertSmiley/popups/insertsmiley.html";s:4:"27dd";s:46:"htmlarea/plugins/InsertSmiley/smileys/0001.gif";s:4:"4aff";s:46:"htmlarea/plugins/InsertSmiley/smileys/0002.gif";s:4:"02c4";s:46:"htmlarea/plugins/InsertSmiley/smileys/0003.gif";s:4:"834f";s:46:"htmlarea/plugins/InsertSmiley/smileys/0004.gif";s:4:"fb6a";s:46:"htmlarea/plugins/InsertSmiley/smileys/0005.gif";s:4:"2a48";s:46:"htmlarea/plugins/InsertSmiley/smileys/0006.gif";s:4:"f970";s:46:"htmlarea/plugins/InsertSmiley/smileys/0007.gif";s:4:"97ee";s:46:"htmlarea/plugins/InsertSmiley/smileys/0008.gif";s:4:"10a6";s:46:"htmlarea/plugins/InsertSmiley/smileys/0009.gif";s:4:"1907";s:46:"htmlarea/plugins/InsertSmiley/smileys/0010.gif";s:4:"9ee6";s:46:"htmlarea/plugins/InsertSmiley/smileys/0011.gif";s:4:"ae73";s:46:"htmlarea/plugins/InsertSmiley/smileys/0012.gif";s:4:"f058";s:46:"htmlarea/plugins/InsertSmiley/smileys/0013.gif";s:4:"3ed8";s:46:"htmlarea/plugins/InsertSmiley/smileys/0014.gif";s:4:"a948";s:46:"htmlarea/plugins/InsertSmiley/smileys/0015.gif";s:4:"218d";s:46:"htmlarea/plugins/InsertSmiley/smileys/0016.gif";s:4:"3539";s:46:"htmlarea/plugins/InsertSmiley/smileys/0017.gif";s:4:"ee2e";s:46:"htmlarea/plugins/InsertSmiley/smileys/0018.gif";s:4:"8c66";s:46:"htmlarea/plugins/InsertSmiley/smileys/0019.gif";s:4:"ac36";s:46:"htmlarea/plugins/InsertSmiley/smileys/0020.gif";s:4:"71ef";s:44:"htmlarea/plugins/ContextMenu/context-menu.js";s:4:"77ce";s:42:"htmlarea/plugins/ContextMenu/locallang.xml";s:4:"3ead";s:41:"htmlarea/plugins/TYPO3Image/locallang.xml";s:4:"ab27";s:41:"htmlarea/plugins/TYPO3Image/typo3image.js";s:4:"3bf5";s:46:"htmlarea/plugins/DefaultColor/default-color.js";s:4:"8621";s:43:"htmlarea/plugins/DefaultColor/locallang.xml";s:4:"c8d1";s:54:"htmlarea/plugins/DefaultColor/popups/select_color.html";s:4:"6c3c";s:35:"htmlarea/plugins/Acronym/acronym.js";s:4:"9895";s:38:"htmlarea/plugins/Acronym/locallang.xml";s:4:"fead";s:46:"htmlarea/plugins/DefaultClean/default-clean.js";s:4:"a2d4";s:43:"htmlarea/plugins/DefaultClean/locallang.xml";s:4:"9e62";s:43:"htmlarea/plugins/RemoveFormat/locallang.xml";s:4:"aa85";s:46:"htmlarea/plugins/RemoveFormat/remove-format.js";s:4:"0c90";s:54:"htmlarea/plugins/RemoveFormat/popups/removeformat.html";s:4:"a3b1";s:44:"htmlarea/plugins/DefaultLink/default-link.js";s:4:"09c2";s:42:"htmlarea/plugins/DefaultLink/locallang.xml";s:4:"e233";s:45:"htmlarea/plugins/DefaultLink/popups/link.html";s:4:"21eb";s:37:"htmlarea/plugins/Language/language.js";s:4:"d2ac";s:39:"htmlarea/plugins/Language/locallang.xml";s:4:"9ca8";s:44:"htmlarea/plugins/FindReplace/find-replace.js";s:4:"ab77";s:41:"htmlarea/plugins/FindReplace/fr_engine.js";s:4:"095f";s:42:"htmlarea/plugins/FindReplace/locallang.xml";s:4:"f836";s:53:"htmlarea/plugins/FindReplace/popups/find_replace.html";s:4:"8d1e";s:48:"htmlarea/plugins/DefaultInline/default-inline.js";s:4:"9875";s:44:"htmlarea/plugins/DefaultInline/locallang.xml";s:4:"7b16";s:40:"htmlarea/plugins/TYPO3Link/locallang.xml";s:4:"c39b";s:39:"htmlarea/plugins/TYPO3Link/typo3link.js";s:4:"f1ac";s:46:"htmlarea/plugins/TableOperations/locallang.xml";s:4:"e7ed";s:52:"htmlarea/plugins/TableOperations/table-operations.js";s:4:"0e5f";s:57:"htmlarea/plugins/TableOperations/popups/insert_table.html";s:4:"9c35";s:46:"htmlarea/plugins/CharacterMap/character-map.js";s:4:"c653";s:43:"htmlarea/plugins/CharacterMap/locallang.xml";s:4:"1feb";s:58:"htmlarea/plugins/CharacterMap/popups/select_character.html";s:4:"a909";s:26:"htmlarea/popups/about.html";s:4:"48fe";s:26:"htmlarea/popups/blank.html";s:4:"e697";s:32:"htmlarea/popups/editor_help.html";s:4:"398a";s:33:"htmlarea/popups/insert_image.html";s:4:"bfc1";s:33:"htmlarea/popups/insert_table.html";s:4:"983d";s:25:"htmlarea/popups/link.html";s:4:"c122";s:24:"htmlarea/popups/popup.js";s:4:"4861";s:33:"htmlarea/popups/select_color.html";s:4:"ceba";s:34:"mod5/class.tx_rtehtmlarea_user.php";s:4:"7629";s:14:"mod5/clear.gif";s:4:"cc11";s:13:"mod5/conf.php";s:4:"9162";s:18:"mod5/locallang.xml";s:4:"7a78";s:13:"mod5/user.php";s:4:"f39d";s:32:"pi1/class.tx_rtehtmlarea_pi1.php";s:4:"c05e";s:17:"pi1/locallang.xml";s:4:"2e58";s:46:"mod4/class.tx_rtehtmlarea_dam_browse_media.php";s:4:"6e41";s:42:"mod4/class.tx_rtehtmlarea_select_image.php";s:4:"80dc";s:14:"mod4/clear.gif";s:4:"cc11";s:13:"mod4/conf.php";s:4:"3903";s:18:"mod4/locallang.xml";s:4:"8995";s:21:"mod4/select_image.php";s:4:"a36c";s:32:"pi3/class.tx_rtehtmlarea_pi3.php";s:4:"8662";s:16:"mod2/acronym.php";s:4:"7e21";s:37:"mod2/class.tx_rtehtmlarea_acronym.php";s:4:"a955";s:41:"mod2/class.tx_rtehtmlarea_acronym_mod.php";s:4:"1e3f";s:14:"mod2/clear.gif";s:4:"cc11";s:13:"mod2/conf.php";s:4:"0231";s:18:"mod2/locallang.xml";s:4:"7dee";s:33:"res/clickenlarge/pageTSConfig.txt";s:4:"90c2";s:26:"res/image/pageTSConfig.txt";s:4:"ca94";s:25:"res/demo/pageTSConfig.txt";s:4:"9fc9";s:25:"res/demo/userTSConfig.txt";s:4:"cfd5";s:26:"res/contentcss/default.css";s:4:"7446";s:28:"res/contentcss/locallang.xml";s:4:"ec0e";s:39:"res/contentcss/img/red_arrow_bullet.gif";s:4:"82d6";s:29:"res/advanced/pageTSConfig.txt";s:4:"1ab3";s:29:"res/advanced/userTSConfig.txt";s:4:"36b6";s:32:"res/indentalign/pageTSConfig.txt";s:4:"14d5";s:25:"res/proc/pageTSConfig.txt";s:4:"0693";s:36:"res/accessibilityicons/locallang.xml";s:4:"8211";s:39:"res/accessibilityicons/pageTSConfig.txt";s:4:"9bcb";s:39:"res/accessibilityicons/img/download.gif";s:4:"f6d9";s:44:"res/accessibilityicons/img/external_link.gif";s:4:"9e48";s:55:"res/accessibilityicons/img/external_link_new_window.gif";s:4:"6e8d";s:44:"res/accessibilityicons/img/internal_link.gif";s:4:"12b9";s:55:"res/accessibilityicons/img/internal_link_new_window.gif";s:4:"402a";s:35:"res/accessibilityicons/img/mail.gif";s:4:"d5a2";s:28:"res/typical/pageTSConfig.txt";s:4:"5d6c";s:28:"res/typical/userTSConfig.txt";s:4:"1ce2";s:40:"mod6/class.tx_rtehtmlarea_parse_html.php";s:4:"4af1";s:13:"mod6/conf.php";s:4:"e430";s:19:"mod6/parse_html.php";s:4:"1fd0";s:29:"static/clickenlarge/setup.txt";s:4:"5681";s:65:"extensions/InlineElements/class.tx_rtehtmlarea_inlineelements.php";s:4:"4d23";s:39:"extensions/InlineElements/locallang.xml";s:4:"07c6";s:43:"extensions/InlineElements/skin/htmlarea.css";s:4:"978b";s:54:"extensions/InlineElements/skin/images/bidioverride.gif";s:4:"f38b";s:45:"extensions/InlineElements/skin/images/big.gif";s:4:"779b";s:46:"extensions/InlineElements/skin/images/bold.gif";s:4:"06ac";s:50:"extensions/InlineElements/skin/images/citation.gif";s:4:"b6eb";s:46:"extensions/InlineElements/skin/images/code.gif";s:4:"6057";s:52:"extensions/InlineElements/skin/images/definition.gif";s:4:"692d";s:53:"extensions/InlineElements/skin/images/deletedtext.gif";s:4:"4eec";s:50:"extensions/InlineElements/skin/images/emphasis.gif";s:4:"04c9";s:54:"extensions/InlineElements/skin/images/insertedtext.gif";s:4:"a624";s:48:"extensions/InlineElements/skin/images/italic.gif";s:4:"be83";s:50:"extensions/InlineElements/skin/images/keyboard.gif";s:4:"53ac";s:52:"extensions/InlineElements/skin/images/monospaced.gif";s:4:"78c0";s:51:"extensions/InlineElements/skin/images/quotation.gif";s:4:"7c62";s:48:"extensions/InlineElements/skin/images/sample.gif";s:4:"667c";s:47:"extensions/InlineElements/skin/images/small.gif";s:4:"e013";s:46:"extensions/InlineElements/skin/images/span.gif";s:4:"0dfa";s:55:"extensions/InlineElements/skin/images/strikethrough.gif";s:4:"73b1";s:48:"extensions/InlineElements/skin/images/strong.gif";s:4:"7f50";s:51:"extensions/InlineElements/skin/images/subscript.gif";s:4:"36c0";s:53:"extensions/InlineElements/skin/images/superscript.gif";s:4:"40c4";s:51:"extensions/InlineElements/skin/images/underline.gif";s:4:"dfac";s:50:"extensions/InlineElements/skin/images/variable.gif";s:4:"da61";s:46:"extensions/InlineElements/res/pageTSConfig.txt";s:4:"8267";s:53:"extensions/QuickTag/class.tx_rtehtmlarea_quicktag.php";s:4:"b5f7";s:37:"extensions/QuickTag/skin/htmlarea.css";s:4:"fc28";s:45:"extensions/QuickTag/skin/images/inserttag.gif";s:4:"a463";s:61:"extensions/SpellChecker/class.tx_rtehtmlarea_spellchecker.php";s:4:"c300";s:41:"extensions/SpellChecker/skin/htmlarea.css";s:4:"cedf";s:51:"extensions/SpellChecker/skin/images/spell-check.gif";s:4:"6e0a";s:57:"extensions/TYPO3Color/class.tx_rtehtmlarea_typo3color.php";s:4:"3388";s:35:"extensions/TYPO3Color/locallang.xml";s:4:"377f";s:39:"extensions/TYPO3Color/skin/htmlarea.css";s:4:"fec1";s:47:"extensions/TYPO3Color/skin/images/forecolor.gif";s:4:"dbc8";s:49:"extensions/TYPO3Color/skin/images/hilitecolor.gif";s:4:"d97c";s:59:"extensions/AboutEditor/class.tx_rtehtmlarea_abouteditor.php";s:4:"ec48";s:40:"extensions/AboutEditor/skin/htmlarea.css";s:4:"eb62";s:44:"extensions/AboutEditor/skin/images/about.gif";s:4:"1690";s:61:"extensions/DefaultImage/class.tx_rtehtmlarea_defaultimage.php";s:4:"32d8";s:41:"extensions/DefaultImage/skin/htmlarea.css";s:4:"eb4c";s:45:"extensions/DefaultImage/skin/images/image.gif";s:4:"c0f0";s:55:"extensions/TextStyle/class.tx_rtehtmlarea_textstyle.php";s:4:"cc5d";s:34:"extensions/TextStyle/locallang.xml";s:4:"23dd";s:67:"extensions/TYPO3HtmlParser/class.tx_rtehtmlarea_typo3htmlparser.php";s:4:"7958";s:55:"extensions/InlineCSS/class.tx_rtehtmlarea_inlinecss.php";s:4:"710a";s:34:"extensions/InlineCSS/locallang.xml";s:4:"82ed";s:63:"extensions/BlockElements/class.tx_rtehtmlarea_blockelements.php";s:4:"eca9";s:38:"extensions/BlockElements/locallang.xml";s:4:"8a29";s:42:"extensions/BlockElements/skin/htmlarea.css";s:4:"83ce";s:51:"extensions/BlockElements/skin/images/blockquote.gif";s:4:"34dc";s:47:"extensions/BlockElements/skin/images/indent.gif";s:4:"57df";s:58:"extensions/BlockElements/skin/images/insertOrderedList.gif";s:4:"eb1c";s:61:"extensions/BlockElements/skin/images/insertParagraphAfter.gif";s:4:"e335";s:62:"extensions/BlockElements/skin/images/insertParagraphBefore.gif";s:4:"9c42";s:60:"extensions/BlockElements/skin/images/insertUnorderedList.gif";s:4:"5620";s:54:"extensions/BlockElements/skin/images/justifyCenter.gif";s:4:"420d";s:52:"extensions/BlockElements/skin/images/justifyFull.gif";s:4:"b129";s:52:"extensions/BlockElements/skin/images/justifyLeft.gif";s:4:"3799";s:53:"extensions/BlockElements/skin/images/justifyRight.gif";s:4:"0662";s:48:"extensions/BlockElements/skin/images/outdent.gif";s:4:"4786";s:57:"extensions/BlockStyle/class.tx_rtehtmlarea_blockstyle.php";s:4:"a516";s:35:"extensions/BlockStyle/locallang.xml";s:4:"26b8";s:61:"extensions/UserElements/class.tx_rtehtmlarea_userelements.php";s:4:"82ed";s:41:"extensions/UserElements/skin/htmlarea.css";s:4:"d015";s:44:"extensions/UserElements/skin/images/user.gif";s:4:"bbb4";s:57:"extensions/DynamicCSS/class.tx_rtehtmlarea_dynamiccss.php";s:4:"6226";s:35:"extensions/DynamicCSS/locallang.xml";s:4:"26b8";s:59:"extensions/DefaultFont/class.tx_rtehtmlarea_defaultfont.php";s:4:"a026";s:36:"extensions/DefaultFont/locallang.xml";s:4:"8c90";s:61:"extensions/InsertSmiley/class.tx_rtehtmlarea_insertsmiley.php";s:4:"5ad3";s:41:"extensions/InsertSmiley/skin/htmlarea.css";s:4:"fb52";s:46:"extensions/InsertSmiley/skin/images/smiley.gif";s:4:"c331";s:57:"extensions/TYPO3Image/class.tx_rtehtmlarea_typo3image.php";s:4:"711d";s:39:"extensions/TYPO3Image/skin/htmlarea.css";s:4:"fa33";s:43:"extensions/TYPO3Image/skin/images/image.gif";s:4:"c0f0";s:61:"extensions/DefaultColor/class.tx_rtehtmlarea_defaultcolor.php";s:4:"b4ef";s:37:"extensions/DefaultColor/locallang.xml";s:4:"3fb4";s:41:"extensions/DefaultColor/skin/htmlarea.css";s:4:"4759";s:49:"extensions/DefaultColor/skin/images/forecolor.gif";s:4:"dbc8";s:51:"extensions/DefaultColor/skin/images/hilitecolor.gif";s:4:"d97c";s:51:"extensions/Acronym/class.tx_rtehtmlarea_acronym.php";s:4:"8021";s:36:"extensions/Acronym/skin/htmlarea.css";s:4:"6cf9";s:42:"extensions/Acronym/skin/images/acronym.gif";s:4:"1eaa";s:61:"extensions/DefaultClean/class.tx_rtehtmlarea_defaultclean.php";s:4:"59a6";s:61:"extensions/RemoveFormat/class.tx_rtehtmlarea_removeformat.php";s:4:"497d";s:41:"extensions/RemoveFormat/skin/htmlarea.css";s:4:"be33";s:45:"extensions/RemoveFormat/skin/images/clean.gif";s:4:"2a0f";s:59:"extensions/DefaultLink/class.tx_rtehtmlarea_defaultlink.php";s:4:"1c36";s:40:"extensions/DefaultLink/skin/htmlarea.css";s:4:"883b";s:43:"extensions/DefaultLink/skin/images/link.gif";s:4:"db9a";s:45:"extensions/DefaultLink/skin/images/unlink.gif";s:4:"86c4";s:53:"extensions/Language/class.tx_rtehtmlarea_language.php";s:4:"7325";s:37:"extensions/Language/skin/htmlarea.css";s:4:"f6b2";s:49:"extensions/Language/skin/images/left_to_right.gif";s:4:"1a1f";s:49:"extensions/Language/skin/images/right_to_left.gif";s:4:"2a38";s:59:"extensions/FindReplace/class.tx_rtehtmlarea_findreplace.php";s:4:"8d67";s:40:"extensions/FindReplace/skin/htmlarea.css";s:4:"43cc";s:43:"extensions/FindReplace/skin/images/find.gif";s:4:"827f";s:63:"extensions/DefaultInline/class.tx_rtehtmlarea_defaultinline.php";s:4:"f271";s:38:"extensions/DefaultInline/locallang.xml";s:4:"e592";s:42:"extensions/DefaultInline/skin/htmlarea.css";s:4:"5b38";s:45:"extensions/DefaultInline/skin/images/bold.gif";s:4:"94f2";s:47:"extensions/DefaultInline/skin/images/italic.gif";s:4:"f60c";s:54:"extensions/DefaultInline/skin/images/strikethrough.gif";s:4:"3fd0";s:50:"extensions/DefaultInline/skin/images/subscript.gif";s:4:"cedd";s:52:"extensions/DefaultInline/skin/images/superscript.gif";s:4:"8aea";s:50:"extensions/DefaultInline/skin/images/underline.gif";s:4:"81e6";s:55:"extensions/TYPO3Link/class.tx_rtehtmlarea_typo3link.php";s:4:"6c51";s:38:"extensions/TYPO3Link/skin/htmlarea.css";s:4:"2a46";s:41:"extensions/TYPO3Link/skin/images/link.gif";s:4:"db9a";s:43:"extensions/TYPO3Link/skin/images/unlink.gif";s:4:"86c4";s:67:"extensions/TableOperations/class.tx_rtehtmlarea_tableoperations.php";s:4:"d724";s:44:"extensions/TableOperations/skin/htmlarea.css";s:4:"7022";s:54:"extensions/TableOperations/skin/images/cell-delete.gif";s:4:"f371";s:60:"extensions/TableOperations/skin/images/cell-insert-after.gif";s:4:"2dd2";s:61:"extensions/TableOperations/skin/images/cell-insert-before.gif";s:4:"5d13";s:53:"extensions/TableOperations/skin/images/cell-merge.gif";s:4:"cb52";s:52:"extensions/TableOperations/skin/images/cell-prop.gif";s:4:"ca41";s:53:"extensions/TableOperations/skin/images/cell-split.gif";s:4:"0095";s:53:"extensions/TableOperations/skin/images/col-delete.gif";s:4:"da78";s:59:"extensions/TableOperations/skin/images/col-insert-after.gif";s:4:"80d8";s:60:"extensions/TableOperations/skin/images/col-insert-before.gif";s:4:"d47d";s:51:"extensions/TableOperations/skin/images/col-prop.gif";s:4:"b178";s:52:"extensions/TableOperations/skin/images/col-split.gif";s:4:"c168";s:55:"extensions/TableOperations/skin/images/insert_table.gif";s:4:"c01b";s:53:"extensions/TableOperations/skin/images/row-delete.gif";s:4:"a289";s:59:"extensions/TableOperations/skin/images/row-insert-above.gif";s:4:"1ef1";s:59:"extensions/TableOperations/skin/images/row-insert-under.gif";s:4:"9ad6";s:51:"extensions/TableOperations/skin/images/row-prop.gif";s:4:"5344";s:52:"extensions/TableOperations/skin/images/row-split.gif";s:4:"ebfd";s:53:"extensions/TableOperations/skin/images/table-prop.gif";s:4:"0a5c";s:56:"extensions/TableOperations/skin/images/table-restyle.gif";s:4:"9284";s:57:"extensions/TableOperations/skin/images/toggle-borders.gif";s:4:"50cb";s:61:"extensions/CharacterMap/class.tx_rtehtmlarea_charactermap.php";s:4:"d2a0";s:37:"extensions/CharacterMap/locallang.xml";s:4:"c9d1";s:41:"extensions/CharacterMap/skin/htmlarea.css";s:4:"04d1";s:55:"extensions/CharacterMap/skin/images/insertCharacter.gif";s:4:"af19";}',
        'constraints' => array(
                'depends' => array(
                        'cms' => '',
        'constraints' => array(
                'depends' => array(
                        'cms' => '',
-                       'php' => '5.2.0-0.0.0',
+                       'php' => '5.2-0.0.0',
                        'typo3' => '4.2-0.0.0',
                ),
                'conflicts' => array(
                        'typo3' => '4.2-0.0.0',
                ),
                'conflicts' => array(
index 1903293..6fad0c2 100644 (file)
@@ -50,7 +50,7 @@ class tx_rtehtmlarea_typo3color extends tx_rtehtmlareaapi {
                );
        
        public function main($parentObject) {
                );
        
        public function main($parentObject) {
-               return parent::main($parentObject) && !$this->thisConfig['disableSelectColor'];
+               return parent::main($parentObject) && (!$this->thisConfig['disableSelectColor'] || $this->htmlAreaRTE->client['BROWSER'] == 'gecko');
        }
        
        /**
        }
        
        /**
index edfb6ce..4232ccb 100644 (file)
@@ -42,19 +42,22 @@ class tx_rtehtmlarea_tableoperations extends tx_rtehtmlareaapi {
        protected $thisConfig;                                  // Reference to RTE PageTSConfig
        protected $toolbar;                                     // Reference to RTE toolbar array
        protected $LOCAL_LANG;                                  // Frontend language array
        protected $thisConfig;                                  // Reference to RTE PageTSConfig
        protected $toolbar;                                     // Reference to RTE toolbar array
        protected $LOCAL_LANG;                                  // Frontend language array
+       protected $requiresClassesConfiguration = true;         // True if the registered plugin requires the PageTSConfig Classes configuration
        
        
-       protected $pluginButtons = 'table, toggleborders, tableproperties, rowproperties, rowinsertabove, rowinsertunder, rowdelete, rowsplit,
-                                               columninsertbefore, columninsertafter, columndelete, columnsplit,
+       protected $pluginButtons = 'table, toggleborders, tableproperties, tablerestyle, rowproperties, rowinsertabove, rowinsertunder, rowdelete, rowsplit,
+                                               columnproperties, columninsertbefore, columninsertafter, columndelete, columnsplit,
                                                cellproperties, cellinsertbefore, cellinsertafter, celldelete, cellsplit, cellmerge';
        protected $convertToolbarForHtmlAreaArray = array (
                'table'                 => 'InsertTable',
                'toggleborders'         => 'TO-toggle-borders',
                'tableproperties'       => 'TO-table-prop',
                                                cellproperties, cellinsertbefore, cellinsertafter, celldelete, cellsplit, cellmerge';
        protected $convertToolbarForHtmlAreaArray = array (
                'table'                 => 'InsertTable',
                'toggleborders'         => 'TO-toggle-borders',
                'tableproperties'       => 'TO-table-prop',
+               'tablerestyle'          => 'TO-table-restyle',
                'rowproperties'         => 'TO-row-prop',
                'rowinsertabove'        => 'TO-row-insert-above',
                'rowinsertunder'        => 'TO-row-insert-under',
                'rowdelete'             => 'TO-row-delete',
                'rowsplit'              => 'TO-row-split',
                'rowproperties'         => 'TO-row-prop',
                'rowinsertabove'        => 'TO-row-insert-above',
                'rowinsertunder'        => 'TO-row-insert-under',
                'rowdelete'             => 'TO-row-delete',
                'rowsplit'              => 'TO-row-split',
+               'columnproperties'      => 'TO-col-prop',
                'columninsertbefore'    => 'TO-col-insert-before',
                'columninsertafter'     => 'TO-col-insert-after',
                'columndelete'          => 'TO-col-delete',
                'columninsertbefore'    => 'TO-col-insert-before',
                'columninsertafter'     => 'TO-col-insert-after',
                'columndelete'          => 'TO-col-delete',
@@ -96,13 +99,33 @@ class tx_rtehtmlarea_tableoperations extends tx_rtehtmlareaapi {
                $registerRTEinJavascriptString = '';
                if (in_array('table', $this->toolbar)) {
                        
                $registerRTEinJavascriptString = '';
                if (in_array('table', $this->toolbar)) {
                        
+                               // Combining fieldset disablers as a list
+                       $disabledFieldsets = array('Alignment', 'Borders', 'Color', 'Description', 'Layout', 'RowGroup', 'Spacing', 'Style');
+                       foreach ($disabledFieldsets as $index => $fieldset) {
+                               if (!trim($this->thisConfig['disable'.$fieldset.'FieldsetInTableOperations'])) {
+                                       unset($disabledFieldsets[$index]);
+                               }
+                       }
+                       $disabledFieldsets = strtolower(implode(',', $disabledFieldsets));
+                       
+                               // Dialogue fieldsets removal configuration
+                       $dialogues = array('table', 'tableproperties', 'rowproperties', 'columnproperties', 'cellproperties');
+                       foreach ($dialogues as $dialogue) {
+                               if (!is_array( $this->thisConfig['buttons.']) || !is_array( $this->thisConfig['buttons.'][$dialogue.'.'])) {
+                                       $registerRTEinJavascriptString .= '
+                       RTEarea['.$RTEcounter.'].buttons.'.$dialogue.' = new Object();
+                       RTEarea['.$RTEcounter.'].buttons.'.$dialogue.'.removeFieldsets = "' . $disabledFieldsets . '";';
+                               } else if ($this->thisConfig['buttons.'][$dialogue.'.']['removeFieldsets']) {
+                                       $registerRTEinJavascriptString .= '
+                       RTEarea['.$RTEcounter.'].buttons.'.$dialogue.'.removeFieldsets += ",' . $disabledFieldsets . '";';
+                               } else {
+                                       $registerRTEinJavascriptString .= '
+                       RTEarea['.$RTEcounter.'].buttons.'.$dialogue.'.removeFieldsets = ",' . $disabledFieldsets . '";';
+                               }
+                       }
+                       
                        $registerRTEinJavascriptString .= '
                        $registerRTEinJavascriptString .= '
-                       RTEarea['.$RTEcounter.'].hideTableOperationsInToolbar = ' . (trim($this->thisConfig['hideTableOperationsInToolbar']) ? 'true' : 'false') . ';
-                       RTEarea['.$RTEcounter.'].disableLayoutFieldsetInTableOperations = ' . (trim($this->thisConfig['disableLayoutFieldsetInTableOperations'])?'true':'false') . ';
-                       RTEarea['.$RTEcounter.'].disableAlignmentFieldsetInTableOperations = ' . (trim($this->thisConfig['disableAlignmentFieldsetInTableOperations'])?'true':'false') . ';
-                       RTEarea['.$RTEcounter.'].disableSpacingFieldsetInTableOperations = ' . (trim($this->thisConfig['disableSpacingFieldsetInTableOperations'])?'true':'false') . ';
-                       RTEarea['.$RTEcounter.'].disableBordersFieldsetInTableOperations = ' . (trim($this->thisConfig['disableBordersFieldsetInTableOperations'])?'true':'false') . ';
-                       RTEarea['.$RTEcounter.'].disableColorFieldsetInTableOperations = ' . (trim($this->thisConfig['disableColorFieldsetInTableOperations'])?'true':'false') . ';';
+                       RTEarea['.$RTEcounter.'].hideTableOperationsInToolbar = ' . (trim($this->thisConfig['hideTableOperationsInToolbar']) ? 'true' : 'false') . ';';
                        
                                // Deprecated toggleborders button configuration
                        if (in_array('toggleborders',$this->toolbar) && $this->thisConfig['keepToggleBordersInToolbar']) {
                        
                                // Deprecated toggleborders button configuration
                        if (in_array('toggleborders',$this->toolbar) && $this->thisConfig['keepToggleBordersInToolbar']) {
index c1f21a9..43607d1 100644 (file)
@@ -1,20 +1,22 @@
 /* Selectors for the Table Operations extension of htmlArea RTE */
 /* Selectors for the Table Operations extension of htmlArea RTE */
-/* TYPO3 SVN ID: $Id $ */
+/* TYPO3 SVN ID: $Id: htmlarea.css $ */
 .htmlarea .toolbar .InsertTable {background-image:url("images/insert_table.gif");}
 .htmlarea .toolbar .InsertTable {background-image:url("images/insert_table.gif");}
-.htmlarea .toolbar .TO-toggle-borders, .htmlarea-context-menu .TO-toggle-borders {background-image:url("images/TableOperations/toggle-borders.gif");}
-.htmlarea .toolbar .TO-table-prop, .htmlarea-context-menu .TO-table-prop  {background-image:url("images/TableOperations/table-prop.gif");}
-.htmlarea .toolbar .TO-row-prop, .htmlarea-context-menu .TO-row-prop {background-image:url("images/TableOperations/row-prop.gif");}
-.htmlarea .toolbar .TO-row-insert-above, .htmlarea-context-menu .TO-row-insert-above {background-image:url("images/TableOperations/row-insert-above.gif");}
-.htmlarea .toolbar .TO-row-insert-under, .htmlarea-context-menu .TO-row-insert-under {background-image:url("images/TableOperations/row-insert-under.gif");}
-.htmlarea .toolbar .TO-row-delete, .htmlarea-context-menu .TO-row-delete {background-image:url("images/TableOperations/row-delete.gif");}
-.htmlarea .toolbar .TO-row-split, .htmlarea-context-menu .TO-row-split {background-image:url("images/TableOperations/row-split.gif");}
-.htmlarea .toolbar .TO-col-insert-before, .htmlarea-context-menu .TO-col-insert-before {background-image:url("images/TableOperations/col-insert-before.gif");}
-.htmlarea .toolbar .TO-col-insert-after, .htmlarea-context-menu .TO-col-insert-after {background-image:url("images/TableOperations/col-insert-after.gif");}
-.htmlarea .toolbar .TO-col-delete, .htmlarea-context-menu .TO-col-delete {background-image:url("images/TableOperations/col-delete.gif");}
-.htmlarea .toolbar .TO-col-split, .htmlarea-context-menu .TO-col-split {background-image:url("images/TableOperations/col-split.gif");}
-.htmlarea .toolbar .TO-cell-prop, .htmlarea-context-menu .TO-cell-prop {background-image:url("images/TableOperations/cell-prop.gif");}
-.htmlarea .toolbar .TO-cell-insert-before, .htmlarea-context-menu .TO-cell-insert-before {background-image:url("images/TableOperations/cell-insert-before.gif");}
-.htmlarea .toolbar .TO-cell-insert-after, .htmlarea-context-menu .TO-cell-insert-after {background-image:url("images/TableOperations/cell-insert-after.gif");}
-.htmlarea .toolbar .TO-cell-delete, .htmlarea-context-menu .TO-cell-delete {background-image:url("images/TableOperations/cell-delete.gif");}
-.htmlarea .toolbar .TO-cell-split, .htmlarea-context-menu .TO-cell-split {background-image:url("images/TableOperations/cell-split.gif");}
-.htmlarea .toolbar .TO-cell-merge, .htmlarea-context-menu .TO-cell-merge {background-image:url("images/TableOperations/cell-merge.gif");}
+.htmlarea .toolbar .TO-toggle-borders, .htmlarea-context-menu .TO-toggle-borders {background-image:url("images/toggle-borders.gif");}
+.htmlarea .toolbar .TO-table-prop, .htmlarea-context-menu .TO-table-prop {background-image:url("images/table-prop.gif");}
+.htmlarea .toolbar .TO-table-restyle, .htmlarea-context-menu .TO-table-restyle {background-image:url("images/table-restyle.gif");}
+.htmlarea .toolbar .TO-row-prop, .htmlarea-context-menu .TO-row-prop {background-image:url("images/row-prop.gif");}
+.htmlarea .toolbar .TO-row-insert-above, .htmlarea-context-menu .TO-row-insert-above {background-image:url("images/row-insert-above.gif");}
+.htmlarea .toolbar .TO-row-insert-under, .htmlarea-context-menu .TO-row-insert-under {background-image:url("images/row-insert-under.gif");}
+.htmlarea .toolbar .TO-row-delete, .htmlarea-context-menu .TO-row-delete {background-image:url("images/row-delete.gif");}
+.htmlarea .toolbar .TO-row-split, .htmlarea-context-menu .TO-row-split {background-image:url("images/row-split.gif");}
+.htmlarea .toolbar .TO-col-prop, .htmlarea-context-menu .TO-col-prop {background-image:url("images/col-prop.gif");}
+.htmlarea .toolbar .TO-col-insert-before, .htmlarea-context-menu .TO-col-insert-before {background-image:url("images/col-insert-before.gif");}
+.htmlarea .toolbar .TO-col-insert-after, .htmlarea-context-menu .TO-col-insert-after {background-image:url("images/col-insert-after.gif");}
+.htmlarea .toolbar .TO-col-delete, .htmlarea-context-menu .TO-col-delete {background-image:url("images/col-delete.gif");}
+.htmlarea .toolbar .TO-col-split, .htmlarea-context-menu .TO-col-split {background-image:url("images/col-split.gif");}
+.htmlarea .toolbar .TO-cell-prop, .htmlarea-context-menu .TO-cell-prop {background-image:url("images/cell-prop.gif");}
+.htmlarea .toolbar .TO-cell-insert-before, .htmlarea-context-menu .TO-cell-insert-before {background-image:url("images/cell-insert-before.gif");}
+.htmlarea .toolbar .TO-cell-insert-after, .htmlarea-context-menu .TO-cell-insert-after {background-image:url("images/cell-insert-after.gif");}
+.htmlarea .toolbar .TO-cell-delete, .htmlarea-context-menu .TO-cell-delete {background-image:url("images/cell-delete.gif");}
+.htmlarea .toolbar .TO-cell-split, .htmlarea-context-menu .TO-cell-split {background-image:url("images/cell-split.gif");}
+.htmlarea .toolbar .TO-cell-merge, .htmlarea-context-menu .TO-cell-merge {background-image:url("images/cell-merge.gif");}
diff --git a/typo3/sysext/rtehtmlarea/extensions/TableOperations/skin/images/col-prop.gif b/typo3/sysext/rtehtmlarea/extensions/TableOperations/skin/images/col-prop.gif
new file mode 100644 (file)
index 0000000..03c8486
Binary files /dev/null and b/typo3/sysext/rtehtmlarea/extensions/TableOperations/skin/images/col-prop.gif differ
diff --git a/typo3/sysext/rtehtmlarea/extensions/TableOperations/skin/images/table-restyle.gif b/typo3/sysext/rtehtmlarea/extensions/TableOperations/skin/images/table-restyle.gif
new file mode 100644 (file)
index 0000000..d7d63d3
Binary files /dev/null and b/typo3/sysext/rtehtmlarea/extensions/TableOperations/skin/images/table-restyle.gif differ
index 0751eda..55c1dc4 100644 (file)
@@ -57,6 +57,7 @@ HTMLArea.prototype._initEditMode = function () {
                try {
                        this._doc.designMode = "on";
                        if (this._doc.queryCommandEnabled("insertbronreturn")) this._doc.execCommand("insertbronreturn", false, this.config.disableEnterParagraphs);
                try {
                        this._doc.designMode = "on";
                        if (this._doc.queryCommandEnabled("insertbronreturn")) this._doc.execCommand("insertbronreturn", false, this.config.disableEnterParagraphs);
+                       if (this._doc.queryCommandEnabled("enableObjectResizing")) this._doc.execCommand("enableObjectResizing", false, !this.config.disableObjectResizing);
                        if (this._doc.queryCommandEnabled("enableInlineTableEditing")) this._doc.execCommand("enableInlineTableEditing", false, (this.config.buttons.table && this.config.buttons.table.enableHandles) ? true : false);
                        if (this._doc.queryCommandEnabled("styleWithCSS")) this._doc.execCommand("styleWithCSS", false, this.config.useCSS);
                                else if (this._doc.queryCommandEnabled("useCSS")) this._doc.execCommand("useCSS", false, !this.config.useCSS);
                        if (this._doc.queryCommandEnabled("enableInlineTableEditing")) this._doc.execCommand("enableInlineTableEditing", false, (this.config.buttons.table && this.config.buttons.table.enableHandles) ? true : false);
                        if (this._doc.queryCommandEnabled("styleWithCSS")) this._doc.execCommand("styleWithCSS", false, this.config.useCSS);
                                else if (this._doc.queryCommandEnabled("useCSS")) this._doc.execCommand("useCSS", false, !this.config.useCSS);
@@ -464,6 +465,7 @@ HTMLArea.NestedHandler = function(ev,editor,nestedObj,noOpenCloseAction) {
                                                        editor.sizeIframe(-2);
                                                }
                                                if (editor._doc.queryCommandEnabled("insertbronreturn")) editor._doc.execCommand("insertbronreturn", false, editor.config.disableEnterParagraphs);
                                                        editor.sizeIframe(-2);
                                                }
                                                if (editor._doc.queryCommandEnabled("insertbronreturn")) editor._doc.execCommand("insertbronreturn", false, editor.config.disableEnterParagraphs);
+                                               if (editor._doc.queryCommandEnabled("enableObjectResizing")) editor._doc.execCommand("enableObjectResizing", false, !editor.config.disableObjectResizing);
                                                if (editor._doc.queryCommandEnabled("enableInlineTableEditing")) editor._doc.execCommand("enableInlineTableEditing", false, (editor.config.buttons.table && editor.config.buttons.table.enableHandles) ? true : false);
                                                if (editor._doc.queryCommandEnabled("styleWithCSS")) editor._doc.execCommand("styleWithCSS", false, editor.config.useCSS);
                                                        else if (editor._doc.queryCommandEnabled("useCSS")) editor._doc.execCommand("useCSS", false, !editor.config.useCSS);
                                                if (editor._doc.queryCommandEnabled("enableInlineTableEditing")) editor._doc.execCommand("enableInlineTableEditing", false, (editor.config.buttons.table && editor.config.buttons.table.enableHandles) ? true : false);
                                                if (editor._doc.queryCommandEnabled("styleWithCSS")) editor._doc.execCommand("styleWithCSS", false, editor.config.useCSS);
                                                        else if (editor._doc.queryCommandEnabled("useCSS")) editor._doc.execCommand("useCSS", false, !editor.config.useCSS);
index 3ddd136..5306ccc 100644 (file)
@@ -132,7 +132,6 @@ HTMLArea.loadScript = function(url, plugin) {
        if (HTMLArea._compressedScripts && url.indexOf("compressed") == -1) url = url.replace(/\.js$/gi, "_compressed.js");
        HTMLArea._scripts.push(url);
 };
        if (HTMLArea._compressedScripts && url.indexOf("compressed") == -1) url = url.replace(/\.js$/gi, "_compressed.js");
        HTMLArea._scripts.push(url);
 };
-HTMLArea.loadScript(RTEarea[0]["popupwin"] ? RTEarea[0]["popupwin"] : _editor_url + "popupwin.js");
 if(HTMLArea.is_gecko) HTMLArea.loadScript(RTEarea[0]["htmlarea-gecko"] ? RTEarea[0]["htmlarea-gecko"] : _editor_url + "htmlarea-gecko.js");
 if(HTMLArea.is_ie) HTMLArea.loadScript(RTEarea[0]["htmlarea-ie"] ? RTEarea[0]["htmlarea-ie"] : _editor_url + "htmlarea-ie.js");
 
 if(HTMLArea.is_gecko) HTMLArea.loadScript(RTEarea[0]["htmlarea-gecko"] ? RTEarea[0]["htmlarea-gecko"] : _editor_url + "htmlarea-gecko.js");
 if(HTMLArea.is_ie) HTMLArea.loadScript(RTEarea[0]["htmlarea-ie"] ? RTEarea[0]["htmlarea-ie"] : _editor_url + "htmlarea-ie.js");
 
@@ -271,6 +270,7 @@ HTMLArea.Config = function () {
        this.useCSS = false;
        this.enableMozillaExtension = true;
        this.disableEnterParagraphs = false;
        this.useCSS = false;
        this.enableMozillaExtension = true;
        this.disableEnterParagraphs = false;
+       this.disableObjectResizing = false;
        this.removeTrailingBR = false;
                // style included in the iframe document
        this.editedContentStyle = _editor_edited_content_CSS;
        this.removeTrailingBR = false;
                // style included in the iframe document
        this.editedContentStyle = _editor_edited_content_CSS;
@@ -1163,6 +1163,7 @@ HTMLArea.generatePlugins = function(editorNumber) {
                editor.onGenerate = null;
        }
        HTMLArea._appendToLog("[HTMLArea::initIframe]: All plugins successfully generated.");
                editor.onGenerate = null;
        }
        HTMLArea._appendToLog("[HTMLArea::initIframe]: All plugins successfully generated.");
+       editor.focusEditor();
        editor.updateToolbar();
 };
 
        editor.updateToolbar();
 };
 
@@ -1246,6 +1247,7 @@ HTMLArea.prototype.setMode = function(mode) {
                        if (HTMLArea.is_gecko) {
                                try {
                                        if (this._doc.queryCommandEnabled("insertbronreturn")) this._doc.execCommand("insertbronreturn", false, this.config.disableEnterParagraphs);
                        if (HTMLArea.is_gecko) {
                                try {
                                        if (this._doc.queryCommandEnabled("insertbronreturn")) this._doc.execCommand("insertbronreturn", false, this.config.disableEnterParagraphs);
+                                       if (this._doc.queryCommandEnabled("enableObjectResizing")) this._doc.execCommand("enableObjectResizing", false, !this.config.disableObjectResizing);
                                        if (this._doc.queryCommandEnabled("enableInlineTableEditing")) this._doc.execCommand("enableInlineTableEditing", false, (this.config.buttons.table && this.config.buttons.table.enableHandles) ? true : false);
                                        if (this._doc.queryCommandEnabled("styleWithCSS")) this._doc.execCommand("styleWithCSS", false, this.config.useCSS);
                                                else if (this._doc.queryCommandEnabled("useCSS")) this._doc.execCommand("useCSS", false, !this.config.useCSS);
                                        if (this._doc.queryCommandEnabled("enableInlineTableEditing")) this._doc.execCommand("enableInlineTableEditing", false, (this.config.buttons.table && this.config.buttons.table.enableHandles) ? true : false);
                                        if (this._doc.queryCommandEnabled("styleWithCSS")) this._doc.execCommand("styleWithCSS", false, this.config.useCSS);
                                                else if (this._doc.queryCommandEnabled("useCSS")) this._doc.execCommand("useCSS", false, !this.config.useCSS);
@@ -2210,7 +2212,7 @@ HTMLArea.selectValue = function(select, value) {
 
 HTMLArea.RE_blockTags = /^(body|p|h1|h2|h3|h4|h5|h6|ul|ol|pre|dl|dt|dd|div|noscript|blockquote|form|hr|table|caption|fieldset|address|td|tr|th|li|tbody|thead|tfoot|iframe)$/;
 HTMLArea.isBlockElement = function(el) { return el && el.nodeType == 1 && HTMLArea.RE_blockTags.test(el.nodeName.toLowerCase()); };
 
 HTMLArea.RE_blockTags = /^(body|p|h1|h2|h3|h4|h5|h6|ul|ol|pre|dl|dt|dd|div|noscript|blockquote|form|hr|table|caption|fieldset|address|td|tr|th|li|tbody|thead|tfoot|iframe)$/;
 HTMLArea.isBlockElement = function(el) { return el && el.nodeType == 1 && HTMLArea.RE_blockTags.test(el.nodeName.toLowerCase()); };
-HTMLArea.RE_closingTags = /^(p|blockquote|a|li|ol|ul|dl|dt|td|th|tr|tbody|thead|tfoot|caption|colgroup|table|div|b|bdo|big|cite|code|del|dfn|em|i|ins|kbd|label|q|samp|small|span|strike|strong|sub|sup|tt|u|var|abbr|acronym|font|center|object|embed|style|script|title|head|clickenlarge)$/;
+HTMLArea.RE_closingTags = /^(p|blockquote|a|li|ol|ul|dl|dt|td|th|tr|tbody|thead|tfoot|caption|colgroup|table|div|b|bdo|big|cite|code|del|dfn|em|i|ins|kbd|label|q|samp|small|span|strike|strong|sub|sup|tt|u|var|abbr|acronym|font|center|object|embed|style|script|title|head)$/;
 HTMLArea.RE_noClosingTag = /^(img|br|hr|col|input|area|base|link|meta|param)$/;
 HTMLArea.needsClosingTag = function(el) { return el && el.nodeType == 1 && !HTMLArea.RE_noClosingTag.test(el.tagName.toLowerCase()); };
 
 HTMLArea.RE_noClosingTag = /^(img|br|hr|col|input|area|base|link|meta|param)$/;
 HTMLArea.needsClosingTag = function(el) { return el && el.nodeType == 1 && !HTMLArea.RE_noClosingTag.test(el.tagName.toLowerCase()); };
 
@@ -2266,8 +2268,7 @@ HTMLArea.getHTMLWrapper = function(root, outputRoot, editor) {
                }
                if (config.htmlRemoveTagsAndContents && config.htmlRemoveTagsAndContents.test(root_tag)) break;
                var custom_tag = (config.customTags && config.customTags.test(root_tag));
                }
                if (config.htmlRemoveTagsAndContents && config.htmlRemoveTagsAndContents.test(root_tag)) break;
                var custom_tag = (config.customTags && config.customTags.test(root_tag));
-               var empty_root = (root_tag == "clickenlarge" && !(root.firstChild && root.firstChild.nodeName.toLowerCase() == "img"));
-               if (outputRoot) outputRoot = !(config.htmlRemoveTags && config.htmlRemoveTags.test(root_tag)) && !empty_root;
+               if (outputRoot) outputRoot = !(config.htmlRemoveTags && config.htmlRemoveTags.test(root_tag));
                if ((HTMLArea.is_ie || HTMLArea.is_safari) && root_tag == "head") {
                        if(outputRoot) html += "<head>";
                        var save_multiline = RegExp.multiline;
                if ((HTMLArea.is_ie || HTMLArea.is_safari) && root_tag == "head") {
                        if(outputRoot) html += "<head>";
                        var save_multiline = RegExp.multiline;
@@ -2982,7 +2983,7 @@ HTMLArea.Plugin = HTMLArea.Base.extend({
         * @return      boolean
         */
        onMode : function(mode) {
         * @return      boolean
         */
        onMode : function(mode) {
-               if (this.dialog && mode === "textmode" && !(this.dialog.buttonId && this.editorConfiguration.btnList[this.dialog.buttonId] && this.editorConfiguration.btnList[this.dialog.buttonId].textMode)) {
+               if (mode === "textmode" && this.dialog && HTMLArea.Dialog[this.name] == this.dialog && !(this.dialog.buttonId && this.editorConfiguration.btnList[this.dialog.buttonId] && this.editorConfiguration.btnList[this.dialog.buttonId].textMode)) {
                        this.dialog.close();
                }
        },
                        this.dialog.close();
                }
        },
@@ -3017,7 +3018,7 @@ HTMLArea.Plugin = HTMLArea.Base.extend({
         * @return      string          the localization of the label
         */
        localize : function (label) {
         * @return      string          the localization of the label
         */
        localize : function (label) {
-               return HTMLArea.I18N.dialogs[label] || HTMLArea.I18N.tooltips[label] || this.I18N[label];
+               return this.I18N[label] || HTMLArea.I18N.dialogs[label] || HTMLArea.I18N.tooltips[label];
        },
        
        /**
        },
        
        /**
@@ -3068,10 +3069,11 @@ HTMLArea.Plugin = HTMLArea.Base.extend({
         * @param       object          arguments: object of variable type to be passed to the dialog
         * @param       object          dimensions: object giving the width and height of the dialog window
         * @param       string          showScrollbars: specifies by "yes" or "no" whether or not the dialog window should have scrollbars
         * @param       object          arguments: object of variable type to be passed to the dialog
         * @param       object          dimensions: object giving the width and height of the dialog window
         * @param       string          showScrollbars: specifies by "yes" or "no" whether or not the dialog window should have scrollbars
+        * @param       object          dialogOpener: reference to the opener window
         *
         *
-        * @return      object          the dialog window
+        * @return      object          the dialogue object
         */
         */
-       openDialog : function (buttonId, url, action, arguments, dimensions, showScrollbars) {
+       openDialog : function (buttonId, url, action, arguments, dimensions, showScrollbars, dialogOpener) {
                if (this.dialog && this.dialog.hasOpenedWindow() && this.dialog.buttonId === buttonId) {
                        this.dialog.focus();
                        return this.dialog;
                if (this.dialog && this.dialog.hasOpenedWindow() && this.dialog.buttonId === buttonId) {
                        this.dialog.focus();
                        return this.dialog;
@@ -3091,7 +3093,8 @@ HTMLArea.Plugin = HTMLArea.Base.extend({
                                        actionFunctionReference,
                                        arguments,
                                        {width: ((dimensions && dimensions.width)?dimensions.width:100), height: ((dimensions && dimensions.height)?dimensions.height:100)},
                                        actionFunctionReference,
                                        arguments,
                                        {width: ((dimensions && dimensions.width)?dimensions.width:100), height: ((dimensions && dimensions.height)?dimensions.height:100)},
-                                       (showScrollbars?showScrollbars:"no")
+                                       (showScrollbars?showScrollbars:"no"),
+                                       dialogOpener
                                );
                }
        },
                                );
                }
        },
@@ -3150,10 +3153,11 @@ HTMLArea.Dialog = HTMLArea.Base.extend({
         * @param       object          arguments: object of variable type to be passed to the dialog
         * @param       object          dimensions: object giving the width and height of the dialog window
         * @param       string          showScrollbars: specifies by "yes" or "no" whether or not the dialog window should have scrollbars
         * @param       object          arguments: object of variable type to be passed to the dialog
         * @param       object          dimensions: object giving the width and height of the dialog window
         * @param       string          showScrollbars: specifies by "yes" or "no" whether or not the dialog window should have scrollbars
+        * @param       object          dialogOpener: reference to the opener window
         *
         * @return      boolean         true if the dialog window was opened
         */
         *
         * @return      boolean         true if the dialog window was opened
         */
-       constructor : function (plugin, buttonId, url, action, arguments, dimensions, showScrollbars) {
+       constructor : function (plugin, buttonId, url, action, arguments, dimensions, showScrollbars, dialogOpener) {
                this.window = window.window ? window.window : window.self;
                this.plugin = plugin;
                this.buttonId = buttonId;
                this.window = window.window ? window.window : window.self;
                this.plugin = plugin;
                this.buttonId = buttonId;
@@ -3167,18 +3171,151 @@ HTMLArea.Dialog = HTMLArea.Base.extend({
                        HTMLArea.Dialog[this.plugin.name].close();
                }
                HTMLArea.Dialog[this.plugin.name] = this;
                        HTMLArea.Dialog[this.plugin.name].close();
                }
                HTMLArea.Dialog[this.plugin.name] = this;
-               
                this.dialogWindow = window.open(url, this.plugin.name + "Dialog", "toolbar=no,location=no,directories=no,menubar=no,resizable=yes,top=100,left=100,dependent=yes,dialog=yes,chrome=no,width=" + dimensions.width + ",height=" + dimensions.height + ",scrollbars=" + showScrollbars);
                this.dialogWindow = window.open(url, this.plugin.name + "Dialog", "toolbar=no,location=no,directories=no,menubar=no,resizable=yes,top=100,left=100,dependent=yes,dialog=yes,chrome=no,width=" + dimensions.width + ",height=" + dimensions.height + ",scrollbars=" + showScrollbars);
+               
                if (!this.dialogWindow) {
                        this.plugin.appendToLog("openDialog", "Dialog window could not be opened with url " + url);
                        return false;
                }
                if (!this.dialogWindow) {
                        this.plugin.appendToLog("openDialog", "Dialog window could not be opened with url " + url);
                        return false;
                }
+               
+               if (typeof(dialogOpener) !== "undefined") {
+                       this.dialogWindow.opener = dialogOpener;
+                       this.dialogWindow.opener.openedDialog = this;
+               }
                if (!this.dialogWindow.opener) {
                        this.dialogWindow.opener = this.window;
                }
                if (!this.dialogWindow.opener) {
                        this.dialogWindow.opener = this.window;
                }
+               
+               if (!url) this.createForm();
                return true;
        },
        
                return true;
        },
        
+       /**
+        * Creates the document and the dialogue form of the dialogue window
+        *
+        * @return      void
+        */
+       createForm : function () {
+               
+               this.document = this.dialogWindow.document;
+               this.editor = this.plugin.editor;
+               
+               if (HTMLArea.is_ie) {
+                       this.document.open();
+                       var html = "<html><head></head><body></body></html>\n";
+                       this.document.write(html);
+                       this.document.close();
+                       this.loadStyle();
+               }
+               var html = this.document.documentElement;
+               html.className = "popupwin";
+               var head = this.document.getElementsByTagName("head")[0];
+               if (!head) {
+                       var head = this.document.createElement("head");
+                       html.appendChild(head);
+               }
+               var title = this.document.getElementsByTagName("title")[0];
+               if (!title) {
+                       var title = this.document.createElement("title");
+                       head.appendChild(title);
+               }
+               this.document.title = this.arguments.title;
+               var body = this.document.body;
+               if (!body) {
+                       var body = this.document.createElement("body");
+               }
+               body.className = "popupwin dialog";
+               body.id = "--HA-body";
+               var content = this.document.createElement("div");
+               content.className = "content";
+               content.id = "content";
+               this.content = content;
+               body.appendChild(content);
+               if (HTMLArea.is_gecko) {
+                       html.appendChild(body);
+               }
+                       // Create the form
+                       // Localize, resize and initiate capture of events
+                       // Catch errors for IE loosing control in case the window is closed while being initialized
+               if (HTMLArea.is_ie) {
+                       try {
+                               this.arguments.initialize(this);
+                               this.initialize(false, false, HTMLArea.is_ie);
+                               this.focus();
+                       } catch(e) { }
+               } else {
+                       this.arguments.initialize(this);
+                       this.initialize(false, false, HTMLArea.is_ie);
+                       this.focus();
+               }
+       },
+       
+       /**
+        * Adds OK and Cancel buttons to the dialogue window
+        *
+        * @return      void
+        */
+       addButtons : function() {
+               var self = this;
+               var div = this.document.createElement("div");
+               this.content.appendChild(div);
+               div.className = "buttons";
+               for (var i = 0; i < arguments.length; ++i) {
+                       var btn = arguments[i];
+                       var button = this.document.createElement("button");
+                       div.appendChild(button);
+                       switch (btn) {
+                               case "ok":
+                                       button.innerHTML = this.plugin.localize("OK");
+                                       button.onclick = function() {
+                                               try {
+                                                       self.callFormInputHandler();
+                                               } catch(e) { };
+                                               return false;
+                                       };
+                                       break;
+                               case "cancel":
+                                       button.innerHTML = this.plugin.localize("Cancel");
+                                       button.onclick = function() {
+                                               self.close();
+                                               return false;
+                                       };
+                                       break;
+                       }
+               }
+       },
+       
+       /**
+        * Call the form input handler
+        *
+        * @return      boolean         false
+        */
+       callFormInputHandler : 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.nodeName.toLowerCase() == "input") {
+                                       if (el.type == "checkbox") {
+                                               val = el.checked;
+                                       }
+                               }
+                               params[el.name] = val;
+                       }
+               }
+               this.action(this, params);
+               return false;
+       },
+       
+       /**
+        * Cheks if the dialogue has an open dialogue window
+        *
+        * @return      boolean         true if the dialogue has an open window
+        */
        hasOpenedWindow : function () {
                return this.dialogWindow && !this.dialogWindow.closed;
        },
        hasOpenedWindow : function () {
                return this.dialogWindow && !this.dialogWindow.closed;
        },
@@ -3191,17 +3328,17 @@ HTMLArea.Dialog = HTMLArea.Base.extend({
         *
         * @return      void
         */
         *
         * @return      void
         */
-       initialize : function (noLocalize, noResize) {
+       initialize : function (noLocalize, noResize, noStyle) {
                this.dialogWindow.HTMLArea = HTMLArea;
                this.dialogWindow.dialog = this;
                this.dialogWindow.HTMLArea = HTMLArea;
                this.dialogWindow.dialog = this;
+                       // Capture unload and escape events
+               this.captureEvents();
                        // Get stylesheets for the dialog window
                        // Get stylesheets for the dialog window
-               this.loadStyle();
+               if (!noStyle) this.loadStyle();
                        // Localize the labels of the popup window
                if (!noLocalize) this.localize();
                        // Resize the dialog window to its contents
                if (!noResize) this.resize(noResize);
                        // Localize the labels of the popup window
                if (!noLocalize) this.localize();
                        // Resize the dialog window to its contents
                if (!noResize) this.resize(noResize);
-                       // Capture unload and escape events
-               this.captureEvents();
        },
        
        /**
        },
        
        /**
@@ -3215,6 +3352,7 @@ HTMLArea.Dialog = HTMLArea.Base.extend({
                link.rel = "stylesheet";
                link.type = "text/css";
                link.href = HTMLArea.editorCSS;
                link.rel = "stylesheet";
                link.type = "text/css";
                link.href = HTMLArea.editorCSS;
+               if (link.href.indexOf("http") == -1 && HTMLArea.is_gecko) link.href = _typo3_host_url + link.href;
                head.appendChild(link);
        },
        
                head.appendChild(link);
        },
        
@@ -3235,7 +3373,8 @@ HTMLArea.Dialog = HTMLArea.Base.extend({
                                        if (label) element.firstChild.data = label;
                                }
                                if (element.title) {
                                        if (label) element.firstChild.data = label;
                                }
                                if (element.title) {
-                                       element.title = this.plugin.localize(element.title);
+                                       label = this.plugin.localize(element.title);
+                                       if (label) element.title = label;
                                }
                                        // resetting the selected option for Mozilla
                                if (types[type] == "option" && element.selected ) {
                                }
                                        // resetting the selected option for Mozilla
                                if (types[type] == "option" && element.selected ) {
@@ -3244,7 +3383,8 @@ HTMLArea.Dialog = HTMLArea.Base.extend({
                                }
                        }
                }
                                }
                        }
                }
-               this.dialogWindow.document.title = this.plugin.localize(this.dialogWindow.document.title);
+               label = this.plugin.localize(this.dialogWindow.document.title);
+               if (label) this.dialogWindow.document.title = label;
        },
        
        /**
        },
        
        /**
@@ -3257,7 +3397,8 @@ HTMLArea.Dialog = HTMLArea.Base.extend({
        resize : function (noResize) {
                        // resize if allowed
                var dialogWindow = this.dialogWindow;
        resize : function (noResize) {
                        // resize if allowed
                var dialogWindow = this.dialogWindow;
-               var content = dialogWindow.document.getElementById("content");
+               var doc = dialogWindow.document;
+               var content = doc.getElementById("content");
                if ((HTMLArea.is_gecko && !HTMLArea.is_opera && !HTMLArea.is_safari) || (HTMLArea.is_opera && content)) {
                        var self = this;
                        setTimeout( function() {
                if ((HTMLArea.is_gecko && !HTMLArea.is_opera && !HTMLArea.is_safari) || (HTMLArea.is_opera && content)) {
                        var self = this;
                        setTimeout( function() {
@@ -3276,39 +3417,32 @@ HTMLArea.Dialog = HTMLArea.Base.extend({
                                } catch(e) { }
                        }, 25);
                } else {
                                } catch(e) { }
                        }, 25);
                } else {
+                       var body = doc.body;
                        var innerX, innerY;
                        if (dialogWindow.innerHeight) {
                                        // all except Explorer
                                innerX = dialogWindow.innerWidth;
                                innerY = dialogWindow.innerHeight;
                        var innerX, innerY;
                        if (dialogWindow.innerHeight) {
                                        // all except Explorer
                                innerX = dialogWindow.innerWidth;
                                innerY = dialogWindow.innerHeight;
-                       } else if (dialogWindow.document.documentElement && dialogWindow.document.documentElement.clientHeight) {
+                       } else if (doc.documentElement && doc.documentElement.clientHeight) {
                                        // Explorer 6 Strict Mode
                                        // Explorer 6 Strict Mode
-                               innerX = dialogWindow.document.documentElement.clientWidth;
-                               innerY = dialogWindow.document.documentElement.clientHeight;
-                       } else if (document.body) {
+                               innerX = doc.documentElement.clientWidth;
+                               innerY = doc.documentElement.clientHeight;
+                       } else {
                                        // other Explorers
                                        // other Explorers
-                               innerX = dialogWindow.document.body.clientWidth;
-                               innerY = dialogWindow.document.body.clientHeight;
+                               innerX = body.clientWidth;
+                               innerY = body.clientHeight;
                        }
                        
                        }
                        
-                       var pageX, pageY;
-                       var test1 = dialogWindow.document.body.scrollHeight;
-                       var test2 = dialogWindow.document.body.offsetHeight
-                       if (test1 > test2) {
-                                       // all but Explorer Mac
-                               pageX = dialogWindow.document.body.scrollWidth;
-                               pageY = dialogWindow.document.body.scrollHeight;
+                       var pageY = Math.max(body.scrollHeight, body.offsetHeight);
+                       if (innerY == pageY) {
+                               dialogWindow.resizeTo(body.scrollWidth, body.scrollHeight+75);
                        } else {
                        } else {
-                                       // Explorer Mac;
-                                       //would also work in Explorer 6 Strict, Mozilla and Safari
-                               pageX = dialogWindow.document.body.offsetWidth;
-                               pageY = dialogWindow.document.body.offsetHeight;
+                               dialogWindow.resizeBy(Math.max(body.scrollWidth, body.offsetWidth) - innerX, pageY - innerY);
                        }
                        }
-                       dialogWindow.resizeBy(pageX - innerX, pageY - innerY);
                        
                                // center on parent if allowed
                        
                                // center on parent if allowed
-                       var W = dialogWindow.document.body.offsetWidth;
-                       var H = dialogWindow.document.body.offsetHeight;
+                       var W = body.offsetWidth;
+                       var H = body.offsetHeight;
                        var x = (screen.availWidth - W) / 2;
                        var y = (screen.availHeight - H) / 2;
                        dialogWindow.moveTo(x, y);
                        var x = (screen.availWidth - W) / 2;
                        var y = (screen.availHeight - H) / 2;
                        dialogWindow.moveTo(x, y);
@@ -3367,22 +3501,38 @@ HTMLArea.Dialog = HTMLArea.Base.extend({
        },
        
        /**
        },
        
        /**
+        * Recover focus from the parent window
+        *
+        * @return      void
+        */
+       recoverFocus : function(ev) {
+               if (this.dialogWindow && !this.dialogWindow.closed) {
+                       if (!ev) var ev = window.event;
+                       HTMLArea._stopEvent(ev);
+                       this.focus();
+               }
+               return false;
+       },
+       
+       /**
         * Close the dialog window
         *
         * @return      void
         */
        close : function () {
         * Close the dialog window
         *
         * @return      void
         */
        close : function () {
-               if (this.hasOpenedWindow()) {
-                       if (this.dialogWindow.opener && !this.dialogWindow.opener.closed) {
-                               this.releaseEvents();
+               if (this.dialogWindow) {
+                       if (this.dialogWindow.openedDialog) {
+                               this.dialogWindow.openedDialog.close();
                        }
                        }
-                       this.releaseEvents(this.dialogWindow);
+                       this.releaseEvents();
                        HTMLArea.Dialog[this.plugin.name] = null;
                        HTMLArea.Dialog[this.plugin.name] = null;
-                       if (HTMLArea.is_safari) {
-                               this.dialogWindow.blur();
+                       if (!this.dialogWindow.closed) {
+                               this.dialogWindow.dialog = null;
+                               if (HTMLArea.is_safari || HTMLArea.is_ie) {
+                                       this.dialogWindow.blur();
+                               }
+                               this.dialogWindow.close();
                        }
                        }
-                       this.dialogWindow.close();
-                       this.dialogWindow.dialog = null;
                        this.plugin.editor.updateToolbar();
                }
                return false;
                        this.plugin.editor.updateToolbar();
                }
                return false;
@@ -3425,36 +3575,76 @@ HTMLArea.Dialog = HTMLArea.Base.extend({
        },
        
        /**
        },
        
        /**
-        *Capture unload and escape events
+        * Capture unload, escape and focus events
         *
         * @return      void
         *
         * @return      void
-        */     
+        */
        captureEvents : function (skipUnload) {
        captureEvents : function (skipUnload) {
+                       // Capture unload events on the dialogue window, the opener window and the editor frame
                this.unloadFunctionReference = this.makeFunctionReference("close");
                HTMLArea._addEvent(this.dialogWindow.opener, "unload", this.unloadFunctionReference);
                if (HTMLArea.is_gecko && this.plugin.editor._iframe.contentWindow) {
                        HTMLArea._addEvent(this.plugin.editor._iframe.contentWindow, "unload", this.unloadFunctionReference);
                }
                if (!skipUnload) HTMLArea._addEvent(this.dialogWindow, "unload", this.unloadFunctionReference);
                this.unloadFunctionReference = this.makeFunctionReference("close");
                HTMLArea._addEvent(this.dialogWindow.opener, "unload", this.unloadFunctionReference);
                if (HTMLArea.is_gecko && this.plugin.editor._iframe.contentWindow) {
                        HTMLArea._addEvent(this.plugin.editor._iframe.contentWindow, "unload", this.unloadFunctionReference);
                }
                if (!skipUnload) HTMLArea._addEvent(this.dialogWindow, "unload", this.unloadFunctionReference);
+                       // Capture escape key on the dialogue window
                this.escapeFunctionReference = this.makeFunctionReference("closeOnEscape");
                HTMLArea._addEvent(this.dialogWindow.document, "keypress", this.escapeFunctionReference);
                this.escapeFunctionReference = this.makeFunctionReference("closeOnEscape");
                HTMLArea._addEvent(this.dialogWindow.document, "keypress", this.escapeFunctionReference);
+                       // Capture focus events on the opener window and its frames
+               if (HTMLArea.is_gecko) {
+                       this.recoverFocusFunctionReference = this.makeFunctionReference("recoverFocus");
+                       this.captureFocus(this.dialogWindow.opener);
+               }
         },
         },
+        
+       /**
+        * Capture focus events
+        *
+        * @return      void
+        */
+       captureFocus : function (w) {
+               if (HTMLArea.is_gecko) {
+                       w.addEventListener("focus", this.recoverFocusFunctionReference, true);
+               } else {
+                       HTMLArea._addEvent(w, "focus", this.recoverFocusFunctionReference);
+               }
+               for (var i = w.frames.length; --i >= 0;) {
+                       this.captureFocus(w.frames[i]);
+               }
+       },
        
        /**
        
        /**
-        * Release all event handlers that were set when the dialog window was opened
+        * Release all event handlers that were set when the dialogue window was opened
         *
         * @return      void
         */
        releaseEvents : function() {
         *
         * @return      void
         */
        releaseEvents : function() {
-               var opener = this.dialogWindow.opener;
-               if (opener && !opener.closed) {
-                               // release the capturing of events
-                       HTMLArea._removeEvent(opener, "unload", this.unloadFunctionReference);
+               if (this.dialogWindow) {
                        HTMLArea._removeEvent(this.dialogWindow, "unload", this.unloadFunctionReference);
                        HTMLArea._removeEvent(this.dialogWindow, "unload", this.unloadFunctionReference);
-                       if (HTMLArea.is_gecko && this.plugin.editor._iframe.contentWindow) {
-                               HTMLArea._removeEvent(this.plugin.editor._iframe.contentWindow, "unload", this.unloadFunctionReference);
+                       if (this.dialogWindow.document) {
+                               HTMLArea._removeEvent(this.dialogWindow.document, "keypress", this.escapeFunctionReference);
                        }
                        }
-                       HTMLArea._removeEvent(this.dialogWindow.document, "keypress", this.escapeFunctionReference);
+                       if (this.dialogWindow.opener && !this.dialogWindow.opener.closed) {
+                               HTMLArea._removeEvent(this.dialogWindow.opener, "unload", this.unloadFunctionReference);
+                               if (HTMLArea.is_gecko) {
+                                       this.releaseFocus(this.dialogWindow.opener);
+                               }
+                       }
+               }
+               if (HTMLArea.is_gecko && this.plugin.editor._iframe.contentWindow) {
+                       HTMLArea._removeEvent(this.plugin.editor._iframe.contentWindow, "unload", this.unloadFunctionReference);
+               }
+       },
+       
+       /**
+        * Release focus capturing events that were set when the dialogue window was opened
+        *
+        * @return      void
+        */
+       releaseFocus : function(w) {
+               HTMLArea._removeEvent(w, "focus", this.recoverFocusFunctionReference);
+               for (var i = w.frames.length; --i >= 0;) {
+                       this.releaseFocus(w.frames[i]);
                }
        }
 });
                }
        }
 });
index 29a1627..a88be40 100644 (file)
@@ -268,12 +268,28 @@ BlockElements = HTMLArea.Plugin.extend({
                                                this.indentSelectedListElements(parentElement, range);
                                        }
                                } else if (tableCell) {
                                                this.indentSelectedListElements(parentElement, range);
                                        }
                                } else if (tableCell) {
-                                       var nextCell = tableCell.nextSibling ? tableCell.nextSibling : (tableCell.parentNode.nextSibling ? tableCell.parentNode.nextSibling.firstChild : null);
+                                       var tablePart = tableCell.parentNode.parentNode;
+                                               // Get next cell in same table part
+                                       var nextCell = tableCell.nextSibling ? tableCell.nextSibling : (tableCell.parentNode.nextSibling ? tableCell.parentNode.nextSibling.cells[0] : null);
+                                               // Next cell is in other table part
+                                       if (!nextCell) {
+                                               switch (tablePart.nodeName.toLowerCase()) {
+                                                   case "thead":
+                                                       nextCell = tablePart.parentNode.tBodies[0].rows[0].cells[0];
+                                                       break;
+                                                   case "tbody":
+                                                       nextCell = tablePart.nextSibling ? tablePart.nextSibling.rows[0].cells[0] : null;
+                                                       break;
+                                                   case "tfoot":
+                                                       this.editor.selectNodeContents(tablePart.parentNode.lastChild.lastChild.lastChild, true);
+                                               }
+       
+                                       }
                                        if (!nextCell) {
                                                if (this.editor.plugins.TableOperations) {
                                                        this.editor.plugins.TableOperations.instance.onButtonPress(this.editor, "TO-row-insert-under");
                                                } else {
                                        if (!nextCell) {
                                                if (this.editor.plugins.TableOperations) {
                                                        this.editor.plugins.TableOperations.instance.onButtonPress(this.editor, "TO-row-insert-under");
                                                } else {
-                                                       nextCell = tableCell.parentNode.parentNode.firstChild.firstChild;
+                                                       nextCell = tablePart.parentNode.rows[0].cells[0];
                                                }
                                        }
                                        if (nextCell) {
                                                }
                                        }
                                        if (nextCell) {
index ff586b8..b595b36 100644 (file)
@@ -82,9 +82,11 @@ BlockStyle = HTMLArea.Plugin.extend({
                this.prefixLabelWithClassName = this.pageTSconfiguration.prefixLabelWithClassName;
                this.postfixLabelWithClassName = this.pageTSconfiguration.postfixLabelWithClassName;
                
                this.prefixLabelWithClassName = this.pageTSconfiguration.prefixLabelWithClassName;
                this.postfixLabelWithClassName = this.pageTSconfiguration.postfixLabelWithClassName;
                
-                       /* Registering plugin "About" information */
+               /*
+                * Registering plugin "About" information
+                */
                var pluginInformation = {
                var pluginInformation = {
-                       version         : "1.1",
+                       version         : "1.2",
                        developer       : "Stanislas Rolland",
                        developerUrl    : "http://www.fructifor.ca/",
                        copyrightOwner  : "Stanislas Rolland",
                        developer       : "Stanislas Rolland",
                        developerUrl    : "http://www.fructifor.ca/",
                        copyrightOwner  : "Stanislas Rolland",
@@ -94,7 +96,9 @@ BlockStyle = HTMLArea.Plugin.extend({
                };
                this.registerPluginInformation(pluginInformation);
                
                };
                this.registerPluginInformation(pluginInformation);
                
-                       /* Registering the dropdown list */
+               /*
+                * Registeringthe drop-down list
+                */
                var dropDownId = "BlockStyle";
                var dropDownConfiguration = {
                        id              : dropDownId,
                var dropDownId = "BlockStyle";
                var dropDownConfiguration = {
                        id              : dropDownId,
@@ -142,11 +146,30 @@ BlockStyle = HTMLArea.Plugin.extend({
                        for (var i = classNames.length; --i >= 0;) {
                                if (!HTMLArea.reservedClassNames.test(classNames[i])) {
                                        HTMLArea._removeClass(node, classNames[i]);
                        for (var i = classNames.length; --i >= 0;) {
                                if (!HTMLArea.reservedClassNames.test(classNames[i])) {
                                        HTMLArea._removeClass(node, classNames[i]);
+                                       if (node.nodeName.toLowerCase() === "table" && this.editor.plugins.TableOperations) {
+                                               this.editor.plugins.TableOperations.instance.removeAlternatingClasses(node, classNames[i]);
+                                       }
                                        break;
                                }
                        }
                } else {
                                        break;
                                }
                        }
                } else {
-                       HTMLArea._addClass(node, className);
+                       var nodeName = node.nodeName.toLowerCase();
+                       if (this.tags && this.tags[nodeName]) {
+                               var allowedClasses = this.tags[nodeName].allowedClasses;
+                               if (allowedClasses && allowedClasses.indexOf(className) !== -1) {
+                                       HTMLArea._addClass(node, className);
+                               }
+                       } else if (this.tags && this.tags.all) {
+                               var allowedClasses = this.tags.all.allowedClasses;
+                               if (allowedClasses && allowedClasses.indexOf(className) !== -1) {
+                                       HTMLArea._addClass(node, className);
+                               }
+                       } else {
+                               HTMLArea._addClass(node, className);
+                       }
+                       if (nodeName === "table" && this.editor.plugins.TableOperations) {
+                               this.editor.plugins.TableOperations.instance.reStyleTable(node);
+                       }
                }
        },
        
                }
        },
        
index 5ac68d1..239e550 100644 (file)
@@ -290,7 +290,8 @@ ContextMenu.prototype.getContextMenu = function(target) {
                    case "table":
                        table = target;
                        if(!tbo) break;
                    case "table":
                        table = target;
                        if(!tbo) break;
-                       this.pushOperations(["TO-toggle-borders", "TO-table-prop", "TO-col-split", "TO-col-delete", "TO-col-insert-after", "TO-col-insert-before"], menu, tbo);
+                       this.pushOperations(["TO-col-split", "TO-col-delete", "TO-col-insert-after", "TO-col-insert-before", "TO-col-prop"], menu, tbo);
+                       this.pushOperations(["TO-toggle-borders", "TO-table-restyle", "TO-table-prop"], menu, tbo);
                        break;
                    case "ol":
                    case "ul":
                        break;
                    case "ol":
                    case "ul":
index 2c98d7e..ab7bcfe 100644 (file)
@@ -9,23 +9,25 @@
                        <label index="Cut">Cut</label>
                        <label index="Copy">Copy</label>
                        <label index="Paste">Paste</label>
                        <label index="Cut">Cut</label>
                        <label index="Copy">Copy</label>
                        <label index="Paste">Paste</label>
-                       <label index="Image Properties">_Image Properties...</label>
-                       <label index="Modify Link">_Modify Link...</label>
-                       <label index="Check Link">Chec_k Link...</label>
-                       <label index="Remove Link">_Remove Link...</label>
+                       <label index="Image Properties">_Image Properties</label>
+                       <label index="Modify Link">_Modify Link</label>
+                       <label index="Check Link">Chec_k Link</label>
+                       <label index="Remove Link">_Remove Link</label>
                        <label index="TO-toggle-borders-title">Toggle borders</label>
                        <label index="TO-toggle-borders-title">Toggle borders</label>
-                       <label index="TO-cell-prop-title">C_ell Properties...</label>
+                       <label index="TO-cell-prop-title">C_ell Properties</label>
                        <label index="TO-cell-insert-before-title">Insert cell before</label>
                        <label index="TO-cell-insert-after-title">Insert cell after</label>
                        <label index="TO-cell-delete-title">Delete Cell</label>
                        <label index="TO-cell-split-title">Split Cell</label>
                        <label index="TO-cell-merge-title">Merge Cells</label>
                        <label index="TO-cell-insert-before-title">Insert cell before</label>
                        <label index="TO-cell-insert-after-title">Insert cell after</label>
                        <label index="TO-cell-delete-title">Delete Cell</label>
                        <label index="TO-cell-split-title">Split Cell</label>
                        <label index="TO-cell-merge-title">Merge Cells</label>
-                       <label index="TO-row-prop-title">Ro_w Properties...</label>
+                       <label index="TO-row-prop-title">Ro_w Properties</label>
                        <label index="TO-row-insert-above-title">I_nsert Row Before</label>
                        <label index="TO-row-insert-under-title">In_sert Row After</label>
                        <label index="TO-row-delete-title">_Delete Row</label>
                        <label index="TO-row-split-title">Split Row</label>
                        <label index="TO-row-insert-above-title">I_nsert Row Before</label>
                        <label index="TO-row-insert-under-title">In_sert Row After</label>
                        <label index="TO-row-delete-title">_Delete Row</label>
                        <label index="TO-row-split-title">Split Row</label>
-                       <label index="TO-table-prop-title">_Table Properties...</label>
+                       <label index="TO-table-prop-title">_Table Properties</label>
+                       <label index="TO-table-restyle-title">Re-apply table styles</label>
+                       <label index="TO-col-prop-title">Column Cells Properties</label>
                        <label index="TO-col-insert-before-title">Insert _Column Before</label>
                        <label index="TO-col-insert-after-title">Insert C_olumn After</label>
                        <label index="TO-col-delete-title">De_lete Column</label>
                        <label index="TO-col-insert-before-title">Insert _Column Before</label>
                        <label index="TO-col-insert-after-title">Insert C_olumn After</label>
                        <label index="TO-col-delete-title">De_lete Column</label>
@@ -38,9 +40,9 @@
                        <label index="JustifyCenter-tooltip">Centers the text</label>
                        <label index="JustifyRight-tooltip">Aligns text to the right</label>
                        <label index="JustifyFull-tooltip">Aligns text both to the left and the right</label>
                        <label index="JustifyCenter-tooltip">Centers the text</label>
                        <label index="JustifyRight-tooltip">Aligns text to the right</label>
                        <label index="JustifyFull-tooltip">Aligns text both to the left and the right</label>
-                       <label index="Make link">Make lin_k...</label>
+                       <label index="Make link">Make lin_k</label>
                        <label index="Remove the">Remove the</label>
                        <label index="Remove the">Remove the</label>
-                       <label index="Element">Element...</label>
+                       <label index="Element">Element</label>
                        <label index="Please confirm remove">Please confirm that you want to remove this element:</label>
                        <label index="Remove this node from the document">Remove this node from the document</label>
                        <label index="How did you get here? (Please report!)">How did you get here? (Please report!)</label>
                        <label index="Please confirm remove">Please confirm that you want to remove this element:</label>
                        <label index="Remove this node from the document">Remove this node from the document</label>
                        <label index="How did you get here? (Please report!)">How did you get here? (Please report!)</label>
                        <label index="Link points to:">Link points to:</label>
                        <label index="Unlink the current element">Unlink the current element</label>
                        <label index="TO-toggle-borders-tooltip">Toggle borders</label>
                        <label index="Link points to:">Link points to:</label>
                        <label index="Unlink the current element">Unlink the current element</label>
                        <label index="TO-toggle-borders-tooltip">Toggle borders</label>
-                       <label index="TO-cell-prop-tooltip">Shows the Table Cell Properties dialog</label>
+                       <label index="TO-cell-prop-tooltip">Shows the Table Cell Properties dialogue</label>
                        <label index="TO-cell-insert-before-tooltip">Inserts a new cell before the current one</label>
                        <label index="TO-cell-insert-after-tooltip">Inserts a new cell after the current one</label>
                        <label index="TO-cell-delete-tooltip">Deletes the current cell</label>
                        <label index="TO-cell-split-tooltip">Splits the current cell</label>
                        <label index="TO-cell-merge-tooltip">Merges the selected cells</label>
                        <label index="TO-cell-insert-before-tooltip">Inserts a new cell before the current one</label>
                        <label index="TO-cell-insert-after-tooltip">Inserts a new cell after the current one</label>
                        <label index="TO-cell-delete-tooltip">Deletes the current cell</label>
                        <label index="TO-cell-split-tooltip">Splits the current cell</label>
                        <label index="TO-cell-merge-tooltip">Merges the selected cells</label>
-                       <label index="TO-row-prop-tooltip">Shows the Table Row Properties dialog</label>
+                       <label index="TO-row-prop-tooltip">Shows the Table Row Properties dialogue</label>
                        <label index="TO-row-insert-above-tooltip">Inserts a new row before the current one</label>
                        <label index="TO-row-insert-under-tooltip">Inserts a new row after the current one</label>
                        <label index="TO-row-delete-tooltip">Deletes the current row</label>
                        <label index="TO-row-split-tooltip">Splits the current row</label>
                        <label index="TO-row-insert-above-tooltip">Inserts a new row before the current one</label>
                        <label index="TO-row-insert-under-tooltip">Inserts a new row after the current one</label>
                        <label index="TO-row-delete-tooltip">Deletes the current row</label>
                        <label index="TO-row-split-tooltip">Splits the current row</label>
-                       <label index="TO-table-prop-tooltip">Shows the Table Properties dialog</label>
+                       <label index="TO-table-prop-tooltip">Shows the Table Properties dialogue</label>
+                       <label index="TO-table-restyle-tooltip">Re-applies the odd-even styles on the table</label>
+                       <label index="TO-col-prop-tooltip">Shows the Column Cells Properties dialogue</label>
                        <label index="TO-col-insert-before-tooltip">Inserts a new column before the current one</label>
                        <label index="TO-col-insert-after-tooltip">Inserts a new column after the current one</label>
                        <label index="TO-col-delete-tooltip">Deletes the current column</label>
                        <label index="TO-col-insert-before-tooltip">Inserts a new column before the current one</label>
                        <label index="TO-col-insert-after-tooltip">Inserts a new column after the current one</label>
                        <label index="TO-col-delete-tooltip">Deletes the current column</label>
index bcfe2f7..46dfcf0 100644 (file)
@@ -27,7 +27,7 @@
 /*
  * TYPO3 Color Plugin for TYPO3 htmlArea RTE
  *
 /*
  * TYPO3 Color Plugin for TYPO3 htmlArea RTE
  *
- * TYPO3 SVN ID: $Id: $
+ * TYPO3 SVN ID: $Id: typo3color.js $
  */
 TYPO3Color = HTMLArea.Plugin.extend({
        
  */
 TYPO3Color = HTMLArea.Plugin.extend({
        
@@ -48,7 +48,7 @@ TYPO3Color = HTMLArea.Plugin.extend({
                 * Registering plugin "About" information
                 */
                var pluginInformation = {
                 * Registering plugin "About" information
                 */
                var pluginInformation = {
-                       version         : "1.7",
+                       version         : "2.0",
                        developer       : "Stanislas Rolland",
                        developerUrl    : "http://www.fructifor.ca/",
                        copyrightOwner  : "Stanislas Rolland",
                        developer       : "Stanislas Rolland",
                        developerUrl    : "http://www.fructifor.ca/",
                        copyrightOwner  : "Stanislas Rolland",
@@ -110,33 +110,128 @@ TYPO3Color = HTMLArea.Plugin.extend({
                }
        },
        
                }
        },
        
-       // this function requires the file PopupWin
-       dialogSelectColor : function (buttonId, element, field, opener) {
-               var editor = this.editor;
-               var windowWidth = 470;
-               var windowHeight = 245;
-               
+       dialogSelectColor : function (buttonId, element, field, dialogOpener) {
+               var dimensions = {
+                       width   : 480,
+                       height  : 245
+               };
+               var arguments = {
+                       title           : buttonId + "_title",
+                       buttonId        : buttonId,
+                       element         : element,
+                       field           : field
+               };
                        // buttonId's  "color" and "tag" are not registered but used to interface with the Table Operations and QuickTag plugins
                switch (buttonId) {
                        case "ForeColor"        :
                        case "HiliteColor"      :
                        // buttonId's  "color" and "tag" are not registered but used to interface with the Table Operations and QuickTag plugins
                switch (buttonId) {
                        case "ForeColor"        :
                        case "HiliteColor"      :
-                               var selectColorInitFunctRef = TYPO3Color.selectColorCOInit(this, buttonId);
-                               var setColorFunctRef = TYPO3Color.setColorCO(this);
-                               this.dialog = new PopupWin(this.editor, this.localize(buttonId + "_title"), setColorFunctRef, selectColorInitFunctRef, windowWidth, windowHeight, editor._iframe.contentWindow);
+                               var selectColorWithButtonInitFunctRef = this.makeFunctionReference("selectColorWithButtonInit");
+                               arguments.initialize = selectColorWithButtonInitFunctRef;
+                               this.dialog = this.openDialog(buttonId, "", "setColor", arguments, dimensions);
                                break;
                        case "color"            :
                                break;
                        case "color"            :
-                               var selectColorInitFunctRef = TYPO3Color.selectColorColorInit(this, buttonId, field);
-                               var setColorFunctRef = TYPO3Color.setColorColor(this, element, field);
-                               this.dialog = new PopupWin(this.editor, this.localize(buttonId + "_title"), setColorFunctRef, selectColorInitFunctRef, windowWidth, windowHeight, opener);
+                               var selectColorCodeInitFunctRef = this.makeFunctionReference("selectColorCodeInit");
+                               arguments.initialize = selectColorCodeInitFunctRef;
+                               this.dialog = this.openDialog(buttonId, "", "setColor", arguments, dimensions, null, dialogOpener);
                                break;
                        case "tag"              :
                                break;
                        case "tag"              :
-                               var selectColorInitFunctRef = TYPO3Color.selectColorTagInit(this, buttonId);
-                               var setColorFunctRef = TYPO3Color.setColorTag(this, field);
-                               this.dialog = new PopupWin(this.editor, this.localize("color_title"), setColorFunctRef, selectColorInitFunctRef, windowWidth, windowHeight, opener);
+                               var selectColorCodeInitFunctRef = this.makeFunctionReference("selectColorCodeInit");
+                               arguments.initialize = selectColorCodeInitFunctRef;
+                               arguments.title = "color_title";
+                               this.dialog = this.openDialog(buttonId, "", "setColorInTag", arguments, dimensions, null, dialogOpener);
+               }
+       },
+       
+       /*
+        * Initialize the forecolor and the hilitecolor select color dialogues
+        */
+       selectColorWithButtonInit : function(dialog) {
+               var editor = dialog.editor;
+               var doc = editor._doc;
+               var buttonId = dialog.arguments.buttonId;
+               dialog.content.innerHTML = this.renderPopupSelectColor(buttonId, dialog, dialog.arguments.title);
+               var colorTable = dialog.document.getElementById("colorTable");
+               colorTable.onclick = function(e) {
+                       if(!e) var e = dialog.dialogWindow.event;
+                       var target = e.target ? e.target : e.srcElement;
+                       if (target.nodeType == 3) target = target.parentNode;
+                       dialog.document.getElementById(buttonId).value = target.bgColor ? target.bgColor : "";
+                       dialog.callFormInputHandler();
+                       return false;
+               };
+               var colorUnset = dialog.document.getElementById("colorUnset");
+               colorUnset.onclick = function(e) {
+                       dialog.document.getElementById(buttonId).value="";
+                       dialog.callFormInputHandler();
+                       return false;
+               };
+               try {
+                       with (dialog.document.getElementById(buttonId+"Current").style) {
+                               switch (buttonId) {
+                                       case "ForeColor":
+                                               backgroundColor = HTMLArea._makeColor(doc.queryCommandValue("ForeColor"));
+                                               break;
+                                       case "HiliteColor":
+                                               backgroundColor = HTMLArea._makeColor(doc.queryCommandValue(((HTMLArea.is_ie || HTMLArea.is_safari) ? "BackColor" : "HiliteColor")));
+                                               if (/transparent/i.test(backgroundColor)) {
+                                                               // Mozilla
+                                                       backgroundColor = HTMLArea._makeColor(doc.queryCommandValue("BackColor"));
+                                               }
+                                               break;
+                               }
+                       }
+               } catch (e) { }
+       },
+       
+       /*
+        * Set the color and close the ForeColor and the HiliteColor select color dialogues
+        */
+       setColor : function(dialog, params) {
+               this.processStyle(dialog, params, dialog.arguments.element, dialog.arguments.field);
+               dialog.close();
+       },
+       
+       /*
+        * Initialize the case=color select color dialogue
+        * This case is used by the Table Operations and QuickTag plugins
+        */
+       selectColorCodeInit : function(dialog) {
+               var buttonId = dialog.arguments.buttonId;
+               var field = dialog.arguments.field;
+               dialog.content.innerHTML = this.renderPopupSelectColor(buttonId, dialog, this.localize(dialog.arguments.title));
+               var colorTable = dialog.document.getElementById("colorTable");
+               colorTable.onclick = function(e) {
+                       if(!e) var e = dialog.dialogWindow.event;
+                       var target = e.target ? e.target : e.srcElement;
+                       if (target.nodeType == 3) target = target.parentNode;
+                       dialog.document.getElementById(buttonId).value = target.bgColor;
+                       dialog.callFormInputHandler();
+                       return false;
+               };
+               var colorUnset = dialog.document.getElementById("colorUnset");
+               colorUnset.onclick = function(e) {
+                       dialog.document.getElementById(buttonId).value = "";
+                       dialog.callFormInputHandler();
+                       return false;
+               };
+               if (buttonId === "color") {
+                       dialog.document.getElementById(buttonId+"Current").style.backgroundColor = field.value;
+               } else if (buttonId === "tag"){
+                       dialog.document.getElementById(buttonId+"Current").style.backgroundColor = "";
                }
        },
        
                }
        },
        
-       // Applies the style found in "params" to the given element.
+       /*
+       * Sets the color
+       */
+       setColorInTag : function(dialog, params) {
+               dialog.arguments.field.insertColor(params.tag);
+               dialog.close();
+       },
+       
+       /*
+       * Applies the style found in "params" to the given element
+       */
        processStyle : function (dialog, params, element, field) {
                var editor = this.editor;
                for (var i in params) {
        processStyle : function (dialog, params, element, field) {
                var editor = this.editor;
                for (var i in params) {
@@ -186,9 +281,9 @@ TYPO3Color = HTMLArea.Plugin.extend({
                sz += '<input type="hidden" name="' + sID + '" id="' + sID + '" value="" />';
                sz += '<table style="width:100%;"><tr><td style="vertical-align: middle;"><span style="margin-left: 5px; height: 1em;" class="dialog buttonColor" ';
                sz += '         onMouseover="className += \' buttonColor-hilite\';" ';
                sz += '<input type="hidden" name="' + sID + '" id="' + sID + '" value="" />';
                sz += '<table style="width:100%;"><tr><td style="vertical-align: middle;"><span style="margin-left: 5px; height: 1em;" class="dialog buttonColor" ';
                sz += '         onMouseover="className += \' buttonColor-hilite\';" ';
-               sz += '         onMouseout="className = \'buttonColor\';"> ';
-               sz += ' <span id="' + szID + '" class="chooser"></span> ';
-               sz += ' <span id="colorUnset" class="nocolor" title="' + this.localize("no_color") + '" ';
+               sz += '         onMouseout="className = \'buttonColor\';">';
+               sz += ' <span id="' + szID + '" class="chooser">&nbsp;</span>';
+               sz += ' <span id="colorUnset" class="nocolor" title="' + "no_color" + '" ';
                sz += '         onMouseover="className += \' nocolor-hilite\';" ';
                sz += '         onMouseout="className = \'nocolor\';"';
                sz += ' >&#x00d7;</span></span></td><td>';
                sz += '         onMouseover="className += \' nocolor-hilite\';" ';
                sz += '         onMouseout="className = \'nocolor\';"';
                sz += ' >&#x00d7;</span></span></td><td>';
@@ -233,138 +328,3 @@ TYPO3Color = HTMLArea.Plugin.extend({
        }
 });
 
        }
 });
 
-/*
- * Initialize the forecolor and the hilitecolor select color dialogs
- */
-TYPO3Color.selectColorCOInit = function(instance, buttonId) {
-       return (function(dialog) {
-               var editor = dialog.editor;
-               var doc = editor._doc;
-               dialog.content.innerHTML = instance.renderPopupSelectColor(buttonId, dialog, instance.localize(buttonId + "_title"));
-               var colorTable = dialog.doc.getElementById("colorTable");
-               colorTable.onclick = function(e) {
-                       if(!e) var e = dialog.dialogWindow.event;
-                       var targ = e.target ? e.target : e.srcElement;
-                       if (targ.nodeType == 3) targ = targ.parentNode;
-                       dialog.doc.getElementById(buttonId).value = targ.bgColor ? targ.bgColor : "";
-                       dialog.callHandler();
-                       return false;
-               };
-               var colorUnset = dialog.doc.getElementById("colorUnset");
-               colorUnset.onclick = function(e) {
-                       dialog.doc.getElementById(buttonId).value="";
-                       dialog.callHandler();
-                       return false;
-               };
-               try {
-                       with (dialog.doc.getElementById(buttonId+"Current").style) {
-                               switch (buttonId) {
-                                       case "ForeColor":
-                                               backgroundColor = HTMLArea._makeColor(doc.queryCommandValue("ForeColor"));
-                                               break;
-                                       case "HiliteColor":
-                                               backgroundColor = HTMLArea._makeColor(doc.queryCommandValue(((HTMLArea.is_ie || HTMLArea.is_safari) ? "BackColor" : "HiliteColor")));
-                                               if (/transparent/i.test(backgroundColor)) {
-                                                               // Mozilla
-                                                       backgroundColor = HTMLArea._makeColor(doc.queryCommandValue("BackColor"));
-                                               }
-                                               break;
-                               }
-                       }
-               } catch (e) { }
-               dialog.showAtElement();
-       });
-};
-
-/*
- * Set the color and close the ForeColor and the HiliteColor select color dialogs
- */
-TYPO3Color.setColorCO = function(instance) {
-       return (function(dialog,params) {
-               var editor = dialog.editor;
-               instance.processStyle(dialog, params, "", "");
-               dialog.releaseEvents();
-               editor.focusEditor();
-               editor.updateToolbar();
-               dialog.close();
-       });
-};
-
-/*
- * Initialize the case=color select color dialog
- * This case is used by the Table Operations plugin
- */
-TYPO3Color.selectColorColorInit = function(instance,buttonId,field) {
-       return (function(dialog) {
-               dialog.content.innerHTML = instance.renderPopupSelectColor(buttonId, dialog, instance.localize(buttonId + "_title"));
-               var colorTable = dialog.doc.getElementById("colorTable");
-               colorTable.onclick = function(e) {
-                       if(!e) var e = dialog.dialogWindow.event;
-                       var targ = e.target ? e.target : e.srcElement;
-                       if (targ.nodeType == 3) targ = targ.parentNode;
-                       dialog.doc.getElementById(buttonId).value = targ.bgColor;
-                       dialog.callHandler();
-                       return false;
-               };
-               var colorUnset = dialog.doc.getElementById("colorUnset");
-               colorUnset.onclick = function(e) {
-                       dialog.doc.getElementById(buttonId).value = "";
-                       dialog.callHandler();
-                       return false;
-               };
-               dialog.doc.getElementById(buttonId+"Current").style.backgroundColor = field.value;
-               dialog.showAtElement();
-
-       });
-};
-
-/*
- * Set the color and close the case=color select color dialog
- */
-TYPO3Color.setColorColor = function(instance,element,field) {
-       return (function(dialog,params) {
-               instance.processStyle(dialog, params, element, field);
-               dialog.releaseEvents();
-               dialog.close();
-       });
-};
-
-/*
- * Initialize the case=tag select color dialog
- * This is used by the QuickTag plugin
- */
-TYPO3Color.selectColorTagInit = function(instance, buttonId) {
-       return (function(dialog) {
-               instance.dialog = dialog;
-               dialog.content.innerHTML = instance.renderPopupSelectColor(buttonId, dialog, instance.localize("color_title"));
-               var colorTable = dialog.doc.getElementById("colorTable");
-               colorTable.onclick = function(e) {
-                       if(!e) var e = dialog.dialogWindow.event;
-                       var targ = e.target ? e.target : e.srcElement;
-                       if (targ.nodeType == 3) targ = targ.parentNode;
-                       dialog.doc.getElementById(buttonId).value = targ.bgColor;
-                       dialog.callHandler();
-                       return false;
-               };
-               var colorUnset = dialog.doc.getElementById("colorUnset");
-               colorUnset.onclick = function(e) {
-                       dialog.doc.getElementById(buttonId).value = "";
-                       dialog.callHandler();
-                       return false;
-               };
-               dialog.doc.getElementById(buttonId+"Current").style.backgroundColor = "";
-               dialog.showAtElement();
-       });
-};
-
-/*
- * Set the color and close the case=color select color dialog
- */
-TYPO3Color.setColorTag = function(instance,field) {
-       return (function(dialog,params) {
-               dialog.releaseEvents();
-               field.insertColor(params["tag"]);
-               dialog.close();
-       });
-};
-
index 14dfae2..fd13be2 100644 (file)
@@ -8,17 +8,19 @@
                <languageKey index="default" type="array">
                        <label index="Not set">Not set</label>
                        <label index="None">None</label>
                <languageKey index="default" type="array">
                        <label index="Not set">Not set</label>
                        <label index="None">None</label>
-                       <label index="CSS Style">CSS Style</label>
-                       <label index="Class:">Class:</label>
-                       <label index="Class selector">CSS class selector</label>
-                       <label index="Table class:">Table:</label>
-                       <label index="Table class selector">Class of the table</label>
+                       <label index="Size and Headers">Size and Headers</label>
+                       <label index="Headers">Headers</label>
+                       <label index="CSS Style">Style</label>
+                       <label index="Class:">Classes:</label>
+                       <label index="Class selector">Classes</label>
+                       <label index="Table class:">Table classes:</label>
+                       <label index="Table class selector">Classes of the table</label>
                        <label index="Table body class:">Body:</label>
                        <label index="Table body class:">Body:</label>
-                       <label index="Table body class selector">Class of the table body</label>
+                       <label index="Table body class selector">Classes of the table body</label>
                        <label index="Table header class:">Header:</label>
                        <label index="Table header class:">Header:</label>
-                       <label index="Table header class selector">Class of the table header</label>
+                       <label index="Table header class selector">Classes of the table header</label>
                        <label index="Table footer class:">Footer:</label>
                        <label index="Table footer class:">Footer:</label>
-                       <label index="Table footer class selector">Class of the table footer</label>
+                       <label index="Table footer class selector">Classes of the table footer</label>
                        <label index="Default">Default</label>
                        <label index="Undefined">Undefined</label>
                        <label index="Alignment">Alignment</label>
                        <label index="Default">Default</label>
                        <label index="Undefined">Undefined</label>
                        <label index="Alignment">Alignment</label>
@@ -53,7 +55,7 @@
                        <label index="Cell Properties">Cell Properties</label>
                        <label index="Cell Type and Scope">Cell Type and Scope</label>
                        <label index="Type of cell">Type of cell:</label>
                        <label index="Cell Properties">Cell Properties</label>
                        <label index="Cell Type and Scope">Cell Type and Scope</label>
                        <label index="Type of cell">Type of cell:</label>
-                       <label index="Normal">Normal cell</label>
+                       <label index="Normal">Data cell</label>
                        <label index="Header">Header cell</label>
                        <label index="Specifies the type of cell">Specifies the type of cell</label>
                        <label index="Scope">Scope:</label>
                        <label index="Header">Header cell</label>
                        <label index="Specifies the type of cell">Specifies the type of cell</label>
                        <label index="Scope">Scope:</label>
                        <label index="Space between adjacent cells">Space between adjacent cells</label>
                        <label index="Summary:">Summary:</label>
                        <label index="Summary of the table purpose and structure">Summary of the table's purpose and structure</label>
                        <label index="Space between adjacent cells">Space between adjacent cells</label>
                        <label index="Summary:">Summary:</label>
                        <label index="Summary of the table purpose and structure">Summary of the table's purpose and structure</label>
+                       <label index="captionOrSummary-required">Please enter at least one of caption or summary</label>
+                       <label index="caption-required">Please enter a caption</label>
+                       <label index="summary-required">Please enter a summary</label>
                        <label index="TO-cell-delete">Delete cell</label>
                        <label index="TO-cell-insert-after">Insert cell after</label>
                        <label index="TO-cell-insert-before">Insert cell before</label>
                        <label index="TO-cell-merge">Merge cells</label>
                        <label index="TO-cell-prop">Cell properties</label>
                        <label index="TO-cell-split">Split cell</label>
                        <label index="TO-cell-delete">Delete cell</label>
                        <label index="TO-cell-insert-after">Insert cell after</label>
                        <label index="TO-cell-insert-before">Insert cell before</label>
                        <label index="TO-cell-merge">Merge cells</label>
                        <label index="TO-cell-prop">Cell properties</label>
                        <label index="TO-cell-split">Split cell</label>
+                       <label index="TO-col-prop">Column properties</label>
                        <label index="TO-col-delete">Delete column</label>
                        <label index="TO-col-insert-after">Insert column after</label>
                        <label index="TO-col-insert-before">Insert column before</label>
                        <label index="TO-col-delete">Delete column</label>
                        <label index="TO-col-insert-after">Insert column after</label>
                        <label index="TO-col-insert-before">Insert column before</label>
                        <label index="TO-row-prop">Row properties</label>
                        <label index="TO-row-split">Split row</label>
                        <label index="TO-table-prop">Table properties</label>
                        <label index="TO-row-prop">Row properties</label>
                        <label index="TO-row-split">Split row</label>
                        <label index="TO-table-prop">Table properties</label>
+                       <label index="TO-table-restyle">Re-apply table styles</label>
                        <label index="TO-toggle-borders">Toggle borders</label>
                        <label index="Table Properties">Table Properties</label>
                        <label index="Text alignment:">Text alignment:</label>
                        <label index="TO-toggle-borders">Toggle borders</label>
                        <label index="Table Properties">Table Properties</label>
                        <label index="Text alignment:">Text alignment:</label>
                        <label index="percent">percent</label>
                        <label index="pixels">pixels</label>
                        <label index="em">em</label>
                        <label index="percent">percent</label>
                        <label index="pixels">pixels</label>
                        <label index="em">em</label>
+                       <label index="Headers:">Headers:</label>
+                       <label index="Table headers">Table headers</label>
+                       <label index="No header cells">No header cells</label>
+                       <label index="Header cells on top">Header cells on top</label>
+                       <label index="Header cells on left">Header cells on left</label>
+                       <label index="Header cells on top and left">Header cells on top and left</label>
+                       <label index="Make cells header cells">Make all row cells header cells</label>
+                       <label index="Make cells data cells">Make all row cells data cells</label>
+                       <label index="Header for column">Header cell for column</label>
+                       <label index="Header for row">Header cell for row</label>
+                       <label index="Header for row group">Header cell for row group</label>
+                       <label index="Column Properties">Column Cells Properties</label>
+                       <label index="Type of cells">Type of cells</label>
+                       <label index="Type of cells of the column">Type of cells of the column:</label>
+                       <label index="Specifies the type of cells">Specifies the type of cells of the column</label>
+                       <label index="Data cells">Data cells</label>
+                       <label index="Headers for rows">Headers for rows</label>
+                       <label index="Headers for row groups">Headers for row groups</label>
+                       <label index="Technische Universitat Ilmenau">Technische Universit├Ąt Ilmenau</label>
                </languageKey>
        </data>
        <orig_hash type="array">
                </languageKey>
        </data>
        <orig_hash type="array">
index 14b908c..59dd917 100644 (file)
@@ -44,18 +44,42 @@ TableOperations = HTMLArea.Plugin.extend({
         */
        configurePlugin : function (editor) {
                
         */
        configurePlugin : function (editor) {
                
+               this.classesUrl = this.editorConfiguration.classesUrl;
                this.buttonsConfiguration = this.editorConfiguration.buttons;
                this.buttonsConfiguration = this.editorConfiguration.buttons;
+               this.floatLeft = "float-left";
+               this.floatRight = "float-right";
+               this.floatDefault = "not set";
+               this.useHeaderClass = "thead";
+               if (this.buttonsConfiguration.table && this.buttonsConfiguration.table.properties) {
+                       if (this.buttonsConfiguration.table.properties.float) {
+                               var floatConfiguration = this.buttonsConfiguration.table.properties.float;
+                               this.floatLeft = (floatConfiguration.left && floatConfiguration.left.useClass) ? floatConfiguration.left.useClass : "float-left";
+                               this.floatRight = (floatConfiguration.right && floatConfiguration.right.useClass) ? floatConfiguration.right.useClass : "float-right";
+                               this.floatDefault = (floatConfiguration.defaultValue) ?  floatConfiguration.defaultValue : "not set";
+                       }
+                       if (this.buttonsConfiguration.table.properties.headers && this.buttonsConfiguration.table.properties.headers.both 
+                                       && this.buttonsConfiguration.table.properties.headers.both.useHeaderClass) {
+                               this.useHeaderClass = this.buttonsConfiguration.table.properties.headers.both.useHeaderClass;
+                       }
+               }
+               
+               if (this.buttonsConfiguration.blockstyle) {
+                       this.tags = this.editorConfiguration.buttons.blockstyle.tags;
+               }
+               
+               this.tableParts = ["tfoot", "thead", "tbody"];
+               this.convertAlignment = { "not set" : "none", "left" : "JustifyLeft", "center" : "JustifyCenter", "right" : "JustifyRight", "justify" : "JustifyFull" };
                
                /*
                 * Registering plugin "About" information
                 */
                var pluginInformation = {
                
                /*
                 * Registering plugin "About" information
                 */
                var pluginInformation = {
-                       version         : "3.7",
+                       version         : "4.0",
                        developer       : "Mihai Bazon & Stanislas Rolland",
                        developerUrl    : "http://www.fructifor.ca/",
                        copyrightOwner  : "Mihai Bazon & Stanislas Rolland",
                        developer       : "Mihai Bazon & Stanislas Rolland",
                        developerUrl    : "http://www.fructifor.ca/",
                        copyrightOwner  : "Mihai Bazon & Stanislas Rolland",
-                       sponsor         : "Zapatec Inc. & Fructifor Inc.",
-                       sponsorUrl      : "http://www.fructifor.ca/",
+                       sponsor         : this.localize("Technische Universitat Ilmenau") + " & Zapatec Inc.",
+                       sponsorUrl      : "http://www.tu-ilmenau.de/",
                        license         : "GPL"
                };
                this.registerPluginInformation(pluginInformation);
                        license         : "GPL"
                };
                this.registerPluginInformation(pluginInformation);
@@ -89,11 +113,13 @@ TableOperations = HTMLArea.Plugin.extend({
                ["InsertTable",         null,                           "table"],
                ["toggle-borders",      null,                           "toggleborders"],
                ["table-prop",          "table",                        "tableproperties"],
                ["InsertTable",         null,                           "table"],
                ["toggle-borders",      null,                           "toggleborders"],
                ["table-prop",          "table",                        "tableproperties"],
+               ["table-restyle",       "table",                        "tablerestyle"],
                ["row-prop",            "tr",                           "rowproperties"],
                ["row-insert-above",    "tr",                           "rowinsertabove"],
                ["row-insert-under",    "tr",                           "rowinsertunder"],
                ["row-delete",          "tr",                           "rowdelete"],
                ["row-split",           "td,th[rowSpan!=1]",            "rowsplit"],
                ["row-prop",            "tr",                           "rowproperties"],
                ["row-insert-above",    "tr",                           "rowinsertabove"],
                ["row-insert-under",    "tr",                           "rowinsertunder"],
                ["row-delete",          "tr",                           "rowdelete"],
                ["row-split",           "td,th[rowSpan!=1]",            "rowsplit"],
+               ["col-prop",            "td,th",                        "columnproperties"],
                ["col-insert-before",   "td,th",                        "columninsertbefore"],
                ["col-insert-after",    "td,th",                        "columninsertafter"],
                ["col-delete",          "td,th",                        "columndelete"],
                ["col-insert-before",   "td,th",                        "columninsertbefore"],
                ["col-insert-after",    "td,th",                        "columninsertafter"],
                ["col-delete",          "td,th",                        "columndelete"],
@@ -106,21 +132,18 @@ TableOperations = HTMLArea.Plugin.extend({
                ["cell-split",          "td,th[colSpan!=1,rowSpan!=1]", "cellsplit"]
        ],
        
                ["cell-split",          "td,th[colSpan!=1,rowSpan!=1]", "cellsplit"]
        ],
        
-       /************************
-        * UTILITIES
-        ************************/
        /*
        /*
-        * Retrieve the closest element having the specified tagName in the list of
+        * Retrieve the closest element having the specified nodeName in the list of
         * ancestors of the current selection/caret.
         */
         * ancestors of the current selection/caret.
         */
-       getClosest : function (tagName) {
+       getClosest : function (nodeName) {
                var editor = this.editor;
                var ancestors = editor.getAllAncestors();
                var ret = null;
                var editor = this.editor;
                var ancestors = editor.getAllAncestors();
                var ret = null;
-               tagName = ("" + tagName).toLowerCase();
+               nodeName = ("" + nodeName).toLowerCase();
                for (var i=0; i < ancestors.length; ++i) {
                        var el = ancestors[i];
                for (var i=0; i < ancestors.length; ++i) {
                        var el = ancestors[i];
-                       if (el.tagName.toLowerCase() == tagName) {
+                       if (el.nodeName.toLowerCase() == nodeName) {
                                ret = el;
                                break;
                        }
                                ret = el;
                                break;
                        }
@@ -129,21 +152,209 @@ TableOperations = HTMLArea.Plugin.extend({
        },
        
        /*
        },
        
        /*
-        * Open the table properties dialog.
+        * Open the table properties dialogue
         */
         */
-       dialogTableProperties : function () {
-                       // retrieve existing values
-               var table = this.getClosest("table");
-               var tablePropertiesInitFunctRef = TableOperations.tablePropertiesInit(table);
-               var tablePropertiesUpdateFunctRef = TableOperations.tablePropertiesUpdate(table);
-               var dialog = new PopupWin(this.editor, this.localize("Table Properties"), tablePropertiesUpdateFunctRef, tablePropertiesInitFunctRef, 570, 600);
+       dialogTableProperties : function (buttonId) {
+               var tablePropertiesInitFunctRef = this.makeFunctionReference("tablePropertiesInit");
+               var insert = (buttonId === "InsertTable");
+               var arguments = {
+                       title           : (insert ? "Insert Table" : "Table Properties"),
+                       initialize      : tablePropertiesInitFunctRef,
+                       element         : (insert ? null : this.getClosest("table"))
+               };
+               var dimensions = {
+                       width   : 820,
+                       height  : insert ? 600 : 630
+               };
+               this.dialog = this.openDialog((insert ? "InsertTable" : "table-prop"), "", "tablePropertiesUpdate", arguments, dimensions);
+       },
+       
+       /*
+        * Initialize the table insertion or table properties dialog
+        */
+       tablePropertiesInit : function(dialog) {
+               var doc = dialog.document;
+               var content = dialog.content;
+               var table = dialog.arguments.element;
+               this.removedFieldsets = this.buttonsConfiguration[table?"tableproperties":"table"].removeFieldsets ? this.buttonsConfiguration[table?"tableproperties":"table"].removeFieldsets : "";
+               this.properties = this.buttonsConfiguration.table.properties;
+               this.removedProperties = (this.properties && this.properties.removed) ? this.properties.removed : "";
+               TableOperations.buildTitle(doc, content, dialog.arguments.title);
+               TableOperations.insertSpace(doc, content);
+               if (this.removedFieldsets.indexOf("description") == -1) {
+                       TableOperations.buildDescriptionFieldset(doc, table, content, "floating");
+               }
+               if (this.removedFieldsets.indexOf("spacing") == -1) TableOperations.buildSpacingFieldset(doc, table, content);
+               TableOperations.insertSpace(doc, content);
+               this.buildSizeAndHeadersFieldset(doc, table, content, "floating");
+               if (this.removedFieldsets.indexOf("style") == -1 && dialog.editor.config.customSelects.BlockStyle) {
+                       var blockStyle = dialog.editor.plugins.BlockStyle.instance;
+                       if (blockStyle && blockStyle.cssLoaded) {
+                               TableOperations.buildStylingFieldset(doc, this.editor, table, content);
+                               TableOperations.insertSpace(doc, content);
+                       }
+               }
+               if (this.removedFieldsets.indexOf("layout") == -1) this.buildLayoutFieldset(doc, table, content, "floating");
+               if (this.removedFieldsets.indexOf("alignment") == -1) this.buildAlignmentFieldset(doc, table, content);
+               TableOperations.insertSpace(doc, content);
+               if (this.removedFieldsets.indexOf("borders") == -1) this.buildBordersFieldset(dialog.dialogWindow, doc, dialog.editor, table, content);
+               if (this.removedFieldsets.indexOf("color") == -1) TableOperations.buildColorsFieldset(dialog.dialogWindow, doc, dialog.editor, table, content);
+               dialog.addButtons("ok", "cancel");
        },
        
        /*
        },
        
        /*
-        * Open the row/cell properties dialog.
-        * This function requires the file PopupWin to be loaded.
+        * Insert the table or update the table properties and close the dialogue
         */
         */
-       dialogRowCellProperties : function (cell) {
+       tablePropertiesUpdate : function(dialog, params) {
+               if (this.buttonsConfiguration.table.properties && this.buttonsConfiguration.table.properties.required) {
+                       if (this.buttonsConfiguration.table.properties.required.indexOf("captionOrSummary") != -1) {
+                               if (!/\S/.test(params.f_caption) && !/\S/.test(params.f_summary)) {
+                                       dialog.dialogWindow.alert(this.localize("captionOrSummary" + "-required"));
+                                       var el = dialog.document.getElementById("f_caption");
+                                       el.focus();
+                                       return false;
+                               }
+                       } else {
+                               var required = { "f_caption": "caption", "f_summary": "summary" };
+                               for (var i in required) {
+                                       if (required.hasOwnProperty(i)) {
+                                               var el = dialog.document.getElementById(i);
+                                               if (!el.value && this.buttonsConfiguration.table.properties.required.indexOf(required[i]) != -1) {
+                                                       dialog.dialogWindow.alert(this.localize(required[i] + "-required"));
+                                                       el.focus();
+                                                       return false;
+                                               }
+                                       }
+                               }
+                       }
+               }
+               var doc = dialog.editor._doc;
+               if (dialog.buttonId === "InsertTable") {
+                       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) {
+                               if (required.hasOwnProperty(i)) {
+                                       var el = dialog.document.getElementById(i);
+                                       if (!el.value) {
+                                               dialog.dialogWindow.alert(this.localize(required[i]));
+                                               el.focus();
+                                               return false;
+                                       }
+                               }
+                       }
+                       var table = doc.createElement("table");
+                       var tbody = doc.createElement("tbody");
+                       table.appendChild(tbody);
+                       for (var i = params.f_rows; --i >= 0;) {
+                               var tr = doc.createElement("tr");
+                               tbody.appendChild(tr);
+                               for (var j = params.f_cols; --j >= 0;) {
+                                       var td = doc.createElement("td");
+                                       tr.appendChild(td);
+                               }
+                       }
+               } else {
+                       var table = dialog.arguments.element;
+               }
+               table = this.setHeaders(table, params);
+               table = this.processStyle(table, params);
+               table.removeAttribute("border");
+               for (var i in params) {
+                       if (params.hasOwnProperty(i)) {
+                               var val = params[i];
+                               switch (i) {
+                                   case "f_caption":
+                                       if (/\S/.test(val)) {
+                                               // contains non white-space characters
+                                               var caption = table.getElementsByTagName("caption");
+                                               if (caption) {
+                                                       caption = caption[0];
+                                               }
+                                               if (!caption) {
+                                                       var caption = doc.createElement("caption");
+                                                       table.appendChild(caption);
+                                               }
+                                               caption.innerHTML = val;
+                                       } else {
+                                               // delete the caption if found
+                                               if (table.caption) table.deleteCaption();
+                                       }
+                                       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_frames":
+                                       table.frame = (val != "not set") ? val : "";
+                                       break;
+                                   case "f_rules":
+                                       if (val != "not set") table.rules = val;
+                                               else table.removeAttribute("rules");
+                                       break;
+                                   case "f_st_float":
+                                       switch (val) {
+                                           case "not set":
+                                               HTMLArea._removeClass(table, this.floatRight);
+                                               HTMLArea._removeClass(table, this.floatLeft);
+                                               break;
+                                           case "right":
+                                               HTMLArea._removeClass(table, this.floatLeft);
+                                               HTMLArea._addClass(table, this.floatRight);
+                                               break;
+                                           case "left":
+                                               HTMLArea._removeClass(table, this.floatRight);
+                                               HTMLArea._addClass(table, this.floatLeft);
+                                               break;
+                                       }
+                                       break;
+                                   case "f_st_textAlign":
+                                       if (this.editor.plugins.BlockElements) {
+                                               this.editor.plugins.BlockElements.instance.toggleAlignmentClass(table, this.convertAlignment[val]);
+                                               table.style.textAlign = "";
+                                       }
+                                       break;
+                                   case "f_class":
+                                   case "f_class_tbody":
+                                   case "f_class_thead":
+                                   case "f_class_tfoot":
+                                       var tpart = table;
+                                       if (i.length > 7) tpart = table.getElementsByTagName(i.substring(8,13))[0];
+                                       if (tpart) {
+                                               this.editor.plugins.BlockStyle.instance.applyClassChange(tpart, val);
+                                       }
+                                       break;
+                               }
+                       }
+               }
+               if (dialog.buttonId === "InsertTable") {
+                       this.editor.insertNodeAtSelection(table);
+                       if (HTMLArea.is_gecko) {
+                               this.editor.selectNodeContents(table.rows[0].cells[0], true);
+                       }
+                       if (this.buttonsConfiguration.toggleborders && this.buttonsConfiguration.toggleborders.setOnTableCreation) {
+                               this.toggleBorders(true);
+                       } else if (HTMLArea.is_gecko && !HTMLArea.is_safari && !HTMLArea.is_opera) {
+                                       // otherwise the cells are 2 pixels high..
+                               this.editor.setMode("wysiwyg");
+                       }
+               }
+               dialog.close();
+       },
+       
+       /*
+        * Open the row/column/cell properties dialogue
+        */
+       dialogRowCellProperties : function (cell, column) {
                        // retrieve existing values
                if (cell) {
                        var element = this.getClosest("td");
                        // retrieve existing values
                if (cell) {
                        var element = this.getClosest("td");
@@ -151,11 +362,119 @@ TableOperations = HTMLArea.Plugin.extend({
                } else {
                        var element = this.getClosest("tr");
                }
                } else {
                        var element = this.getClosest("tr");
                }
-               if(element) {
-                       var rowCellPropertiesInitFunctRef = TableOperations.rowCellPropertiesInit(element, cell);
-                       var rowCellPropertiesUpdateFunctRef = TableOperations.rowCellPropertiesUpdate(element);
-                       var dialog = new PopupWin(this.editor, this.localize(cell ? "Cell Properties" : "Row Properties"), rowCellPropertiesUpdateFunctRef, rowCellPropertiesInitFunctRef, 700, 425);
+               if (element) {
+                       var rowCellPropertiesInitFunctRef = this.makeFunctionReference("rowCellPropertiesInit");
+                       var arguments = {
+                               title           : (cell ? (column ? "Column Properties" : "Cell Properties") : "Row Properties"),
+                               initialize      : rowCellPropertiesInitFunctRef,
+                               element         : element,
+                               cell            : cell,
+                               column          : column
+                       };
+                       this.dialog = this.openDialog(cell ? (column ? "col-prop" : "cell-prop") :"row-prop", "", "rowCellPropertiesUpdate", arguments, { width : 830, height : 425 });
+               }
+       },
+       
+       /*
+        * Initialize the row/column/cell properties dialogue
+        */
+       rowCellPropertiesInit : function(dialog) {
+               var doc = dialog.document;
+               var content = dialog.content;
+               var element = dialog.arguments.element;
+               var cell = dialog.arguments.cell;
+               var column = dialog.arguments.column;
+               this.removedFieldsets = this.buttonsConfiguration[cell?(column?"columnproperties":"cellproperties"):"rowproperties"].removeFieldsets ? this.buttonsConfiguration[cell?(column?"columnproperties":"cellproperties"):"rowproperties"].removeFieldsets : "";
+               this.properties = this.buttonsConfiguration[(cell ||column)?"cellproperties":"rowproperties"].properties;
+               this.removedProperties = (this.properties && this.properties.removed) ? this.properties.removed : "";
+               TableOperations.buildTitle(doc, content, (cell ? (column ? "Column Properties" : "Cell Properties") : "Row Properties"));
+               TableOperations.insertSpace(doc, content);
+               if (column) {
+                       if (this.removedFieldsets.indexOf("columntype") == -1) TableOperations.buildCellTypeFieldset(doc, dialog.editor, element, content, true);
+               } else if (cell) {
+                       if (this.removedFieldsets.indexOf("celltype") == -1) TableOperations.buildCellTypeFieldset(doc, dialog.editor, element, content, false);
+               } else {
+                       if (this.removedFieldsets.indexOf("rowgroup") == -1) TableOperations.buildRowGroupFieldset(dialog.dialogWindow, doc, dialog.editor, element, content);
+               }
+               if (this.removedFieldsets.indexOf("style") == -1 && this.editor.config.customSelects.BlockStyle) {
+                       var blockStyle = this.editor.plugins.BlockStyle.instance;
+                       if (blockStyle && blockStyle.cssLoaded) {
+                               TableOperations.buildStylingFieldset(doc, this.editor, element, content);
+                               TableOperations.insertSpace(doc, content);
+                       } else {
+                               TableOperations.insertSpace(doc, content);
+                       }
+               } else {
+                       TableOperations.insertSpace(doc, content);
                }
                }
+               if (this.removedFieldsets.indexOf("layout") == -1) this.buildLayoutFieldset(doc, element, content, "floating");
+               if (this.removedFieldsets.indexOf("alignment") == -1) this.buildAlignmentFieldset(doc, element, content);
+               if (this.removedFieldsets.indexOf("borders") == -1) this.buildBordersFieldset(dialog.dialogWindow, doc, dialog.editor, element, content);
+               if (this.removedFieldsets.indexOf("color") == -1) TableOperations.buildColorsFieldset(dialog.dialogWindow, doc, dialog.editor, element, content);
+               dialog.addButtons("ok", "cancel");
+       },
+       
+       /*
+        * Update the row/column/cell properties
+        */
+       rowCellPropertiesUpdate : function(dialog, params) {
+               var element = dialog.arguments.element;
+               var cell = dialog.arguments.cell;
+               var column = dialog.arguments.column;
+               var section = (cell || column) ? element.parentNode.parentNode : element.parentNode;
+               var table = section.parentNode;
+               var elements = new Array();
+               if (column) {
+                       elements = this.getColumnCells(dialog.arguments.element);
+               } else {
+                       elements.push(dialog.arguments.element);
+               }
+               for (var k = elements.length; --k >= 0;) {
+                       var element = elements[k];
+                       element = this.processStyle(element, params);
+                       for (var i in params) {
+                               var val = params[i];
+                               switch (i) {
+                                   case "f_cell_type":
+                                       if (val.substring(0,2) != element.nodeName.toLowerCase()) {
+                                               element = this.remapCell(element, val.substring(0,2));
+                                               this.editor.selectNodeContents(element, true);
+                                       }
+                                       if (val.substring(2,10) != element.scope) {
+                                               element.scope = val.substring(2,10);
+                                       }
+                                       break;
+                                   case "f_rowgroup":
+                                       var nodeName = section.nodeName.toLowerCase();
+                                       if (val != nodeName) {
+                                               var newSection = table.getElementsByTagName(val)[0];
+                                               if (!newSection) var newSection = table.insertBefore(dialog.editor._doc.createElement(val), table.getElementsByTagName("tbody")[0]);
+                                               if (nodeName == "thead" && val == "tbody") var newElement = newSection.insertBefore(element, newSection.firstChild);
+                                                       else var newElement = newSection.appendChild(element);
+                                               if (!section.hasChildNodes()) table.removeChild(section);
+                                       }
+                                       if (params.f_convertCells) {
+                                               if (val == "thead") {
+                                                       this.remapRowCells(element, "th");
+                                               } else {
+                                                       this.remapRowCells(element, "td");
+                                               }
+                                       }
+                                       break;
+                                   case "f_st_textAlign":
+                                       if (this.editor.plugins.BlockElements) {
+                                               this.editor.plugins.BlockElements.instance.toggleAlignmentClass(element, this.convertAlignment[val]);
+                                               element.style.textAlign = "";
+                                       }
+                                       break;
+                                   case "f_class":
+                                       this.editor.plugins.BlockStyle.instance.applyClassChange(element, val);
+                                       break;
+                               }
+                       }
+               }
+               this.reStyleTable(table);
+               dialog.close();
        },
        
        /*
        },
        
        /*
@@ -194,7 +513,7 @@ TableOperations = HTMLArea.Plugin.extend({
                function splitRow(td) {
                        var n = parseInt("" + td.rowSpan);
                        var colSpan = td.colSpan;
                function splitRow(td) {
                        var n = parseInt("" + td.rowSpan);
                        var colSpan = td.colSpan;
-                       var tagName = td.tagName.toLowerCase();
+                       var nodeName = td.nodeName.toLowerCase();
                        td.rowSpan = 1;
                        var tr = td.parentNode;
                        var sectionRowIndex = tr.sectionRowIndex;
                        td.rowSpan = 1;
                        var tr = td.parentNode;
                        var sectionRowIndex = tr.sectionRowIndex;
@@ -204,7 +523,7 @@ TableOperations = HTMLArea.Plugin.extend({
                                tr = rows[++sectionRowIndex];
                                        // Last row
                                if (!tr) tr = td.parentNode.parentNode.appendChild(editor._doc.createElement("tr"));
                                tr = rows[++sectionRowIndex];
                                        // Last row
                                if (!tr) tr = td.parentNode.parentNode.appendChild(editor._doc.createElement("tr"));
-                               var otd = editor._doc.createElement(tagName);
+                               var otd = editor._doc.createElement(nodeName);
                                otd.colSpan = colSpan;
                                otd.innerHTML = mozbr;
                                tr.insertBefore(otd, tr.cells[index]);
                                otd.colSpan = colSpan;
                                otd.innerHTML = mozbr;
                                tr.insertBefore(otd, tr.cells[index]);
@@ -213,12 +532,12 @@ TableOperations = HTMLArea.Plugin.extend({
        
                function splitCol(td) {
                        var nc = parseInt("" + td.colSpan);
        
                function splitCol(td) {
                        var nc = parseInt("" + td.colSpan);
-                       var tagName = td.tagName.toLowerCase();
+                       var nodeName = td.nodeName.toLowerCase();
                        td.colSpan = 1;
                        var tr = td.parentNode;
                        var ref = td.nextSibling;
                        while (--nc > 0) {
                        td.colSpan = 1;
                        var tr = td.parentNode;
                        var ref = td.nextSibling;
                        while (--nc > 0) {
-                               var otd = editor._doc.createElement(tagName);
+                               var otd = editor._doc.createElement(nodeName);
                                otd.rowSpan = td.rowSpan;
                                otd.innerHTML = mozbr;
                                tr.insertBefore(otd, ref);
                                otd.rowSpan = td.rowSpan;
                                otd.innerHTML = mozbr;
                                tr.insertBefore(otd, ref);
@@ -255,8 +574,8 @@ TableOperations = HTMLArea.Plugin.extend({
                        try {
                                while (range = sel.getRangeAt(i++)) {
                                        cell = range.startContainer.childNodes[range.startOffset];
                        try {
                                while (range = sel.getRangeAt(i++)) {
                                        cell = range.startContainer.childNodes[range.startOffset];
-                                       while (!/^(td|th|body)$/.test(cell.tagName.toLowerCase())) cell = cell.parentNode;
-                                       if (/^(td|th)$/.test(cell.tagName.toLowerCase())) cells.push(cell);
+                                       while (!/^(td|th|body)$/.test(cell.nodeName.toLowerCase())) cell = cell.parentNode;
+                                       if (/^(td|th)$/.test(cell.nodeName.toLowerCase())) cells.push(cell);
                                }
                        } catch(e) {
                        /* finished walking through selection */
                                }
                        } catch(e) {
                        /* finished walking through selection */
@@ -329,6 +648,7 @@ TableOperations = HTMLArea.Plugin.extend({
                        clearRow(otr);
                        otr = tr.parentNode.insertBefore(otr, (/under/.test(buttonId) ? tr.nextSibling : tr));
                        this.editor.selectNodeContents(otr.firstChild, true);
                        clearRow(otr);
                        otr = tr.parentNode.insertBefore(otr, (/under/.test(buttonId) ? tr.nextSibling : tr));
                        this.editor.selectNodeContents(otr.firstChild, true);
+                       this.reStyleTable(tr.parentNode.parentNode);
                        break;
                    case "TO-row-delete":
                        var tr = this.getClosest("tr");
                        break;
                    case "TO-row-delete":
                        var tr = this.getClosest("tr");
@@ -344,9 +664,7 @@ TableOperations = HTMLArea.Plugin.extend({
                                selectNextNode(tr);
                                part.removeChild(tr);
                        }
                                selectNextNode(tr);
                                part.removeChild(tr);
                        }
-                       editor.forceRedraw();
-                       editor.focusEditor();
-                       editor.updateToolbar();
+                       this.reStyleTable(table);
                        break;
                    case "TO-row-split":
                        var cell = this.getClosest("td");
                        break;
                    case "TO-row-split":
                        var cell = this.getClosest("td");
@@ -359,8 +677,6 @@ TableOperations = HTMLArea.Plugin.extend({
                        } else {
                                splitRow(cell);
                        }
                        } else {
                                splitRow(cell);
                        }
-                       editor.forceRedraw();
-                       editor.updateToolbar();
                        break;
        
                        // COLUMNS
                        break;
        
                        // COLUMNS
@@ -379,18 +695,18 @@ TableOperations = HTMLArea.Plugin.extend({
                                                var tr = rows[i];
                                                var ref = tr.cells[index + (/after/.test(buttonId) ? 1 : 0)];
                                                if (!ref) {
                                                var tr = rows[i];
                                                var ref = tr.cells[index + (/after/.test(buttonId) ? 1 : 0)];
                                                if (!ref) {
-                                                       var otd = editor._doc.createElement(tr.lastChild.tagName.toLowerCase());
+                                                       var otd = editor._doc.createElement(tr.lastChild.nodeName.toLowerCase());
                                                        otd.innerHTML = mozbr;
                                                        tr.appendChild(otd);
                                                } else {
                                                        otd.innerHTML = mozbr;
                                                        tr.appendChild(otd);
                                                } else {
-                                                       var otd = editor._doc.createElement(ref.tagName.toLowerCase());
+                                                       var otd = editor._doc.createElement(ref.nodeName.toLowerCase());
                                                        otd.innerHTML = mozbr;
                                                        tr.insertBefore(otd, ref);
                                                }
                                        }
                                }
                        }
                                                        otd.innerHTML = mozbr;
                                                        tr.insertBefore(otd, ref);
                                                }
                                        }
                                }
                        }
-                       editor.focusEditor();
+                       this.reStyleTable(table);
                        break;
                    case "TO-col-split":
                        var cell = this.getClosest("td");
                        break;
                    case "TO-col-split":
                        var cell = this.getClosest("td");
@@ -403,8 +719,7 @@ TableOperations = HTMLArea.Plugin.extend({
                        } else {
                                splitCol(cell);
                        }
                        } else {
                                splitCol(cell);
                        }
-                       editor.forceRedraw();
-                       editor.updateToolbar();
+                       this.reStyleTable(table);
                        break;
                    case "TO-col-delete":
                        var cell = this.getClosest("td");
                        break;
                    case "TO-col-delete":
                        var cell = this.getClosest("td");
@@ -443,9 +758,7 @@ TableOperations = HTMLArea.Plugin.extend({
                                selectNextNode(table);
                                table.parentNode.removeChild(table);
                        }
                                selectNextNode(table);
                                table.parentNode.removeChild(table);
                        }
-                       editor.forceRedraw();
-                       editor.focusEditor();
-                       editor.updateToolbar();
+                       this.reStyleTable(table);
                        break;
        
                        // CELLS
                        break;
        
                        // CELLS
@@ -460,8 +773,7 @@ TableOperations = HTMLArea.Plugin.extend({
                        } else {
                                splitCell(cell);
                        }
                        } else {
                                splitCell(cell);
                        }
-                       editor.forceRedraw();
-                       editor.updateToolbar();
+                       this.reStyleTable(table);
                        break;
                    case "TO-cell-insert-before":
                    case "TO-cell-insert-after":
                        break;
                    case "TO-cell-insert-before":
                    case "TO-cell-insert-after":
@@ -469,11 +781,10 @@ TableOperations = HTMLArea.Plugin.extend({
                        if (!cell) var cell = this.getClosest("th");
                        if (!cell) break;
                        var tr = cell.parentNode;
                        if (!cell) var cell = this.getClosest("th");
                        if (!cell) break;
                        var tr = cell.parentNode;
-                       var otd = editor._doc.createElement(cell.tagName.toLowerCase());
+                       var otd = editor._doc.createElement(cell.nodeName.toLowerCase());
                        otd.innerHTML = mozbr;
                        tr.insertBefore(otd, (/after/.test(buttonId) ? cell.nextSibling : cell));
                        otd.innerHTML = mozbr;
                        tr.insertBefore(otd, (/after/.test(buttonId) ? cell.nextSibling : cell));
-                       editor.forceRedraw();
-                       editor.focusEditor();
+                       this.reStyleTable(tr.parentNode.parentNode);
                        break;
                    case "TO-cell-delete":
                        var cell = this.getClosest("td");
                        break;
                    case "TO-cell-delete":
                        var cell = this.getClosest("td");
@@ -496,9 +807,7 @@ TableOperations = HTMLArea.Plugin.extend({
                                selectNextNode(cell);
                                row.removeChild(cell);
                        }
                                selectNextNode(cell);
                                row.removeChild(cell);
                        }
-                       editor.forceRedraw();
-                       editor.focusEditor();
-                       editor.updateToolbar();
+                       this.reStyleTable(table);
                        break;
                    case "TO-cell-merge":
                        var sel = editor._getSelection();
                        break;
                    case "TO-cell-merge":
                        var sel = editor._getSelection();
@@ -521,7 +830,7 @@ TableOperations = HTMLArea.Plugin.extend({
                                } catch(e) {
                                        /* finished walking through selection */
                                }
                                } catch(e) {
                                        /* finished walking through selection */
                                }
-                               rows[tablePartsIndex[row.parentNode.nodeName.toLowerCase()]].push(cells);
+                               try { rows[tablePartsIndex[row.parentNode.nodeName.toLowerCase()]].push(cells); } catch(e) { }
                        } else {
                                // Internet Explorer, Safari and Opera
                                var cell = this.getClosest("td");
                        } else {
                                // Internet Explorer, Safari and Opera
                                var cell = this.getClosest("td");
@@ -599,405 +908,638 @@ TableOperations = HTMLArea.Plugin.extend({
                                        editor.selectNodeContents(td);
                                }
                        }
                                        editor.selectNodeContents(td);
                                }
                        }
+                       this.reStyleTable(table);
                        break;
                        break;
-                               // CREATION AND PROPERTIES
-                       case "InsertTable":
-                               this.dialogInsertTable();
-                               break;
-                       case "TO-table-prop":
-                               this.dialogTableProperties();
-                               break;
-                       case "TO-row-prop":
-                               this.dialogRowCellProperties(false);
-                               break;
-                       case "TO-cell-prop":
-                               this.dialogRowCellProperties(true);
-                               break;
-                       case "TO-toggle-borders":
-                               this.toggleBorders();
-                               break;
-                       default:
-                               alert("Button [" + buttonId + "] not yet implemented");
+                       
+                       // CREATION AND PROPERTIES
+                   case "InsertTable":
+                   case "TO-table-prop":
+                       this.dialogTableProperties(buttonId);
+                       break;
+                   case "TO-table-restyle":
+                       this.reStyleTable(this.getClosest("table"));
+                       break;
+                   case "TO-row-prop":
+                       this.dialogRowCellProperties(false, false);
+                       break;
+                   case "TO-col-prop":
+                       this.dialogRowCellProperties(true, true);
+                       break;
+                   case "TO-cell-prop":
+                       this.dialogRowCellProperties(true, false);
+                       break;
+                   case "TO-toggle-borders":
+                       this.toggleBorders();
+                       break;
+                   default:
+                       alert("Button [" + buttonId + "] not yet implemented");
                }
        },
        
        /*
                }
        },
        
        /*
-        * Open insert table request
+        * Returns an array of all cells in the column containing the given cell
+        *
+        * @param       object          cell: the cell serving as reference point for the column
+        *
+        * @return      array           the array of cells of the column
         */
         */
-       dialogInsertTable : function () {
-               this.dialog = this.openDialog("InsertTable", this.makeUrlFromPopupName("insert_table"), "insertTable", null, {width:520, height:230});
-               return false;
+       getColumnCells : function (cell) {
+               var cells = new Array();
+               var index = cell.cellIndex;
+               var table = cell.parentNode.parentNode.parentNode;
+               for (var j = this.tableParts.length; --j >= 0;) {
+                       var tablePart = table.getElementsByTagName(this.tableParts[j])[0];
+                       if (tablePart) {
+                               var rows = tablePart.rows;
+                               for (var i = rows.length; --i >= 0;) {
+                                       if(rows[i].cells.length > index) {
+                                               cells.push(rows[i].cells[index]);
+                                       }
+                               }
+                       }
+               }
+               return cells;
        },
        
        /*
        },
        
        /*
-       * Get the insert table action function
-       */
-       insertTable : function(param) {
-               var editor = this.editor;
-               if (!param) return false;
-               var doc = editor._doc;
-               var table = doc.createElement("table");
-               for (var field in param) {
-                       if (param.hasOwnProperty(field)) {
-                               var value = param[field];
-                               if (value) {
-                                       switch (field) {
-                                               case "f_width"   : 
-                                                       if(value != "") {
-                                                               table.style.width = parseInt(value) + param["f_unit"];
-                                                               break;
-                                                       }
-                                               case "f_align"   :
-                                                       table.style.textAlign = value;
-                                                       break;
-                                               case "f_border"  :
-                                                       if(value != "") {
-                                                               table.style.borderWidth  = parseInt(value)+"px";
-                                                               table.style.borderStyle = "solid";
-                                                       }
-                                                       break;
-                                               case "f_spacing" :
-                                                       if(value != "") {
-                                                               table.cellSpacing = parseInt(value);
-                                                               break;
-                                                       }
-                                               case "f_padding" :
-                                                       if(value != "") {
-                                                               table.cellPadding = parseInt(value);
-                                                               break;
-                                                       }
-                                               case "f_float"   :
-                                                       if (HTMLArea.is_ie) {
-                                                               table.style.styleFloat = ((value != "not set") ? value : "");
-                                                       } else {
-                                                               table.style.cssFloat = ((value != "not set") ? value : "");
-                                                       }
-                                                       break;
+        * Toggles the display of borders on tables and table cells
+        *
+        * @param       boolean         forceBorders: if set, borders are displayed whatever the current state
+        *
+        * @return      void
+        */
+       toggleBorders : function (forceBorders) {
+               var body = this.editor._doc.body;
+               if (!HTMLArea._hasClass(body, 'htmlarea-showtableborders')) {
+                       HTMLArea._addClass(body,'htmlarea-showtableborders');
+               } else if (!forceBorders) {
+                       HTMLArea._removeClass(body,'htmlarea-showtableborders');
+               }
+                       // The only way to get Firefox to show these borders...
+               if (HTMLArea.is_gecko && !HTMLArea.is_safari && !HTMLArea.is_opera) this.editor.setMode("wysiwyg");
+       },
+       
+       /*
+        * Applies to rows/cells the alternating classes of an alternating style scheme
+        *
+        * @param       object          table: the table to be re-styled
+        *
+        * @return      void
+        */
+       reStyleTable : function (table) {
+               if (table) {
+                       if (this.classesUrl && typeof(HTMLArea.classesAlternating) === "undefined") {
+                               this.getJavascriptFile(this.classesUrl);
+                       }
+                       var classNames = table.className.trim().split(" ");
+                       for (var i = classNames.length; --i >= 0;) {
+                               var classConfiguration = HTMLArea.classesAlternating[classNames[i]];
+                               if (classConfiguration && classConfiguration.rows) {
+                                       if (classConfiguration.rows.oddClass && classConfiguration.rows.evenClass) {
+                                               this.alternateRows(table, classConfiguration);
+                                       }
+                               }
+                               if (classConfiguration && classConfiguration.columns) {
+                                       if (classConfiguration.columns.oddClass && classConfiguration.columns.evenClass) {
+                                               this.alternateColumns(table, classConfiguration);
                                        }
                                }
                        }
                }
                                        }
                                }
                        }
                }
-               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 = param["f_rows"]; i > 0; i--) {
-                       var tr = doc.createElement("tr");
-                       tbody.appendChild(tr);
-                       for (var j = param["f_cols"]; j > 0; j--) {
-                               var td = doc.createElement("td");
-                               if (cellwidth) td.style.width = cellwidth + "%";
-                               if (HTMLArea.is_opera) { td.innerHTML = '&nbsp;'; }
-                               tr.appendChild(td);
+       },
+       
+       /*
+        * Removes from rows/cells the alternating classes of an alternating style scheme
+        *
+        * @param       object          table: the table to be re-styled
+        * @param       string          removeClass: the name of the class that identifies the alternating style scheme
+        *
+        * @return      void
+        */
+       removeAlternatingClasses : function (table, removeClass) {
+               if (table) {
+                       if (this.classesUrl && typeof(HTMLArea.classesAlternating) === "undefined") {
+                               this.getJavascriptFile(this.classesUrl);
+                       }
+                       var classConfiguration = HTMLArea.classesAlternating[removeClass];
+                       if (classConfiguration) {
+                               if (classConfiguration.rows && classConfiguration.rows.oddClass && classConfiguration.rows.evenClass) {
+                                       this.alternateRows(table, classConfiguration, true);
+                               }
+                               if (classConfiguration.columns && classConfiguration.columns.oddClass && classConfiguration.columns.evenClass) {
+                                       this.alternateColumns(table, classConfiguration, true);
+                               }
                        }
                }
                        }
                }
-               editor.focusEditor();
-               editor.insertNodeAtSelection(table);
-               if (this.buttonsConfiguration.toggleborders && this.buttonsConfiguration.toggleborders.setOnTableCreation) {
-                       this.toggleBorders();
-               }
-               return true;
        },
        
        },
        
-       toggleBorders : function () {
-               var tables = this.editor._doc.getElementsByTagName("table");
-               if (tables.length != 0) {
-                       this.editor.borders = true;
-                       for (var ix=0; ix < tables.length; ix++) this.editor.borders = this.editor.borders && /htmlarea-showtableborders/.test(tables[ix].className);
-                       for (ix=0; ix < tables.length; ix++) {
-                               if (!this.editor.borders) HTMLArea._addClass(tables[ix],'htmlarea-showtableborders');
-                                       else HTMLArea._removeClass(tables[ix],'htmlarea-showtableborders');
+       /*
+        * Applies/removes the alternating classes of an alternating rows style scheme
+        *
+        * @param       object          table: the table to be re-styled
+        * @param       object          classConfifuration: the alternating sub-array of the configuration of the class
+        * @param       boolean         remove: if true, the classes are removed
+        *
+        * @return      void
+        */
+       alternateRows : function (table, classConfiguration, remove) {
+               var oddClass = { tbody : classConfiguration.rows.oddClass, thead : classConfiguration.rows.oddHeaderClass };
+               var evenClass = { tbody : classConfiguration.rows.evenClass, thead : classConfiguration.rows.evenHeaderClass };
+               var startAt = classConfiguration.rows.startAt ? parseInt(classConfiguration.rows.startAt) : 0;
+               startAt = remove ? 0 : startAt;
+               var rows = table.rows, type, odd, even;
+                       // Loop through the rows
+               for (var i = startAt, n = rows.length; i < n; i++) {
+                       var row = rows[i];
+                       type = (row.parentNode.nodeName.toLowerCase() == "thead") ? "thead" : "tbody";
+                       odd = oddClass[type];
+                       even = evenClass[type];
+                       if (remove) {
+                               HTMLArea._removeClass(row, odd);
+                               HTMLArea._removeClass(row, even);
+                               // Check if i is even, and apply classes for both possible results
+                       } else if (odd && even) {
+                               if ((i % 2) == 0) {
+                                       if (HTMLArea._hasClass(row, odd)) {
+                                               HTMLArea._removeClass(row, odd);
+                                       }
+                                       HTMLArea._addClass(row, even);
+                               } else {
+                                       if (HTMLArea._hasClass(row, even)) {
+                                               HTMLArea._removeClass(row, even);
+                                       }
+                                       HTMLArea._addClass(row, odd);
+                               }
                        }
                }
                        }
                }
-                       // The only way to get Firefox to show these borders...
-               if (HTMLArea.is_gecko && !HTMLArea.is_safari && !HTMLArea.is_opera) this.editor.setMode("wysiwyg");
-       }
-});
-
-/*
- * Set the language file for the plugin
- */
-TableOperations.I18N = TableOperations_langArray;
-
-/*
- * Initialize the table properties dialog
- */
-TableOperations.tablePropertiesInit = function(table) {
-       return (function (dialog) {
-               var doc = dialog.doc;
-               var content = dialog.content;
-               var i18n = TableOperations.I18N;
-               TableOperations.buildTitle(doc, i18n, content, "Table Properties");
-               TableOperations.buildDescriptionFieldset(doc, table, i18n, content);
-               var obj = dialog.editor.config.customSelects.BlockStyle ? dialog.editor.plugins.BlockStyle.instance : dialog.editor.config.customSelects["DynamicCSS-class"];
-               if (obj && (obj.loaded || obj.cssLoaded)) TableOperations.buildStylingFieldset(doc, table, i18n, content, obj.cssArray);
-               if (!dialog.editor.config.disableLayoutFieldsetInTableOperations) TableOperations.buildLayoutFieldset(doc, table, i18n, content);
-               if (!dialog.editor.config.disableAlignmentFieldsetInTableOperations) TableOperations.buildAlignmentFieldset(doc, table, i18n, content, "floating");
-               if (!dialog.editor.config.disableSpacingFieldsetInTableOperations) TableOperations.buildSpacingFieldset(doc, table, i18n, content);
-               if (!dialog.editor.config.disableBordersFieldsetInTableOperations) TableOperations.buildBordersFieldset(dialog.dialogWindow, doc, dialog.editor, table, i18n, content);
-               if (!dialog.editor.config.disableColorFieldsetInTableOperations) TableOperations.buildColorsFieldset(dialog.dialogWindow, doc, dialog.editor, table, i18n, content);
-               dialog.modal = true;
-               dialog.addButtons("ok", "cancel");
-               dialog.showAtElement();
-       });
-};
-
-/*
- * Update the table properties and close the dialog
- */
-TableOperations.tablePropertiesUpdate = function(table) {
-       return (function (dialog,params) {
-               dialog.editor.focusEditor();
-               TableOperations.processStyle(params, table);
-               table.removeAttribute("border");
-               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);
+       },
+       
+       /*
+        * Applies/removes the alternating classes of an alternating columns style scheme
+        *
+        * @param       object          table: the table to be re-styled
+        * @param       object          classConfifuration: the alternating sub-array of the configuration of the class
+        * @param       boolean         remove: if true, the classes are removed
+        *
+        * @return      void
+        */
+       alternateColumns : function (table, classConfiguration, remove) {
+               var oddClass = { td : classConfiguration.columns.oddClass, th : classConfiguration.columns.oddHeaderClass };
+               var evenClass = { td : classConfiguration.columns.evenClass, th : classConfiguration.columns.evenHeaderClass };
+               var startAt = classConfiguration.columns.startAt ? parseInt(classConfiguration.columns.startAt) : 0;
+               startAt = remove ? 0 : startAt;
+               var rows = table.rows, type, odd, even;
+                       // Loop through the rows of the table
+               for (var i = rows.length; --i >= 0;) {
+                               // Loop through the cells
+                       var cells = rows[i].cells;
+                       for (var j = startAt, n = cells.length; j < n; j++) {
+                               var cell = cells[j];
+                               type = cell.nodeName.toLowerCase();
+                               odd = oddClass[type];
+                               even = evenClass[type];
+                               if (remove) {
+                                       if (odd) HTMLArea._removeClass(cell, odd);
+                                       if (even) HTMLArea._removeClass(cell, even);
+                               } else if (odd && even) {
+                                               // Check if j+startAt is even, and apply classes for both possible results
+                                       if ((j % 2) == 0) {
+                                               if (HTMLArea._hasClass(cell, odd)) {
+                                                       HTMLArea._removeClass(cell, odd);
+                                               }
+                                               HTMLArea._addClass(cell, even);
+                                       } else{
+                                               if (HTMLArea._hasClass(cell, even)) {
+                                                       HTMLArea._removeClass(cell, even);
+                                               }
+                                               HTMLArea._addClass(cell, odd);
                                        }
                                        }
-                                       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_frames":
-                               table.frame = (val != "not set") ? val : "";
-                               break;
-                           case "f_rules":
-                               if (val != "not set") table.rules = val;
-                                       else table.removeAttribute("rules");
-                               break;
-                           case "f_class":
-                           case "f_class_tbody":
-                           case "f_class_thead":
-                           case "f_class_tfoot":
-                               var tpart = table;
-                               if (i.length > 7) tpart = table.getElementsByTagName(i.substring(8,13))[0];
-                               var cls = tpart.className.trim().split(" ");
-                               for (var j = cls.length;j > 0;) {
-                                       if (!HTMLArea.reservedClassNames.test(cls[--j])) HTMLArea._removeClass(tpart,cls[j]);
+                       }
+               }
+       },
+       
+       /*
+        * This function sets the headers cells on the table (top, left, both or none)
+        *
+        * @param       object          table: the table being edited
+        * @param       object          params: the field values entered in the form
+        *
+        * @return      object          the modified table
+        */
+       setHeaders : function (table, params) {
+               var headers = params.f_headers;
+               var doc = this.editor._doc;
+               var tbody = table.tBodies[0];
+               var thead = table.tHead;
+               if (thead && !thead.rows.length && !tbody.rows.length) {
+                        // Table is degenerate
+                       return table;
+               }
+               if (headers == "top") {
+                       if (!thead) {
+                               var thead = doc.createElement("thead");
+                               thead = table.insertBefore(thead, tbody);
+                       }
+                       if (!thead.rows.length) {
+                               var firstRow = thead.appendChild(tbody.rows[0]);
+                       } else {
+                               var firstRow = thead.rows[0];
+                       }
+                       HTMLArea._removeClass(firstRow, this.useHeaderClass);
+               } else {
+                       if (thead) {
+                               var rows = thead.rows;
+                               if (rows.length) {
+                                       for (var i = rows.length; --i >= 0 ;) {
+                                               this.remapRowCells(rows[i], "td");
+                                               if (tbody.rows.length) {
+                                                       tbody.insertBefore(rows[i], tbody.rows[0]);
+                                               } else {
+                                                       tbody.appendChild(rows[i]);
+                                               }
+                                       }
                                }
                                }
-                               if (val != 'none') HTMLArea._addClass(tpart,val);
-                               break;
+                               table.removeChild(thead);
                        }
                }
                        }
                }
-               dialog.editor.focusEditor();
-               dialog.editor.updateToolbar();
-       });
-};
-
-/*
- * Initialize the row/cell properties dialog
- */
-TableOperations.rowCellPropertiesInit = function(element,cell) {
-       return (function (dialog) {
-               var doc = dialog.doc;
-               var content = dialog.content;
-               var i18n = TableOperations.I18N;
-               TableOperations.buildTitle(doc, i18n, content, (cell ? "Cell Properties" : "Row Properties"));
-               if (cell) TableOperations.buildCellTypeFieldset(dialog.dialogWindow, doc, dialog.editor, element, i18n, content);
-                       else TableOperations.buildRowGroupFieldset(dialog.dialogWindow, doc, dialog.editor, element, i18n, content);
-               var obj = dialog.editor.config.customSelects.BlockStyle ? dialog.editor.plugins.BlockStyle.instance : dialog.editor.config.customSelects["DynamicCSS-class"];
-               if (obj && (obj.loaded || obj.cssLoaded))  TableOperations.buildStylingFieldset(doc, element, i18n, content, obj.cssArray);
-                       else TableOperations.insertSpace(doc, content);
-               if (!dialog.editor.config.disableLayoutFieldsetInTableOperations) TableOperations.buildLayoutFieldset(doc, element, i18n, content, "floating");
-               if (!dialog.editor.config.disableAlignmentFieldsetInTableOperations) TableOperations.buildAlignmentFieldset(doc, element, i18n, content);
-               if (!dialog.editor.config.disableBordersFieldsetInTableOperations) TableOperations.buildBordersFieldset(dialog.dialogWindow, doc, dialog.editor, element, i18n, content);
-               if (!dialog.editor.config.disableColorFieldsetInTableOperations) TableOperations.buildColorsFieldset(dialog.dialogWindow, doc, dialog.editor, element, i18n, content);
-               dialog.modal = true;
-               dialog.addButtons("ok", "cancel");
-               dialog.showAtElement();
-       });
-};
-
-/*
- * Update the row/cell properties and close the dialog
- */
-TableOperations.rowCellPropertiesUpdate = function(element) {
-       return (function (dialog,params) {
-               dialog.editor.focusEditor();
-               TableOperations.processStyle(params, element);
-               var convertCellType = false;
-               for (var i in params) {
-                       var val = params[i];
-                       switch (i) {
-                           case "f_scope":
-                               if (val != "not set") element.scope = val;
-                                       else element.removeAttribute('scope');
-                               break;
-                           case "f_cell_type":
-                                       // Set all cell attributes before cloning it with a new tag
-                               if (val != element.tagName.toLowerCase()) {
-                                       var newCellType = val;
-                                       convertCellType = true;
+               if (headers == "both") {
+                       var firstRow = tbody.rows[0];
+                       HTMLArea._addClass(firstRow, this.useHeaderClass);
+               } else if (headers != "top") {
+                       var firstRow = tbody.rows[0];
+                       HTMLArea._removeClass(firstRow, this.useHeaderClass);
+                       this.remapRowCells(firstRow, "td");
+               }
+               if (headers == "top" || headers == "both") {
+                       this.remapRowCells(firstRow, "th");
+               }
+               if (headers == "left") {
+                       var firstRow = tbody.rows[0];
+               }
+               if (headers == "left" || headers == "both") {
+                       var rows = tbody.rows;
+                       for (var i = rows.length; --i >= 0 ;) {
+                               if (i || rows[i] == firstRow) {
+                                       if (rows[i].cells[0].nodeName.toLowerCase() != "th") {
+                                               var th = this.remapCell(rows[i].cells[0], "th");
+                                               th.scope = "row";
+                                       }
                                }
                                }
-                               break;
-                           case "f_rowgroup":
-                               var section = element.parentNode;
-                               var tagName = section.tagName.toLowerCase();
-                               if (val != tagName) {
-                                       var table = section.parentNode;
-                                       var newSection = table.getElementsByTagName(val)[0];
-                                       if (!newSection) var newSection = table.insertBefore(dialog.editor._doc.createElement(val), table.getElementsByTagName("tbody")[0]);
-                                       if (tagName == "thead" && val == "tbody") var newElement = newSection.insertBefore(element, newSection.firstChild);
-                                               else var newElement = newSection.appendChild(element);
-                                       if (!section.hasChildNodes()) table.removeChild(section);
+                       }
+               } else {
+                       var rows = tbody.rows;
+                       for (var i = rows.length; --i >= 0 ;) {
+                               if (rows[i].cells[0].nodeName.toLowerCase() != "td") {
+                                       rows[i].cells[0].scope = "";
+                                       var td = this.remapCell(rows[i].cells[0], "td");
                                }
                                }
-                               break;
-                           case "f_char":
-                               element.ch = val;
-                               break;
-                           case "f_class":
-                               var cls = element.className.trim().split(" ");
-                               for (var j = cls.length;j > 0;) {
-                                       if (!HTMLArea.reservedClassNames.test(cls[--j])) HTMLArea._removeClass(element,cls[j]);
+                       }
+               }
+               this.reStyleTable(table);
+               return table;
+       },
+       
+       /*
+        * This function remaps the given cell to the specified node name
+        */
+       remapCell : function(element, nodeName) {
+               var newCell = this.editor.convertNode(element, nodeName);
+               var attributes = element.attributes, attributeName, attributeValue;
+               for (var i = attributes.length; --i >= 0;) {
+                       attributeName = attributes.item(i).nodeName;
+                       attributeValue = element.getAttribute(attributeName);
+                       if (attributeValue) newCell.setAttribute(attributeName, attributeValue);
+               }
+                       // In IE, the above fails to update the classname and style attributes.
+               if (HTMLArea.is_ie) {
+                       if (element.style.cssText) {
+                               newCell.style.cssText = element.style.cssText;
+                       }
+                       if (element.className) {
+                               newCell.setAttribute("className", element.className);
+                       } else {
+                               newCell.removeAttribute("className");
+                       }
+               }
+               
+               if (this.tags && this.tags[nodeName] && this.tags[nodeName].allowedClasses) {
+                       if (newCell.className && /\S/.test(newCell.className)) {
+                               var allowedClasses = new RegExp( "^(" + this.tags[nodeName].allowedClasses.trim().split(",").join("|") + ")$");
+                               var classNames = newCell.className.trim().split(" ");
+                               for (var i = classNames.length; --i >= 0;) {
+                                       if (!allowedClasses.test(classNames[i])) {
+                                               HTMLArea._removeClass(newCell, classNames[i]);
+                                       }
                                }
                                }
-                               if (val != 'none') HTMLArea._addClass(element,val);
-                               break;
                        }
                }
                        }
                }
-               if (convertCellType) {
-                       var newCell = dialog.editor._doc.createElement(newCellType), p = element.parentNode, a, attrName, name;
-                       var attrs = element.attributes;
-                       for (var i = attrs.length; --i >= 0 ;) {
-                               a = attrs.item(i);
-                               attrName = a.nodeName;
-                               name = attrName.toLowerCase();
-                                       // IE5.5 reports wrong values. For this reason we extract the values directly from the root node.
-                               if (typeof(element[attrName]) != "undefined" && name != "style" && !/^on/.test(name)) {
-                                       if (element[attrName]) newCell.setAttribute(attrName, element[attrName]);
-                               } else {
-                                       if (a.nodeValue) newCell.setAttribute(attrName, a.nodeValue);
+               return newCell;
+       },
+       
+       remapRowCells : function (row, toType) {
+               var cells = row.cells;
+               if (toType === "th") {
+                       for (var i = cells.length; --i >= 0 ;) {
+                               if (cells[i].nodeName.toLowerCase() != "th") {
+                                       var th = this.remapCell(cells[i], "th");
+                                       th.scope = "col";
                                }
                        }
                                }
                        }
-                               // In IE, the above fails to update the classname and style attributes.
-                       if (HTMLArea.is_ie) {
-                               if (element.style.cssText) newCell.style.cssText = element.style.cssText;
-                               if (element.className) {
-                                       newCell.setAttribute("className", element.className);
-                               } else { 
-                                       newCell.className = element.className;
-                                       newCell.removeAttribute("className");
+               } else {
+                       for (var i = cells.length; --i >= 0 ;) {
+                               if (cells[i].nodeName.toLowerCase() != "td") {
+                                       var td = this.remapCell(cells[i], "td");
+                                       td.scope = "";
                                }
                        }
                                }
                        }
-                       while (element.firstChild) newCell.appendChild(element.firstChild);
-                       p.insertBefore(newCell, element);
-                       p.removeChild(element);
-                       dialog.editor.selectNodeContents(newCell, false);
                }
                }
-               dialog.editor.updateToolbar();
-       });
-};
-
-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 = "";
-                       }
-                       break;
-                   case "f_st_borderWidth":
-                       if (/\S/.test(val)) {
-                               style.borderWidth = val + "px";
-                       } else {
-                               style.borderWidth = "";
+       },
+       
+       /*
+        * This function applies the style properties found in params to the given element
+        *
+        * @param       object          element: the element
+        * @param       object          params: the properties
+        *
+        * @return      object          the modified element
+        */
+       processStyle : function (element, params) {
+               var style = element.style;
+               if (HTMLArea.is_ie) {
+                       style.styleFloat = "";
+               } else {
+                       style.cssFloat = "";
+               }
+               style.textAlign = "";
+               for (var i in params) {
+                       if (params.hasOwnProperty(i)) {
+                               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 = "";
+                                       }
+                                       break;
+                                   case "f_st_borderWidth":
+                                       if (/\S/.test(val)) {
+                                               style.borderWidth = val + "px";
+                                       } else {
+                                               style.borderWidth = "";
+                                       }
+                                       if (params.f_st_borderStyle == "none") style.borderWidth = "0px";
+                                       if (params.f_st_borderStyle == "not set") style.borderWidth = "";
+                                       break;
+                                   case "f_st_borderStyle":
+                                       style.borderStyle = (val != "not set") ? 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":
+                                       style.textAlign = (val != "not set") ? val : "";
+                                       break;
+                                   case "f_st_vertAlign":
+                                       style.verticalAlign = (val != "not set") ? val : "";
+                                       break;
+                               }
                        }
                        }
-                       if (params["f_st_borderStyle"] == "none") style.borderWidth = "0px";
-                       if (params["f_st_borderStyle"] == "not set") style.borderWidth = "";
-                       break;
-                   case "f_st_borderStyle":
-                       style.borderStyle = (val != "not set") ? 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"];
+               }
+               return element;
+       },
+       
+       /*
+        * This function creates a Size and Headers fieldset to be added to the form
+        *
+        * @param       object          doc: the dialog document
+        * @param       object          table: the table being edited
+        * @param       object          content: the content div of the dialog window
+        *
+        * @return      void
+        */
+       buildSizeAndHeadersFieldset : function (doc, table, content, fieldsetClass) {
+               var fieldset = doc.createElement("fieldset");
+               if (fieldsetClass) fieldset.className = fieldsetClass;
+               if (!table) {
+                       TableOperations.insertLegend(doc, fieldset, "Size and Headers");
+                       TableOperations.buildInput(doc, fieldset, "f_rows", "Rows:", "Number of rows", "", "5", ((this.properties && this.properties.numberOfRows && this.properties.numberOfRows.defaultValue) ? this.properties.numberOfRows.defaultValue : "2"), "fr");
+                       TableOperations.buildInput(doc, fieldset, "f_cols", "Cols:", "Number of columns", "", "5", ((this.properties && this.properties.numberOfColumns && this.properties.numberOfColumns.defaultValue) ? this.properties.numberOfColumns.defaultValue : "4"));
+               } else {
+                       TableOperations.insertLegend(doc, fieldset, "Headers");
+               }
+               if (this.removedProperties.indexOf("headers") == -1) {
+                       var ul = doc.createElement("ul");
+                       fieldset.appendChild(ul);
+                       var li = doc.createElement("li");
+                       ul.appendChild(li);
+                       if (!table) {
+                               var selected = (this.properties && this.properties.headers && this.properties.headers.defaultValue) ? this.properties.headers.defaultValue : "top";
                        } else {
                        } else {
-                               style.width = "";
+                               var selected = "none";
+                               var thead = table.getElementsByTagName("thead");
+                               var tbody = table.getElementsByTagName("tbody");
+                               if (thead.length && thead[0].rows.length) {
+                                       selected = "top";
+                               } else if (tbody.length && tbody[0].rows.length) {
+                                       if (HTMLArea._hasClass(tbody[0].rows[0], this.useHeaderClass)) {
+                                               selected = "both";
+                                       } else if (tbody[0].rows[0].cells.length && tbody[0].rows[0].cells[0].nodeName.toLowerCase() == "th") {
+                                               selected = "left";
+                                       }
+                               }
                        }
                        }
-                       break;
-                   case "f_st_height":
-                       if (/\S/.test(val)) {
-                               style.height = val + params["f_st_heightUnit"];
-                       } else {
-                               style.height = "";
+                       var selectHeaders = TableOperations.buildSelectField(doc, li, "f_headers", "Headers:", "fr", "floating", "Table headers", ["No header cells", "Header cells on top", "Header cells on left", "Header cells on top and left"], ["none", "top", "left", "both"],  new RegExp((selected ? selected : "top"), "i"));
+                       this.removeOptions(selectHeaders, "headers");
+               }
+               TableOperations.insertSpace(doc, fieldset);
+               content.appendChild(fieldset);
+       },
+       
+       buildLayoutFieldset : function(doc, el, content, fieldsetClass) {
+               var select, selected;
+               var fieldset = doc.createElement("fieldset");
+               if (fieldsetClass) fieldset.className = fieldsetClass;
+               TableOperations.insertLegend(doc, fieldset, "Layout");
+               var f_st_width = el ? TableOperations.getLength(el.style.width) : ((this.properties && this.properties.width && this.properties.width.defaultValue) ? this.properties.width.defaultValue : "");
+               var f_st_height = el ? TableOperations.getLength(el.style.height) : ((this.properties && this.properties.height && this.properties.height.defaultValue) ? this.properties.height.defaultValue : "");
+               var selectedWidthUnit = el ? (/%/.test(el.style.width) ? '%' : (/px/.test(el.style.width) ? 'px' : 'em')) : ((this.properties && this.properties.widthUnit &&this.properties.widthUnit.defaultValue) ? this.properties.widthUnit.defaultValue : "%");
+               var selectedHeightUnit = el ? (/%/.test(el.style.height) ? '%' : (/px/.test(el.style.height) ? 'px' : 'em')) : ((this.properties && this.properties.heightUnit &&this.properties.heightUnit.defaultValue) ? this.properties.heightUnit.defaultValue : "%");
+               var nodeName = el ? el.nodeName.toLowerCase() : "table";
+               var ul = doc.createElement("ul");
+               fieldset.appendChild(ul);
+               switch(nodeName) {
+                       case "table" :
+                               var widthTitle = "Table width";
+                               var heightTitle = "Table height";
+                               break;
+                       case "tr" :
+                               var widthTitle = "Row width";
+                               var heightTitle = "Row height";
+                               break;
+                       case "td" :
+                       case "th" :
+                               var widthTitle = "Cell width";
+                               var heightTitle = "Cell height";
+               }
+               if (this.removedProperties.indexOf("width") == -1) {
+                       var li = doc.createElement("li");
+                       ul.appendChild(li);
+                       TableOperations.buildInput(doc, li, "f_st_width", "Width:", widthTitle, "", "5", f_st_width, "fr");
+                       select = TableOperations.buildSelectField(doc, li, "f_st_widthUnit", "", "", "", "Width unit", ["percent", "pixels", "em"], ["%", "px", "em"], new RegExp((f_st_width ? selectedWidthUnit : "%"), "i"));
+                       this.removeOptions(select, "widthUnit");
+               }
+               if (this.removedProperties.indexOf("height") == -1) {
+                       var li = doc.createElement("li");
+                       ul.appendChild(li);
+                       TableOperations.buildInput(doc, li, "f_st_height", "Height:", heightTitle, "", "5", f_st_height, "fr");
+                       select = TableOperations.buildSelectField(doc, li, "f_st_heightUnit", "", "", "", "Height unit", ["percent", "pixels", "em"], ["%", "px", "em"], new RegExp((f_st_height ? selectedHeightUnit : "%"), "i"));
+                       this.removeOptions(select, "heightUnit");
+               }
+               if (nodeName == "table" && this.removedProperties.indexOf("float") == -1) {
+                       selected = el ? (HTMLArea._hasClass(el, this.floatLeft) ? "left" : (HTMLArea._hasClass(el, this.floatRight) ? "right" : "not set")) : this.floatDefault;
+                       select = TableOperations.buildSelectField(doc, li, "f_st_float", "Float:", "", "", "Specifies where the table should float", ["Not set", "Left", "Right"], ["not set", "left", "right"], new RegExp((selected ? selected : "not set"), "i"));
+                       this.removeOptions(select, "float");
+               }
+               content.appendChild(fieldset);
+       },
+       
+       buildAlignmentFieldset : function (doc, el, content, fieldsetClass) {
+               var select;
+               var nodeName = el ? el.nodeName.toLowerCase() : "table";
+               var fieldset = doc.createElement("fieldset");
+               if (fieldsetClass) fieldset.className = fieldsetClass;
+               TableOperations.insertLegend(doc, fieldset, "Alignment");
+               var options = ["Not set", "Left", "Center", "Right", "Justify"];
+               var values = ["not set", "left", "center", "right", "justify"];
+               var selected = "";
+               if (el && this.editor.plugins.BlockElements) {
+                       var blockElements = this.editor.plugins.BlockElements.instance;
+                       for (var value in this.convertAlignment) {
+                               if (this.convertAlignment.hasOwnProperty(value) && HTMLArea._hasClass(el, blockElements.useClass[this.convertAlignment[value]])) {
+                                       selected = value;
+                                       break;
+                               }
                        }
                        }
-                       break;
-                   case "f_st_textAlign":
-                       if (val == "character") {
-                               var ch = params["f_st_textAlignChar"];
-                               if (ch == '"') {
-                                       ch = '\\"';
+               } else {
+                       selected = el ? el.style.verticalAlign : "";
+               }
+               (selected.match(/([^\s]*)\s/)) && (selected = RegExp.$1);
+               var ul = doc.createElement("ul");
+               fieldset.appendChild(ul);
+               var li = doc.createElement("li");
+               ul.appendChild(li);
+               select = TableOperations.buildSelectField(doc, li, "f_st_textAlign", "Text alignment:", "fr", "", "Horizontal alignment of text within cell", options, values, new RegExp((selected ? selected : "not set"), "i"));
+               
+               var li = doc.createElement("li");
+               ul.appendChild(li);
+               selected = el ? el.style.verticalAlign : "";
+               (selected.match(/([^\s]*)\s/)) && (selected = RegExp.$1);
+               select = TableOperations.buildSelectField(doc, li, "f_st_vertAlign", "Vertical alignment:", "fr", "", "Vertical alignment of content within cell", ["Not set", "Top", "Middle", "Bottom", "Baseline"], ["not set", "top", "middle", "bottom", "baseline"], new RegExp((selected ? selected : "not set"), "i"));
+               content.appendChild(fieldset);
+       },
+       
+       buildBordersFieldset : function (w, doc, editor, el, content, fieldsetClass) {
+               var nodeName = el ? el.nodeName.toLowerCase() : "table";
+               var select;
+               var selected;
+               var borderFields = [];
+               function setBorderFieldsVisibility(value) {
+                       for (var i = 0; i < borderFields.length; ++i) {
+                               var borderFieldElement = borderFields[i];
+                               borderFieldElement.style.visibility = value ? "hidden" : "visible";
+                               if (!value && (borderFieldElement.nodeName.toLowerCase() == "input")) {
+                                       borderFieldElement.focus();
+                                       borderFieldElement.select();
                                }
                                }
-                               style.textAlign = '"' + ch + '"';
-                       } else {
-                               style.textAlign = (val != "not set") ? val : "";
                        }
                        }
-                       break;
-                   case "f_st_vertAlign":
-                       style.verticalAlign = (val != "not set") ? val : "";
-                       break;
-                   case "f_st_float":
-                       if (HTMLArea.is_ie) { 
-                               style.styleFloat = (val != "not set") ? val : "";
-                       } else { 
-                               style.cssFloat = (val != "not set") ? val : "";
+               };
+               var fieldset = doc.createElement("fieldset");
+               fieldset.className = fieldsetClass;
+               TableOperations.insertLegend(doc, fieldset, "Frame and borders");
+               TableOperations.insertSpace(doc, fieldset);
+                       // Gecko reports "solid solid solid solid" for "border-style: solid".
+                       // That is, "top right bottom left" -- we only consider the first value.
+               var f_st_borderWidth = el ? TableOperations.getLength(el.style.borderWidth) : ((this.properties && this.properties.borderWidth && this.properties.borderWidth.defaultValue) ? this.properties.borderWidth.defaultValue : "");
+               selected = el ? el.style.borderStyle : ((this.properties && this.properties.borderWidth) ? ((this.properties.borderStyle && this.properties.borderStyle.defaultValue) ? this.properties.borderStyle.defaultValue : "solid") : "");
+               (selected.match(/([^\s]*)\s/)) && (selected = RegExp.$1);
+               selectBorderStyle = TableOperations.buildSelectField(doc, fieldset, "f_st_borderStyle", "Border style:", "fr", "floating", "Border style", ["Not set", "No border", "Dotted", "Dashed", "Solid", "Double", "Groove", "Ridge", "Inset", "Outset"], ["not set", "none", "dotted", "dashed", "solid", "double", "groove", "ridge", "inset", "outset"], new RegExp((selected ? selected : "not set"), "i"));
+               selectBorderStyle.onchange = function() { setBorderFieldsVisibility(this.value == "none"); };
+               this.removeOptions(selectBorderStyle, "f_st_borderStyle");
+               TableOperations.buildInput(doc, fieldset, "f_st_borderWidth", "Border width:", "Border width", "pixels", "5", f_st_borderWidth, "fr", "floating", "postlabel", borderFields);
+               TableOperations.insertSpace(doc, fieldset, borderFields);
+               
+               if (nodeName == "table") {
+                       TableOperations.buildColorField(w, doc, editor, fieldset, "", "Color:", "fr", "colorButton", (el ? el.style.borderColor : ""), "borderColor", borderFields);
+                       var label = doc.createElement("label");
+                       label.className = "fl-borderCollapse";
+                       label.htmlFor = "f_st_borderCollapse";
+                       label.innerHTML = "Collapsed borders";
+                       fieldset.appendChild(label);
+                       borderFields.push(label);
+                       var input = doc.createElement("input");
+                       input.className = "checkbox";
+                       input.type = "checkbox";
+                       input.name = "f_st_borderCollapse";
+                       input.id = "f_st_borderCollapse";
+                       input.defaultChecked = el ? /collapse/i.test(el.style.borderCollapse) : false;
+                       input.checked = input.defaultChecked;
+                       fieldset.appendChild(input);
+                       borderFields.push(input);
+                       TableOperations.insertSpace(doc, fieldset, borderFields);
+                       select = TableOperations.buildSelectField(doc, fieldset, "f_frames", "Frames:", "fr", "floating", "Specifies which sides should have a border", ["Not set", "No sides", "The top side only", "The bottom side only", "The top and bottom sides only", "The right and left sides only", "The left-hand side only", "The right-hand side only", "All four sides"], ["not set", "void", "above", "below", "hsides", "vsides", "lhs", "rhs", "box"], new RegExp(((el && el.frame) ? el.frame : "not set"), "i"), borderFields);
+                       TableOperations.insertSpace(doc, fieldset, borderFields);
+                       select = TableOperations.buildSelectField(doc, fieldset, "f_rules", "Rules:", "fr", "floating", "Specifies where rules should be displayed", ["Not set", "No rules", "Rules will appear between rows only", "Rules will appear between columns only", "Rules will appear between all rows and columns"], ["not set", "none", "rows", "cols", "all"], new RegExp(((el && el.rules) ? el.rules : "not set"), "i"), borderFields);
+               } else {
+                       TableOperations.insertSpace(doc, fieldset, borderFields);
+                       TableOperations.buildColorField(w, doc, editor, fieldset, "", "Color:", "fr", "colorButton", (el ? el.style.borderColor : ""), "borderColor", borderFields);
+               }
+               setBorderFieldsVisibility(selectBorderStyle.value == "none");
+               TableOperations.insertSpace(doc, fieldset);
+               content.appendChild(fieldset);
+       },
+       
+       removeOptions : function(select, property) {
+               if (this.properties && this.properties[property] && this.properties[property].removeItems) {
+                       for (var i = select.options.length; --i >= 0;) {
+                               if (this.properties[property].removeItems.indexOf(select.options[i].value) != -1) {
+                                       if (select.options[i].value != select.value) {
+                                               select.options[i] = null;
+                                       }
+                               }
                        }
                        }
-                       break;
-//                 case "f_st_margin":
-//                     style.margin = val + "px";
-//                     break;
-//                 case "f_st_padding":
-//                     style.padding = val + "px";
-//                     break;
                }
        }
                }
        }
+});
+
+TableOperations.getLength = function(value) {
+       var len = parseInt(value);
+       if (isNaN(len)) len = "";
+       return len;
 };
 
 // Returns an HTML element for a widget that allows color selection.  That is,
 };
 
 // Returns an HTML element for a widget that allows color selection.  That is,
@@ -1025,27 +1567,33 @@ TableOperations.createColorButton = function(w, doc, editor, color, name) {
        var span = doc.createElement("span");
        span.className = "chooser";
        span.style.backgroundColor = color;
        var span = doc.createElement("span");
        span.className = "chooser";
        span.style.backgroundColor = color;
+       var space = doc.createTextNode("\xA0");
+       span.appendChild(space);
        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;
        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;
-               var typo3ColorPlugin = editor.plugins.TYPO3Color;
-               if (typo3ColorPlugin) {
-                       typo3ColorPlugin.instance.dialogSelectColor("color", span, field, w);
-               } else { 
-                       editor._popupDialog("select_color.html", function(color) {
-                               if (color) {
-                                       span.style.backgroundColor = "#" + color;
-                                       field.value = "#" + color;
-                               }
-                       }, color, 200, 182, w);
+               var colorPlugin = editor.plugins.TYPO3Color;
+               if (colorPlugin) {
+                 &nbs