Documentation TYPO3 par Ameos |
00001 <?php 00002 /*************************************************************** 00003 * Copyright notice 00004 * 00005 * (c) 2004 Kasper Skaarhoj (kasper@typo3.com) 00006 * (c) 2004 Philipp Borgmann <philipp.borgmann@gmx.de> 00007 * (c) 2004, 2005, 2006 Stanislas Rolland <stanislas.rolland(arobas)fructifor.ca> 00008 * All rights reserved 00009 * 00010 * This script is part of the TYPO3 project. The TYPO3 project is 00011 * free software; you can redistribute it and/or modify 00012 * it under the terms of the GNU General Public License as published by 00013 * the Free Software Foundation; either version 2 of the License, or 00014 * (at your option) any later version. 00015 * 00016 * The GNU General Public License can be found at 00017 * http://www.gnu.org/copyleft/gpl.html. 00018 * A copy is found in the textfile GPL.txt and important notices to the license 00019 * from the author is found in LICENSE.txt distributed with these scripts. 00020 * 00021 * 00022 * This script is distributed in the hope that it will be useful, 00023 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00024 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00025 * GNU General Public License for more details. 00026 * 00027 * This copyright notice MUST APPEAR in all copies of the script! 00028 ***************************************************************/ 00038 require_once(PATH_t3lib.'class.t3lib_rteapi.php'); 00039 require_once(PATH_t3lib.'class.t3lib_cs.php'); 00040 00041 class tx_rtehtmlarea_base extends t3lib_rteapi { 00042 00043 // Configuration of supported browsers 00044 var $conf_supported_browser = array ( 00045 'msie' => array ( 00046 1 => array ( 00047 'version' => 5.5, 00048 'system' => 'win' 00049 ) 00050 ), 00051 'gecko' => array ( 00052 1 => array ( 00053 'version' => 1.3 00054 ) 00055 ), 00056 'safari' => array ( 00057 1 => array ( 00058 'version' => 312 00059 ) 00060 ), 00061 'opera' => array ( 00062 1 => array ( 00063 'version' => 9 00064 ) 00065 ) 00066 ); 00067 00068 // Always hide these toolbar buttons (TYPO3 button name) 00069 var $conf_toolbar_hide = array ( 00070 'showhelp', // Has no content yet 00071 ); 00072 00073 // Hide these toolbar buttons not implemented in Safari 00074 var $conf_toolbar_safari_hide = array ( 00075 'strikethrough', 00076 'line', 00077 'orderedlist', 00078 'unorderedlist', 00079 ); 00080 00081 // Hide these toolbar buttons not implemented in Opera 00082 var $conf_toolbar_opera_hide = array ( 00083 'copy', 00084 'cut', 00085 'paste', 00086 ); 00087 00088 // Always show these toolbar buttons (TYPO3 button name) 00089 var $conf_toolbar_show = array ( 00090 'undo', 00091 'redo', 00092 //'showhelp', 00093 'about', 00094 ); 00095 00096 // The order of the toolbar: the name is the TYPO3-button name 00097 var $defaultToolbarOrder; 00098 00099 // The default hotkeys: the name is the TYPO3-button name 00100 var $defaultHotKeyList = 'selectall, bold, italic, underline, strikethrough, left, center, right, justifyfull, formatblock, paste, cleanword, undo, redo'; 00101 00102 // Conversion array: TYPO3 button names to htmlArea button names 00103 var $conf_toolbar_convert = array ( 00104 // 'TYPO3 name' => 'htmlArea name' 00105 'fontstyle' => 'FontName', 00106 'fontsize' => 'FontSize', 00107 'textcolor' => 'ForeColor', 00108 'bgcolor' => 'HiliteColor', 00109 'bold' => 'Bold', 00110 'italic' => 'Italic', 00111 'underline' => 'Underline', 00112 'left' => 'JustifyLeft', 00113 'center' => 'JustifyCenter', 00114 'right' => 'JustifyRight', 00115 'orderedlist' => 'InsertOrderedList', 00116 'unorderedlist' => 'InsertUnorderedList', 00117 'outdent' => 'Outdent', 00118 'indent' => 'Indent', 00119 'emoticon' => 'InsertSmiley', 00120 'line' => 'InsertHorizontalRule', 00121 'link' => 'CreateLink', 00122 'table' => 'InsertTable', 00123 'image' => 'InsertImage', 00124 'cut' => 'Cut', 00125 'copy' => 'Copy', 00126 'paste' => 'Paste', 00127 'formatblock' => 'FormatBlock', 00128 'chMode' => 'HtmlMode', 00129 'user' => 'UserElements', 00130 00131 // htmlArea extra buttons 00132 'lefttoright' => 'LeftToRight', 00133 'righttoleft' => 'RightToLeft', 00134 'justifyfull' => 'JustifyFull', 00135 'strikethrough' => 'StrikeThrough', 00136 'superscript' => 'Superscript', 00137 'subscript' => 'Subscript', 00138 'showhelp' => 'ShowHelp', 00139 'insertcharacter' => 'InsertCharacter', 00140 'findreplace' => 'FindReplace', 00141 'spellcheck' => 'SpellCheck', 00142 'removeformat' => 'RemoveFormat', 00143 'inserttag' => 'InsertTag', 00144 'acronym' => 'Acronym', 00145 'splitblock' => 'SplitBlock', 00146 'blockstylelabel' => 'I[style]', 00147 'blockstyle' => 'DynamicCSS-class', 00148 'textstylelabel' => 'I[text_style]', 00149 'textstyle' => 'InlineCSS-class', 00150 'toggleborders' => 'TO-toggle-borders', 00151 'tableproperties' => 'TO-table-prop', 00152 'rowproperties' => 'TO-row-prop', 00153 'rowinsertabove' => 'TO-row-insert-above', 00154 'rowinsertunder' => 'TO-row-insert-under', 00155 'rowdelete' => 'TO-row-delete', 00156 'rowsplit' => 'TO-row-split', 00157 'columninsertbefore' => 'TO-col-insert-before', 00158 'columninsertafter' => 'TO-col-insert-after', 00159 'columndelete' => 'TO-col-delete', 00160 'columnsplit' => 'TO-col-split', 00161 'cellproperties' => 'TO-cell-prop', 00162 'cellinsertbefore' => 'TO-cell-insert-before', 00163 'cellinsertafter' => 'TO-cell-insert-after', 00164 'celldelete' => 'TO-cell-delete', 00165 'cellsplit' => 'TO-cell-split', 00166 'cellmerge' => 'TO-cell-merge', 00167 00168 // Toolbar formating 00169 'space' => 'space', 00170 'bar' => 'separator', 00171 'linebreak' => 'linebreak', 00172 00173 // Always show 00174 'undo' => 'Undo', 00175 'redo' => 'Redo', 00176 'textindicator' => 'TextIndicator', 00177 'about' => 'About', 00178 ); 00179 00180 var $defaultParagraphs = array( 00181 'p' => 'Normal', 00182 'h1' => 'Heading 1', 00183 'h2' => 'Heading 2', 00184 'h3' => 'Heading 3', 00185 'h4' => 'Heading 4', 00186 'h5' => 'Heading 5', 00187 'h6' => 'Heading 6', 00188 'pre' => 'Preformatted', 00189 'address' => 'Address', 00190 ); 00191 00192 var $defaultFontFaces = array( 00193 'Arial' => 'Arial,sans-serif', 00194 'Arial Black' => 'Arial Black,sans-serif', 00195 'Verdana' => 'Verdana,Arial,sans-serif', 00196 'Times New Roman' => 'Times New Roman,Times,serif', 00197 'Garamond' => 'Garamond', 00198 'Lucida Handwriting' => 'Lucida Handwriting', 00199 'Courier' => 'Courier', 00200 'Webdings' => 'Webdings', 00201 'Wingdings' => 'Wingdings', 00202 ); 00203 00204 var $defaultFontSizes = array( 00205 '1' => '1 (8 pt)', 00206 '2' => '2 (10 pt)', 00207 '3' => '3 (12 pt)', 00208 '4' => '4 (14 pt)', 00209 '5' => '5 (18 pt)', 00210 '6' => '6 (24 pt)', 00211 '7' => '7 (36 pt)', 00212 ); 00213 00214 var $defaultFontSizes_safari = array( 00215 '1' => 'xx-small', 00216 '2' => 'x-small', 00217 '3' => 'small', 00218 '4' => 'medium', 00219 '5' => 'large', 00220 '6' => 'x-large', 00221 '7' => 'xx-large', 00222 ); 00223 00224 var $pluginList = 'TableOperations, ContextMenu, SpellChecker, SelectColor, TYPO3Browsers, InsertSmiley, FindReplace, RemoveFormat, CharacterMap, QuickTag, InlineCSS, DynamicCSS, UserElements, Acronym, TYPO3HtmlParser'; 00225 00226 var $pluginButton = array( 00227 'InlineCSS' => 'textstyle', 00228 'DynamicCSS' => 'blockstyle', 00229 'SpellChecker' => 'spellcheck', 00230 'InsertSmiley' => 'emoticon', 00231 'FindReplace' => 'findreplace', 00232 'RemoveFormat' => 'removeformat', 00233 'QuickTag' => 'inserttag', 00234 'CharacterMap' => 'insertcharacter', 00235 'TableOperations' => 'table, toggleborders, tableproperties, rowproperties, rowinsertabove, rowinsertunder, rowdelete, rowsplit, 00236 columninsertbefore, columninsertafter, columndelete, columnsplit, 00237 cellproperties, cellinsertbefore, cellinsertafter, celldelete, cellsplit, cellmerge', 00238 'UserElements' => 'user', 00239 'Acronym' => 'acronym', 00240 ); 00241 00242 var $pluginLabel = array( 00243 'InlineCSS' => 'textstylelabel', 00244 'DynamicCSS' => 'blockstylelabel', 00245 ); 00246 00247 var $spellCheckerModes = array( 'ultra', 'fast', 'normal', 'bad-spellers'); 00248 00249 // External: 00250 var $RTEdivStyle; // Alternative style for RTE <div> tag. 00251 var $extHttpPath; // full Path to this extension for http (so no Server path). It ends with "/" 00252 var $siteURL; // TYPO3 site url 00253 var $hostURL; // TYPO3 host url 00254 var $typoVersion; // Typo3 version 00255 00256 // Internal, static: 00257 var $ID = 'rtehtmlarea'; // Identifies the RTE as being the one from the "rte" extension if any external code needs to know... 00258 var $debugMode = FALSE; // If set, the content goes into a regular TEXT area field - for developing testing of transformations. (Also any browser will load the field!) 00259 00260 // For the editor 00261 var $client; 00262 var $TCEform; 00263 var $elementId; 00264 var $elementParts; 00265 var $tscPID; 00266 var $typeVal; 00267 var $thePid; 00268 var $RTEsetup; 00269 var $thisConfig; 00270 var $confValues; 00271 var $language; 00272 var $BECharset; 00273 var $OutputCharset; 00274 var $editorCSS; 00275 var $spellCheckerLanguage; 00276 var $spellCheckerCharset; 00277 var $spellCheckerMode; 00278 var $quickTagHideTags; 00279 var $specConf; 00280 var $toolBar = array(); // Save the buttons for the toolbar 00281 var $toolbar_level_size; // The size for each level in the toolbar: 00282 var $toolbarOrderArray = array(); 00283 var $pluginEnableList; 00284 var $pluginEnableArray = array(); 00285 00293 function isAvailable() { 00294 global $TYPO3_CONF_VARS; 00295 00296 $this->client = $this->clientInfo(); 00297 $this->errorLog = array(); 00298 if (!$this->debugMode) { // If debug-mode, let any browser through 00299 $rteIsAvailable = 0; 00300 $rteConfBrowser = $this->conf_supported_browser; 00301 if (!$TYPO3_CONF_VARS['EXTCONF']['rtehtmlarea']['enableInOpera9']) unset($rteConfBrowser['opera']); 00302 if (is_array($rteConfBrowser)) { 00303 reset($rteConfBrowser); 00304 while(list ($browser, $browserConf) = each($rteConfBrowser)){ 00305 if ($browser == $this->client['BROWSER']) { 00306 // Config for Browser found, check it: 00307 if (is_array($browserConf)) { 00308 reset($browserConf); 00309 while(list ($browserConfNr, $browserConfSub) = each($browserConf)){ 00310 if ($browserConfSub['version'] <= $this->client['VERSION'] || empty($browserConfSub['version'])) { 00311 // Version is correct 00312 if ($browserConfSub['system'] == $this->client['SYSTEM'] || empty($browserConfSub['system'])) { 00313 // System is correctly 00314 $rteIsAvailable = 1; 00315 }// End of System 00316 }// End of Version 00317 }// End of while-BrowserSubpart 00318 } else { 00319 // no config for this browser found, so all versions or system with this browsers are allow 00320 $rteIsAvailable = 1; 00321 } 00322 } // End of Browser Check 00323 } // while: Browser Check 00324 } else { 00325 // no Browser config for this RTE-Editor, so all Clients are allow 00326 } 00327 if (!$rteIsAvailable) { 00328 $this->errorLog[] = 'rte: Browser not supported. Only msie Version 5 or higher and Mozilla based client 1. and higher.'; 00329 } 00330 if (t3lib_div::int_from_ver(TYPO3_version) < 3007000) { 00331 $rteIsAvailable = 0; 00332 $this->errorLog[] = 'rte: This version of htmlArea RTE cannot run under this version of TYPO3.'; 00333 } 00334 } 00335 if ($rteIsAvailable) return true; 00336 } 00337 00354 function drawRTE(&$pObj,$table,$field,$row,$PA,$specConf,$thisConfig,$RTEtypeVal,$RTErelPath,$thePidValue) { 00355 global $BE_USER,$LANG, $TYPO3_DB, $TYPO3_CONF_VARS; 00356 00357 $this->TCEform = $pObj; 00358 $inline =& $this->TCEform->inline; 00359 00360 $LANG->includeLLFile('EXT:' . $this->ID . '/locallang.xml'); 00361 $this->client = $this->clientInfo(); 00362 $this->typoVersion = t3lib_div::int_from_ver(TYPO3_version); 00363 $this->userUid = 'BE_' . $BE_USER->user['uid']; 00364 00365 // Draw form element: 00366 if ($this->debugMode) { // Draws regular text area (debug mode) 00367 $item = parent::drawRTE($pObj,$table,$field,$row,$PA,$specConf,$thisConfig,$RTEtypeVal,$RTErelPath,$thePidValue); 00368 } else { // Draw real RTE 00369 00370 /* ======================================= 00371 * INIT THE EDITOR-SETTINGS 00372 * ======================================= 00373 */ 00374 00375 // first get the http-path to typo3: 00376 $this->httpTypo3Path = substr( substr( t3lib_div::getIndpEnv('TYPO3_SITE_URL'), strlen( t3lib_div::getIndpEnv('TYPO3_REQUEST_HOST') ) ), 0, -1 ); 00377 if (strlen($this->httpTypo3Path) == 1) { 00378 $this->httpTypo3Path = '/'; 00379 } else { 00380 $this->httpTypo3Path .= '/'; 00381 } 00382 // Get the path to this extension: 00383 $this->extHttpPath = $this->httpTypo3Path . t3lib_extMgm::siteRelPath($this->ID); 00384 // Get the site URL 00385 $this->siteURL = t3lib_div::getIndpEnv('TYPO3_SITE_URL'); 00386 // Get the host URL 00387 $this->hostURL = t3lib_div::getIndpEnv('TYPO3_REQUEST_HOST'); 00388 00389 // Element ID + pid 00390 $this->elementId = $PA['itemFormElName']; // Form element name 00391 $this->elementParts = explode('][',ereg_replace('\]$','',ereg_replace('^(TSFE_EDIT\[data\]\[|data\[)','',$this->elementId))); 00392 00393 // Find the page PIDs: 00394 list($this->tscPID,$this->thePid) = t3lib_BEfunc::getTSCpid(trim($this->elementParts[0]),trim($this->elementParts[1]),$thePidValue); 00395 00396 // Record "types" field value: 00397 $this->typeVal = $RTEtypeVal; // TCA "types" value for record 00398 00399 // Find "thisConfig" for record/editor: 00400 unset($this->RTEsetup); 00401 $this->RTEsetup = $BE_USER->getTSConfig('RTE',t3lib_BEfunc::getPagesTSconfig($this->tscPID)); 00402 $this->thisConfig = $thisConfig; 00403 00404 // Special configuration and default extras: 00405 $this->specConf = $specConf; 00406 00407 if ($this->thisConfig['forceHTTPS']) { 00408 $this->httpTypo3Path = preg_replace('/^(http|https)/', 'https', $this->httpTypo3Path); 00409 $this->extHttpPath = preg_replace('/^(http|https)/', 'https', $this->extHttpPath); 00410 $this->siteURL = preg_replace('/^(http|https)/', 'https', $this->siteURL); 00411 $this->hostURL = preg_replace('/^(http|https)/', 'https', $this->hostURL); 00412 } 00413 00414 /* ======================================= 00415 * LANGUAGES & CHARACTER SETS 00416 * ======================================= 00417 */ 00418 00419 // Languages: interface and content 00420 $this->language = $LANG->lang; 00421 if ($this->language=='default' || !$this->language) { 00422 $this->language='en'; 00423 } 00424 $this->contentTypo3Language = $this->language; 00425 00426 $this->contentLanguageUid = ($row['sys_language_uid'] > 0) ? $row['sys_language_uid'] : 0; 00427 if (t3lib_extMgm::isLoaded('static_info_tables')) { 00428 if ($this->contentLanguageUid) { 00429 $tableA = 'sys_language'; 00430 $tableB = 'static_languages'; 00431 $languagesUidsList = $this->contentLanguageUid; 00432 $selectFields = $tableA . '.uid,' . $tableB . '.lg_iso_2,' . $tableB . '.lg_country_iso_2,' . $tableB . '.lg_typo3'; 00433 $tableAB = $tableA . ' LEFT JOIN ' . $tableB . ' ON ' . $tableA . '.static_lang_isocode=' . $tableB . '.uid'; 00434 $whereClause = $tableA . '.uid IN (' . $languagesUidsList . ') '; 00435 $whereClause .= t3lib_BEfunc::BEenableFields($tableA); 00436 $whereClause .= t3lib_BEfunc::deleteClause($tableA); 00437 $res = $TYPO3_DB->exec_SELECTquery($selectFields, $tableAB, $whereClause); 00438 while($languageRow = $TYPO3_DB->sql_fetch_assoc($res)) { 00439 $this->contentISOLanguage = strtolower(trim($languageRow['lg_iso_2']).(trim($languageRow['lg_country_iso_2'])?'_'.trim($languageRow['lg_country_iso_2']):'')); 00440 $this->contentTypo3Language = strtolower(trim($languageRow['lg_typo3'])); 00441 } 00442 } else { 00443 $this->contentISOLanguage = trim($TYPO3_CONF_VARS['EXTCONF'][$this->ID]['defaultDictionary']) ? trim($TYPO3_CONF_VARS['EXTCONF'][$this->ID]['defaultDictionary']) : 'en'; 00444 $selectFields = 'lg_iso_2, lg_typo3'; 00445 $tableAB = 'static_languages'; 00446 $whereClause = 'lg_iso_2 = ' . $TYPO3_DB->fullQuoteStr(strtoupper($this->contentISOLanguage), $tableAB); 00447 $res = $TYPO3_DB->exec_SELECTquery($selectFields, $tableAB, $whereClause); 00448 while($languageRow = $TYPO3_DB->sql_fetch_assoc($res)) { 00449 $this->contentTypo3Language = strtolower(trim($languageRow['lg_typo3'])); 00450 } 00451 } 00452 } 00453 00454 // Character sets: interface and content 00455 $this->charset = $LANG->csConvObj->charSetArray[$this->language]; 00456 $this->charset = $this->charset ? $this->charset : 'iso-8859-1'; 00457 $this->BECharset = trim($TYPO3_CONF_VARS['BE']['forceCharset']) ? trim($TYPO3_CONF_VARS['BE']['forceCharset']) : $this->charset; 00458 $this->OutputCharset = $this->BECharset; 00459 00460 $this->contentCharset = $LANG->csConvObj->charSetArray[$this->contentTypo3Language]; 00461 $this->contentCharset = $this->contentCharset ? $this->contentCharset : 'iso-8859-1'; 00462 $this->origContentCharSet = $this->contentCharset; 00463 $this->contentCharset = (trim($TYPO3_CONF_VARS['BE']['forceCharset']) ? trim($TYPO3_CONF_VARS['BE']['forceCharset']) : $this->contentCharset); 00464 00465 /* ======================================= 00466 * TOOLBAR CONFIGURATION 00467 * ======================================= 00468 */ 00469 00470 // htmlArea plugins list 00471 $this->pluginEnableArray = array_intersect(t3lib_div::trimExplode(',', $this->pluginList , 1), t3lib_div::trimExplode(',', $TYPO3_CONF_VARS['EXTCONF'][$this->ID]['HTMLAreaPluginList'], 1)); 00472 $hidePlugins = array(); 00473 if(!t3lib_extMgm::isLoaded('static_info_tables') || in_array($this->language, t3lib_div::trimExplode(',', $TYPO3_CONF_VARS['EXTCONF'][$this->ID]['noSpellCheckLanguages']))) $hidePlugins[] = 'SpellChecker'; 00474 if ($this->client['BROWSER'] == 'msie') $hidePlugins[] = 'Acronym'; 00475 if ($this->client['BROWSER'] == 'opera') { 00476 $hidePlugins[] = 'ContextMenu'; 00477 $this->thisConfig['hideTableOperationsInToolbar'] = 0; 00478 $this->thisConfig['disableEnterParagraphs'] = 1; 00479 } 00480 $this->pluginEnableArray = array_diff($this->pluginEnableArray, $hidePlugins); 00481 $this->pluginEnableArrayMultiple = $this->pluginEnableArray; 00482 00483 // Toolbar 00484 $this->setToolBar(); 00485 00486 // Check if some plugins need to be disabled 00487 $this->setPlugins(); 00488 00489 /* ======================================= 00490 * PLUGIN-SPECIFIC CONFIGURATION 00491 * ======================================= 00492 */ 00493 00494 if ($this->isPluginEnable('SpellChecker')) { 00495 // Set the language of the content for the SpellChecker 00496 $this->spellCheckerLanguage = $this->contentISOLanguage; 00497 $this->spellCheckerTypo3Language = $this->contentTypo3Language; 00498 00499 // Set the charset of the content for the SpellChecker 00500 $this->spellCheckerCharset = $this->contentCharset; 00501 $this->spellCheckerCharset = trim($TYPO3_CONF_VARS['BE']['forceCharset']) ? trim($TYPO3_CONF_VARS['BE']['forceCharset']) : $this->spellCheckerCharset; 00502 00503 // Set the SpellChecker mode 00504 $this->spellCheckerMode = isset($BE_USER->userTS['options.']['HTMLAreaPspellMode']) ? trim($BE_USER->userTS['options.']['HTMLAreaPspellMode']) : 'normal'; 00505 if( !in_array($this->spellCheckerMode, $this->spellCheckerModes)) { 00506 $this->spellCheckerMode = 'normal'; 00507 } 00508 00509 // Set the use of personal dictionary 00510 $this->spellCheckerPersonalDicts = $this->thisConfig['enablePersonalDicts'] ? (isset($BE_USER->userTS['options.']['enablePersonalDicts']) ? true : false) : false; 00511 if (ini_get('safe_mode')) { 00512 $this->spellCheckerPersonalDicts = false; 00513 } 00514 } 00515 00516 /* ======================================= 00517 * SET STYLES 00518 * ======================================= 00519 */ 00520 00521 $RTEWidth = isset($BE_USER->userTS['options.']['RTESmallWidth']) ? $BE_USER->userTS['options.']['RTESmallWidth'] : '530'; 00522 $RTEHeight = isset($BE_USER->userTS['options.']['RTESmallHeight']) ? $BE_USER->userTS['options.']['RTESmallHeight'] : '380'; 00523 $RTEWidth = $RTEWidth + ($pObj->docLarge ? (isset($BE_USER->userTS['options.']['RTELargeWidthIncrement']) ? $BE_USER->userTS['options.']['RTELargeWidthIncrement'] : '150') : 0); 00524 $RTEWidth -= ($inline->getStructureDepth() > 0 ? ($inline->getStructureDepth()+1)*$inline->getLevelMargin() : 0); 00525 $RTEHeight = $RTEHeight + ($pObj->docLarge ? (isset($BE_USER->userTS['options.']['RTELargeHeightIncrement']) ? $BE_USER->userTS['options.']['RTELargeHeightIncrement'] : 0) : 0); 00526 $editorWrapWidth = $RTEWidth . 'px'; 00527 $editorWrapHeight = $RTEHeight . 'px'; 00528 $this->RTEdivStyle = $this->RTEdivStyle ? $this->RTEdivStyle : 'position:relative; left:0px; top:0px; height:' . $RTEHeight . 'px; width:'.$RTEWidth.'px; border: 1px solid black; padding: 2px 0px 2px 2px;'; 00529 $this->toolbar_level_size = $RTEWidth; 00530 00531 /* ======================================= 00532 * LOAD CSS AND JAVASCRIPT 00533 * ======================================= 00534 */ 00535 00536 // Preloading the pageStyle 00537 $filename = trim($this->thisConfig['contentCSS']) ? trim($this->thisConfig['contentCSS']) : 'EXT:' . $this->ID . '/htmlarea/plugins/DynamicCSS/dynamiccss.css'; 00538 $pObj->additionalCode_pre['loadCSS'] = ' 00539 <link rel="alternate stylesheet" type="text/css" href="' . $this->getFullFileName($filename) . '" />'; 00540 00541 // Loading the editor skin 00542 $skinFilename = trim($this->thisConfig['skin']) ? trim($this->thisConfig['skin']) : 'EXT:' . $this->ID . '/htmlarea/skins/default/htmlarea.css'; 00543 if($this->client['BROWSER'] == 'gecko' && $this->client['VERSION'] == '1.3' && substr($skinFilename,0,4) == 'EXT:') { 00544 $skinFilename = 'EXT:' . $this->ID . '/htmlarea/skins/default/htmlarea.css'; 00545 } 00546 if (substr($skinFilename,0,4) == 'EXT:') { // extension 00547 list($extKey,$local) = explode('/',substr($skinFilename,4),2); 00548 $skinFilename=''; 00549 if (strcmp($extKey,'') && t3lib_extMgm::isLoaded($extKey) && strcmp($local,'')) { 00550 $skinFilename = $this->httpTypo3Path . t3lib_extMgm::siteRelPath($extKey) . $local; 00551 $skinDir = $this->siteURL . t3lib_extMgm::siteRelPath($extKey) . dirname($local); 00552 } 00553 } elseif (substr($skinFilename,0,1) != '/') { 00554 $skinDir = $this->siteURL.dirname($skinFilename); 00555 $skinFilename = $this->siteURL . $skinFilename; 00556 } else { 00557 $skinDir = substr($this->siteURL,0,-1) . dirname($skinFilename); 00558 } 00559 $this->editorCSS = $skinFilename; 00560 $this->editedContentCSS = $skinDir . '/htmlarea-edited-content.css'; 00561 $pObj->additionalCode_pre['loadCSS'] .= ' 00562 <link rel="alternate stylesheet" type="text/css" href="' . $this->editedContentCSS . '" />'; 00563 00564 $pObj->additionalCode_pre['loadCSS'] .= ' 00565 <link rel="stylesheet" type="text/css" href="' . $this->editorCSS . '" />'; 00566 00567 // Loading JavaScript files and code 00568 $pObj->additionalCode_pre['loadJSfiles'] = $this->loadJSfiles($pObj->RTEcounter); 00569 $pObj->additionalJS_pre['loadJScode'] = $this->loadJScode($pObj->RTEcounter); 00570 00571 /* ======================================= 00572 * DRAW THE EDITOR 00573 * ======================================= 00574 */ 00575 00576 // Transform value: 00577 $value = $this->transformContent('rte',$PA['itemFormElValue'],$table,$field,$row,$specConf,$thisConfig,$RTErelPath,$thePidValue); 00578 00579 // Change some tags 00580 if ($this->client['BROWSER'] == 'gecko') { 00581 // change <strong> to <b> 00582 $value = preg_replace('/<(\/?)strong/i', "<$1b", $value); 00583 // change <em> to <i> 00584 $value = preg_replace('/<(\/?)em([^b>]*>)/i', "<$1i$2", $value); 00585 } 00586 if ($this->client['BROWSER'] == 'msie') { 00587 // change <abbr> to <acronym> 00588 $value = preg_replace('/<(\/?)abbr/i', "<$1acronym", $value); 00589 } 00590 00591 // Register RTE windows 00592 $pObj->RTEwindows[] = $PA['itemFormElName']; 00593 00594 // Check if wizard_rte called this for fullscreen edtition; if so, change the size of the RTE to fullscreen using JS 00595 if (basename(PATH_thisScript) == 'wizard_rte.php') { 00596 $height = 'window.innerHeight'; 00597 $width = 'window.innerWidth'; 00598 if ($this->client['BROWSER'] == 'msie') { 00599 $height = 'document.body.offsetHeight'; 00600 $width = 'document.body.offsetWidth'; 00601 } 00602 $editorWrapWidth = '100%'; 00603 $editorWrapHeight = '100%'; 00604 $this->RTEdivStyle = 'position:relative; left:0px; top:0px; height:100%; width:100%; border: 1px solid black; padding: 2px 0px 2px 2px;'; 00605 $pObj->additionalJS_post[] = $this->setRTEsizeByJS('RTEarea'.$pObj->RTEcounter, $height, $width); 00606 } 00607 00608 // Register RTE in JS: 00609 $pObj->additionalJS_post[] = $this->registerRTEinJS($pObj->RTEcounter, $table, $row['uid'], $field); 00610 00611 // Set the save option for the RTE: 00612 $pObj->additionalJS_submit[] = $this->setSaveRTE($pObj->RTEcounter, $pObj->formName, htmlspecialchars($PA['itemFormElName'])); 00613 00614 // Draw the textarea 00615 $visibility = 'hidden'; 00616 $item = $this->triggerField($PA['itemFormElName']).' 00617 <div id="pleasewait' . $pObj->RTEcounter . '" class="pleasewait" style="display: none;" >' . $LANG->getLL('Please wait') . '</div> 00618 <div id="editorWrap' . $pObj->RTEcounter . '" class="editorWrap" style="width:' . $editorWrapWidth . '; height:' . $editorWrapHeight . ';"> 00619 <textarea id="RTEarea'.$pObj->RTEcounter.'" name="'.htmlspecialchars($PA['itemFormElName']).'" style="'.t3lib_div::deHSCentities(htmlspecialchars($this->RTEdivStyle)).'">'.t3lib_div::formatForTextarea($value).'</textarea> 00620 </div>' . ($TYPO3_CONF_VARS['EXTCONF'][$this->ID]['enableDebugMode'] ? '<div id="HTMLAreaLog"></div>' : '') . ' 00621 '; 00622 } 00623 00624 // Return form item: 00625 return $item; 00626 } 00627 00633 function setToolBar() { 00634 global $BE_USER; 00635 00636 $this->defaultToolbarOrder = 'bar, blockstylelabel, blockstyle, space, textstylelabel, textstyle, linebreak, 00637 bar, fontstyle, space, fontsize, space, formatblock, 00638 bar, bold, italic, underline, strikethrough, subscript, superscript, 00639 bar, lefttoright, righttoleft, bar, left, center, right, justifyfull, 00640 bar, orderedlist, unorderedlist, outdent, indent, bar, textcolor, bgcolor, textindicator, 00641 bar, emoticon, insertcharacter, line, link, 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, 00642 bar, chMode, inserttag, removeformat, bar, copy, cut, paste, bar, undo, redo, bar, showhelp, about, linebreak, 00643 ' . ($this->thisConfig['hideTableOperationsInToolbar'] ? '': 'bar, toggleborders,') . ' bar, tableproperties, bar, rowproperties, rowinsertabove, rowinsertunder, rowdelete, rowsplit, bar, 00644 columninsertbefore, columninsertafter, columndelete, columnsplit, bar, 00645 cellproperties, cellinsertbefore, cellinsertafter, celldelete, cellsplit, cellmerge'; 00646 00647 // Special toolbar for Mozilla Wamcom on Mac OS 9 00648 if($this->client['BROWSER'] == 'gecko' && $this->client['VERSION'] == '1.3') { 00649 $this->defaultToolbarOrder = $this->TCEform->docLarge ? 'bar, blockstylelabel, blockstyle, space, textstylelabel, textstyle, linebreak, 00650 bar, fontstyle, space, fontsize, space, formatblock, bar, bold, italic, underline, strikethrough, 00651 subscript, superscript, lefttoright, righttoleft, bar, left, center, right, justifyfull, linebreak, 00652 bar, orderedlist, unorderedlist, outdent, indent, bar, textcolor, bgcolor, textindicator, bar, emoticon, 00653 insertcharacter, line, link, image, table, user, acronym, bar, findreplace, spellcheck, bar, chMode, inserttag, 00654 removeformat, bar, copy, cut, paste, bar, undo, redo, bar, showhelp, about, linebreak, 00655 bar, toggleborders, bar, tableproperties, bar, rowproperties, rowinsertabove, rowinsertunder, rowdelete, rowsplit, bar, 00656 columninsertbefore, columninsertafter, columndelete, columnsplit, bar, 00657 cellproperties, cellinsertbefore, cellinsertafter, celldelete, cellsplit, cellmerge' 00658 : 'bar, blockstylelabel, blockstyle, space, textstylelabel, textstyle, linebreak, 00659 bar, fontstyle, space, fontsize, space, formatblock, bar, bold, italic, underline, strikethrough, 00660 subscript, superscript, linebreak, bar, lefttoright, righttoleft, bar, left, center, right, justifyfull, 00661 orderedlist, unorderedlist, outdent, indent, bar, textcolor, bgcolor, textindicator, bar, emoticon, 00662 insertcharacter, line, link, image, table, user, acronym, linebreak, bar, findreplace, spellcheck, bar, chMode, inserttag, 00663 removeformat, bar, copy, cut, paste, bar, undo, redo, bar, showhelp, about, linebreak, 00664 bar, toggleborders, bar, tableproperties, bar, rowproperties, rowinsertabove, rowinsertunder, rowdelete, rowsplit, bar, 00665 columninsertbefore, columninsertafter, columndelete, columnsplit, bar, 00666 cellproperties, cellinsertbefore, cellinsertafter, celldelete, cellsplit, cellmerge'; 00667 } 00668 $toolbarOrder = $this->thisConfig['toolbarOrder'] ? $this->thisConfig['toolbarOrder'] : $this->defaultToolbarOrder; 00669 00670 // Getting rid of undefined buttons 00671 $this->toolbarOrderArray = array_intersect(t3lib_div::trimExplode(',', $toolbarOrder, 1), t3lib_div::trimExplode(',', $this->defaultToolbarOrder, 1)); 00672 $toolbarOrder = array_unique(array_values($this->toolbarOrderArray)); 00673 00674 // Fetching specConf for field from backend 00675 $pList = is_array($this->specConf['richtext']['parameters']) ? implode(',',$this->specConf['richtext']['parameters']) : ''; 00676 if ($pList != '*') { // If not all 00677 $show = is_array($this->specConf['richtext']['parameters']) ? $this->specConf['richtext']['parameters'] : array(); 00678 if ($this->thisConfig['showButtons']) { 00679 if (!t3lib_div::inList($this->thisConfig['showButtons'],'*')) { 00680 $show = array_unique(array_merge($show,t3lib_div::trimExplode(',',$this->thisConfig['showButtons'],1))); 00681 } else { 00682 $show = array_unique(array_merge($show, $toolbarOrder)); 00683 } 00684 } 00685 if (is_array($this->thisConfig['showButtons.'])) { 00686 reset($this->thisConfig['showButtons.']); 00687 while(list($button,$value) = each($this->thisConfig['showButtons.'])) { 00688 if ($value) $show[] = $button; 00689 } 00690 $show = array_unique($show); 00691 } 00692 } else { 00693 $show = $toolbarOrder; 00694 } 00695 00696 // Resticting to RTEkeyList for backend user 00697 if(is_object($BE_USER)) { 00698 $RTEkeyList = isset($BE_USER->userTS['options.']['RTEkeyList']) ? $BE_USER->userTS['options.']['RTEkeyList'] : '*'; 00699 if ($RTEkeyList != '*') { // If not all 00700 $show = array_intersect($show, t3lib_div::trimExplode(',',$RTEkeyList,1)); 00701 } 00702 } 00703 00704 // Hiding buttons of disabled plugins 00705 $hideButtons = array('space', 'bar', 'linebreak'); 00706 reset($this->pluginButton); 00707 while(list($plugin, $buttonList) = each($this->pluginButton) ) { 00708 if(!$this->isPluginEnable($plugin)) { 00709 $buttonArray = t3lib_div::trimExplode(',',$buttonList,1); 00710 foreach($buttonArray as $button) { 00711 $hideButtons[] = $button; 00712 } 00713 } 00714 } 00715 00716 // Hiding labels of disabled plugins 00717 reset($this->pluginLabel); 00718 while(list($plugin, $label) = each($this->pluginLabel) ) { 00719 if(!$this->isPluginEnable($plugin)) $hideButtons[] = $label; 00720 } 00721 00722 // Hiding buttons not implemented in Safari 00723 if ($this->client['BROWSER'] == 'safari') { 00724 reset($this->conf_toolbar_safari_hide); 00725 while(list(, $button) = each($this->conf_toolbar_safari_hide) ) { 00726 $hideButtons[] = $button; 00727 } 00728 } 00729 00730 // Hiding buttons not implemented in Opera 00731 if ($this->client['BROWSER'] == 'opera') { 00732 reset($this->conf_toolbar_opera_hide); 00733 while(list(, $button) = each($this->conf_toolbar_opera_hide) ) { 00734 $hideButtons[] = $button; 00735 } 00736 } 00737 00738 // Hiding the buttons 00739 $show = array_diff($show, $this->conf_toolbar_hide, $hideButtons, t3lib_div::trimExplode(',',$this->thisConfig['hideButtons'],1)); 00740 00741 // Adding the always show buttons 00742 $show = array_unique(array_merge($show, $this->conf_toolbar_show)); 00743 $toolbarOrder = array_unique(array_merge($toolbarOrder, $this->conf_toolbar_show)); 00744 reset($this->conf_toolbar_show); 00745 while(list(,$button) = each($this->conf_toolbar_show)) { 00746 if(!in_array($button, $this->toolbarOrderArray)) $this->toolbarOrderArray[] = $button; 00747 } 00748 00749 // Getting rid of the buttons for which we have no position 00750 $show = array_intersect($show, $toolbarOrder); 00751 $this->toolBar = $show; 00752 } 00753 00759 function setPlugins() { 00760 global $TYPO3_CONF_VARS; 00761 00762 $hideButtons = array(); 00763 // Disabling the plugins if their buttons are not in the toolbar 00764 $hidePlugins = array(); 00765 reset($this->pluginButton); 00766 while(list($plugin, $buttonList) = each($this->pluginButton) ) { 00767 $buttonArray = t3lib_div::trimExplode(',',$buttonList,1); 00768 if(!in_array($buttonArray[0],$this->toolBar)) { 00769 $hidePlugins[] = $plugin; 00770 foreach($buttonArray as $button) { 00771 $hideButtons[] = $button; 00772 } 00773 } 00774 } 00775 00776 if($this->thisConfig['disableContextMenu'] || $this->thisConfig['disableRightClick']) $hidePlugins[] = 'ContextMenu'; 00777 if($this->thisConfig['disableSelectColor']) $hidePlugins[] = 'SelectColor'; 00778 if($this->thisConfig['disableTYPO3Browsers']) $hidePlugins[] = 'TYPO3Browsers'; 00779 if(!$this->thisConfig['enableWordClean'] || !is_array($this->thisConfig['enableWordClean.'])) $hidePlugins[] = 'TYPO3HtmlParser'; 00780 if(!t3lib_extMgm::isLoaded('static_info_tables') || in_array($this->language, t3lib_div::trimExplode(',', $TYPO3_CONF_VARS['EXTCONF'][$this->ID]['noSpellCheckLanguages']))) $hidePlugins[] = 'SpellChecker'; 00781 00782 $this->pluginEnableArray = array_diff($this->pluginEnableArray, $hidePlugins); 00783 00784 // Hiding labels of disabled plugins 00785 reset($this->pluginLabel); 00786 while(list($plugin, $label) = each($this->pluginLabel) ) { 00787 if(!$this->isPluginEnable($plugin)) $hideButtons[] = $label; 00788 } 00789 $this->toolBar = array_diff($this->toolBar, $hideButtons); 00790 00791 // Renaming buttons of replacement plugins 00792 if( $this->isPluginEnable('SelectColor') ) { 00793 $this->conf_toolbar_convert['textcolor'] = 'CO-forecolor'; 00794 $this->conf_toolbar_convert['bgcolor'] = 'CO-hilitecolor'; 00795 } 00796 } 00797 00805 function convertToolBarForHTMLArea($button) { 00806 return $this->conf_toolbar_convert[$button]; 00807 } 00808 00817 function setRTEsizeByJS($divId, $height, $width) { 00818 return ' 00819 setRTEsizeByJS(\''.$divId.'\','.$height.', '.$width.'); 00820 '; 00821 } 00822 00828 function loadJSfiles($number) { 00829 global $TYPO3_CONF_VARS; 00830 00831 return ' 00832 <script type="text/javascript"> 00833 /*<![CDATA[*/ 00834 var i=1; 00835 while (document.getElementById("pleasewait" + i)) { 00836 document.getElementById("pleasewait" + i).style.display = "block"; 00837 document.getElementById("editorWrap" + i).style.visibility = "hidden"; 00838 i++; 00839 }; 00840 var RTEarea = new Array(); 00841 RTEarea[0] = new Object(); 00842 RTEarea[0]["version"] = "' . $TYPO3_CONF_VARS['EXTCONF'][$this->ID]['version'] . '"; 00843 RTEarea[0]["popupwin"] = "' . $this->writeJSFileToTypo3tempDir('EXT:' . $this->ID . '/htmlarea/popupwin' . ($TYPO3_CONF_VARS['EXTCONF'][$this->ID]['enableCompressedScripts']?'-compressed':'') .'.js', "popupwin", $TYPO3_CONF_VARS['EXTCONF'][$this->ID]['enableCompressedScripts']) . '"; 00844 RTEarea[0]["htmlarea-gecko"] = "' . $this->writeJSFileToTypo3tempDir('EXT:' . $this->ID . '/htmlarea/htmlarea-gecko' . ($TYPO3_CONF_VARS['EXTCONF'][$this->ID]['enableCompressedScripts']?'-compressed':'') .'.js', "htmlarea-gecko", $TYPO3_CONF_VARS['EXTCONF'][$this->ID]['enableCompressedScripts']) . '"; 00845 RTEarea[0]["htmlarea-ie"] = "' . $this->writeJSFileToTypo3tempDir('EXT:' . $this->ID . '/htmlarea/htmlarea-ie' . ($TYPO3_CONF_VARS['EXTCONF'][$this->ID]['enableCompressedScripts']?'-compressed':'') .'.js', "htmlarea-ie", $TYPO3_CONF_VARS['EXTCONF'][$this->ID]['enableCompressedScripts']) . '"; 00846 var _editor_url = "' . $this->extHttpPath . 'htmlarea"; 00847 var _editor_lang = "' . $this->language . '"; 00848 var _editor_CSS = "' . $this->editorCSS . '"; 00849 var _editor_skin = "' . dirname($this->editorCSS) . '"; 00850 var _editor_edited_content_CSS = "' . $this->editedContentCSS . '"; 00851 var _typo3_host_url = "' . $this->hostURL . '"; 00852 var _editor_debug_mode = ' . ($TYPO3_CONF_VARS['EXTCONF'][$this->ID]['enableDebugMode'] ? 'true' : 'false') . '; 00853 var _editor_compressed_scripts = ' . ($TYPO3_CONF_VARS['EXTCONF'][$this->ID]['enableCompressedScripts'] ? 'true' : 'false') . '; 00854 var _editor_mozAllowClipboard_url = "' . ($TYPO3_CONF_VARS['EXTCONF'][$this->ID]['mozAllowClipboardUrl'] ? $TYPO3_CONF_VARS['EXTCONF'][$this->ID]['mozAllowClipboardUrl'] : '') . '"; 00855 var _spellChecker_lang = "' . $this->spellCheckerLanguage . '"; 00856 var _spellChecker_charset = "' . $this->spellCheckerCharset . '"; 00857 var _spellChecker_mode = "' . $this->spellCheckerMode . '"; 00858 /*]]>*/ 00859 </script> 00860 <script type="text/javascript" src="' . $this->buildJSMainLangFile($number) . '"></script> 00861 <script type="text/javascript" src="' . $this->writeJSFileToTypo3tempDir('EXT:' . $this->ID . '/htmlarea/htmlarea' . ($TYPO3_CONF_VARS['EXTCONF'][$this->ID]['enableCompressedScripts']?'-compressed':'') .'.js', "htmlarea", $TYPO3_CONF_VARS['EXTCONF'][$this->ID]['enableCompressedScripts']) . '"></script> 00862 '; 00863 } 00864 00871 function loadJScode($number) { 00872 global $TSFE, $TYPO3_CONF_VARS; 00873 00874 $loadPluginCode = ''; 00875 $pluginArray = t3lib_div::trimExplode(',', $this->pluginList , 1); 00876 while( list(,$plugin) = each($pluginArray) ) { 00877 if ($this->isPluginEnable($plugin) || (intval($number) > 1 && in_array($plugin, $this->pluginEnableArrayMultiple))) { 00878 $loadPluginCode .= ' 00879 HTMLArea.loadPlugin("' . $plugin . '", true, "' . $this->writeJSFileToTypo3tempDir('EXT:' . $this->ID . '/htmlarea/plugins/' . $plugin . '/' . strtolower(preg_replace('/([a-z])([A-Z])([a-z])/', "$1".'-'."$2"."$3", $plugin)) . ($TYPO3_CONF_VARS['EXTCONF'][$this->ID]['enableCompressedScripts']?'-compressed':'') .'.js', $plugin, $TYPO3_CONF_VARS['EXTCONF'][$this->ID]['enableCompressedScripts']) . '");'; 00880 } 00881 } 00882 return (!is_object($TSFE) ? '' : ' 00883 ' . '/*<![CDATA[*/') . (is_object($TSFE) ? '' : ' 00884 RTEarea[0]["RTEtsConfigParams"] = "&RTEtsConfigParams=' . rawurlencode($this->RTEtsConfigParams()) . '"; 00885 RTEarea[0]["pathAcronymModule"] = "../../mod2/acronym.php"; 00886 RTEarea[0]["pathLinkModule"] = "../../mod3/browse_links.php"; 00887 RTEarea[0]["pathImageModule"] = "../../mod4/select_image.php"; 00888 RTEarea[0]["pathUserModule"] = "../../mod5/user.php"; 00889 RTEarea[0]["pathParseHtmlModule"] = "' . $this->extHttpPath . 'mod6/parse_html.php";') 00890 . $loadPluginCode . ' 00891 HTMLArea.init();' . (!is_object($TSFE) ? '' : ' 00892 /*]]>*/ 00893 '); 00894 } 00895 00907 function registerRTEinJS($number, $table='', $uid='', $field='') { 00908 global $TSFE, $TYPO3_CONF_VARS; 00909 00910 // if this RTE is shown inline of an IRRE record, the JS functions need to know about that 00911 if ($this->TCEform->inline->inlineNames['object']) { 00912 $tceformsInlineObject = $this->TCEform->inline->inlineNames['object'].'['.$table.']['.$uid.']_fields'; 00913 } 00914 00915 $registerRTEinJSString = (!is_object($TSFE) ? '' : ' 00916 ' . '/*<![CDATA[*/') . ' 00917 RTEarea['.$number.'] = new Object(); 00918 RTEarea['.$number.']["number"] = '.$number.'; 00919 RTEarea['.$number.']["id"] = "RTEarea'.$number.'"; 00920 RTEarea['.$number.']["enableWordClean"] = ' . (trim($this->thisConfig['enableWordClean'])?'true':'false') . '; 00921 RTEarea['.$number.']["htmlRemoveComments"] = ' . (trim($this->thisConfig['removeComments'])?'true':'false') . '; 00922 RTEarea['.$number.']["disableEnterParagraphs"] = ' . (trim($this->thisConfig['disableEnterParagraphs'])?'true':'false') . '; 00923 RTEarea['.$number.']["removeTrailingBR"] = ' . (trim($this->thisConfig['removeTrailingBR'])?'true':'false') . '; 00924 RTEarea['.$number.']["useCSS"] = ' . (trim($this->thisConfig['useCSS'])?'true':'false') . '; 00925 RTEarea['.$number.']["keepButtonGroupTogether"] = ' . (trim($this->thisConfig['keepButtonGroupTogether'])?'true':'false') . '; 00926 RTEarea['.$number.']["disablePCexamples"] = ' . (trim($this->thisConfig['disablePCexamples'])?'true':'false') . '; 00927 RTEarea['.$number.']["statusBar"] = ' . (trim($this->thisConfig['showStatusBar'])?'true':'false') . '; 00928 RTEarea['.$number.']["showTagFreeClasses"] = ' . (trim($this->thisConfig['showTagFreeClasses'])?'true':'false') . '; 00929 RTEarea['.$number.']["useHTTPS"] = ' . ((trim(stristr($this->siteURL, 'https')) || $this->thisConfig['forceHTTPS'])?'true':'false') . '; 00930 RTEarea['.$number.']["enableMozillaExtension"] = ' . (($this->client['BROWSER'] == 'gecko' && $TYPO3_CONF_VARS['EXTCONF'][$this->ID]['enableMozillaExtension'])?'true':'false') . '; 00931 RTEarea['.$number.']["tceformsInlineObject"] = "' . $tceformsInlineObject . '"; 00932 RTEarea['.$number.']["tceformsDynTabs"] = "' . $this->TCEform->getDynTabLevelState('-DIV') . '";'; 00933 00934 // The following properties apply only to the backend 00935 if (!is_object($TSFE)) { 00936 $registerRTEinJSString .= ' 00937 RTEarea['.$number.']["sys_language_content"] = "' . $this->contentLanguageUid . '"; 00938 RTEarea['.$number.']["typo3ContentLanguage"] = "' . $this->contentTypo3Language . '"; 00939 RTEarea['.$number.']["typo3ContentCharset"] = "' . $this->contentCharset . '"; 00940 RTEarea['.$number.']["enablePersonalDicts"] = ' . ($this->spellCheckerPersonalDicts ? 'true' : 'false') . '; 00941 RTEarea['.$number.']["userUid"] = "' . $this->userUid . '";'; 00942 } 00943 00944 // Setting the plugin flags 00945 $registerRTEinJSString .= ' 00946 RTEarea['.$number.']["plugin"] = new Object();'; 00947 00948 $pluginArray = t3lib_div::trimExplode(',', $this->pluginList , 1); 00949 reset($pluginArray); 00950 while( list(,$plugin) = each($pluginArray) ) { 00951 if ($this->isPluginEnable($plugin)) { 00952 $registerRTEinJSString .= ' 00953 RTEarea['.$number.']["plugin"]["'.$plugin.'"] = true;'; 00954 } 00955 } 00956 00957 // Setting the buttons configuration 00958 $registerRTEinJSString .= ' 00959 RTEarea['.$number.']["buttons"] = new Object();'; 00960 if (is_array($this->thisConfig['buttons.'])) { 00961 reset($this->thisConfig['buttons.']); 00962 while( list($buttonIndex,$conf) = each($this->thisConfig['buttons.']) ) { 00963 $button = substr($buttonIndex, 0, -1); 00964 if (in_array($button,$this->toolBar)) { 00965 $indexButton = 0; 00966 $registerRTEinJSString .= ' 00967 RTEarea['.$number.']["buttons"]["'.$button.'"] = {'; 00968 if (is_array($conf)) { 00969 reset($conf); 00970 while (list($propertyName,$conf1) = each($conf)) { 00971 $property = $propertyName; 00972 if ($indexButton) { 00973 $registerRTEinJSString .= ', '; 00974 } 00975 if (is_array($conf1)) { 00976 $property = substr($property, 0, -1); 00977 $indexProperty = 0; 00978 $registerRTEinJSString .= '"'.$property.'" : {'; 00979 reset($conf1); 00980 while (list($property1Name,$conf2) = each($conf1)) { 00981 $property1 = $property1Name; 00982 if ($indexProperty) { 00983 $registerRTEinJSString .= ', '; 00984 } 00985 if (is_array($conf2)) { 00986 $property1 = substr($property1, 0, -1); 00987 $indexProperty1 = 0; 00988 $registerRTEinJSString .= '"'.$property1.'" : {'; 00989 reset($conf2); 00990 while (list($property2Name,$conf3) = each($conf2)) { 00991 $property2 = $property2Name; 00992 if ($indexProperty1) { 00993 $registerRTEinJSString .= ', '; 00994 } 00995 if (is_array($conf3)) { 00996 $property2 = substr($property2, 0, -1); 00997 $indexProperty2 = 0; 00998 $registerRTEinJSString .= '"'.$property2.'" : {'; 00999 reset($conf3); 01000 while (list($property3Name,$conf4) = each($conf3)) { 01001 $property3 = $property3Name; 01002 if ($indexProperty2) { 01003 $registerRTEinJSString .= ', '; 01004 } 01005 if (!is_array($conf4)) { 01006 $registerRTEinJSString .= '"'.$property3.'" : '.($conf4?'"'.$conf4.'"':'false'); 01007 } 01008 $indexProperty2++; 01009 } 01010 $registerRTEinJSString .= '}'; 01011 } else { 01012 $registerRTEinJSString .= '"'.$property2.'" : '.($conf3?'"'.$conf3.'"':'false'); 01013 } 01014 $indexProperty1++; 01015 } 01016 $registerRTEinJSString .= '}'; 01017 } else { 01018 $registerRTEinJSString .= '"'.$property1.'" : '.($conf2?'"'.$conf2.'"':'false'); 01019 } 01020 $indexProperty++; 01021 } 01022 $registerRTEinJSString .= '}'; 01023 } else { 01024 $registerRTEinJSString .= '"'.$property.'" : '.($conf1?'"'.$conf1.'"':'false'); 01025 } 01026 $indexButton++; 01027 } 01028 } 01029 $registerRTEinJSString .= '};'; 01030 } 01031 } 01032 } 01033 01034 // Deprecated inserttag button configuration 01035 if (in_array('inserttag', $this->toolBar) && trim($this->thisConfig['hideTags'])) { 01036 if (!is_array($this->thisConfig['buttons.']['inserttag.'])) { 01037 $registerRTEinJSString .= ' 01038 RTEarea['.$number.']["buttons"]["inserttag"] = new Object(); 01039 RTEarea['.$number.']["buttons"]["inserttag"]["denyTags"] = "'.implode(',', t3lib_div::trimExplode(',', $this->thisConfig['hideTags'], 1)).'";'; 01040 } elseif (!$this->thisConfig['buttons.']['inserttag.']['denyTags']) { 01041 $registerRTEinJSString .= ' 01042 RTEarea['.$number.']["buttons"]["inserttag"]["denyTags"] = "'.implode(',', t3lib_div::trimExplode(',', $this->thisConfig['hideTags'], 1)).'";'; 01043 } 01044 } 01045 01046 // Setting the list of tags to be removed if specified in the RTE config 01047 if (trim($this->thisConfig['removeTags'])) { 01048 $registerRTEinJSString .= ' 01049 RTEarea['.$number.']["htmlRemoveTags"] = /^(' . implode('|', t3lib_div::trimExplode(',', $this->thisConfig['removeTags'], 1)) . ')$/i;'; 01050 } 01051 01052 // Setting the list of tags to be removed with their contents if specified in the RTE config 01053 if (trim($this->thisConfig['removeTagsAndContents'])) { 01054 $registerRTEinJSString .= ' 01055 RTEarea['.$number.']["htmlRemoveTagsAndContents"] = /^(' . implode('|', t3lib_div::trimExplode(',', $this->thisConfig['removeTagsAndContents'], 1)) . ')$/i;'; 01056 } 01057 01058 // Process default style configuration 01059 $registerRTEinJSString .= ' 01060 RTEarea['.$number.']["defaultPageStyle"] = "' . $this->hostURL . $this->buildJSFile('css', $this->buildStyleSheet(), 'css') . '";'; 01061 01062 // Setting the pageStyle 01063 $filename = trim($this->thisConfig['contentCSS']) ? trim($this->thisConfig['contentCSS']) : 'EXT:' . $this->ID . '/htmlarea/plugins/DynamicCSS/dynamiccss.css'; 01064 $registerRTEinJSString .= ' 01065 RTEarea['.$number.']["pageStyle"] = "' . $this->getFullFileName($filename) .'";'; 01066 01067 // Process colors configuration 01068 if ( $this->isPluginEnable('SelectColor') ) { 01069 $registerRTEinJSString .= $this->buildJSColorsConfig($number); 01070 } 01071 01072 // Process classes configuration 01073 if ($this->isPluginEnable('InlineCSS') || $this->isPluginEnable('DynamicCSS')) { 01074 $registerRTEinJSString .= $this->buildJSClassesConfig($number); 01075 } 01076 01077 // Process font faces configuration 01078 $registerRTEinJSString .= $this->buildJSFontFacesConfig($number); 01079 01080 // Process paragraphs configuration 01081 $registerRTEinJSString .= $this->buildJSParagraphsConfig($number); 01082 01083 // Process font sizes configuration 01084 $registerRTEinJSString .= $this->buildJSFontSizesConfig($number); 01085 01086 if ($this->isPluginEnable('TableOperations')) { 01087 $registerRTEinJSString .= ' 01088 RTEarea['.$number.']["hideTableOperationsInToolbar"] = ' . (trim($this->thisConfig['hideTableOperationsInToolbar']) ? 'true' : 'false') . '; 01089 RTEarea['.$number.']["disableLayoutFieldsetInTableOperations"] = ' . (trim($this->thisConfig['disableLayoutFieldsetInTableOperations'])?'true':'false') . '; 01090 RTEarea['.$number.']["disableAlignmentFieldsetInTableOperations"] = ' . (trim($this->thisConfig['disableAlignmentFieldsetInTableOperations'])?'true':'false') . '; 01091 RTEarea['.$number.']["disableSpacingFieldsetInTableOperations"] = ' . (trim($this->thisConfig['disableSpacingFieldsetInTableOperations'])?'true':'false') . '; 01092 RTEarea['.$number.']["disableBordersFieldsetInTableOperations"] = ' . (trim($this->thisConfig['disableBordersFieldsetInTableOperations'])?'true':'false') . '; 01093 RTEarea['.$number.']["disableColorFieldsetInTableOperations"] = ' . (trim($this->thisConfig['disableColorFieldsetInTableOperations'])?'true':'false') . ';'; 01094 // // Deprecated toggleborders button configuration 01095 if (in_array('toggleborders',$this->toolBar) && $this->thisConfig['keepToggleBordersInToolbar']) { 01096 if (!is_array($this->thisConfig['buttons.']['toggleborders.'])) { 01097 $registerRTEinJSString .= ' 01098 RTEarea['.$number.']["buttons"]["toggleborders"] = new Object(); 01099 RTEarea['.$number.']["buttons"]["toggleborders"]["keepInToolbar"] = true;'; 01100 } elseif (!$this->thisConfig['buttons.']['toggleborders.']['keepInToolbar']) { 01101 $registerRTEinJSString .= ' 01102 RTEarea['.$number.']["buttons"]["toggleborders"]["keepInToolbar"] = true;'; 01103 } 01104 } 01105 } 01106 01107 if ($this->isPluginEnable('Acronym')) { 01108 $registerRTEinJSString .= ' 01109 RTEarea['.$number.']["acronymUrl"] = "' . $this->buildJSFile('acronym_'.$this->contentLanguageUid, $this->buildJSAcronymArray()) . '";'; 01110 } 01111 01112 if ($this->isPluginEnable('TYPO3Browsers')) { 01113 $registerRTEinJSString .= $this->buildJSClassesAnchorConfig($number); 01114 } 01115 01116 $registerRTEinJSString .= ' 01117 RTEarea['.$number.']["toolbar"] = '.$this->getJSToolbarArray().'; 01118 HTMLArea.initEditor('.$number.');' . (!is_object($TSFE) ? '' : ' 01119 /*]]>*/'); 01120 return $registerRTEinJSString; 01121 } 01122 01129 function isPluginEnable($plugin) { 01130 return in_array($plugin, $this->pluginEnableArray); 01131 } 01132 01133 01139 function buildJSFontSizesConfig($number) { 01140 global $LANG, $TSFE; 01141 $registerRTEinJSString = ''; 01142 01143 // Builing JS array of default font sizes 01144 $HTMLAreaFontSizes = array(); 01145 if (is_object($TSFE)) { 01146 $HTMLAreaFontSizes[0] = $TSFE->csConvObj->conv($TSFE->getLLL('No size',$this->LOCAL_LANG), $TSFE->labelsCharset, $TSFE->renderCharset); 01147 } else { 01148 $HTMLAreaFontSizes[0] = $LANG->getLL('No size'); 01149 } 01150 01151 reset($this->defaultFontSizes); 01152 while( list($FontSizeItem,$FontSizeLabel) = each($this->defaultFontSizes)) { 01153 if ($this->client['BROWSER'] == 'safari') { 01154 $HTMLAreaFontSizes[$this->defaultFontSizes_safari[$FontSizeItem]] = $FontSizeLabel; 01155 } else { 01156 $HTMLAreaFontSizes[$FontSizeItem] = $FontSizeLabel; 01157 } 01158 } 01159 if ($this->thisConfig['hideFontSizes'] ) { 01160 $hideFontSizes = t3lib_div::trimExplode(',', $this->cleanList($this->thisConfig['hideFontSizes']), 1); 01161 foreach($hideFontSizes as $item) { 01162 if ($HTMLAreaFontSizes[strtolower($item)]) { 01163 if ($this->client['BROWSER'] == 'safari') { 01164 unset($HTMLAreaFontSizes[$this->defaultFontSizes_safari[strtolower($item)]]); 01165 } else { 01166 unset($HTMLAreaFontSizes[strtolower($item)]); 01167 } 01168 } else { 01169 01170 } 01171 } 01172 } 01173 01174 $HTMLAreaJSFontSize = '{'; 01175 if ($this->cleanList($this->thisConfig['hideFontSizes']) != '*') { 01176 reset($HTMLAreaFontSizes); 01177 $HTMLAreaParagraphIndex = 0; 01178 while( list($FontSizeItem,$FontSizeLabel) = each($HTMLAreaFontSizes)) { 01179 if($HTMLAreaFontSizeIndex) { 01180 $HTMLAreaJSFontSize .= ','; 01181 } 01182 $HTMLAreaJSFontSize .= ' 01183 "' . $FontSizeLabel . '" : "' . ($FontSizeItem?$FontSizeItem:'') . '"'; 01184 $HTMLAreaFontSizeIndex++; 01185 } 01186 } 01187 $HTMLAreaJSFontSize .= '};'; 01188 $registerRTEinJSString .= ' 01189 RTEarea['.$number.']["fontsize"] = '. $HTMLAreaJSFontSize; 01190 01191 return $registerRTEinJSString; 01192 } 01198 function buildJSParagraphsConfig($number) { 01199 global $TSFE, $LANG; 01200 $registerRTEinJSString = ''; 01201 01202 // Paragraphs 01203 $HTMLAreaParagraphs = $this->defaultParagraphs; 01204 if ($this->thisConfig['hidePStyleItems']) { 01205 $hidePStyleItems = t3lib_div::trimExplode(',', $this->cleanList($this->thisConfig['hidePStyleItems']), 1); 01206 foreach($hidePStyleItems as $item) unset($HTMLAreaParagraphs[strtolower($item)]); 01207 } 01208 $HTMLAreaJSParagraph = '{'; 01209 if ($this->cleanList($this->thisConfig['hidePStyleItems']) != '*') { 01210 reset($HTMLAreaParagraphs); 01211 $HTMLAreaParagraphIndex = 0; 01212 while( list($PStyleItem,$PStyleLabel) = each($HTMLAreaParagraphs)) { 01213 if($HTMLAreaParagraphIndex) { 01214 $HTMLAreaJSParagraph .= ','; 01215 } 01216 if (is_object($TSFE)) { 01217 $HTMLAreaJSParagraph .= ' 01218 "' . $TSFE->csConvObj->conv($TSFE->getLLL($PStyleLabel,$this->LOCAL_LANG), $TSFE->labelsCharset, $TSFE->renderCharset) . '" : "' . $PStyleItem . '"'; 01219 01220 } else { 01221 $HTMLAreaJSParagraph .= ' 01222 "' . $LANG->getLL($PStyleLabel) . '" : "' . $PStyleItem . '"'; 01223 } 01224 $HTMLAreaParagraphIndex++; 01225 } 01226 } 01227 $HTMLAreaJSParagraph .= '};'; 01228 $registerRTEinJSString .= ' 01229 RTEarea['.$number.']["paragraphs"] = '. $HTMLAreaJSParagraph; 01230 01231 return $registerRTEinJSString; 01232 } 01233 01239 function buildJSFontfacesConfig($number) { 01240 global $TSFE, $LANG; 01241 01242 if (is_object($TSFE)) { 01243 $RTEProperties = $this->RTEsetup; 01244 } else { 01245 $RTEProperties = $this->RTEsetup['properties']; 01246 } 01247 01248 $registerRTEinJSString = ''; 01249 01250 // Builing JS array of default font faces 01251 $HTMLAreaFontname = array(); 01252 $HTMLAreaFontname['nofont'] = ' 01253 "' . $fontName . '" : "' . $this->cleanList($fontValue) . '"'; 01254 $defaultFontFacesList = 'nofont,'; 01255 if (is_object($TSFE)) { 01256 $HTMLAreaFontname['nofont'] = ' 01257 "' . $TSFE->csConvObj->conv($TSFE->getLLL('No font',$this->LOCAL_LANG), $TSFE->labelsCharset, $TSFE->renderCharset) . '" : ""'; 01258 } else { 01259 $HTMLAreaFontname['nofont'] = ' 01260 "' . $LANG->getLL('No font') . '" : ""'; 01261 } 01262 01263 $hideFontFaces = $this->cleanList($this->thisConfig['hideFontFaces']); 01264 if ($hideFontFaces != '*') { 01265 $index = 0; 01266 reset($this->defaultFontFaces); 01267 while (list($fontName,$fontValue) = each($this->defaultFontFaces)) { 01268 if (!t3lib_div::inList($hideFontFaces, $index+1)) { 01269 $HTMLAreaFontname[$fontName] = ' 01270 "' . $fontName . '" : "' . $this->cleanList($fontValue) . '"'; 01271 $defaultFontFacesList .= $fontName . ','; 01272 } 01273 $index++; 01274 } 01275 } 01276 01277 // Adding configured font faces 01278 if (is_array($RTEProperties['fonts.'])) { 01279 reset($RTEProperties['fonts.']); 01280 while(list($fontName,$conf)=each($RTEProperties['fonts.'])) { 01281 $fontName=substr($fontName,0,-1); 01282 if (is_object($TSFE)) { 01283 $string = $TSFE->sL($conf['name']); 01284 } else { 01285 $string = $LANG->sL($conf['name']); 01286 } 01287 $HTMLAreaFontname[$fontName] = ' 01288 "' . str_replace('"', '\"', str_replace('\\\'', '\'', $string)) . '" : "' . $this->cleanList($conf['value']) . '"'; 01289 } 01290 } 01291 01292 // Setting the list of font faces 01293 $HTMLAreaJSFontface = '{'; 01294 $HTMLAreaFontface = t3lib_div::trimExplode(',' , $this->cleanList($defaultFontFacesList . ',' . $this->thisConfig['fontFace'])); 01295 reset($HTMLAreaFontface); 01296 $HTMLAreaFontfaceIndex = 0; 01297 while( list(,$fontName) = each($HTMLAreaFontface)) { 01298 if($HTMLAreaFontfaceIndex) { 01299 $HTMLAreaJSFontface .= ','; 01300 } 01301 $HTMLAreaJSFontface .= $HTMLAreaFontname[$fontName]; 01302 $HTMLAreaFontfaceIndex++; 01303 } 01304 $HTMLAreaJSFontface .= '};'; 01305 01306 $registerRTEinJSString .= ' 01307 RTEarea['.$number.']["fontname"] = '. $HTMLAreaJSFontface; 01308 01309 return $registerRTEinJSString; 01310 } 01311 01317 function buildJSColorsConfig($number) { 01318 global $TSFE, $LANG; 01319 01320 if (is_object($TSFE)) { 01321 $RTEProperties = $this->RTEsetup; 01322 } else { 01323 $RTEProperties = $this->RTEsetup['properties']; 01324 } 01325 01326 $registerRTEinJSString = ''; 01327 01328 if(trim($this->thisConfig['disableColorPicker'])) { 01329 $registerRTEinJSString .= ' 01330 RTEarea['.$number.']["disableColorPicker"] = true;'; 01331 } else { 01332 $registerRTEinJSString .= ' 01333 RTEarea['.$number.']["disableColorPicker"] = false;'; 01334 } 01335 01336 // Building JS array of configured colors 01337 if (is_array($RTEProperties['colors.']) ) { 01338 $HTMLAreaColorname = array(); 01339 reset($RTEProperties['colors.']); 01340 while(list($colorName,$conf)=each($RTEProperties['colors.'])) { 01341 $colorName=substr($colorName,0,-1); 01342 if (is_object($TSFE)) { 01343 $string = $TSFE->csConvObj->conv($TSFE->sL(trim($conf['name'])), $TSFE->renderCharset, $TSFE->metaCharset); 01344 $string = str_replace('"', '\"', str_replace('\\\'', '\'', $string)); 01345 $string = $this->feJScharCode($string); 01346 } else { 01347 $string = $this->getLLContent(trim($conf['name'])); 01348 } 01349 $HTMLAreaColorname[$colorName] = ' 01350 [' . $string . ' , "' . $conf['value'] . '"]'; 01351 } 01352 } 01353 01354 // Setting the list of colors if specified in the RTE config 01355 if ($this->thisConfig['colors'] ) { 01356 $HTMLAreaJSColors = '['; 01357 $HTMLAreaColors = t3lib_div::trimExplode(',' , $this->cleanList($this->thisConfig['colors'])); 01358 reset($HTMLAreaColors); 01359 $HTMLAreaColorsIndex = 0; 01360 while( list(,$colorName) = each($HTMLAreaColors)) { 01361 if($HTMLAreaColorsIndex && $HTMLAreaColorname[$colorName]) { 01362 $HTMLAreaJSColors .= ','; 01363 } 01364 $HTMLAreaJSColors .= $HTMLAreaColorname[$colorName]; 01365 $HTMLAreaColorsIndex++; 01366 } 01367 $HTMLAreaJSColors .= '];'; 01368 $registerRTEinJSString .= ' 01369 RTEarea['.$number.']["colors"] = '. $HTMLAreaJSColors; 01370 } 01371 01372 return $registerRTEinJSString; 01373 } 01374 01380 function buildStyleSheet() { 01381 01382 if (!trim($this->thisConfig['ignoreMainStyleOverride'])) { 01383 $mainStyle_font = $this->thisConfig['mainStyle_font'] ? $this->thisConfig['mainStyle_font']: 'Verdana,sans-serif'; 01384 01385 $mainElements = array(); 01386 $mainElements['P'] = $this->thisConfig['mainStyleOverride_add.']['P']; 01387 $elList = explode(',','H1,H2,H3,H4,H5,H6,PRE'); 01388 reset($elList); 01389 while(list(,$elListName)=each($elList)) { 01390 if ($this->thisConfig['mainStyleOverride_add.'][$elListName]) { 01391 $mainElements[$elListName] = $this->thisConfig['mainStyleOverride_add.'][$elListName]; 01392 } 01393 } 01394 01395 $addElementCode = ''; 01396 reset($mainElements); 01397 while(list($elListName,$elValue)=each($mainElements)) { 01398 $addElementCode .= strToLower($elListName) . ' {' . $elValue . '}' . chr(10); 01399 } 01400 01401 $stylesheet = $this->thisConfig['mainStyleOverride'] ? $this->thisConfig['mainStyleOverride'] : chr(10) . 01402 'body.htmlarea-content-body { font-family: ' . $mainStyle_font . 01403 '; font-size: '.($this->thisConfig['mainStyle_size'] ? $this->thisConfig['mainStyle_size'] : '12px') . 01404 '; color: '.($this->thisConfig['mainStyle_color']?$this->thisConfig['mainStyle_color'] : 'black') . 01405 '; background-color: '.($this->thisConfig['mainStyle_bgcolor'] ? $this->thisConfig['mainStyle_bgcolor'] : 'white') . 01406 ';'.$this->thisConfig['mainStyleOverride_add.']['BODY'].'}' . chr(10) . 01407 'td { ' . $this->thisConfig['mainStyleOverride_add.']['TD'].'}' . chr(10) . 01408 'div { ' . $this->thisConfig['mainStyleOverride_add.']['DIV'].'}' . chr(10) . 01409 'pre { ' . $this->thisConfig['mainStyleOverride_add.']['PRE'].'}' . chr(10) . 01410 'ol { ' . $this->thisConfig['mainStyleOverride_add.']['OL'].'}' . chr(10) . 01411 'ul { ' . $this->thisConfig['mainStyleOverride_add.']['UL'].'}' . chr(10) . 01412 'blockquote { ' . $this->thisConfig['mainStyleOverride_add.']['BLOCKQUOTE'].'}' . chr(10) . 01413 $addElementCode; 01414 01415 if (is_array($this->thisConfig['inlineStyle.'])) { 01416 $stylesheet .= chr(10) . implode(chr(10), $this->thisConfig['inlineStyle.']) . chr(10); 01417 } 01418 } else { 01419 $stylesheet = '/* mainStyleOverride and inlineStyle properties ignored. */'; 01420 } 01421 return $stylesheet; 01422 } 01423 01429 function buildJSClassesConfig($number) { 01430 01431 // Build JS array of lists of classes 01432 $classesTagList = 'classesCharacter, classesParagraph, classesImage, classesTable, classesLinks, classesTD'; 01433 $classesTagConvert = array( 'classesCharacter' => 'span', 'classesParagraph' => 'p', 'classesImage' => 'img', 'classesTable' => 'table', 'classesLinks' => 'a', 'classesTD' => 'td'); 01434 $classesTagArray = t3lib_div::trimExplode(',' , $classesTagList); 01435 $registerRTEinJSString = ' 01436 RTEarea['.$number.']["classesTag"] = new Object();'; 01437 while( list(,$classesTagName) = each($classesTagArray)) { 01438 $HTMLAreaJSClasses = ($this->thisConfig[$classesTagName])?('"' . $this->cleanList($this->thisConfig[$classesTagName]) . '";'):'null;'; 01439 $registerRTEinJSString .= ' 01440 RTEarea['.$number.']["classesTag"]["'. $classesTagConvert[$classesTagName] .'"] = '. $HTMLAreaJSClasses; 01441 } 01442 01443 // Include JS arrays of configured classes 01444 $registerRTEinJSString .= ' 01445 RTEarea['.$number.']["classesUrl"] = "' . $this->hostURL . $this->buildJSFile('classes_'.$this->contentLanguageUid, $this->buildJSClassesArray()) . '";'; 01446 01447 return $registerRTEinJSString; 01448 } 01449 01455 function buildJSClassesArray() { 01456 global $TSFE, $LANG, $TYPO3_CONF_VARS; 01457 01458 if (is_object($TSFE)) { 01459 $RTEProperties = $this->RTEsetup; 01460 } else { 01461 $RTEProperties = $this->RTEsetup['properties']; 01462 } 01463 01464 $linebreak = $TYPO3_CONF_VARS['EXTCONF'][$this->ID]['enableCompressedScripts'] ? '' : chr(10); 01465 $index = 0; 01466 $JSClassesLabelsArray = 'HTMLArea.classesLabels = { ' . $linebreak; 01467 $JSClassesValuesArray = 'HTMLArea.classesValues = { ' . $linebreak; 01468 $JSClassesNoShowArray = 'HTMLArea.classesNoShow = { ' . $linebreak; 01469 01470 // Scanning the list of classes if specified in the RTE config 01471 if (is_array($RTEProperties['classes.'])) { 01472 $stylesheet = ''; 01473 reset($RTEProperties['classes.']); 01474 while(list($className,$conf)=each($RTEProperties['classes.'])) { 01475 $className = substr($className,0,-1); 01476 if (is_object($TSFE)) { 01477 $string = $TSFE->csConvObj->conv($TSFE->sL(trim($conf['name'])), $TSFE->renderCharset, $TSFE->metaCharset); 01478 $string = str_replace('"', '\"', str_replace('\\\'', '\'', $string)); 01479 $string = $this->feJScharCode($string); 01480 } else { 01481 $string = $this->getLLContent(trim($conf['name'])); 01482 } 01483 $JSClassesLabelsArray .= (($index)?',':'') . '"' . $className . '": ' . $string . $linebreak; 01484 $JSClassesValuesArray .= (($index)?',':'') . '"' . $className . '":"' . str_replace('"', '\"', str_replace('\\\'', '\'', $conf['value'])) . '"' . $linebreak; 01485 $JSClassesNoShowArray .= (($index)?',':'') . '"' . $className . '":' . ($conf['noShow']?'true':'false') . $linebreak; 01486 $index++; 01487 } 01488 } 01489 $JSClassesLabelsArray .= '};' . $linebreak; 01490 $JSClassesValuesArray .= '};' . $linebreak; 01491 $JSClassesNoShowArray .= '};' . $linebreak; 01492 01493 return $JSClassesLabelsArray . $JSClassesValuesArray . $JSClassesNoShowArray; 01494 } 01495 01501 function buildJSMainLangArray() { 01502 global $TSFE, $LANG, $TYPO3_CONF_VARS; 01503 01504 $linebreak = $TYPO3_CONF_VARS['EXTCONF'][$this->ID]['enableCompressedScripts'] ? '' : chr(10); 01505 $JSLanguageArray .= 'var HTMLArea_langArray = new Object();' . $linebreak; 01506 $JSLanguageArray .= 'HTMLArea_langArray = { ' . $linebreak; 01507 if(is_object($TSFE)) { 01508 $JSLanguageArray = $TSFE->csConvObj->conv($JSLanguageArray, 'iso-8859-1', $this->OutputCharset); 01509 } else { 01510 $JSLanguageArray = $LANG->csConvObj->conv($JSLanguageArray, 'iso-8859-1', $this->OutputCharset); 01511 } 01512 01513 $subArrays = array( 'tooltips', 'msg' , 'dialogs'); 01514 $subArraysIndex = 0; 01515 foreach($subArrays as $labels) { 01516 $JSLanguageArray .= (($subArraysIndex++)?',':'') . $labels . ': {' . $linebreak; 01517 if(is_object($TSFE)) { 01518 $LOCAL_LANG = $TSFE->readLLfile(t3lib_extMgm::extPath($this->ID).'htmlarea/locallang_' . $labels . '.xml', $this->language); 01519 $TSFE->csConvObj->convArray($LOCAL_LANG['default'], 'iso-8859-1', $this->OutputCharset); 01520 if(!empty($LOCAL_LANG[$this->language])) $TSFE->csConvObj->convArray($LOCAL_LANG[$this->language], $this->charset, $this->OutputCharset); 01521 } else { 01522 $LOCAL_LANG = $LANG->readLLfile(t3lib_extMgm::extPath($this->ID).'htmlarea/locallang_' . $labels . '.xml'); 01523 $LANG->csConvObj->convArray($LOCAL_LANG['default'], 'iso-8859-1', $this->OutputCharset); 01524 if(!empty($LOCAL_LANG[$this->language])) $LANG->csConvObj->convArray($LOCAL_LANG[$this->language], $this->charset, $this->OutputCharset); 01525 } 01526 if(!empty($LOCAL_LANG[$this->language])) { 01527 $LOCAL_LANG[$this->language] = t3lib_div::array_merge_recursive_overrule($LOCAL_LANG['default'], $LOCAL_LANG[$this->language]); 01528 } else { 01529 $LOCAL_LANG[$this->language] = $LOCAL_LANG['default']; 01530 } 01531 $index = 0; 01532 foreach ( $LOCAL_LANG[$this->language] as $labelKey => $labelValue ) { 01533 $JSLanguageArray .= (($index++)?',':'') . '"' . $labelKey . '":"' . str_replace('"', '\"', $labelValue) . '"' . $linebreak; 01534 } 01535 if(is_object($TSFE)) { 01536 $JSLanguageArray .= $TSFE->csConvObj->conv(' }' . chr(10), 'iso-8859-1', $this->OutputCharset); 01537 } else { 01538 $JSLanguageArray .= $LANG->csConvObj->conv(' }' . chr(10), 'iso-8859-1', $this->OutputCharset); 01539 } 01540 } 01541 01542 if(is_object($TSFE)) { 01543 $JSLanguageArray .= $TSFE->csConvObj->conv(' }' . chr(10), 'iso-8859-1', $this->OutputCharset); 01544 } else { 01545 $JSLanguageArray .= $LANG->csConvObj->conv(' }' . chr(10), 'iso-8859-1', $this->OutputCharset); 01546 } 01547 return $JSLanguageArray; 01548 } 01549 01556 function buildJSAcronymArray() { 01557 global $TYPO3_CONF_VARS, $TYPO3_DB; 01558 01559 $linebreak = $TYPO3_CONF_VARS['EXTCONF'][$this->ID]['enableCompressedScripts'] ? '' : chr(10); 01560 $acronymIndex = 0; 01561 $abbraviationIndex = 0; 01562 $JSAcronymArray .= 'acronyms = { ' . $linebreak; 01563 $JSAbbreviationArray .= 'abbreviations = { ' . $linebreak; 01564 $table = 'tx_rtehtmlarea_acronym'; 01565 if($this->contentLanguageUid > -1) { 01566 $whereClause = '(sys_language_uid="'.$this->contentLanguageUid . '" OR sys_language_uid="-1")'; 01567 } else { 01568 $whereClause = '1 = 1'; 01569 } 01570 $whereClause .= t3lib_BEfunc::BEenableFields($table); 01571 $whereClause .= t3lib_BEfunc::deleteClause($table); 01572 $res = $TYPO3_DB->exec_SELECTquery('type,term,acronym', $table, $whereClause); 01573 while($acronymRow = $TYPO3_DB->sql_fetch_assoc($res)) { 01574 if($acronymRow['type'] == 1) $JSAcronymArray .= (($acronymIndex++)?',':'') . '"' . $acronymRow['acronym'] . '":"' . $acronymRow['term'] . '"' . $linebreak; 01575 if($acronymRow['type'] == 2) $JSAbbreviationArray .= (($AbbreviationIndex++)?',':'') . '"' . $acronymRow['acronym'] . '":"' . $acronymRow['term'] . '"' . $linebreak; 01576 } 01577 $JSAcronymArray .= '};' . $linebreak; 01578 $JSAbbreviationArray .= '};' . $linebreak; 01579 01580 return $JSAcronymArray . $JSAbbreviationArray; 01581 } 01582 01588 function buildJSClassesAnchorConfig($number) { 01589 global $TSFE; 01590 01591 if (is_object($TSFE)) { 01592 $RTEProperties = $this->RTEsetup; 01593 } else { 01594 $RTEProperties = $this->RTEsetup['properties']; 01595 } 01596 01597 $registerRTEinJSString = ''; 01598 if (is_array($RTEProperties['classesAnchor.'])) { 01599 $registerRTEinJSString .= ' 01600 RTEarea['.$number.']["classesAnchorUrl"] = "' . $this->buildJSFile('classesAnchor_'.$this->contentLanguageUid, $this->buildJSClassesAnchorArray()) . '";'; 01601 } 01602 return $registerRTEinJSString; 01603 } 01604 01610 function buildJSClassesAnchorArray() { 01611 global $LANG, $TYPO3_CONF_VARS; 01612 01613 $linebreak = $TYPO3_CONF_VARS['EXTCONF'][$this->ID]['enableCompressedScripts'] ? '' : chr(10); 01614 $JSClassesAnchorArray .= 'editor.classesAnchorSetup = [ ' . $linebreak; 01615 $classesAnchorIndex = 0; 01616 reset($this->RTEsetup['properties']['classesAnchor.']); 01617 while(list($label,$conf)=each($this->RTEsetup['properties']['classesAnchor.'])) { 01618 if (is_array($conf) && $conf['class']) { 01619 $JSClassesAnchorArray .= (($classesAnchorIndex++)?',':'') . ' { ' . $linebreak; 01620 $index = 0; 01621 $JSClassesAnchorArray .= (($index++)?',':'') . 'name : "' . $conf['class'] . '"' . $linebreak; 01622 if ($conf['type']) { 01623 $JSClassesAnchorArray .= (($index++)?',':'') . 'type : "' . $conf['type'] . '"' . $linebreak; 01624 } 01625 if (trim(str_replace('\'', '', str_replace('"', '', $conf['image'])))) { 01626 $JSClassesAnchorArray .= (($index++)?',':'') . 'image : "' . $this->getFullFileName(trim(str_replace('\'', '', str_replace('"', '', $conf['image'])))) . '"' . $linebreak; 01627 } 01628 if (trim($conf['altText'])) { 01629 $string = $this->getLLContent(trim($conf['altText'])); 01630 $JSClassesAnchorArray .= (($index++)?',':'') . 'altText : ' . str_replace('"', '\"', str_replace('\\\'', '\'', $string)) . $linebreak; 01631 } 01632 if (trim($conf['titleText'])) { 01633 $string = $this->getLLContent(trim($conf['titleText'])); 01634 $JSClassesAnchorArray .= (($index++)?',':'') . 'titleText : ' . str_replace('"', '\"', str_replace('\\\'', '\'', $string)) . $linebreak; 01635 } 01636 $JSClassesAnchorArray .= '}' . $linebreak; 01637 } 01638 } 01639 $JSClassesAnchorArray .= '];' . $linebreak; 01640 return $JSClassesAnchorArray; 01641 } 01642 01649 function buildJSFile($label,$contents,$ext='js') { 01650 $relFilename = 'typo3temp/' . $this->ID . '_' . $label . '_' . md5($contents) . '.' . $ext; 01651 $outputFilename = PATH_site . $relFilename; 01652 if(!file_exists($outputFilename)) { 01653 $outputHandle = fopen($outputFilename,'wb'); 01654 fwrite($outputHandle, $contents); 01655 fclose($outputHandle); 01656 t3lib_div::fixPermissions($outputFilename); 01657 } 01658 return $this->httpTypo3Path . $relFilename; 01659 } 01660 01667 function writeJSFileToTypo3tempDir($JSFile,$label,$compressed=FALSE,$ext='js') { 01668 global $TYPO3_CONF_VARS; 01669 01670 $source = t3lib_div::getFileAbsFileName($JSFile); 01671 $relFilename = 'typo3temp/' . $this->ID . '_' . $label . '_' . md5($JSFile . $TYPO3_CONF_VARS['EXTCONF'][$this->ID]['version']) . ($compressed ? '-compressed' : '') . '.' . $ext; 01672 $destination = PATH_site . $relFilename; 01673 if(!file_exists($destination)) { 01674 @copy($source,$destination); 01675 t3lib_div::fixPermissions($destination); 01676 } 01677 return ($this->thisConfig['forceHTTPS']?$this->siteURL:$this->httpTypo3Path) . $relFilename; 01678 } 01679 01686 function buildJSMainLangFile($number) { 01687 $contents = $this->buildJSMainLangArray() . chr(10); 01688 $pluginArray = t3lib_div::trimExplode(',', $this->pluginList , 1); 01689 while( list(,$plugin) = each($pluginArray) ) { 01690 if ($this->isPluginEnable($plugin) || (intval($number) > 1 && in_array($plugin, $this->pluginEnableArrayMultiple))) { 01691 $contents .= $this->buildJSLangArray($plugin) . chr(10); 01692 } 01693 } 01694 return $this->buildJSFile($this->language.'_'.$this->OutputCharset,$contents); 01695 } 01696 01703 function buildJSLangArray($plugin) { 01704 global $TSFE, $LANG, $TYPO3_CONF_VARS; 01705 01706 $linebreak = $TYPO3_CONF_VARS['EXTCONF'][$this->ID]['enableCompressedScripts'] ? '' : chr(10); 01707 if(is_object($TSFE)) { 01708 $LOCAL_LANG = $TSFE->readLLfile(t3lib_extMgm::extPath($this->ID).'htmlarea/plugins/' . $plugin . '/locallang.xml', $this->language); 01709 if(!empty($LOCAL_LANG['default'])) $TSFE->csConvObj->convArray($LOCAL_LANG['default'], 'iso-8859-1', $this->OutputCharset); 01710 if(!empty($LOCAL_LANG[$this->language])) $TSFE->csConvObj->convArray($LOCAL_LANG[$this->language], $this->charset, $this->OutputCharset); 01711 } else { 01712 $LOCAL_LANG = $LANG->readLLfile(t3lib_extMgm::extPath($this->ID).'htmlarea/plugins/' . $plugin . '/locallang.xml'); 01713 if(!empty($LOCAL_LANG['default'])) $LANG->csConvObj->convArray($LOCAL_LANG['default'], 'iso-8859-1', $this->OutputCharset); 01714 if(!empty($LOCAL_LANG[$this->language])) $LANG->csConvObj->convArray($LOCAL_LANG[$this->language], $this->charset, $this->OutputCharset); 01715 } 01716 01717 if(!empty($LOCAL_LANG[$this->language])) { 01718 $LOCAL_LANG[$this->language] = t3lib_div::array_merge_recursive_overrule($LOCAL_LANG['default'],$LOCAL_LANG[$this->language]); 01719 } else { 01720 $LOCAL_LANG[$this->language] = $LOCAL_LANG['default']; 01721 } 01722 01723 $JSLanguageArray .= 'var ' . $plugin . '_langArray = new Object();' . $linebreak; 01724 $JSLanguageArray .= $plugin . '_langArray = {' . $linebreak; 01725 if(is_object($TSFE)) { 01726 $JSLanguageArray = $TSFE->csConvObj->conv($JSLanguageArray, 'iso-8859-1', $this->OutputCharset); 01727 } else { 01728 $JSLanguageArray = $LANG->csConvObj->conv($JSLanguageArray, 'iso-8859-1', $this->OutputCharset); 01729 } 01730 01731 $index = 0; 01732 foreach ( $LOCAL_LANG[$this->language] as $labelKey => $labelValue ) { 01733 $JSLanguageArray .= (($index++)?',':'') . '"' . $labelKey . '":"' . str_replace('"', '\"', $labelValue) . '"' . $linebreak; 01734 } 01735 01736 if(is_object($TSFE)) { 01737 $JSLanguageArray .= $TSFE->csConvObj->conv(' }' . chr(10), 'iso-8859-1', $this->OutputCharset); 01738 } else { 01739 $JSLanguageArray .= $LANG->csConvObj->conv(' }' . chr(10), 'iso-8859-1', $this->OutputCharset); 01740 } 01741 01742 return $JSLanguageArray; 01743 } 01744 01751 function getJSToolbarArray() { 01752 $toolbar = ''; // The JS-Code for the toolbar 01753 $group = ''; // The TS-Code for the group in the moment, each group are between "bar"s 01754 $group_has_button = false; // True if the group has any enabled buttons 01755 $group_needs_starting_bar = false; 01756 $previous_is_space = false; 01757 01758 // process each button in the order list 01759 reset($this->toolbarOrderArray); 01760 while (list(, $button) = each($this->toolbarOrderArray) ) { 01761 // check if a new group starts 01762 if (($button == 'bar' || $button == 'linebreak') && $group_has_button) { 01763 // New line 01764 if ($button == 'linebreak') { 01765 $convertButton = '"' . $this->convertToolBarForHTMLArea('linebreak') . '"'; 01766 $group = ($group!='') ? ($group . ', ' . $convertButton) : $convertButton; 01767 } 01768 // New group 01769 $toolbar .= $toolbar ? (', ' . $group) : ('[[' . $group); 01770 $group = ''; 01771 $previous_is_space = false; 01772 $group_has_button = false; 01773 $group_needs_starting_bar = true; 01774 } elseif ($toolbar && $button == 'linebreak' && !$group_has_button) { 01775 // Insert linebreak if no group is opened 01776 $group = ''; 01777 $previous_is_space = false; 01778 $group_needs_starting_bar = false; 01779 $toolbar .= ', "' . $this->convertToolBarForHTMLArea($button) . '"'; 01780 } elseif ($button == 'bar' && !$group_has_button) { 01781 $group_needs_starting_bar = true; 01782 } elseif ($button == 'space' && $group_has_button && !$previous_is_space) { 01783 $convertButton = $this->convertToolBarForHTMLArea($button); 01784 $convertButton = '"' . $convertButton . '"'; 01785 $group .= $group ? (', ' . $convertButton) : ($group_needs_starting_bar ? ('"' . $this->convertToolBarForHTMLArea('bar') . '", ' . $convertButton) : $convertButton); 01786 $group_needs_starting_bar = false; 01787 $previous_is_space = true; 01788 } elseif (in_array($button, $this->toolBar)) { 01789 // Add the button to the group 01790 $convertButton = $this->convertToolBarForHTMLArea($button); 01791 if ($convertButton) { 01792 $convertButton = '"' . $convertButton . '"'; 01793 $group .= $group ? (', ' . $convertButton) : ($group_needs_starting_bar ? ('"' . $this->convertToolBarForHTMLArea('bar') . '", ' . $convertButton) : $convertButton); 01794 $group_has_button = true; 01795 $group_needs_starting_bar = false; 01796 $previous_is_space = false; 01797 } 01798 } 01799 // else ignore 01800 } 01801 // add the last group 01802 if($group_has_button) $toolbar .= $toolbar ? (', ' . $group) : ('[[' . $group); 01803 $toolbar = $toolbar . ']]'; 01804 return $toolbar; 01805 } 01806 01807 function getLLContent($string) { 01808 global $LANG; 01809 01810 $BE_lang = $LANG->lang; 01811 $BE_origCharset = $LANG->origCharSet; 01812 $BE_charSet = $LANG->charSet; 01813 $LANG->lang = $this->contentTypo3Language; 01814 $LANG->origCharSet = $this->origContentCharSet; 01815 $LANG->charSet = $this->contentCharset; 01816 $LLString = $LANG->JScharCode($LANG->sL($string)); 01817 $LANG->lang = $BE_lang; 01818 $LANG->origCharSet = $BE_origCharset; 01819 $LANG->charSet = $BE_charSet; 01820 return $LLString; 01821 } 01822 01823 function feJScharCode($str) { 01824 global $TSFE; 01825 // Convert string to UTF-8: 01826 if ($this->OutputCharset != 'utf-8') $str = $TSFE->csConvObj->utf8_encode($str,$this->OutputCharset); 01827 // Convert the UTF-8 string into a array of char numbers: 01828 $nArr = $TSFE->csConvObj->utf8_to_numberarray($str); 01829 return 'String.fromCharCode('.implode(',',$nArr).')'; 01830 } 01831 01832 function getFullFileName($filename) { 01833 if (substr($filename,0,4)=='EXT:') { // extension 01834 list($extKey,$local) = explode('/',substr($filename,4),2); 01835 $newFilename = ''; 01836 if (strcmp($extKey,'') && t3lib_extMgm::isLoaded($extKey) && strcmp($local,'')) { 01837 $newFilename = $this->siteURL . t3lib_extMgm::siteRelPath($extKey) . $local; 01838 } 01839 } elseif (substr($filename,0,1) != '/') { 01840 $newFilename = $this->siteURL . $filename; 01841 } else { 01842 $newFilename = $this->siteURL . substr($filename,1); 01843 } 01844 return $newFilename; 01845 } 01846 01854 function setSaveRTE($number, $form, $textarea) { 01855 return ' 01856 editornumber = '.$number.'; 01857 if (RTEarea[editornumber]) { 01858 document.'.$form.'["'.$textarea.'"].value = RTEarea[editornumber]["editor"].getHTML(); 01859 } 01860 else { 01861 OK=0; 01862 } 01863 '; 01864 } 01865 01875 function clientInfo($useragent='') { 01876 global $TYPO3_CONF_VARS; 01877 01878 if (!$useragent) $useragent=t3lib_div::getIndpEnv('HTTP_USER_AGENT'); 01879 01880 $bInfo=array(); 01881 // Which browser? 01882 if (strstr($useragent,'Konqueror')) { 01883 $bInfo['BROWSER']= 'konqu'; 01884 } elseif (strstr($useragent,'Opera')) { 01885 $bInfo['BROWSER']= 'opera'; 01886 } elseif (strstr($useragent,'MSIE')) { 01887 $bInfo['BROWSER']= 'msie'; 01888 } elseif (strstr($useragent,'Gecko/')) { 01889 $bInfo['BROWSER']='gecko'; 01890 } elseif (strstr($useragent,'Safari/') && $TYPO3_CONF_VARS['EXTCONF']['rtehtmlarea']['safari_test'] == 1) { 01891 $bInfo['BROWSER']='safari'; 01892 } elseif (strstr($useragent,'Mozilla/4')) { 01893 $bInfo['BROWSER']='net'; 01894 } 01895 01896 if ($bInfo['BROWSER']) { 01897 // Browser version 01898 switch($bInfo['BROWSER']) { 01899 case 'net': 01900 $bInfo['VERSION']= doubleval(substr($useragent,8)); 01901 if (strstr($useragent,'Netscape6/')) {$bInfo['VERSION']=doubleval(substr(strstr($useragent,'Netscape6/'),10));} 01902 if (strstr($useragent,'Netscape/7')) {$bInfo['VERSION']=doubleval(substr(strstr($useragent,'Netscape/7'),9));} 01903 break; 01904 case 'gecko': 01905 $tmp = strstr($useragent,'rv:'); 01906 $bInfo['VERSION'] = doubleval(ereg_replace('^[^0-9]*','',substr($tmp,3))); 01907 break; 01908 case 'msie': 01909 $tmp = strstr($useragent,'MSIE'); 01910 $bInfo['VERSION'] = doubleval(ereg_replace('^[^0-9]*','',substr($tmp,4))); 01911 break; 01912 case 'safari': 01913 $tmp = strstr($useragent,'Safari/'); 01914 $bInfo['VERSION'] = doubleval(ereg_replace('^[^0-9]*','',substr($tmp,3))); 01915 break; 01916 case 'opera': 01917 $tmp = strstr($useragent,'Opera'); 01918 $bInfo['VERSION'] = doubleval(ereg_replace('^[^0-9]*','',substr($tmp,5))); 01919 break; 01920 case 'konqu': 01921 $tmp = strstr($useragent,'Konqueror/'); 01922 $bInfo['VERSION'] = doubleval(substr($tmp,10)); 01923 break; 01924 } 01925 01926 // Client system 01927 if (strstr($useragent,'Win')) { 01928 $bInfo['SYSTEM'] = 'win'; 01929 } elseif (strstr($useragent,'Mac')) { 01930 $bInfo['SYSTEM'] = 'mac'; 01931 } elseif (strstr($useragent,'Linux') || strstr($useragent,'X11') || strstr($useragent,'SGI') || strstr($useragent,' SunOS ') || strstr($useragent,' HP-UX ')) { 01932 $bInfo['SYSTEM'] = 'unix'; 01933 } 01934 } 01935 01936 // Is true if the browser supports css to format forms, especially the width 01937 $bInfo['FORMSTYLE']=($bInfo['BROWSER']=='msie' || ($bInfo['BROWSER']=='net'&&$bInfo['VERSION']>=5) || $bInfo['BROWSER']=='opera' || $bInfo['BROWSER']=='konqu'); 01938 return $bInfo; 01939 } 01940 01941 /*************************** 01942 * 01943 * OTHER FUNCTIONS: (from Classic RTE) 01944 * 01945 ***************************/ 01951 function RTEtsConfigParams() { 01952 global $TSFE; 01953 if(is_object($TSFE)) { 01954 return ''; 01955 } else { 01956 $p = t3lib_BEfunc::getSpecConfParametersFromArray($this->specConf['rte_transform']['parameters']); 01957 return $this->elementParts[0].':'.$this->elementParts[1].':'.$this->elementParts[2].':'.$this->thePid.':'.$this->typeVal.':'.$this->tscPID.':'.$p['imgpath']; 01958 } 01959 } 01960 01961 function cleanList($str) { 01962 if (strstr($str,'*')) { 01963 $str = '*'; 01964 } else { 01965 $str = implode(',',array_unique(t3lib_div::trimExplode(',',$str,1))); 01966 } 01967 return $str; 01968 } 01969 01970 function filterStyleEl($elValue,$matchList) { 01971 $matchParts = t3lib_div::trimExplode(',',$matchList,1); 01972 $styleParts = explode(';',$elValue); 01973 $nStyle=array(); 01974 while(list($k,$p)=each($styleParts)) { 01975 $pp = t3lib_div::trimExplode(':',$p); 01976 if ($pp[0]&&$pp[1]) { 01977 reset($matchParts); 01978 while(list(,$el)=each($matchParts)) { 01979 $star=substr($el,-1)=='*'; 01980 if (!strcmp($pp[0],$el) || ($star && t3lib_div::isFirstPartOfStr($pp[0],substr($el,0,-1)) )) { 01981 $nStyle[]=$pp[0].':'.$pp[1]; 01982 } else unset($styleParts[$k]); 01983 } 01984 } else { 01985 unset($styleParts[$k]); 01986 } 01987 } 01988 return implode('; ',$nStyle); 01989 } 01990 01991 // Hook on lorem_ipsum extension to insert text into the RTE in wysiwyg mode 01992 function loremIpsumInsert($params) { 01993 return " 01994 if (typeof(lorem_ipsum) == 'function' && " . $params['element'] . ".tagName.toLowerCase() == 'textarea' ) lorem_ipsum(" . $params['element'] . ", lipsum_temp_strings[lipsum_temp_pointer]); 01995 "; 01996 } 01997 } 01998 01999 if (defined('TYPO3_MODE') && $TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['ext/rtehtmlarea/class.tx_rtehtmlarea_base.php']) { 02000 include_once($TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['ext/rtehtmlarea/class.tx_rtehtmlarea_base.php']); 02001 } 02002 02003 ?>