[TYPO3-core] RFC: Inline Relational Record Editing (IRRE)
Kasper Skårhøj
kasper2006 at typo3.com
Mon Nov 20 12:34:36 CET 2006
Hi Ingmar,
I must trust that its good. Make sure to search for alt_doc.php API
in TYPO3 Core API and make proper updates if needed.
WHy is your patch not attached so I can open it in a colorizing
editor you think?
- kasper
On Nov 17, 2006, at 15:03 , Ingmar Schlecht wrote:
> Hi guys,
>
> to make life easier for those who want to review the patch, I have
> split
> it up into multiple files, with a proper and clear description of what
> the code-changes in that particular file do on top of each patch.
>
> I think it's enough if you only read through the code and don't
> test it,
> because a lot of others including me have intensively tested it
> already.
>
> cheers
> Ingmar
>
> The alt_doc.php script had the nasty behavior to display forms for
> all newly created
> records even if they weren't in the edit[] array.
> This was a showstopper for IRRE using the data[tablename][NEW...]
> array to create new sub-records:
> Of course those newly created sub-records shouldn't be shown as a
> separate form by alt_doc.php but
> inside of the typeInline field of the parent record.
>
> The below code fixes that issue, so that after clicking "save" only
> forms for those records are
> displayed that were edited before (and are thus in the $this-
> >editconf array). NEW... ids are
> correctly replaced with their real ids.
>
> Index: C:/apache/typo3/irre-trunk/typo3/alt_doc.php
> ===================================================================
> --- C:/apache/typo3/irre-trunk/typo3/alt_doc.php (revision 1794)
> +++ C:/apache/typo3/irre-trunk/typo3/alt_doc.php (working copy)
> @@ -253,6 +253,7 @@
>
> // GPvars specifically for processing:
> $this->data = t3lib_div::_GP('data');
> + $this->cmd = t3lib_div::_GP('cmd');
> $this->mirror = t3lib_div::_GP('mirror');
> $this->cacheCmd = t3lib_div::_GP('cacheCmd');
> $this->redirect = t3lib_div::_GP('redirect');
> @@ -277,7 +278,7 @@
> $tce->disableRTE = $this->disableRTE;
>
> // Loading TCEmain with data:
> - $tce->start($this->data,array());
> + $tce->start($this->data,$this->cmd);
> if (is_array($this->mirror)) { $tce->setMirror($this->mirror); }
>
> // If pages are being edited, we set an instruction about
> updating the page tree after this operation.
> @@ -297,27 +298,35 @@
> // Perform the saving operation with TCEmain:
> $tce->process_uploads($_FILES);
> $tce->process_datamap();
> + $tce->process_cmdmap();
>
> // If there was saved any new items, load them:
> if (count($tce->substNEWwithIDs_table)) {
>
> - // Resetting editconf:
> - $this->editconf = array();
> -
> - // Traverse all new records and forge the content of -
> >editconf so we can continue to EDIT these records!
> - foreach($tce->substNEWwithIDs_table as $nKey => $nTable) {
> - $editId = $tce->substNEWwithIDs[$nKey];
> - // translate new id to the workspace version:
> - if ($versionRec = t3lib_BEfunc::getWorkspaceVersionOfRecord
> ($GLOBALS['BE_USER']->workspace, $nTable, $editId,'uid')) {
> - $editId = $versionRec['uid'];
> + foreach($this->editconf as $tableName => $tableCmds) {
> + $keys = array_keys($tce->substNEWwithIDs_table, $tableName);
> + if(count($keys) > 0) {
> + foreach($keys as $key) {
> + $editId = $tce->substNEWwithIDs[$key];
> + // translate new id to the workspace version:
> + if ($versionRec = t3lib_BEfunc::getWorkspaceVersionOfRecord
> ($GLOBALS['BE_USER']->workspace, $nTable, $editId,'uid')) {
> + $editId = $versionRec['uid'];
> + }
> + $newEditConf[$tableName][$editId] = 'edit';
> +
> + // Traverse all new records and forge the content of -
> >editconf so we can continue to EDIT these records!
> + if ($tableName=='pages' && $this->retUrl!='dummy.php' &&
> $this->returnNewPageId) {
> + $this->retUrl.='&id='.$tce->substNEWwithIDs[$key];
> + }
> + }
> + } else {
> + $newEditConf[$tableName] = $tableCmds;
> }
> -
> - $this->editconf[$nTable][$editId]='edit';
> - if ($nTable=='pages' && $this->retUrl!='dummy.php' && $this-
> >returnNewPageId) {
> - $this->retUrl.='&id='.$tce->substNEWwithIDs[$nKey];
> - }
> }
>
> + // Resetting editconf:
> + $this->editconf = $newEditConf;
> +
> // Finally, set the editconf array in the "getvars" so they
> will be passed along in URLs as needed.
> $this->R_URL_getvars['edit']=$this->editconf;
>
> @@ -479,7 +488,7 @@
>
> // Begin edit:
> if (is_array($this->editconf)) {
> -
> +
> // Initialize TCEforms (rendering the forms)
> $this->tceforms = t3lib_div::makeInstance('t3lib_TCEforms');
> $this->tceforms->initDefaultBEMode();
> @@ -940,7 +949,7 @@
>
> $formContent.='
> <tr>
> - <td colspan="2"><div id="typo3-altdoc-header-info-options">'.
> $pagePath.$langSelector.'<div></td>
> + <td colspan="2"><div id="typo3-altdoc-header-info-options">'.
> $pagePath.$langSelector.'</div></td>
> </tr>
> </table>
>
> - No changes to original functionality
> - Two added functions, readForeignField() and writeForeignField()
> that provide a
> new saving method of relations: Saving the uid of the parent in a
> field of the child table
> (of course this works only for 1:n relations).
>
> Index: C:/apache/typo3/irre-trunk/t3lib/class.t3lib_loaddbgroup.php
> ===================================================================
> --- C:/apache/typo3/irre-trunk/t3lib/class.t3lib_loaddbgroup.php
> (revision 1794)
> +++ C:/apache/typo3/irre-trunk/t3lib/class.t3lib_loaddbgroup.php
> (working copy)
> @@ -90,6 +93,7 @@
> var $MM_oppositeFieldConf = ''; // only set if MM_is_foreign is set
> var $MM_isMultiTableRelationship = 0; // is empty by default; if
> MM_is_foreign is set and there is more than one table allowed (on
> the "local" side), then it contains the first table (as a fallback)
> var $currentTable; // current table => Only needed for reverse
> relations
> + var $undeleteRecord; // if a record should be undeleted (so do
> not use the $useDeleteClause on t3lib_BEfunc)
>
>
> /**
> @@ -156,6 +160,9 @@
> // Now, populate the internal itemArray and tableArray arrays:
> if ($MMtable) { // If MM, then call this function to do that:
> $this->readMM($MMtable,$MMuid);
> + } elseif ($MMuid && $conf['foreign_field']) {
> + // If not MM but foreign_field, read the records by the
> foreign_field
> + $this->readForeignField($MMuid, $conf);
> } else {
> // If not MM, then explode the itemlist by "," and traverse
> the list:
> $this->readList($itemlist);
> @@ -353,6 +360,167 @@
> }
>
> /**
> + * Reads items from a foreign_table, that has a foreign_field
> (uid of the parent record) and
> + * stores the parts in the internal array itemArray and tableArray.
> + *
> + * @param integer $uid: The uid of the parent record (this value
> is also on the foreign_table in the foreign_field)
> + * @param array $conf: TCA configuration for current field
> + * @return void
> + */
> + function readForeignField($uid, $conf) {
> + $key = 0;
> + $uid = intval($uid);
> + $foreign_table = $conf['foreign_table'];
> + $useDeleteClause = $this->undeleteRecord ? false : true;
> +
> + if ($conf['foreign_sortby']) // specific sortby for
> data handled by this field
> + $sortby = $conf['foreign_sortby'];
> + elseif ($GLOBALS['TCA'][$foreign_table]['ctrl']['sortby']) //
> specific sortby for all table records
> + $sortby = $GLOBALS['TCA'][$foreign_table]['ctrl']['sortby'];
> + elseif ($GLOBALS['TCA'][$foreign_table]['ctrl']
> ['default_sortby']) // default sortby for all table records
> + $sortby = $GLOBALS['TCA'][$foreign_table]['ctrl']
> ['default_sortby'];
> +
> + // strip a possible "ORDER BY" in front of the $sortby value
> + $sortby = $GLOBALS['TYPO3_DB']->stripOrderBy($sortby);
> +
> + // get the rows from storage
> + $rows = t3lib_BEfunc::getRecordsByField($foreign_table,$conf
> ['foreign_field'],$uid,'','',$sortby,'',$useDeleteClause);
> +
> + // FIXME: Experiments on bidirectional symmetric record
> handling with attributes
> + if ($conf['symmetric_field']) {
> + $symSortby = $conf['symmetric_sortby'] ? $conf
> ['symmetric_sortby'] : $sortby;
> + $symRows = t3lib_BEfunc::getRecordsByField($foreign_table,$conf
> ['symmetric_field'],$uid,'','',$symSortby,'',$useDeleteClause);
> +
> + if (count($symRows)) {
> + // if there are rows and symRows, we have to merge them, but
> keeping the sorting order
> + if (count($rows)) {
> + $newRows = array();
> + reset($rows);
> + reset($symRows);
> +
> + $row = current($rows);
> + $symRow = current($symRows);
> +
> + while (is_array($row)) {
> + // if the sorting value of the symRow is lower than the row
> sorting value, insert symRow before
> + while (is_array($symRow) && $symRow[$symSortby] <= $row
> [$sortby]) {
> + $newRows[] = $symRow;
> + $symRow = next($symRows);
> + }
> +
> + // all better sorted symRows have been processed, now add
> the row itself
> + $newRows[] = $row;
> + $row = next($rows);
> +
> + // if there are no more rows, paste all remaining symRows
> + if ($row == false && $symRow != false) {
> + while (is_array($symRow)) {
> + $newRows[] = $symRow;
> + $symRow = next($symRows);
> + }
> + }
> + }
> +
> + // set the rows value to the new ordered array
> + $rows = $newRows;
> +
> + // there are no rows, just symRows, so we use them - sorting
> comes from database
> + } else {
> + $rows = $symRows;
> +
> + }
> + }
> + }
> +
> + if (count($rows)) {
> + foreach ($rows as $row) {
> + $this->itemArray[$key]['id'] = $row['uid'];
> + $this->itemArray[$key]['table'] = $conf['foreign_table'];
> + $this->tableArray[$theTable][]= $row['uid'];
> + $key++;
> + }
> + }
> + }
> +
> + /**
> + * For all items in $this->itemArray write the parent uid to the
> foreign_field of
> + * the foreign_table and write the sorting values.
> + *
> + * @param array $conf: TCA configuration for current field
> + * @param integer $parentUid: The uid of the parent record
> + * @param boolean $updateForeignField: Whether to update the
> foreign field with the $parentUid (on Copy)
> + * @return void
> + */
> + function writeForeignField($conf, $parentUid, $updateToUid=0) {
> + $c = 0;
> + $foreign_table = $conf['foreign_table'];
> + $foreign_field = $conf['foreign_field'];
> + $symmetric_field = $conf['symmetric_field'];
> +
> + // if there are table items and we have a proper $parentUid
> + if (t3lib_div::testInt($parentUid) && count($this->tableArray)) {
> + // if updateToUid is not a positive integer, set it to '0', so
> it will be ignored
> + if (!(t3lib_div::testInt($updateToUid) && $updateToUid > 0))
> $updateToUid = 0;
> + $fields = $foreign_field.($symmetric_field ? ','.
> $symmetric_field : '');
> +
> + // update all items
> + foreach ($this->itemArray as $val) {
> + $uid = $val['id'];
> + $table = $val['table'];
> +
> + // fetch the current (not overwritten) relation record if we
> handle symmetric relations
> + $row = t3lib_BEfunc::getRecord($table,$uid,$fields,'',false);
> +
> + $updateValues = array();
> +
> + // no update to a foreign_field/symmetric_field pointer is
> requested
> + if (!$updateToUid) {
> + // Always add the pointer to the parent uid
> + //
> +
> + if ($symmetric_field && $row[$symmetric_field] == $parentUid) {
> + // do nothing
> + $updateValues[$foreign_field] = $parentUid;
> + } else {
> + $updateValues[$foreign_field] = $parentUid;
> + }
> +
> + // specific sortby for data handled by this field
> + if ($conf['foreign_sortby']) {
> + $sortby = $conf['foreign_sortby'];
> + } elseif ($GLOBALS['TCA'][$foreign_table]['ctrl']['sortby'])
> { // specific sortby for all table records
> + $sortby = $GLOBALS['TCA'][$foreign_table]['ctrl']['sortby'];
> + }
> + // strip a possible "ORDER BY" in front of the $sortby value
> + $sortby = $GLOBALS['TYPO3_DB']->stripOrderBy($sortby);
> + $symSortby = $conf['symmetric_sortby'];
> +
> + // set the sorting on the right side, it depends on who
> created the relation, so what uid is in the symmetric_field
> + if ($symmetric_field && $row[$symmetric_field] == $parentUid
> && $symSortby)
> + $updateValues[$symSortby] = ++$c;
> + elseif ($sortby)
> + $updateValues[$sortby] = ++$c;
> +
> + // update to a foreign_field/symmetric_field pointer is
> requested, normally used on record copies
> + // only update the fields, if the old uid is found somewhere
> - for select fields, TCEmain is doing this already!
> + } else {
> + // @TODO: Needed for symmetric relations
> + /*if ($symmetric_field && $row[$symmetric_field] == $parentUid)
> + $updateValues[$symmetric_field] = $updateToUid;
> + else*/
> + if ($row[$foreign_field] == $parentUid) {
> + $updateValues[$foreign_field] = $updateToUid;
> + }
> + }
> +
> + if (count($updateValues)) {
> + $GLOBALS['TYPO3_DB']->exec_UPDATEquery($table, "uid='$uid'",
> $updateValues);
> + }
> + }
> + }
> + }
> +
> + /**
> * After initialization you can extract an array of the elements
> from the object. Use this function for that.
> *
> * @param boolean If set, then table names will ALWAYS be
> prepended (unless its a _NO_TABLE value)
> @@ -462,6 +630,18 @@
> }
> return implode(',',$output);
> }
> +
> + /**
> + * Counts the items in $this->itemArray and puts this value in an
> array by default.
> + *
> + * @param boolean Whether to put the count value in an array
> + * @return mixed The plain count as integer or the same inside
> an array
> + */
> + function countItems($returnAsArray = true) {
> + $count = count($this->itemArray);
> + if ($returnAsArray) $count = array($count);
> + return $count;
> + }
> }
>
>
> Added function renderRecord_inlineProc().
>
> Index: C:/apache/typo3/irre-trunk/t3lib/class.t3lib_transferdata.php
> ===================================================================
> --- C:/apache/typo3/irre-trunk/t3lib/class.t3lib_transferdata.php
> (revision 1794)
> +++ C:/apache/typo3/irre-trunk/t3lib/class.t3lib_transferdata.php
> (working copy)
> @@ -324,7 +325,6 @@
> * @return string Modified $value
> */
> function renderRecord_SW($data,$fieldConfig,$TSconfig,$table,$row,
> $field) {
> -
> switch((string)$fieldConfig['config']['type']) {
> case 'group':
> $data = $this->renderRecord_groupProc($data,$fieldConfig,
> $TSconfig,$table,$row,$field);
> @@ -335,6 +335,9 @@
> case 'flex':
> $data = $this->renderRecord_flexProc($data,$fieldConfig,
> $TSconfig,$table,$row,$field);
> break;
> + case 'inline':
> + $data = $this->renderRecord_inlineProc($data,$fieldConfig,
> $TSconfig,$table,$row,$field);
> + break;
> }
>
> return $data;
> @@ -525,7 +528,31 @@
> return $totalRecordContent;
> }
>
> + /**
> + * Processing of the data value in case the field type is "inline"
> + * In some parts nearly the same as type "select"
> + *
> + * @param string The field value
> + * @param array TCA field config
> + * @param array TCEform TSconfig for the record
> + * @param string Table name
> + * @param array The row
> + * @param string Field name
> + * @return string The processed input field value ($data)
> + * @access private
> + * @see renderRecord()
> + */
> + function renderRecord_inlineProc($data,$fieldConfig,$TSconfig,
> $table,$row,$field) {
> + global $TCA;
>
> + // Initialize:
> + $elements = t3lib_div::trimExplode(',',$data); // Current data set.
> + $dataAcc=array(); // New data set, ready for interface (list of
> values, rawurlencoded)
> +
> + $dataAcc = $this->selectAddForeign($dataAcc, $elements,
> $fieldConfig, $field, $TSconfig, $row, $table);
> +
> + return implode(',',$dataAcc);
> + }
>
>
>
> @@ -814,7 +841,7 @@
> foreach($dataIds as $theId) {
> if (isset($recordList[$theId])) {
> $lPrefix = $this->sL($fieldConfig['config']
> [($theId>0?'':'neg_').'foreign_table_prefix']);
> - if ($fieldConfig['config']['MM']) {
> + if ($fieldConfig['config']['MM'] || $fieldConfig['config']
> ['foreign_field']) {
> $dataAcc[]=rawurlencode($theId).'|'.rawurlencode
> (t3lib_div::fixed_lgd_cs($lPrefix.strip_tags($recordList[$theId]),
> $GLOBALS['BE_USER']->uc['titleLen']));
> } else {
> foreach($elements as $eKey => $value) {
> TCEForms now includes the new class
> "class.t3lib_tceforms_inline.php" and always makes an instance of
> it in $this->inline.
>
> getSingleField_SW() got a new case 'inline' calling
> getSingleField_typeInline().
>
> getSingleField_typeSelect_single() can handle values that must be
> unique among all inline children
>
>
> Index: C:/apache/typo3/irre-trunk/t3lib/class.t3lib_tceforms.php
> ===================================================================
> --- C:/apache/typo3/irre-trunk/t3lib/class.t3lib_tceforms.php
> (revision 1794)
> +++ C:/apache/typo3/irre-trunk/t3lib/class.t3lib_tceforms.php
> (working copy)
> @@ -181,6 +181,7 @@
>
>
> require_once(PATH_t3lib.'class.t3lib_diff.php');
> +require_once(PATH_t3lib.'class.t3lib_tceforms_inline.php');
>
>
>
> @@ -240,6 +241,7 @@
>
> // INTERNAL, static
> var $prependFormFieldNames = 'data'; // The string to prepend
> formfield names with.
> + var $prependCmdFieldNames = 'cmd'; // The string to prepend
> commands for tcemain::process_cmdmap with.
> var $prependFormFieldNames_file = 'data_files'; // The string to
> prepend FILE form field names with.
> var $formName = 'editform'; // The name attribute of the form.
>
> @@ -286,12 +288,12 @@
> var $additionalJS_post = array(); // Additional JavaScript
> printed after the form
> var $additionalJS_submit = array(); // Additional JavaScript
> executed on submit; If you set "OK" variable it will raise an error
> about RTEs not being loaded and offer to block further submission.
>
> + var $inline; // Instance of t3lib_tceforms_inline
>
>
>
>
>
> -
> /**
> * Constructor function, setting internal variables, loading the
> styles used.
> *
> @@ -324,6 +326,8 @@
> // Setting the current colorScheme to default.
> $this->defColorScheme = $this->colorScheme;
> $this->defClassScheme = $this->classScheme;
> +
> + $this->inline = t3lib_div::makeInstance('t3lib_TCEforms_inline');
> }
>
> /**
> @@ -341,6 +345,8 @@
>
> $this->edit_docModuleUpload = $BE_USER->uc['edit_docModuleUpload'];
> $this->titleLen = $BE_USER->uc['titleLen'];
> +
> + $this->inline->init($this);
> }
>
>
> @@ -745,8 +751,11 @@
> $PA['fieldConf'] = $TCA[$table]['columns'][$field];
> $PA['fieldConf']['config']['form_type'] = $PA['fieldConf']
> ['config']['form_type'] ? $PA['fieldConf']['config']['form_type'] :
> $PA['fieldConf']['config']['type']; // Using "form_type" locally in
> this script
>
> + $skipThisField = $this->inline-
> >getSingleField_typeInline_skipField($table, $field, $PA
> ['fieldConf']['config']);
> +
> // Now, check if this field is configured and editable
> (according to excludefields + other configuration)
> if ( is_array($PA['fieldConf']) &&
> + !$skipThisField &&
> (!$PA['fieldConf']['exclude'] || $BE_USER->check
> ('non_exclude_fields',$table.':'.$field)) &&
> $PA['fieldConf']['config']['form_type']!='passthrough' &&
> ($this->RTEenabled || !$PA['fieldConf']['config']
> ['showIfRTE']) &&
> @@ -812,6 +821,10 @@
> $PA['fieldChangeFunc']=array();
> $PA['fieldChangeFunc']['TBE_EDITOR_fieldChanged'] =
> "TBE_EDITOR_fieldChanged('".$table."','".$row['uid']."','".
> $field."','".$PA['itemFormElName']."');";
> $PA['fieldChangeFunc']['alert']=$alertMsgOnChange;
> + // if this is the child of an inline type and it is the
> field creating the label
> + if ($this->inline-
> >getSingleField_typeInline_isInlineChildAndLabelField($table,
> $field)) {
> + $PA['fieldChangeFunc']['inline'] = "inline.handleChangedField
> ('".$PA['itemFormElName']."','".$this->inline->inlineNames
> ['object']."[$table][".$row['uid']."]');";
> + }
>
> // Based on the type of the item, call a render function:
> $item = $this->getSingleField_SW($table,$field,$row,$PA);
> @@ -906,6 +919,9 @@
> case 'group':
> $item = $this->getSingleField_typeGroup($table,$field,$row,$PA);
> break;
> + case 'inline':
> + $item = $this->inline->getSingleField_typeInline($table,$field,
> $row,$PA);
> + break;
> case 'none':
> $item = $this->getSingleField_typeNone($table,$field,$row,$PA);
> break;
> @@ -1341,6 +1357,16 @@
> * @see getSingleField_typeSelect()
> */
> function getSingleField_typeSelect_single($table,$field,$row,&$PA,
> $config,$selItems,$nMV_label) {
> + // check against inline uniqueness
> + $inlineParent = $this->inline-
> >getSingleField_typeInline_getStructureLevel(-1);
> + if(is_array($inlineParent) && $inlineParent['uid']) {
> + if ($inlineParent['config']['foreign_table'] == $table &&
> $inlineParent['config']['foreign_unique'] == $field) {
> + $uniqueIds = $this->inline->inlineData['unique'][$this->inline-
> >inlineNames['object'].'['.$table.']']['used'];
> + $PA['fieldChangeFunc']['inlineUnique'] = "inline.updateUnique
> (this,'".$this->inline->inlineNames['object'].'['.$table."]','".
> $this->inline->inlineNames['form']."','".$row['uid']."');";
> + }
> + // @TODO: Useful only for symmetric mm relations:
> + //$uniqueIds[] = $inlineParent['uid'];
> + }
>
> // Initialization:
> $c = 0;
> @@ -1381,11 +1407,13 @@
> }
>
> // Compiling the <option> tag:
> - $opt[]= '<option value="'.htmlspecialchars($p[1]).'"'.
> - $sM.
> - ($styleAttrValue ? ' style="'.htmlspecialchars
> ($styleAttrValue).'"' : '').
> - (!strcmp($p[1],'--div--') ? ' class="c-divider"' : '').
> - '>'.t3lib_div::deHSCentities(htmlspecialchars($p[0])).'</
> option>';
> + if (!($p[1] != $PA['itemFormElValue'] && is_array($uniqueIds)
> && in_array($p[1], $uniqueIds))) {
> + $opt[]= '<option value="'.htmlspecialchars($p[1]).'"'.
> + $sM.
> + ($styleAttrValue ? ' style="'.htmlspecialchars
> ($styleAttrValue).'"' : '').
> + (!strcmp($p[1],'--div--') ? ' class="c-divider"' : '').
> + '>'.t3lib_div::deHSCentities(htmlspecialchars($p[0])).'</
> option>';
> + }
>
> // If there is an icon for the selector box (rendered in table
> under)...:
> if ($p[2] && !$suppressIcons && (!$onlySelectedIconShown ||
> $sM)) {
> @@ -4477,7 +4504,20 @@
> * @return string A <script></script> section with JavaScript.
> */
> function JSbottom($formname='forms[0]') {
> + // add JS needed for inline fields
> + if ($this->inline->inlineCount > 0) {
> + if (count($this->inline->inlineData)) {
> + $inlineData = 'inline.addToDataArray('.$this->inline-
> >getSingleField_typeInline_getJSON($this->inline->inlineData).');';
> + }
>
> + $out .= $this->inline->getSingleField_typeInline_addJavaScript();
> + $out .= t3lib_div::wrapJS('
> + inline.setPrependFormFieldNames("'.$this->inline-
> >prependNaming.'");
> + inline.setNoTitleString("'.addslashes($this->noTitle('')).'");
> + '.$inlineData.'
> + ');
> + }
> +
> // required
> $reqLines=array();
> $reqLinesCheck=array();
> What you need to know when reviewing the tcemain patch:
> - Child records are created and written using the normal data
> [tablename][id] array, so nothing special here
> - The relations between the parent and child records are written by
> checkValue_inline() in case all records existed already (i.e. no
> NEW... ids in the list of children), otherwise the relations are
> but to a $remapStack array which is gone thru at the end of
> process_datamap when all records are already created and the ids
> are known, so the relations can be written.
> - Checking of "max" is outsourced into a separate function
> checkValue_checkMax() to make it usable from checkValue_inline()
> - When the parent record is deleted/moved, children need to be
> deleted/moved too. Therefore new functions (moveRecord_procFields()
> and deleteRecord_procFields()) have been added.
> - To correct the relations when copying, the function
> remapListedDBRecords_procInline() has been added.
>
> Index: C:/apache/typo3/irre-trunk/t3lib/class.t3lib_tcemain.php
> ===================================================================
> --- C:/apache/typo3/irre-trunk/t3lib/class.t3lib_tcemain.php
> (revision 1794)
> +++ C:/apache/typo3/irre-trunk/t3lib/class.t3lib_tcemain.php
> (working copy)
> @@ -320,7 +325,8 @@
> var $uploadedFileArray = array(); // Uploaded files, set by
> process_uploads()
> var $registerDBList=array(); // Used for tracking references
> that might need correction after operations
> var $copyMappingArray = Array(); // Used by the copy action to
> track the ids of new pages so subpages are correctly inserted! THIS
> is internally cleared for each executed copy operation! DO NOT USE
> THIS FROM OUTSIDE! Read from copyMappingArray_merged instead which
> is accumulating this information.
> -
> + var $remapStack = array(); // array used for remapping uids
> and values at the end of process_datamap
> +
> // Various
> var $fileFunc; // For "singleTon" file-manipulation object
> var $checkValue_currentRecord=array(); // Set to "currentRecord"
> during checking of values.
> @@ -803,6 +809,50 @@
> }
> }
> }
> +
> + // call_user_func_array
> +
> + // Process the stack of relations to remap/correct
> + if(is_array($this->remapStack)) {
> + foreach($this->remapStack as $remapAction) {
> + // if no position index for the arguments was set, skip this
> remap action
> + if (!is_array($remapAction['pos'])) continue;
> +
> + // load values from the argument array in remapAction
> + $field = $remapAction['field'];
> + $id = $remapAction['args'][$remapAction['pos']['id']];
> + $table = $remapAction['args'][$remapAction['pos']['table']];
> + $valueArray = $remapAction['args'][$remapAction['pos']
> ['valueArray']];
> + $tcaFieldConf = $remapAction['args'][$remapAction['pos']
> ['tcaFieldConf']];
> +
> + // Replace NEW... IDs with real uids.
> + if(strpos($id, 'NEW') !== false) {
> + $id = $this->substNEWwithIDs[$id];
> + $remapAction['args'][$remapAction['pos']['id']] = $id;
> + }
> +
> + // Replace relations to NEW...-IDs in values
> + if(is_array($valueArray)) {
> + foreach($valueArray as $key => $value) {
> + if(strpos($value, 'NEW') !== false) {
> + $valueArray[$key] = $this->substNEWwithIDs[$value];
> + }
> + }
> + $remapAction['args'][$remapAction['pos']['valueArray']] =
> $valueArray;
> + }
> +
> + // process the arguments with the defined function
> + $remapAction['args'][$remapAction['pos']['valueArray']] =
> call_user_func_array(
> + array($this, $remapAction['func']),
> + $remapAction['args']
> + );
> +
> + // @TODO: Add option to disable count-field
> + $newVal = $this->checkValue_checkMax($tcaFieldConf,
> $remapAction['args'][$remapAction['pos']['valueArray']]);
> + $this->updateDB($table,$id,array($field => implode(',',
> $newVal)));
> + }
> + }
> +
> $this->dbAnalysisStoreExec();
> $this->removeRegisteredFiles();
> }
> @@ -1152,8 +1202,11 @@
> break;
> case 'group':
> case 'select':
> - $res = $this->checkValue_group_select($res,$value,
> $tcaFieldConf,$PP,$uploadedFiles,$field);
> + $res = $this->checkValue_group_select($res,$value,
> $tcaFieldConf,$PP,$uploadedFiles,$field);
> break;
> + case 'inline':
> + $res = $this->checkValue_inline($res,$value,$tcaFieldConf,$PP,
> $field);
> + break;
> case 'flex':
> if ($field) { // FlexForms are only allowed for real fields.
> $res = $this->checkValue_flex($res,$value,$tcaFieldConf,$PP,
> $uploadedFiles,$field);
> @@ -1336,28 +1389,26 @@
> }
> // For select types which has a foreign table attached:
> if ($tcaFieldConf['type']=='select' && $tcaFieldConf
> ['foreign_table']) {
> - $valueArray = $this->checkValue_group_select_processDBdata
> ($valueArray,$tcaFieldConf,$id,$status,'select', $table);
> + // check, if there is a NEW... id in the value, that should be
> substituded later
> + if (strpos($value, 'NEW') !== false) {
> + $this->remapStack[] = array(
> + 'func' => 'checkValue_group_select_processDBdata',
> + 'args' => array($valueArray,$tcaFieldConf,$id,
> $status,'select',$table),
> + 'pos' => array('valueArray' => 0, 'tcaFieldConf' => 1, 'id'
> => 2, 'table' => 5),
> + 'field' => $field
> + );
> + $unsetResult = true;
> + } else {
> + $valueArray = $this->checkValue_group_select_processDBdata
> ($valueArray,$tcaFieldConf,$id,$status,'select', $table);
> + }
> }
>
> -// BTW, checking for min and max items here does NOT make any
> sense when MM is used because the above function calls will just
> return an array with a single item (the count) if MM is used... Why
> didn't I perform the check before? Probably because we could not
> evaluate the validity of record uids etc... Hmm...
> -
> - // Checking the number of items, that it is correct.
> - // If files, there MUST NOT be too many files in the list at
> this point, so check that prior to this code.
> - $valueArrayC = count($valueArray);
> - $minI = isset($tcaFieldConf['minitems']) ? intval($tcaFieldConf
> ['minitems']):0;
> -
> - // NOTE to the comment: It's not really possible to check for
> too few items, because you must then determine first, if the field
> is actual used regarding the CType.
> - $maxI = isset($tcaFieldConf['maxitems']) ? intval($tcaFieldConf
> ['maxitems']):1;
> - if ($valueArrayC > $maxI) {$valueArrayC=$maxI;} // Checking for
> not too many elements
> -
> - // Dumping array to list
> - $newVal=array();
> - foreach($valueArray as $nextVal) {
> - if ($valueArrayC==0) {break;}
> - $valueArrayC--;
> - $newVal[]=$nextVal;
> + if (!$unsetResult) {
> + $newVal=$this->checkValue_checkMax($tcaFieldConf, $valueArray);
> + $res['value'] = implode(',',$newVal);
> + } else {
> + unset($res['value']);
> }
> - $res['value'] = implode(',',$newVal);
>
> return $res;
> }
> @@ -1531,8 +1582,7 @@
> } else {
> $this->dbAnalysisStore[] = array($dbAnalysis, $tcaFieldConf
> ['MM'], $id, 0); // This will be traversed later to execute the
> actions
> }
> - $cc=count($dbAnalysis->itemArray);
> - $valueArray = array($cc);
> + $valueArray = $dbAnalysis->countItems();
> }
> }
>
> @@ -1691,13 +1741,79 @@
> }
> }
>
> + /**
> + * Evaluates 'inline' type values.
> + * (partly copied from the select_group function on this issue)
> + *
> + * @param array The result array. The processed value (if any!)
> is set in the 'value' key.
> + * @param string The value to set.
> + * @param array Field configuration from TCA
> + * @param array Additional parameters in a numeric array: $table,
> $id,$curValue,$status,$realPid,$recFID
> + * @param string Field name
> + * @return array Modified $res array
> + */
> + function checkValue_inline($res,$value,$tcaFieldConf,$PP,$field) {
> + list($table,$id,$curValue,$status,$realPid,$recFID) = $PP;
>
> + if (!$tcaFieldConf['foreign_table']) {
> + return false; // Fatal error, inline fields should always have
> a foreign_table defined
> + }
>
> + // When values are sent they come as comma-separated values
> which are exploded by this function:
> + $valueArray = t3lib_div::trimExplode(',', $value);
> +
> + // Remove duplicates: (should not be needed)
> + $valueArray = array_unique($valueArray);
> +
> + // Example for received data:
> + // $value = 45,NEW4555fdf59d154,12,123
> + // We need to decide whether we use the stack or can save the
> relation directly.
> + if(strpos($value, 'NEW') !== false || !t3lib_div::testInt($id)) {
> + $this->remapStack[] = array(
> + 'func' => 'checkValue_group_select_processDBdata',
> + 'args' => array($valueArray,$tcaFieldConf,$id,$status,'inline',
> $table),
> + 'pos' => array('valueArray' => 0, 'tcaFieldConf' => 1, 'id' =>
> 2, 'table' => 5),
> + 'field' => $field
> + );
> + unset($res['value']);
> + } elseif($value || t3lib_div::testInt($id)) {
> + $newValueArray = $this->checkValue_group_select_processDBdata
> ($valueArray,$tcaFieldConf,$id,$status,'inline', $table);
>
> + // Checking that the number of items is correct
> + $newVal = $this->checkValue_checkMax($tcaFieldConf,
> $newValueArray);
> + $res['value'] = implode(',',$newVal);
> + }
>
> + return $res;
> + }
> +
> + /**
> + * Checks if a fields has more items than defined via TCA in
> maxitems.
> + * If there are more items than allowd, the item list is
> truncated to the defined number.
> + *
> + * @param array $tcaFieldConf: Field configuration from TCA
> + * @param array $valueArray: Current value array of items
> + * @return array The truncated value array of items
> + */
> + function checkValue_checkMax($tcaFieldConf, $valueArray) {
> + // BTW, checking for min and max items here does NOT make any
> sense when MM is used because the above function calls will just
> return an array with a single item (the count) if MM is used... Why
> didn't I perform the check before? Probably because we could not
> evaluate the validity of record uids etc... Hmm...
>
> + $valueArrayC = count($valueArray);
>
> + // NOTE to the comment: It's not really possible to check for
> too few items, because you must then determine first, if the field
> is actual used regarding the CType.
> + $maxI = isset($tcaFieldConf['maxitems']) ? intval($tcaFieldConf
> ['maxitems']):1;
> + if ($valueArrayC > $maxI) {$valueArrayC=$maxI;} // Checking for
> not too many elements
>
> + // Dumping array to list
> + $newVal=array();
> + foreach($valueArray as $nextVal) {
> + if ($valueArrayC==0) {break;}
> + $valueArrayC--;
> + $newVal[]=$nextVal;
> + }
> +
> + return $newVal;
> + }
>
>
>
> @@ -1708,6 +1824,13 @@
>
>
>
> +
> +
> +
> +
> +
> +
> +
> /*********************************************
> *
> * Helper functions for evaluation functions.
> @@ -1797,11 +1920,11 @@
> break;
> case 'upper':
> $value = strtoupper($value);
> -# $value = strtr($value, 'áéúíâêûôîæøåäöü',
> 'ÁÉÚÍÂÊÛÔÎÆØÅÄÖÜ'); // WILL make trouble with other charsets than
> ISO-8859-1, so what do we do here? PHP-function which can handle
> this for other charsets? Currently the browsers JavaScript will fix
> it.
> +# $value = strtr($value, '', ''); // WILL make trouble with
> other charsets than ISO-8859-1, so what do we do here? PHP-function
> which can handle this for other charsets? Currently the browsers
> JavaScript will fix it.
> break;
> case 'lower':
> $value = strtolower($value);
> -# $value = strtr($value, 'ÁÉÚÍÂÊÛÔÎÆØÅÄÖÜ',
> 'áéúíâêûôîæøåäöü'); // WILL make trouble with other charsets than
> ISO-8859-1, so what do we do here? PHP-function which can handle
> this for other charsets? Currently the browsers JavaScript will fix
> it.
> +# $value = strtr($value, '', ''); // WILL make trouble with
> other charsets than ISO-8859-1, so what do we do here? PHP-function
> which can handle this for other charsets? Currently the browsers
> JavaScript will fix it.
> break;
> case 'required':
> if (!$value) {$set=0;}
> @@ -1855,7 +1978,7 @@
> * @param array TCA field config
> * @param integer Record id, used for look-up of MM relations
> (local_uid)
> * @param string Status string ('update' or 'new')
> - * @param string The type, either 'select' or 'group'
> + * @param string The type, either 'select', 'group' or 'inline'
> * @param string Table name, needs to be passed to
> t3lib_loadDBGroup
> * @return array Modified value array
> */
> @@ -1873,8 +1996,19 @@
> } else {
> $this->dbAnalysisStore[] = array($dbAnalysis,$tcaFieldConf
> ['MM'],$id,$prep); // This will be traversed later to execute the
> actions
> }
> - $cc=count($dbAnalysis->itemArray);
> - $valueArray = array($cc);
> + $valueArray = $dbAnalysis->countItems();
> + } elseif ($type == 'inline') {
> + if ($tcaFieldConf['foreign_field']) {
> + // update sorting
> + $dbAnalysis->writeForeignField($tcaFieldConf, $id);
> + $valueArray = $dbAnalysis->countItems();
> + } else {
> + $valueArray = $dbAnalysis->getValueArray($prep);
> + if ($prep) {
> + // @TODO: Do we want to support relations to multiple tables
> in Comma Separated Lists?
> + $valueArray = $dbAnalysis->convertPosNeg($valueArray,
> $tcaFieldConf['foreign_table'],$tcaFieldConf['neg_foreign_table']);
> + }
> + }
> } else {
> $valueArray = $dbAnalysis->getValueArray($prep);
> if ($type=='select' && $prep) {
> @@ -1882,7 +2016,7 @@
> }
> }
>
> - // Here we should se if 1) the records exist anymore, 2) which
> are new and check if the BE_USER has read-access to the new ones.
> + // Here we should see if 1) the records exist anymore, 2) which
> are new and check if the BE_USER has read-access to the new ones.
> return $valueArray;
> }
>
> @@ -2595,10 +2729,10 @@
>
> // Process references and files, currently that means only the
> files, prepending absolute paths (so the TCEmain engine will detect
> the file as new and one that should be made into a copy)
> $value = $this->copyRecord_procFilesRefs($conf, $uid, $value);
> + $inlineSubType = $this->getInlineFieldType($conf);
>
> -
> - // Register if there are references to take care of (no change
> to value):
> - if ($this->isReferenceField($conf)) {
> + // Register if there are references to take care of or MM is
> used on an inline field (no change to value):
> + if ($this->isReferenceField($conf) || $inlineSubType == 'mm') {
> $allowedTables = $conf['type']=='group' ? $conf['allowed'] :
> $conf['foreign_table'].','.$conf['neg_foreign_table'];
> $prependName = $conf['type']=='group' ? $conf
> ['prepend_tname'] : $conf['neg_foreign_table'];
> if ($conf['MM']) {
> @@ -2609,6 +2743,21 @@
> if ($value) { // Setting the value in this array will notify
> the remapListedDBRecords() function that this field MAY need
> references to be corrected
> $this->registerDBList[$table][$uid][$field] = $value;
> }
> +
> + // if another inline subtype is used (foreign_field, mm with
> attributes or simply item list)
> + } elseif ($inlineSubType !== false) {
> + $dbAnalysis = t3lib_div::makeInstance('t3lib_loadDBGroup');
> + $dbAnalysis->start($value, $conf['foreign_table'], $conf['MM'],
> $uid, $table, $conf);
> +
> + // walk through the items, copy them and remember the new id
> + foreach ($dbAnalysis->itemArray as $k => $v) {
> + $newId = $this->copyRecord($v['table'], $v['id'], -$v['id']);
> + $dbAnalysis->itemArray[$k]['id'] = $newId;
> + }
> +
> + // store the new values, we will set up the uids for the
> subtype later on
> + $value = implode(',',$dbAnalysis->getValueArray());
> + $this->registerDBList[$table][$uid][$field] = $value;
> }
>
> // For "flex" fieldtypes we need to traverse the structure for
> two reasons: If there are file references they have to be prepended
> with absolute paths and if there are database reference they MIGHT
> need to be remapped (still done in remapListedDBRecords())
> @@ -2833,6 +2982,9 @@
> $sortNumber = $this->getSortNumber($table,$uid,$destPid);
> $updateFields[$sortRow] = $sortNumber;
> }
> +
> + // check for child records that have also to be moved
> + $this->moveRecord_procFields($table,$uid,$destPid);
> // Create query for update:
> $GLOBALS['TYPO3_DB']->exec_UPDATEquery($table,
> 'uid='.intval($uid), $updateFields);
>
> @@ -2875,6 +3027,10 @@
> // We now update the pid and sortnumber
> $updateFields['pid'] = $destPid;
> $updateFields[$sortRow] = $sortInfo['sortNumber'];
> +
> + // check for child records that have also to be moved
> + $this->moveRecord_procFields($table,$uid,$destPid);
> + // Create query for update:
> $GLOBALS['TYPO3_DB']->exec_UPDATEquery($table,
> 'uid='.intval($uid), $updateFields);
>
> // Call post processing hooks:
> @@ -2923,6 +3079,58 @@
> }
>
> /**
> + * Walk through all fields of the moved record and look for
> children of e.g. the inline type.
> + * If child records are found, they are also move to the new
> $destPid.
> + *
> + * @param string $table: Record Table
> + * @param string $uid: Record UID
> + * @param string $destPid: Position to move to
> + */
> + function moveRecord_procFields($table,$uid,$destPid) {
> + t3lib_div::loadTCA($table);
> + $conf = $GLOBALS['TCA'][$table]['columns'];
> + $row = t3lib_BEfunc::getRecordWSOL($table,$uid);
> + foreach ($row as $field => $value) {
> + $this->moveRecord_procBasedOnFieldType($table,$uid,$destPid,
> $field,$value,$conf[$field]['config']);
> + }
> + }
> +
> + /**
> + * Move child records depending on the field type of the parent
> record.
> + *
> + * @param string $table: Record Table
> + * @param string $uid: Record UID
> + * @param string $destPid: Position to move to
> + * @param string $field: Record field
> + * @param string $value: Record field value
> + * @param array $conf: TCA configuration on current field
> + */
> + function moveRecord_procBasedOnFieldType($table,$uid,$destPid,
> $field,$value,$conf) {
> + $moveTable = '';
> + $moveIds = array();
> +
> + if ($conf['type'] == 'inline') {
> + $foreign_table = $conf['foreign_table'];
> +
> + if ($foreign_table) {
> + $inlineType = $this->getInlineFieldType($conf);
> + if ($inlineType == 'list' || $inlineType == 'field') {
> + $moveTable = $foreign_table;
> + $dbAnalysis = t3lib_div::makeInstance('t3lib_loadDBGroup');
> + $dbAnalysis->start($value, $conf['foreign_table'], '', $uid,
> $table, $conf);
> + }
> + }
> + }
> +
> + // move the records
> + if (isset($dbAnalysis)) {
> + foreach ($dbAnalysis->itemArray as $v) {
> + $this->moveRecord($v['table'],$v['id'],$destPid);
> + }
> + }
> + }
> +
> + /**
> * Localizes a record to another system language
> *
> * @param string Table name
> @@ -3144,6 +3352,8 @@
> $updateFields[$TCA[$table]['ctrl']['sortby']] = 1000000000;
> }
>
> + // before (un-)deleting this record, check for child records
> or references
> + $this->deleteRecord_procFields($table, $uid, $undeleteRecord);
> $GLOBALS['TYPO3_DB']->exec_UPDATEquery($table, 'uid='.intval
> ($uid), $updateFields);
> } else {
>
> @@ -3328,10 +3538,62 @@
> }
> }
>
> + /**
> + * Beford a record is deleted, check if it has references such as
> inline type or MM references.
> + * If so, set these child records also to be deleted.
> + *
> + * @param string $table: Record Table
> + * @param string $uid: Record UID
> + * @param boolean $undeleteRecord: If a record should be
> undeleted (e.g. from history/undo)
> + * @return void
> + * @see deleteRecord()
> + */
> + function deleteRecord_procFields($table, $uid, $undeleteRecord =
> false) {
> + t3lib_div::loadTCA($table);
> + $conf = $GLOBALS['TCA'][$table]['columns'];
> + $row = t3lib_BEfunc::getRecord($table, $uid, '*', '', false);
>
> + foreach ($row as $field => $value) {
> + $this->deleteRecord_procBasedOnFieldType($table, $uid, $field,
> $value, $conf[$field]['config'], $undeleteRecord);
> + }
> + }
>
> + /**
> + * Process fields of a record to be deleted and search for
> special handling, like
> + * inline type, MM records, etc.
> + *
> + * @param string $table: Record Table
> + * @param string $uid: Record UID
> + * @param string $field: Record field
> + * @param string $value: Record field value
> + * @param array $conf: TCA configuration on current field
> + * @param boolean $undeleteRecord: If a record should be
> undeleted (e.g. from history/undo)
> + * @return void
> + * @see deleteRecord()
> + */
> + function deleteRecord_procBasedOnFieldType($table, $uid, $field,
> $value, $conf, $undeleteRecord = false) {
> + if ($conf['type'] == 'inline') {
> + $foreign_table = $conf['foreign_table'];
>
> + if ($foreign_table) {
> + $inlineType = $this->getInlineFieldType($conf);
> + if ($inlineType == 'list' || $inlineType == 'field') {
> + $dbAnalysis = t3lib_div::makeInstance('t3lib_loadDBGroup');
> + $dbAnalysis->start($value, $conf['foreign_table'], '', $uid,
> $table, $conf);
> + $dbAnalysis->undeleteRecord = true;
>
> + // walk through the items and remove them
> + foreach ($dbAnalysis->itemArray as $v) {
> + if (!$undeleteRecord) {
> + $this->deleteAction($v['table'], $v['id']);
> + } else {
> + $this->undeleteRecord($v['table'], $v['id']);
> + }
> + }
> + }
> + }
> + }
> + }
>
>
>
> @@ -3339,6 +3601,7 @@
>
>
>
> +
> /*********************************************
> *
> * Cmd: Versioning
> @@ -3799,6 +4062,9 @@
> }
> }
> break;
> + case 'inline':
> + $this->remapListedDBRecords_procInline($conf, $value,
> $uid, $table);
> + break;
> default:
> debug('Field type should not appear here: '. $conf['type']);
> break;
> @@ -3888,8 +4154,31 @@
> }
> }
>
> + /**
> + * Performs remapping of old UID values to NEW uid values for a
> inline field.
> + *
> + * @param array $conf: TCA field config
> + * @param string $value: Field value
> + * @param integer $uid: The uid of the ORIGINAL record
> + * @param string $table: Table name
> + * @return string The value to be updated on the table field in
> the database
> + */
> + function remapListedDBRecords_procInline($conf, $value, $uid,
> $table) {
> + $theUidToUpdate = $this->copyMappingArray_merged[$table][$uid];
> +
> + if ($conf['foreign_table']) {
> + $inlineType = $this->getInlineFieldType($conf);
>
> + if ($inlineType == 'field') {
> + $dbAnalysis = t3lib_div::makeInstance('t3lib_loadDBGroup');
> + $dbAnalysis->start($value, $conf['foreign_table'], $conf
> ['MM'], 0, $table, $conf);
>
> + $dbAnalysis->writeForeignField($conf, $uid, $theUidToUpdate);
> + } elseif ($inlineType == 'mm') {
> + $vArray = $this->remapListedDBRecords_procDBRefs($conf,
> $value, $theUidToUpdate, $table);
> + }
> + }
> + }
>
>
>
> @@ -3904,6 +4193,7 @@
>
>
>
> +
> /*****************************
> *
> * Access control / Checking functions
> @@ -5190,6 +5480,25 @@
> }
>
> /**
> + * Returns the subtype as a string of an inline field.
> + * If it's not a inline field at all, it returns false.
> + *
> + * @param array config array for TCA/columns field
> + * @return mixed string: inline subtype (field|mm|list),
> boolean: false
> + */
> + function getInlineFieldType($conf) {
> + if ($conf['type'] == 'inline' && $conf['foreign_table']) {
> + if ($conf['foreign_field'])
> + return 'field'; // the reference to the parent is stored in a
> pointer field in the child record
> + elseif ($conf['MM'])
> + return 'mm'; // regular MM intermediate table is used to
> store data
> + else
> + return 'list'; // an item list (separated by comma) is stored
> (like select type is doing)
> + }
> + return false;
> + }
> +
> + /**
> * Get modified header for a copied record
> *
> * @param string Table name
> - New parameter $useDeleteClause for t3lib_BEfunc::getRecord(),
> getRecordWSOL() and getRecordsByField()
> - Changes to the CSS stylesheets
> - Bugfix for the RTE to make it work together with the prototype
> JavaScript library
>
> Index: C:/apache/typo3/irre-trunk/t3lib/class.t3lib_befunc.php
> ===================================================================
> --- C:/apache/typo3/irre-trunk/t3lib/class.t3lib_befunc.php
> (revision 1794)
> +++ C:/apache/typo3/irre-trunk/t3lib/class.t3lib_befunc.php
> (working copy)
> @@ -224,11 +224,16 @@
> * @param integer UID of record
> * @param string List of fields to select
> * @param string Additional WHERE clause, eg. " AND blablabla=0"
> + * @param boolean Use the deleteClause to check if a record is
> deleted (default true)
> * @return array Returns the row if found, otherwise nothing
> */
> - function getRecord($table,$uid,$fields='*',$where='') {
> + function getRecord($table,$uid,$fields='*',$where='',
> $useDeleteClause=true) {
> if ($GLOBALS['TCA'][$table]) {
> - $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery($fields, $table,
> 'uid='.intval($uid).t3lib_BEfunc::deleteClause($table).$where);
> + $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery(
> + $fields,
> + $table,
> + 'uid='.intval($uid).($useDeleteClause ?
> t3lib_BEfunc::deleteClause($table) : '').$where
> + );
> if ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) {
> return $row;
> }
> @@ -242,12 +247,13 @@
> * @param integer UID of record
> * @param string List of fields to select
> * @param string Additional WHERE clause, eg. " AND blablabla=0"
> + * @param boolean Use the deleteClause to check if a record is
> deleted (default true)
> * @return array Returns the row if found, otherwise nothing
> */
> - function getRecordWSOL($table,$uid,$fields='*',$where='') {
> + function getRecordWSOL($table,$uid,$fields='*',$where='',
> $useDeleteClause=true) {
> if ($fields !== '*') {
> $internalFields = t3lib_div::uniqueList($fields.',uid,pid'.
> ($table == 'pages' ? ',t3ver_swapmode' : ''));
> - $row = t3lib_BEfunc::getRecord($table,$uid,$internalFields,
> $where);
> + $row = t3lib_BEfunc::getRecord($table,$uid,$internalFields,
> $where,$useDeleteClause);
> t3lib_BEfunc::workspaceOL($table,$row);
>
> if (is_array ($row)) {
> @@ -297,16 +303,17 @@
> * @param string Optional GROUP BY field(s), if none, supply
> blank string.
> * @param string Optional ORDER BY field(s), if none, supply
> blank string.
> * @param string Optional LIMIT value ([begin,]max), if none,
> supply blank string.
> + * @param boolean Use the deleteClause to check if a record is
> deleted (default true)
> * @return mixed Multidimensional array with selected records
> (if any is selected)
> */
> - function getRecordsByField($theTable,$theField,$theValue,
> $whereClause='',$groupBy='',$orderBy='',$limit='') {
> + function getRecordsByField($theTable,$theField,$theValue,
> $whereClause='',$groupBy='',$orderBy='',$limit='',
> $useDeleteClause=true) {
> global $TCA;
> if (is_array($TCA[$theTable])) {
> $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery(
> '*',
> $theTable,
> $theField.'='.$GLOBALS['TYPO3_DB']->fullQuoteStr($theValue,
> $theTable).
> - t3lib_BEfunc::deleteClause($theTable).' '.
> + ($useDeleteClause ? t3lib_BEfunc::deleteClause($theTable).'
> ' : '').
> t3lib_BEfunc::versioningPlaceholderClause($theTable).' '.
> $whereClause, // whereClauseMightContainGroupOrderBy
> $groupBy,
> Index: C:/apache/typo3/irre-trunk/typo3/prototype.js
> ===================================================================
> --- C:/apache/typo3/irre-trunk/typo3/prototype.js (revision 1794)
> +++ C:/apache/typo3/irre-trunk/typo3/prototype.js (working copy)
> @@ -1156,9 +1156,8 @@
>
> scrollTo: function(element) {
> element = $(element);
> - var x = element.x ? element.x : element.offsetLeft,
> - y = element.y ? element.y : element.offsetTop;
> - window.scrollTo(x, y);
> + var pos = Position.cumulativeOffset(element);
> + window.scrollTo(pos[0], pos[1]);
> return element;
> },
>
> Index: C:/apache/typo3/irre-trunk/typo3/stylesheet.css
> ===================================================================
> --- C:/apache/typo3/irre-trunk/typo3/stylesheet.css (revision 1794)
> +++ C:/apache/typo3/irre-trunk/typo3/stylesheet.css (working copy)
> @@ -420,8 +420,8 @@
> TABLE#typo3-versionSelector { background-color: #ABBBB4; margin-
> top: 5px; margin-bottom: 5px; }
> TABLE#typo3-versionSelector TD { padding-left: 2px; padding-right:
> 2px; }
>
> -DIV#typo3-newRecordLink { margin: 5px 0px 5px 0px; font-weight:
> bold; }
> -DIV#typo3-newRecordLink IMG { margin-right: 5px; vertical-align:
> middle; }
> +DIV#typo3-newRecordLink, DIV.typo3-newRecordLink { margin: 5px 0px
> 5px 0px; font-weight: bold; }
> +DIV#typo3-newRecordLink IMG, DIV.typo3-newRecordLink IMG { margin-
> right: 5px; vertical-align: middle; }
>
> INPUT.smallCheckboxes { vertical-align: middle; margin: 0px;
> padding: 0px; width: 12px; height: 12px; }
> DIV#typo3-listOptions { margin: 10px 0px 10px 0px; }
> Index: C:/apache/typo3/irre-trunk/typo3/sysext/lang/locallang_core.xml
> ===================================================================
> --- C:/apache/typo3/irre-trunk/typo3/sysext/lang/locallang_core.xml
> (revision 1794)
> +++ C:/apache/typo3/irre-trunk/typo3/sysext/lang/locallang_core.xml
> (working copy)
> @@ -182,6 +182,7 @@
> <label index="cm.movePage_after">Move page after</label>
> <label index="cm.copyFolder_into">Copy folder into</label>
> <label index="cm.moveFolder_into">Move folder into</label>
> + <label index="cm.createNewRelation">Create new relation</label>
> </languageKey>
> </data>
> </T3locallang>
> \ No newline at end of file
> Index: C:/apache/typo3/irre-trunk/typo3/sysext/rtehtmlarea/
> class.tx_rtehtmlarea_base.php
> ===================================================================
> --- C:/apache/typo3/irre-trunk/typo3/sysext/rtehtmlarea/
> class.tx_rtehtmlarea_base.php (revision 1794)
> +++ C:/apache/typo3/irre-trunk/typo3/sysext/rtehtmlarea/
> class.tx_rtehtmlarea_base.php (working copy)
> @@ -835,7 +835,7 @@
> i++;
> };
> var RTEarea = new Array();
> - RTEarea[0] = new Array();
> + RTEarea[0] = new Object();
> RTEarea[0]["version"] = "' . $TYPO3_CONF_VARS['EXTCONF'][$this-
> >ID]['version'] . '";
> 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']) . '";
> 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']) . '";
> @@ -901,7 +901,7 @@
>
> $registerRTEinJSString = (!is_object($TSFE) ? '' : '
> ' . '/*<![CDATA[*/') . '
> - RTEarea['.$number.'] = new Array();
> + RTEarea['.$number.'] = new Object();
> RTEarea['.$number.']["number"] = '.$number.';
> RTEarea['.$number.']["id"] = "RTEarea'.$number.'";
> RTEarea['.$number.']["enableWordClean"] = ' . (trim($this-
> >thisConfig['enableWordClean'])?'true':'false') . ';
> @@ -928,7 +928,7 @@
>
> // Setting the plugin flags
> $registerRTEinJSString .= '
> - RTEarea['.$number.']["plugin"] = new Array();';
> + RTEarea['.$number.']["plugin"] = new Object();';
>
> $pluginArray = t3lib_div::trimExplode(',', $this->pluginList , 1);
> reset($pluginArray);
> @@ -941,7 +941,7 @@
>
> // Setting the buttons configuration
> $registerRTEinJSString .= '
> - RTEarea['.$number.']["buttons"] = new Array();';
> + RTEarea['.$number.']["buttons"] = new Object();';
> if (is_array($this->thisConfig['buttons.'])) {
> reset($this->thisConfig['buttons.']);
> while( list($buttonIndex,$conf) = each($this->thisConfig
> ['buttons.']) ) {
> @@ -1020,7 +1020,7 @@
> if (in_array('inserttag', $this->toolBar) && trim($this-
> >thisConfig['hideTags'])) {
> if (!is_array($this->thisConfig['buttons.']['inserttag.'])) {
> $registerRTEinJSString .= '
> - RTEarea['.$number.']["buttons"]["inserttag"] = new Array();
> + RTEarea['.$number.']["buttons"]["inserttag"] = new Object();
> RTEarea['.$number.']["buttons"]["inserttag"]["denyTags"] =
> "'.implode(',', t3lib_div::trimExplode(',', $this->thisConfig
> ['hideTags'], 1)).'";';
> } elseif (!$this->thisConfig['buttons.']['inserttag.']
> ['denyTags']) {
> $registerRTEinJSString .= '
> @@ -1080,7 +1080,7 @@
> if (in_array('toggleborders',$this->toolBar) && $this-
> >thisConfig['keepToggleBordersInToolbar']) {
> if (!is_array($this->thisConfig['buttons.']['toggleborders.'])) {
> $registerRTEinJSString .= '
> - RTEarea['.$number.']["buttons"]["toggleborders"] = new Array();
> + RTEarea['.$number.']["buttons"]["toggleborders"] = new Object();
> RTEarea['.$number.']["buttons"]["toggleborders"]
> ["keepInToolbar"] = true;';
> } elseif (!$this->thisConfig['buttons.']['toggleborders.']
> ['keepInToolbar']) {
> $registerRTEinJSString .= '
> @@ -1418,7 +1418,7 @@
> $classesTagConvert = array( 'classesCharacter' => 'span',
> 'classesParagraph' => 'p', 'classesImage' => 'img', 'classesTable'
> => 'table', 'classesLinks' => 'a', 'classesTD' => 'td');
> $classesTagArray = t3lib_div::trimExplode(',' , $classesTagList);
> $registerRTEinJSString = '
> - RTEarea['.$number.']["classesTag"] = new Array();';
> + RTEarea['.$number.']["classesTag"] = new Object();';
> while( list(,$classesTagName) = each($classesTagArray)) {
> $HTMLAreaJSClasses = ($this->thisConfig[$classesTagName])?
> ('"' . $this->cleanList($this->thisConfig[$classesTagName]) .
> '";'):'null;';
> $registerRTEinJSString .= '
> @@ -1487,7 +1487,7 @@
> global $TSFE, $LANG, $TYPO3_CONF_VARS;
>
> $linebreak = $TYPO3_CONF_VARS['EXTCONF'][$this->ID]
> ['enableCompressedScripts'] ? '' : chr(10);
> - $JSLanguageArray .= 'var HTMLArea_langArray = new Array();' .
> $linebreak;
> + $JSLanguageArray .= 'var HTMLArea_langArray = new Object();' .
> $linebreak;
> $JSLanguageArray .= 'HTMLArea_langArray = { ' . $linebreak;
> if(is_object($TSFE)) {
> $JSLanguageArray = $TSFE->csConvObj->conv($JSLanguageArray,
> 'iso-8859-1', $this->OutputCharset);
> @@ -1705,7 +1705,7 @@
> $LOCAL_LANG[$this->language] = $LOCAL_LANG['default'];
> }
>
> - $JSLanguageArray .= 'var ' . $plugin . '_langArray = new Array
> ();' . $linebreak;
> + $JSLanguageArray .= 'var ' . $plugin . '_langArray = new Object
> ();' . $linebreak;
> $JSLanguageArray .= $plugin . '_langArray = {' . $linebreak;
> if(is_object($TSFE)) {
> $JSLanguageArray = $TSFE->csConvObj->conv($JSLanguageArray,
> 'iso-8859-1', $this->OutputCharset);
> Index: C:/apache/typo3/irre-trunk/typo3/sysext/rtehtmlarea/htmlarea/
> htmlarea.js
> ===================================================================
> --- C:/apache/typo3/irre-trunk/typo3/sysext/rtehtmlarea/htmlarea/
> htmlarea.js (revision 1794)
> +++ C:/apache/typo3/irre-trunk/typo3/sysext/rtehtmlarea/htmlarea/
> htmlarea.js (working copy)
> @@ -2716,7 +2716,9 @@
>
> if(req) {
> var content = '';
> - for (var i in data) content += (content.length ? '&' : '') + i +
> '=' + encodeURIComponent(data[i]);
> + for (var i in data) {
> + content += (content.length ? '&' : '') + i + '=' +
> encodeURIComponent(data[i]);
> + }
> content += (content.length ? '&' : '') + 'charset=' + charset;
> if (typeof(addParams) != "undefined") content += addParams;
> if (url.substring(0,1) == '/') {
> Index: C:/apache/typo3/irre-trunk/typo3/sysext/rtehtmlarea/htmlarea/
> plugins/DynamicCSS/dynamiccss-compressed.js
> ===================================================================
> --- C:/apache/typo3/irre-trunk/typo3/sysext/rtehtmlarea/htmlarea/
> plugins/DynamicCSS/dynamiccss-compressed.js (revision 1794)
> +++ C:/apache/typo3/irre-trunk/typo3/sysext/rtehtmlarea/htmlarea/
> plugins/DynamicCSS/dynamiccss-compressed.js (working copy)
> @@ -1,2 +1,2 @@
> -DynamicCSS=function(editor,args){this.editor=editor;var
> cfg=editor.config;var toolbar=cfg.toolbar;var
> editorNumber=editor._editorNumber;var obj={id:"DynamicCSS-
> class",tooltip:DynamicCSS_langArray
> ["DynamicCSSStyleTooltip"],options:
> {"":""},action:null,refresh:null,context:"*",cssArray:new Array
> (),parseCount:
> 1,loaded:false,timeout:null,lastTag:"",lastClass:"",showTagFreeClasses
> :RTEarea[editorNumber]["showTagFreeClasses"],classesUrl:RTEarea
> [editorNumber]["classesUrl"],classesTag:RTEarea[editorNumber]
> ["classesTag"]};var actionHandlerFunctRef=DynamicCSS.actionHandler
> (this,obj);obj.action=actionHandlerFunctRef;var
> refreshHandlerFunctRef=DynamicCSS.refreshHandler
> (this);obj.refresh=refreshHandlerFunctRef;cfg.registerDropdown
> (obj);};DynamicCSS.actionHandler=function(instance,obj){return
> (function(editor){instance.onSelect
> (editor,obj);});};DynamicCSS.refreshHandler=function(instance)
> {return(function(editor){instance.generate
> (editor);});};DynamicCSS.I18N=DynamicCSS_langArray;DynamicCSS.parseSty
> leSheet=function(editor){var obj=editor.config.customSelects
> ["DynamicCSS-class"];var iframe=editor._iframe.contentWindow?
> editor._iframe.contentWindow.document:editor._iframe.contentDocument;v
> ar newCssArray=new Array();obj.loaded=true;for(var
> i=0;i<iframe.styleSheets.length;i++){if(HTMLArea.is_gecko){try
> {newCssArray=DynamicCSS.applyCSSRule
> (editor,DynamicCSS.I18N,iframe.styleSheets
> [i].cssRules,newCssArray);}catch(e){obj.loaded=false;}}else{try{if
> (iframe.styleSheets[i].imports)
> newCssArray=DynamicCSS.applyCSSIEImport
> (editor,DynamicCSS.I18N,iframe.styleSheets
> [i].imports,newCssArray);if(iframe.styleSheets[i].rules)
> newCssArray=DynamicCSS.applyCSSRule
> (editor,DynamicCSS.I18N,iframe.styleSheets[i].rules,newCssArray);}
> catch(e){obj.loaded=false;}}};return
> newCssArray;};DynamicCSS.applyCSSRule=function
> (editor,i18n,cssRules,cssArray){var cssElements=new Array
> (),cssElement=new Array(),newCssArray=new Array(),classParts=new
> Array(),tagName,className,rule,k,obj=editor.config.customSelects
> ["DynamicCSS-class"];newCssArray=cssArray;for
> (rule=0;rule<cssRules.length;rule++){if(cssRules[rule].selectorText)
> {if(cssRules[rule].selectorText.search(/:+/)==-1)
> {cssElements=cssRules[rule].selectorText.split(",");for
> (k=0;k<cssElements.length;k++){cssElement=cssElements[k].split
> (".");tagName=cssElement[0].toLowerCase().trim();if(!tagName)
> tagName="all";className=cssElement[1];if(className)
> {classParts=className.trim().split(" ");className=classParts[0];};if
> (!HTMLArea.reservedClassNames.test(className)&&((tagName=="all"&&obj
> ["showTagFreeClasses"]==true)||(tagName!="all"&&(!obj
> ["classesTag"]||!obj["classesTag"][tagName]))||(tagName!="all"&&obj
> ["classesTag"][tagName].indexOf(className)!=-1))){if(!newCssArray
> [tagName])newCssArray[tagName]=new Array();if(className)
> {cssName=className;if(HTMLArea.classesLabels)
> cssName=HTMLArea.classesLabels[className]?HTMLArea.classesLabels
> [className]:cssName;if(tagName!='all')cssName='<'+cssName+'>';}else
> {className='none';if(tagName=='all')cssName=i18n["Default"];else
> cssName='<'+i18n["Default"]+'>';};newCssArray[tagName][className]
> =cssName;}}}}else if(cssRules[rule].styleSheet)
> {newCssArray=DynamicCSS.applyCSSRule(editor,i18n,cssRules
> [rule].styleSheet.cssRules,newCssArray);}};return
> newCssArray;};DynamicCSS.applyCSSIEImport=function
> (editor,i18n,cssIEImport,cssArray){var newCssArray=new Array
> ();newCssArray=cssArray;for(var i=0;i<cssIEImport.length;i++){if
> (cssIEImport[i].imports){newCssArray=DynamicCSS.applyCSSIEImport
> (editor,i18n,cssIEImport[i].imports,newCssArray);};if(cssIEImport
> [i].rules){newCssArray=DynamicCSS.applyCSSRule
> (editor,i18n,cssIEImport[i].rules,newCssArray);}};return
> newCssArray;};DynamicCSS._pluginInfo=
> {name:"DynamicCSS",version:"1.9",developer:"Holger Hees & Stanislas
> Rolland",developer_url:"http://www.fructifor.ca/",c_owner:"Holger
> Hees & Stanislas Rolland",sponsor:"System Concept GmbH & Fructifor
> Inc.",sponsor_url:"http://
> www.fructifor.ca/",license:"GPL"};DynamicCSS.prototype.getSelectedBloc
> ks=function(editor){var block,range,i=0,blocks=[];if
> (HTMLArea.is_gecko&&!HTMLArea.is_safari&&!HTMLArea.is_opera){var
> sel=editor._getSelection();try{while(range=sel.getRangeAt(i++))
> {block=editor.getParentElement(sel,range);blocks.push(block);}}catch
> (e){}}else{blocks.push(editor.getParentElement());};return
> blocks;};DynamicCSS.prototype.onSelect=function(editor,obj){var
> tbobj=editor._toolbarObjects[obj.id];var
> index=document.getElementById(tbobj.elementId).selectedIndex;var
> className=document.getElementById
> (tbobj.elementId).value;editor.focusEditor();var
> blocks=this.getSelectedBlocks(editor);for(var k=0;k<blocks.length;+
> +k){var parent=blocks[k];while(typeof(parent)!="undefined"&&!
> HTMLArea.isBlockElement(parent)&&parent.nodeName.toLowerCase()!
> ="img")parent=parent.parentNode;if(!k)var
> tagName=parent.tagName.toLowerCase();if(parent.tagName.toLowerCase()
> ==tagName){var cls=parent.className.trim().split(" ");for(var
> i=cls.length;i>0;)if(!HTMLArea.reservedClassNames.test(cls[--i]))
> HTMLArea._removeClass(parent,cls[i]);if(className!='none')
> {HTMLArea._addClass(parent,className);obj.lastClass=className;}}}
> editor.updateToolbar();};DynamicCSS.prototype.onGenerate=function()
> {var editor=this.editor;var obj=editor.config.customSelects
> ["DynamicCSS-class"];if(HTMLArea.is_gecko)this.generate
> (editor);};DynamicCSS.prototype.onUpdateToolbar=function(){var
> editor=this.editor;var obj=editor.config.customSelects["DynamicCSS-
> class"];if(HTMLArea.is_gecko&&editor._editMode!="textmode"){if
> (obj.loaded){this.updateValue(editor,obj);}else{if(obj.timeout){if
> (editor._iframe.contentWindow)
> {editor._iframe.contentWindow.clearTimeout(obj.timeout);}else
> {window.clearTimeout(obj.timeout);};obj.timeout=null;};this.generate
> (editor);}}else if(editor._editMode=="textmode"){var
> select=document.getElementById(editor._toolbarObjects
> [obj.id].elementId);select.disabled=true;select.className="buttonDisab
> led";}};DynamicCSS.prototype.generate=function(editor){var
> obj=editor.config.customSelects["DynamicCSS-class"];var
> classesUrl=obj["classesUrl"];if(classesUrl&&typeof
> (HTMLArea.classesLabels)=="undefined"){var
> classesData=HTMLArea._getScript(0,false,classesUrl);if(classesData)
> eval(classesData);};if(obj.loaded)this.updateValue(editor,obj);else
> this.getCSSArray(editor);};DynamicCSS.prototype.getCSSArray=function
> (editor){var obj=editor.config.customSelects["DynamicCSS-
> class"];obj.cssArray=DynamicCSS.parseStyleSheet(editor);if(!
> obj.loaded&&obj.parseCount<17){var
> getCSSArrayLaterFunctRef=DynamicCSS.getCSSArrayLater
> (editor,this);obj.timeout=editor._iframe.contentWindow?
> editor._iframe.contentWindow.setTimeout(getCSSArrayLaterFunctRef,
> 200):window.setTimeout(getCSSArrayLaterFunctRef,200);obj.parseCount+
> +;}else{obj.timeout=null;obj.loaded=true;this.updateValue
> (editor,obj);}};DynamicCSS.getCSSArrayLater=function
> (editor,instance){return(function(){instance.getCSSArray
> (editor);});};DynamicCSS.prototype.onMode=function(mode){var
> editor=this.editor;if(mode=='wysiwyg'){var
> obj=editor.config.customSelects["DynamicCSS-class"];if(obj.loaded)
> {this.updateValue(editor,obj);}else{if(obj.timeout){if
> (editor._iframe.contentWindow)
> editor._iframe.contentWindow.clearTimeout(obj.timeout);else
> window.clearTimeout(obj.timeout);obj.timeout=null;};this.generate
> (editor);}}};DynamicCSS.prototype.updateValue=function(editor,obj)
> {var cssClass,i;if(!obj.loaded){if(obj.timeout){if
> (editor._iframe.contentWindow)
> editor._iframe.contentWindow.clearTimeout(obj.timeout);else
> window.clearTimeout(obj.timeout);obj.timeout=null;};this.generate
> (editor);};var cssArray=obj.cssArray;var tagName="body";var
> className="";var parent=editor.getParentElement();while
> (parent&&typeof(parent)!="undefined"&&!HTMLArea.isBlockElement
> (parent)&&parent.nodeName.toLowerCase()!="img")
> parent=parent.parentNode;if(parent)
> {tagName=parent.nodeName.toLowerCase();className=parent.className;if
> (HTMLArea.reservedClassNames.test(className)){var
> cls=className.split(" ");for(var i=cls.length;i>0;)if(!
> HTMLArea.reservedClassNames.test(cls[--i]))className=cls[i];}};if
> (obj.lastTag!=tagName||obj.lastClass!=className)
> {obj.lastTag=tagName;obj.lastClass=className;var
> select=document.getElementById(editor._toolbarObjects
> [obj.id].elementId);while(select.options.length>0)select.options
> [select.length-1]=null;select.options[0]=new Option(DynamicCSS.I18N
> ["Default"],'none');if(cssArray){if(tagName!='body'||
> editor.config.fullPage){if(cssArray[tagName]){for(cssClass in
> cssArray[tagName]){if(cssClass=='none'){select.options[0]=new Option
> (cssArray[tagName][cssClass],cssClass);}else{select.options
> [select.options.length]=new Option(cssArray[tagName]
> [cssClass],cssClass);if(!
> editor.config.disablePCexamples&&HTMLArea.classesValues&&HTMLArea.clas
> sesValues[cssClass]&&!HTMLArea.classesNoShow[cssClass])
> select.options[select.options.length-1].setAttribute
> ("style",HTMLArea.classesValues[cssClass]);}}};if(cssArray['all'])
> {for(cssClass in cssArray['all']){select.options
> [select.options.length]=new Option(cssArray['all']
> [cssClass],cssClass);if(!
> editor.config.disablePCexamples&&HTMLArea.classesValues&&HTMLArea.clas
> sesValues[cssClass]&&!HTMLArea.classesNoShow[cssClass])
> select.options[select.options.length-1].setAttribute
> ("style",HTMLArea.classesValues[cssClass]);}}}else{if(cssArray
> [tagName]&&cssArray[tagName]['none'])select.options[0]=new Option
> (cssArray[tagName]['none'],'none');}};select.selectedIndex=0;if
> (typeof(className)!="undefined"&&/\S/.test(className)&&!
> HTMLArea.reservedClassNames.test(className)){for
> (i=select.options.length;--i>=0;){var option=select.options[i];if
> (className==option.value){select.selectedIndex=i;break;}};if
> (select.selectedIndex==0){select.options[select.options.length]=new
> Option(DynamicCSS.I18N
> ["Undefined"],className);select.selectedIndex=select.options.length-1;
> }};if(select.options.length>1){select.disabled=false;}else
> select.disabled=true;if(HTMLArea.is_gecko)select.removeAttribute
> ('class');else select.removeAttribute('className');if
> (select.disabled)HTMLArea._addClass(select,"buttonDisabled");}};
> +DynamicCSS=function(editor,args){this.editor=editor;var
> cfg=editor.config;var toolbar=cfg.toolbar;var
> editorNumber=editor._editorNumber;var obj={id:"DynamicCSS-
> class",tooltip:DynamicCSS_langArray
> ["DynamicCSSStyleTooltip"],options:
> {"":""},action:null,refresh:null,context:"*",cssArray:new Object
> (),parseCount:
> 1,loaded:false,timeout:null,lastTag:"",lastClass:"",showTagFreeClasses
> :RTEarea[editorNumber]["showTagFreeClasses"],classesUrl:RTEarea
> [editorNumber]["classesUrl"],classesTag:RTEarea[editorNumber]
> ["classesTag"]};var actionHandlerFunctRef=DynamicCSS.actionHandler
> (this,obj);obj.action=actionHandlerFunctRef;var
> refreshHandlerFunctRef=DynamicCSS.refreshHandler
> (this);obj.refresh=refreshHandlerFunctRef;cfg.registerDropdown
> (obj);};DynamicCSS.actionHandler=function(instance,obj){return
> (function(editor){instance.onSelect
> (editor,obj);});};DynamicCSS.refreshHandler=function(instance)
> {return(function(editor){instance.generate
> (editor);});};DynamicCSS.I18N=DynamicCSS_langArray;DynamicCSS.parseSty
> leSheet=function(editor){var obj=editor.config.customSelects
> ["DynamicCSS-class"];var iframe=editor._iframe.contentWindow?
> editor._iframe.contentWindow.document:editor._iframe.contentDocument;v
> ar newCssArray=new Object();obj.loaded=true;for(var
> i=0;i<iframe.styleSheets.length;i++){if(HTMLArea.is_gecko){try
> {newCssArray=DynamicCSS.applyCSSRule
> (editor,DynamicCSS.I18N,iframe.styleSheets
> [i].cssRules,newCssArray);}catch(e){obj.loaded=false;}}else{try{if
> (iframe.styleSheets[i].imports)
> newCssArray=DynamicCSS.applyCSSIEImport
> (editor,DynamicCSS.I18N,iframe.styleSheets
> [i].imports,newCssArray);if(iframe.styleSheets[i].rules)
> newCssArray=DynamicCSS.applyCSSRule
> (editor,DynamicCSS.I18N,iframe.styleSheets[i].rules,newCssArray);}
> catch(e){obj.loaded=false;}}};return
> newCssArray;};DynamicCSS.applyCSSRule=function
> (editor,i18n,cssRules,cssArray){var cssElements=new Array
> (),cssElement=new Array(),newCssArray=new Object(),classParts=new
> Array(),tagName,className,rule,k,obj=editor.config.customSelects
> ["DynamicCSS-class"];newCssArray=cssArray;for
> (rule=0;rule<cssRules.length;rule++){if(cssRules[rule].selectorText)
> {if(cssRules[rule].selectorText.search(/:+/)==-1)
> {cssElements=cssRules[rule].selectorText.split(",");for
> (k=0;k<cssElements.length;k++){cssElement=cssElements[k].split
> (".");tagName=cssElement[0].toLowerCase().trim();if(!tagName)
> tagName="all";className=cssElement[1];if(className)
> {classParts=className.trim().split(" ");className=classParts[0];};if
> (!HTMLArea.reservedClassNames.test(className)&&((tagName=="all"&&obj
> ["showTagFreeClasses"]==true)||(tagName!="all"&&(!obj
> ["classesTag"]||!obj["classesTag"][tagName]))||(tagName!="all"&&obj
> ["classesTag"][tagName].indexOf(className)!=-1))){if(!newCssArray
> [tagName])newCssArray[tagName]=new Object();if(className)
> {cssName=className;if(HTMLArea.classesLabels)
> cssName=HTMLArea.classesLabels[className]?HTMLArea.classesLabels
> [className]:cssName;if(tagName!='all')cssName='<'+cssName+'>';}else
> {className='none';if(tagName=='all')cssName=i18n["Default"];else
> cssName='<'+i18n["Default"]+'>';};newCssArray[tagName][className]
> =cssName;}}}}else if(cssRules[rule].styleSheet)
> {newCssArray=DynamicCSS.applyCSSRule(editor,i18n,cssRules
> [rule].styleSheet.cssRules,newCssArray);}};return
> newCssArray;};DynamicCSS.applyCSSIEImport=function
> (editor,i18n,cssIEImport,cssArray){var newCssArray=new Object
> ();newCssArray=cssArray;for(var i=0;i<cssIEImport.length;i++){if
> (cssIEImport[i].imports){newCssArray=DynamicCSS.applyCSSIEImport
> (editor,i18n,cssIEImport[i].imports,newCssArray);};if(cssIEImport
> [i].rules){newCssArray=DynamicCSS.applyCSSRule
> (editor,i18n,cssIEImport[i].rules,newCssArray);}};return
> newCssArray;};DynamicCSS._pluginInfo=
> {name:"DynamicCSS",version:"1.9",developer:"Holger Hees & Stanislas
> Rolland",developer_url:"http://www.fructifor.ca/",c_owner:"Holger
> Hees & Stanislas Rolland",sponsor:"System Concept GmbH & Fructifor
> Inc.",sponsor_url:"http://
> www.fructifor.ca/",license:"GPL"};DynamicCSS.prototype.getSelectedBloc
> ks=function(editor){var block,range,i=0,blocks=[];if
> (HTMLArea.is_gecko&&!HTMLArea.is_safari&&!HTMLArea.is_opera){var
> sel=editor._getSelection();try{while(range=sel.getRangeAt(i++))
> {block=editor.getParentElement(sel,range);blocks.push(block);}}catch
> (e){}}else{blocks.push(editor.getParentElement());};return
> blocks;};DynamicCSS.prototype.onSelect=function(editor,obj){var
> tbobj=editor._toolbarObjects[obj.id];var
> index=document.getElementById(tbobj.elementId).selectedIndex;var
> className=document.getElementById
> (tbobj.elementId).value;editor.focusEditor();var
> blocks=this.getSelectedBlocks(editor);for(var k=0;k<blocks.length;+
> +k){var parent=blocks[k];while(typeof(parent)!="undefined"&&!
> HTMLArea.isBlockElement(parent)&&parent.nodeName.toLowerCase()!
> ="img")parent=parent.parentNode;if(!k)var
> tagName=parent.tagName.toLowerCase();if(parent.tagName.toLowerCase()
> ==tagName){var cls=parent.className.trim().split(" ");for(var
> i=cls.length;i>0;)if(!HTMLArea.reservedClassNames.test(cls[--i]))
> HTMLArea._removeClass(parent,cls[i]);if(className!='none')
> {HTMLArea._addClass(parent,className);obj.lastClass=className;}}}
> editor.updateToolbar();};DynamicCSS.prototype.onGenerate=function()
> {var editor=this.editor;var obj=editor.config.customSelects
> ["DynamicCSS-class"];if(HTMLArea.is_gecko)this.generate
> (editor);};DynamicCSS.prototype.onUpdateToolbar=function(){var
> editor=this.editor;var obj=editor.config.customSelects["DynamicCSS-
> class"];if(HTMLArea.is_gecko&&editor._editMode!="textmode"){if
> (obj.loaded){this.updateValue(editor,obj);}else{if(obj.timeout){if
> (editor._iframe.contentWindow)
> {editor._iframe.contentWindow.clearTimeout(obj.timeout);}else
> {window.clearTimeout(obj.timeout);};obj.timeout=null;};this.generate
> (editor);}}else if(editor._editMode=="textmode"){var
> select=document.getElementById(editor._toolbarObjects
> [obj.id].elementId);select.disabled=true;select.className="buttonDisab
> led";}};DynamicCSS.prototype.generate=function(editor){var
> obj=editor.config.customSelects["DynamicCSS-class"];var
> classesUrl=obj["classesUrl"];if(classesUrl&&typeof
> (HTMLArea.classesLabels)=="undefined"){var
> classesData=HTMLArea._getScript(0,false,classesUrl);if(classesData)
> eval(classesData);};if(obj.loaded)this.updateValue(editor,obj);else
> this.getCSSArray(editor);};DynamicCSS.prototype.getCSSArray=function
> (editor){var obj=editor.config.customSelects["DynamicCSS-
> class"];obj.cssArray=DynamicCSS.parseStyleSheet(editor);if(!
> obj.loaded&&obj.parseCount<17){var
> getCSSArrayLaterFunctRef=DynamicCSS.getCSSArrayLater
> (editor,this);obj.timeout=editor._iframe.contentWindow?
> editor._iframe.contentWindow.setTimeout(getCSSArrayLaterFunctRef,
> 200):window.setTimeout(getCSSArrayLaterFunctRef,200);obj.parseCount+
> +;}else{obj.timeout=null;obj.loaded=true;this.updateValue
> (editor,obj);}};DynamicCSS.getCSSArrayLater=function
> (editor,instance){return(function(){instance.getCSSArray
> (editor);});};DynamicCSS.prototype.onMode=function(mode){var
> editor=this.editor;if(mode=='wysiwyg'){var
> obj=editor.config.customSelects["DynamicCSS-class"];if(obj.loaded)
> {this.updateValue(editor,obj);}else{if(obj.timeout){if
> (editor._iframe.contentWindow)
> editor._iframe.contentWindow.clearTimeout(obj.timeout);else
> window.clearTimeout(obj.timeout);obj.timeout=null;};this.generate
> (editor);}}};DynamicCSS.prototype.updateValue=function(editor,obj)
> {var cssClass,i;if(!obj.loaded){if(obj.timeout){if
> (editor._iframe.contentWindow)
> editor._iframe.contentWindow.clearTimeout(obj.timeout);else
> window.clearTimeout(obj.timeout);obj.timeout=null;};this.generate
> (editor);};var cssArray=obj.cssArray;var tagName="body";var
> className="";var parent=editor.getParentElement();while
> (parent&&typeof(parent)!="undefined"&&!HTMLArea.isBlockElement
> (parent)&&parent.nodeName.toLowerCase()!="img")
> parent=parent.parentNode;if(parent)
> {tagName=parent.nodeName.toLowerCase();className=parent.className;if
> (HTMLArea.reservedClassNames.test(className)){var
> cls=className.split(" ");for(var i=cls.length;i>0;)if(!
> HTMLArea.reservedClassNames.test(cls[--i]))className=cls[i];}};if
> (obj.lastTag!=tagName||obj.lastClass!=className)
> {obj.lastTag=tagName;obj.lastClass=className;var
> select=document.getElementById(editor._toolbarObjects
> [obj.id].elementId);while(select.options.length>0)select.options
> [select.length-1]=null;select.options[0]=new Option(DynamicCSS.I18N
> ["Default"],'none');if(cssArray){if(tagName!='body'||
> editor.config.fullPage){if(cssArray[tagName]){for(cssClass in
> cssArray[tagName]){if(cssClass=='none'){select.options[0]=new Option
> (cssArray[tagName][cssClass],cssClass);}else{select.options
> [select.options.length]=new Option(cssArray[tagName]
> [cssClass],cssClass);if(!
> editor.config.disablePCexamples&&HTMLArea.classesValues&&HTMLArea.clas
> sesValues[cssClass]&&!HTMLArea.classesNoShow[cssClass])
> select.options[select.options.length-1].setAttribute
> ("style",HTMLArea.classesValues[cssClass]);}}};if(cssArray['all'])
> {for(cssClass in cssArray['all']){select.options
> [select.options.length]=new Option(cssArray['all']
> [cssClass],cssClass);if(!
> editor.config.disablePCexamples&&HTMLArea.classesValues&&HTMLArea.clas
> sesValues[cssClass]&&!HTMLArea.classesNoShow[cssClass])
> select.options[select.options.length-1].setAttribute
> ("style",HTMLArea.classesValues[cssClass]);}}}else{if(cssArray
> [tagName]&&cssArray[tagName]['none'])select.options[0]=new Option
> (cssArray[tagName]['none'],'none');}};select.selectedIndex=0;if
> (typeof(className)!="undefined"&&/\S/.test(className)&&!
> HTMLArea.reservedClassNames.test(className)){for
> (i=select.options.length;--i>=0;){var option=select.options[i];if
> (className==option.value){select.selectedIndex=i;break;}};if
> (select.selectedIndex==0){select.options[select.options.length]=new
> Option(DynamicCSS.I18N
> ["Undefined"],className);select.selectedIndex=select.options.length-1;
> }};if(select.options.length>1){select.disabled=false;}else
> select.disabled=true;if(HTMLArea.is_gecko)select.removeAttribute
> ('class');else select.removeAttribute('className');if
> (select.disabled)HTMLArea._addClass(select,"buttonDisabled");}};
>
> Index: C:/apache/typo3/irre-trunk/typo3/sysext/rtehtmlarea/htmlarea/
> plugins/DynamicCSS/dynamiccss.js
> ===================================================================
> --- C:/apache/typo3/irre-trunk/typo3/sysext/rtehtmlarea/htmlarea/
> plugins/DynamicCSS/dynamiccss.js (revision 1794)
> +++ C:/apache/typo3/irre-trunk/typo3/sysext/rtehtmlarea/htmlarea/
> plugins/DynamicCSS/dynamiccss.js (working copy)
> @@ -46,7 +46,7 @@
> action : null,
> refresh : null,
> context : "*",
> - cssArray : new Array(),
> + cssArray : new Object(),
> parseCount : 1,
> loaded : false,
> timeout : null,
> @@ -81,7 +81,7 @@
> DynamicCSS.parseStyleSheet = function(editor) {
> var obj = editor.config.customSelects["DynamicCSS-class"];
> var iframe = editor._iframe.contentWindow ?
> editor._iframe.contentWindow.document :
> editor._iframe.contentDocument;
> - var newCssArray = new Array();
> + var newCssArray = new Object();
> obj.loaded = true;
> for (var i = 0; i < iframe.styleSheets.length; i++) {
> // Mozilla
> @@ -102,7 +102,7 @@
> DynamicCSS.applyCSSRule=function(editor,i18n,cssRules,cssArray){
> var cssElements = new Array(),
> cssElement = new Array(),
> - newCssArray = new Array(),
> + newCssArray = new Object(),
> classParts = new Array(),
> tagName, className, rule, k,
> obj = editor.config.customSelects["DynamicCSS-class"];
> @@ -123,7 +123,7 @@
> className = classParts[0];
> }
> if (!HTMLArea.reservedClassNames.test(className) && ((tagName
> == "all" && obj["showTagFreeClasses"] == true) || (tagName != "all"
> && (!obj["classesTag"] || !obj["classesTag"][tagName])) ||
> (tagName != "all" && obj["classesTag"][tagName].indexOf(className) !
> = -1)) ) {
> - if (!newCssArray[tagName]) newCssArray[tagName] = new Array();
> + if (!newCssArray[tagName]) newCssArray[tagName] = new Object();
> if (className) {
> cssName = className;
> if (HTMLArea.classesLabels) cssName = HTMLArea.classesLabels
> [className] ? HTMLArea.classesLabels[className] : cssName ;
> @@ -147,7 +147,7 @@
> };
>
> DynamicCSS.applyCSSIEImport = function
> (editor,i18n,cssIEImport,cssArray){
> - var newCssArray = new Array();
> + var newCssArray = new Object();
> newCssArray = cssArray;
> for(var i=0;i<cssIEImport.length;i++){
> if(cssIEImport[i].imports){
> Index: C:/apache/typo3/irre-trunk/typo3/sysext/rtehtmlarea/htmlarea/
> plugins/InlineCSS/inlinecss-compressed.js
> ===================================================================
> --- C:/apache/typo3/irre-trunk/typo3/sysext/rtehtmlarea/htmlarea/
> plugins/InlineCSS/inlinecss-compressed.js (revision 1794)
> +++ C:/apache/typo3/irre-trunk/typo3/sysext/rtehtmlarea/htmlarea/
> plugins/InlineCSS/inlinecss-compressed.js (working copy)
> @@ -1,2 +1,2 @@
> -InlineCSS=function(editor,args){this.editor=editor;var
> cfg=editor.config;var toolbar=cfg.toolbar;var
> editorNumber=editor._editorNumber;var obj={id:"InlineCSS-
> class",tooltip:InlineCSS_langArray["InlineCSSStyleTooltip"],options:
> {"":""},action:null,refresh:null,context:"*",cssArray:new Array
> (),parseCount:
> 1,loaded:false,timeout:null,lastTag:"",lastClass:"",showTagFreeClasses
> :RTEarea[editorNumber]["showTagFreeClasses"],classesUrl:RTEarea
> [editorNumber]["classesUrl"],classesCharacter:RTEarea[editorNumber]
> ["classesTag"]["span"]};var
> actionHandlerFunctRef=InlineCSS.actionHandler
> (this,obj);obj.action=actionHandlerFunctRef;var
> refreshHandlerFunctRef=InlineCSS.refreshHandler
> (this);obj.refresh=refreshHandlerFunctRef;cfg.registerDropdown
> (obj);};InlineCSS.actionHandler=function(instance,obj){return
> (function(editor){instance.onSelect
> (editor,obj);});};InlineCSS.refreshHandler=function(instance){return
> (function(editor){instance.generate
> (editor);});};InlineCSS.I18N=InlineCSS_langArray;InlineCSS.parseStyleS
> heet=function(editor){var obj=editor.config.customSelects
> ["InlineCSS-class"];var iframe=editor._iframe.contentWindow?
> editor._iframe.contentWindow.document:editor._iframe.contentDocument;v
> ar newCssArray=new Array();obj.loaded=true;for(var
> i=0;i<iframe.styleSheets.length;i++){if(HTMLArea.is_gecko){try
> {newCssArray=InlineCSS.applyCSSRule
> (editor,InlineCSS.I18N,iframe.styleSheets[i].cssRules,newCssArray);}
> catch(e){obj.loaded=false;}}else{try{if(iframe.styleSheets
> [i].imports){newCssArray=InlineCSS.applyCSSIEImport
> (editor,InlineCSS.I18N,iframe.styleSheets
> [i].imports,newCssArray);};if(iframe.styleSheets[i].rules)
> {newCssArray=InlineCSS.applyCSSRule
> (editor,InlineCSS.I18N,iframe.styleSheets[i].rules,newCssArray);}}
> catch(e){obj.loaded=false;}}};return
> newCssArray;};InlineCSS.applyCSSRule=function
> (editor,i18n,cssRules,cssArray){var cssElements=new Array();var
> cssElement=new Array();var newCssArray=new Array();var
> tagName,className,rule,k;var obj=editor.config.customSelects
> ["InlineCSS-class"];newCssArray=cssArray;for
> (rule=0;rule<cssRules.length;rule++){if(cssRules[rule].selectorText)
> {if(cssRules[rule].selectorText.search(/:+/)==-1)
> {cssElements=cssRules[rule].selectorText.split(",");for
> (k=0;k<cssElements.length;k++){cssElement=cssElements[k].split
> (".");tagName=cssElement[0].toLowerCase().trim();if(!tagName)
> tagName='all';className=cssElement[1];if((!obj["classesCharacter"]&&
> (tagName=='span'))||((tagName!="all"||obj["showTagFreeClasses"]
> ==true)&&obj["classesCharacter"]&&obj["classesCharacter"].indexOf
> (className)!=-1)){if(!newCssArray[tagName])newCssArray[tagName]=new
> Array();if(className){cssName=className;if(HTMLArea.classesLabels)
> cssName=HTMLArea.classesLabels[className]?HTMLArea.classesLabels
> [className]:cssName;if(tagName!='all')cssName='<'+cssName+'>';}else
> {className='none';if(tagName=='all')cssName=i18n["Default"];else
> cssName='<'+i18n["Default"]+'>';};newCssArray[tagName][className]
> =cssName;}}}}else if(cssRules[rule].styleSheet)
> {newCssArray=InlineCSS.applyCSSRule(editor,i18n,cssRules
> [rule].styleSheet.cssRules,newCssArray);}};return
> newCssArray;};InlineCSS.applyCSSIEImport=function
> (editor,i18n,cssIEImport,cssArray){var newCssArray=new Array
> ();newCssArray=cssArray;for(var i=0;i<cssIEImport.length;i++){if
> (cssIEImport[i].imports){newCssArray=InlineCSS.applyCSSIEImport
> (editor,i18n,cssIEImport[i].imports,newCssArray);};if(cssIEImport
> [i].rules){newCssArray=InlineCSS.applyCSSRule
> (editor,i18n,cssIEImport[i].rules,newCssArray);}};return
> newCssArray;};InlineCSS._pluginInfo=
> {name:"InlineCSS",version:"1.4",developer:"Stanislas
> Rolland",developer_url:"http://
> www.fructifor.ca/",c_owner:"Stanislas Rolland",sponsor:"Fructifor
> Inc.",sponsor_url:"http://
> www.fructifor.ca/",license:"GPL"};InlineCSS.prototype.onSelect=functio
> n(editor,obj){var tbobj=editor._toolbarObjects[obj.id];var
> index=document.getElementById(tbobj.elementId).selectedIndex;var
> className=document.getElementById(tbobj.elementId).value;var
> selTrimmed;editor.focusEditor();var
> selectedHTML=editor.getSelectedHTMLContents();if(selectedHTML)
> selTrimmed=selectedHTML.replace(/(<[^>]*>| |\n|\r)/g,"");var
> parent=editor.getParentElement();if((HTMLArea.is_gecko&&/\w/.test
> (selTrimmed)==true)||(HTMLArea.is_ie &&/\S/.test(selTrimmed)==true))
> {var sel=editor._getSelection();var range=editor._createRange
> (sel);if(className!='none'){obj.lastClass=className;if(parent&&!
> HTMLArea.isBlockElement(parent)&&selectedHTML.replace(/^\s*|\s*$/
> g,"")==parent.innerHTML.replace(/^\s*|\s*$/g,""))
> {parent.className=className;}else{if(HTMLArea.is_gecko){var
> rangeClone=range.cloneRange();var span=editor._doc.createElement
> ("span");span.className=className;span.appendChild
> (range.extractContents());range.insertNode(span);if
> (HTMLArea.is_safari){sel.empty();sel.setBaseAndExtent
> (rangeClone.startContainer,rangeClone.startOffset,rangeClone.endContai
> ner,rangeClone.endOffset);}else{sel.removeRange(range);sel.addRange
> (rangeClone);};range.detach();}else{var tagopen='<span
> class="'+className+'">';var tagclose="</span>";editor.surroundHTML
> (tagopen,tagclose);}}}else{if(parent&&!HTMLArea.isBlockElement
> (parent)){if(HTMLArea.is_gecko){parent.removeAttribute('class');}
> else{parent.removeAttribute('className');};if
> (parent.tagName.toLowerCase()=="span"){p=parent.parentNode;while
> (parent.firstChild)p.insertBefore
> (parent.firstChild,parent);p.removeChild(parent);}}}
> editor.updateToolbar();}else{editor.updateToolbar();alert
> (InlineCSS.I18N['You have to select some
> text']);}};InlineCSS.prototype.onGenerate=function(){var
> editor=this.editor;var obj=editor.config.customSelects["InlineCSS-
> class"];if(HTMLArea.is_gecko)this.generate
> (editor);};InlineCSS.prototype.onUpdateToolbar=function(){var
> editor=this.editor;var obj=editor.config.customSelects["InlineCSS-
> class"];if(HTMLArea.is_gecko&&editor._editMode!="textmode"){if
> (obj.loaded){this.updateValue(editor,obj);}else{if(obj.timeout){if
> (editor._iframe.contentWindow)
> {editor._iframe.contentWindow.clearTimeout(obj.timeout);}else
> {window.clearTimeout(obj.timeout);};obj.timeout=null;};this.generate
> (editor);}}};InlineCSS.prototype.generate=function(editor){var
> obj=editor.config.customSelects["InlineCSS-class"];var
> classesUrl=obj["classesUrl"];if(classesUrl&&typeof
> (HTMLArea.classesLabels)=="undefined"){var
> classesData=HTMLArea._getScript(0,false,classesUrl);if(classesData)
> eval(classesData);};if(obj.loaded)this.updateValue(editor,obj);else
> this.getCSSArray(editor);};InlineCSS.prototype.getCSSArray=function
> (editor){var obj=editor.config.customSelects["InlineCSS-
> class"];obj.cssArray=InlineCSS.parseStyleSheet(editor);if(!
> obj.loaded&&obj.parseCount<17){var
> getCSSArrayLaterFunctRef=InlineCSS.getCSSArrayLater
> (editor,this);obj.timeout=editor._iframe.contentWindow?
> editor._iframe.contentWindow.setTimeout(getCSSArrayLaterFunctRef,
> 200):window.setTimeout(getCSSArrayLaterFunctRef,200);obj.parseCount+
> +;}else{obj.timeout=null;obj.loaded=true;this.updateValue
> (editor,obj);}};InlineCSS.getCSSArrayLater=function(editor,instance)
> {return(function(){instance.getCSSArray
> (editor);});};InlineCSS.prototype.onMode=function(mode){var
> editor=this.editor;if(mode=='wysiwyg'){var
> obj=editor.config.customSelects["InlineCSS-class"];if(obj.loaded)
> {this.updateValue(editor,obj);}else{if(obj.timeout){if
> (editor._iframe.contentWindow)
> {editor._iframe.contentWindow.clearTimeout(obj.timeout);}else
> {window.clearTimeout(obj.timeout);};obj.timeout=null;};this.generate
> (editor);}}};InlineCSS.prototype.updateValue=function(editor,obj)
> {var cssClass,i;if(!obj.loaded){if(obj.timeout){if
> (editor._iframe.contentWindow)
> {editor._iframe.contentWindow.clearTimeout(obj.timeout);}else
> {window.clearTimeout(obj.timeout);};obj.timeout=null;};this.generate
> (editor);};var cssArray=obj.cssArray;var tagName="body";var
> className="";var parent=editor.getParentElement();if(parent)
> {tagName=parent.nodeName.toLowerCase
> ();className=parent.className;};var
> selTrimmed=editor.getSelectedHTMLContents();if(selTrimmed)
> selTrimmed=selTrimmed.replace(/(<[^>]*>| |\n|\r)/g,"");var
> endPointsInSameBlock=false;if((HTMLArea.is_gecko&&/\w/.test
> (selTrimmed)==true)||(HTMLArea.is_ie &&/\S/.test(selTrimmed)==true))
> {var sel=editor._getSelection();var range=editor._createRange
> (sel);if(HTMLArea.is_gecko){if(sel.rangeCount==1||
> HTMLArea.is_safari){var parentStart=range.startContainer;var
> parentEnd=range.endContainer;if(!
> (parentStart.nodeType==1&&parentStart.tagName.toLowerCase()=="tr"))
> {while(parentStart&&!HTMLArea.isBlockElement(parentStart))
> {parentStart=parentStart.parentNode;};while(parentEnd&&!
> HTMLArea.isBlockElement(parentEnd)){parentEnd=parentEnd.parentNode;}
> endPointsInSameBlock=(parentStart==parentEnd)&&
> (parent.tagName.toLowerCase()!="body")&&(parent.tagName.toLowerCase
> ()!="table")&&(parent.tagName.toLowerCase()!="tbody")&&
> (parent.tagName.toLowerCase()!="tr");}}}else{if(sel.type!="Control")
> {var rangeStart=range.duplicate();rangeStart.collapse(true);var
> rangeEnd=range.duplicate();rangeEnd.collapse(false);var
> parentStart=rangeStart.parentElement();var
> parentEnd=rangeEnd.parentElement();while(parentStart&&!
> HTMLArea.isBlockElement(parentStart))
> {parentStart=parentStart.parentNode;};while(parentEnd&&!
> HTMLArea.isBlockElement(parentEnd)){parentEnd=parentEnd.parentNode;}
> endPointsInSameBlock=(parentStart==parentEnd)&&
> (parent.tagName.toLowerCase()!="body");}}};var
> select=document.getElementById(editor._toolbarObjects
> [obj.id].elementId);select.disabled=!(/\w/.test(selTrimmed))||!
> (endPointsInSameBlock);obj.lastTag=tagName;obj.lastClass=className;whi
> le(select.options.length>0)select.options[select.length-1]
> =null;select.options[0]=new Option(InlineCSS.I18N
> ["Default"],'none');if(cssArray){if(cssArray['span']){for(cssClass
> in cssArray['span']){if(cssClass=='none'){select.options[0]=new
> Option(cssArray['span'][cssClass],cssClass);}else{select.options
> [select.options.length]=new Option(cssArray['span']
> [cssClass],cssClass);if(!
> editor.config.disablePCexamples&&HTMLArea.classesValues&&HTMLArea.clas
> sesValues[cssClass]&&!HTMLArea.classesNoShow[cssClass])
> select.options[select.options.length-1].setAttribute
> ("style",HTMLArea.classesValues[cssClass]);}}};if(cssArray['all'])
> {for(cssClass in cssArray['all']){select.options
> [select.options.length]=new Option(cssArray['all']
> [cssClass],cssClass);if(!
> editor.config.disablePCexamples&&HTMLArea.classesValues&&HTMLArea.clas
> sesValues[cssClass]&&!HTMLArea.classesNoShow[cssClass])
> select.options[select.options.length-1].setAttribute
> ("style",HTMLArea.classesValues
> [cssClass]);}}};select.selectedIndex=0;if(typeof className!
> ="undefined"&&/\S/.test(className)&&!
> HTMLArea.reservedClassNames.test(className)){for
> (i=select.options.length;--i>=0;){var option=select.options[i];if
> (className==option.value)
> {option.selected=true;select.selectedIndex=i;break;}};if
> (select.selectedIndex==0){select.options[select.options.length]=new
> Option(InlineCSS.I18N
> ["Undefined"],className);select.selectedIndex=select.options.length-1;
> }};select.disabled=!(select.options.length>1)||!
> endPointsInSameBlock||!((HTMLArea.is_gecko&&/\w/.test(selTrimmed)
> ==true)||(HTMLArea.is_ie &&/\S/.test(selTrimmed)
> ==true));select.className="";if(select.disabled)
> select.className="buttonDisabled";};
> +InlineCSS=function(editor,args){this.editor=editor;var
> cfg=editor.config;var toolbar=cfg.toolbar;var
> editorNumber=editor._editorNumber;var obj={id:"InlineCSS-
> class",tooltip:InlineCSS_langArray["InlineCSSStyleTooltip"],options:
> {"":""},action:null,refresh:null,context:"*",cssArray:new Object
> (),parseCount:
> 1,loaded:false,timeout:null,lastTag:"",lastClass:"",showTagFreeClasses
> :RTEarea[editorNumber]["showTagFreeClasses"],classesUrl:RTEarea
> [editorNumber]["classesUrl"],classesCharacter:RTEarea[editorNumber]
> ["classesTag"]["span"]};var
> actionHandlerFunctRef=InlineCSS.actionHandler
> (this,obj);obj.action=actionHandlerFunctRef;var
> refreshHandlerFunctRef=InlineCSS.refreshHandler
> (this);obj.refresh=refreshHandlerFunctRef;cfg.registerDropdown
> (obj);};InlineCSS.actionHandler=function(instance,obj){return
> (function(editor){instance.onSelect
> (editor,obj);});};InlineCSS.refreshHandler=function(instance){return
> (function(editor){instance.generate
> (editor);});};InlineCSS.I18N=InlineCSS_langArray;InlineCSS.parseStyleS
> heet=function(editor){var obj=editor.config.customSelects
> ["InlineCSS-class"];var iframe=editor._iframe.contentWindow?
> editor._iframe.contentWindow.document:editor._iframe.contentDocument;v
> ar newCssArray=new Object();obj.loaded=true;for(var
> i=0;i<iframe.styleSheets.length;i++){if(HTMLArea.is_gecko){try
> {newCssArray=InlineCSS.applyCSSRule
> (editor,InlineCSS.I18N,iframe.styleSheets[i].cssRules,newCssArray);}
> catch(e){obj.loaded=false;}}else{try{if(iframe.styleSheets
> [i].imports){newCssArray=InlineCSS.applyCSSIEImport
> (editor,InlineCSS.I18N,iframe.styleSheets
> [i].imports,newCssArray);};if(iframe.styleSheets[i].rules)
> {newCssArray=InlineCSS.applyCSSRule
> (editor,InlineCSS.I18N,iframe.styleSheets[i].rules,newCssArray);}}
> catch(e){obj.loaded=false;}}};return
> newCssArray;};InlineCSS.applyCSSRule=function
> (editor,i18n,cssRules,cssArray){var cssElements=new Array();var
> cssElement=new Array();var newCssArray=new Object();var
> tagName,className,rule,k;var obj=editor.config.customSelects
> ["InlineCSS-class"];newCssArray=cssArray;for
> (rule=0;rule<cssRules.length;rule++){if(cssRules[rule].selectorText)
> {if(cssRules[rule].selectorText.search(/:+/)==-1)
> {cssElements=cssRules[rule].selectorText.split(",");for
> (k=0;k<cssElements.length;k++){cssElement=cssElements[k].split
> (".");tagName=cssElement[0].toLowerCase().trim();if(!tagName)
> tagName='all';className=cssElement[1];if((!obj["classesCharacter"]&&
> (tagName=='span'))||((tagName!="all"||obj["showTagFreeClasses"]
> ==true)&&obj["classesCharacter"]&&obj["classesCharacter"].indexOf
> (className)!=-1)){if(!newCssArray[tagName])newCssArray[tagName]=new
> Object();if(className){cssName=className;if(HTMLArea.classesLabels)
> cssName=HTMLArea.classesLabels[className]?HTMLArea.classesLabels
> [className]:cssName;if(tagName!='all')cssName='<'+cssName+'>';}else
> {className='none';if(tagName=='all')cssName=i18n["Default"];else
> cssName='<'+i18n["Default"]+'>';};newCssArray[tagName][className]
> =cssName;}}}}else if(cssRules[rule].styleSheet)
> {newCssArray=InlineCSS.applyCSSRule(editor,i18n,cssRules
> [rule].styleSheet.cssRules,newCssArray);}};return
> newCssArray;};InlineCSS.applyCSSIEImport=function
> (editor,i18n,cssIEImport,cssArray){var newCssArray=new Object
> ();newCssArray=cssArray;for(var i=0;i<cssIEImport.length;i++){if
> (cssIEImport[i].imports){newCssArray=InlineCSS.applyCSSIEImport
> (editor,i18n,cssIEImport[i].imports,newCssArray);};if(cssIEImport
> [i].rules){newCssArray=InlineCSS.applyCSSRule
> (editor,i18n,cssIEImport[i].rules,newCssArray);}};return
> newCssArray;};InlineCSS._pluginInfo=
> {name:"InlineCSS",version:"1.4",developer:"Stanislas
> Rolland",developer_url:"http://
> www.fructifor.ca/",c_owner:"Stanislas Rolland",sponsor:"Fructifor
> Inc.",sponsor_url:"http://
> www.fructifor.ca/",license:"GPL"};InlineCSS.prototype.onSelect=functio
> n(editor,obj){var tbobj=editor._toolbarObjects[obj.id];var
> index=document.getElementById(tbobj.elementId).selectedIndex;var
> className=document.getElementById(tbobj.elementId).value;var
> selTrimmed;editor.focusEditor();var
> selectedHTML=editor.getSelectedHTMLContents();if(selectedHTML)
> selTrimmed=selectedHTML.replace(/(<[^>]*>| |\n|\r)/g,"");var
> parent=editor.getParentElement();if((HTMLArea.is_gecko&&/\w/.test
> (selTrimmed)==true)||(HTMLArea.is_ie &&/\S/.test(selTrimmed)==true))
> {var sel=editor._getSelection();var range=editor._createRange
> (sel);if(className!='none'){obj.lastClass=className;if(parent&&!
> HTMLArea.isBlockElement(parent)&&selectedHTML.replace(/^\s*|\s*$/
> g,"")==parent.innerHTML.replace(/^\s*|\s*$/g,""))
> {parent.className=className;}else{if(HTMLArea.is_gecko){var
> rangeClone=range.cloneRange();var span=editor._doc.createElement
> ("span");span.className=className;span.appendChild
> (range.extractContents());range.insertNode(span);if
> (HTMLArea.is_safari){sel.empty();sel.setBaseAndExtent
> (rangeClone.startContainer,rangeClone.startOffset,rangeClone.endContai
> ner,rangeClone.endOffset);}else{sel.removeRange(range);sel.addRange
> (rangeClone);};range.detach();}else{var tagopen='<span
> class="'+className+'">';var tagclose="</span>";editor.surroundHTML
> (tagopen,tagclose);}}}else{if(parent&&!HTMLArea.isBlockElement
> (parent)){if(HTMLArea.is_gecko){parent.removeAttribute('class');}
> else{parent.removeAttribute('className');};if
> (parent.tagName.toLowerCase()=="span"){p=parent.parentNode;while
> (parent.firstChild)p.insertBefore
> (parent.firstChild,parent);p.removeChild(parent);}}}
> editor.updateToolbar();}else{editor.updateToolbar();alert
> (InlineCSS.I18N['You have to select some
> text']);}};InlineCSS.prototype.onGenerate=function(){var
> editor=this.editor;var obj=editor.config.customSelects["InlineCSS-
> class"];if(HTMLArea.is_gecko)this.generate
> (editor);};InlineCSS.prototype.onUpdateToolbar=function(){var
> editor=this.editor;var obj=editor.config.customSelects["InlineCSS-
> class"];if(HTMLArea.is_gecko&&editor._editMode!="textmode"){if
> (obj.loaded){this.updateValue(editor,obj);}else{if(obj.timeout){if
> (editor._iframe.contentWindow)
> {editor._iframe.contentWindow.clearTimeout(obj.timeout);}else
> {window.clearTimeout(obj.timeout);};obj.timeout=null;};this.generate
> (editor);}}};InlineCSS.prototype.generate=function(editor){var
> obj=editor.config.customSelects["InlineCSS-class"];var
> classesUrl=obj["classesUrl"];if(classesUrl&&typeof
> (HTMLArea.classesLabels)=="undefined"){var
> classesData=HTMLArea._getScript(0,false,classesUrl);if(classesData)
> eval(classesData);};if(obj.loaded)this.updateValue(editor,obj);else
> this.getCSSArray(editor);};InlineCSS.prototype.getCSSArray=function
> (editor){var obj=editor.config.customSelects["InlineCSS-
> class"];obj.cssArray=InlineCSS.parseStyleSheet(editor);if(!
> obj.loaded&&obj.parseCount<17){var
> getCSSArrayLaterFunctRef=InlineCSS.getCSSArrayLater
> (editor,this);obj.timeout=editor._iframe.contentWindow?
> editor._iframe.contentWindow.setTimeout(getCSSArrayLaterFunctRef,
> 200):window.setTimeout(getCSSArrayLaterFunctRef,200);obj.parseCount+
> +;}else{obj.timeout=null;obj.loaded=true;this.updateValue
> (editor,obj);}};InlineCSS.getCSSArrayLater=function(editor,instance)
> {return(function(){instance.getCSSArray
> (editor);});};InlineCSS.prototype.onMode=function(mode){var
> editor=this.editor;if(mode=='wysiwyg'){var
> obj=editor.config.customSelects["InlineCSS-class"];if(obj.loaded)
> {this.updateValue(editor,obj);}else{if(obj.timeout){if
> (editor._iframe.contentWindow)
> {editor._iframe.contentWindow.clearTimeout(obj.timeout);}else
> {window.clearTimeout(obj.timeout);};obj.timeout=null;};this.generate
> (editor);}}};InlineCSS.prototype.updateValue=function(editor,obj)
> {var cssClass,i;if(!obj.loaded){if(obj.timeout){if
> (editor._iframe.contentWindow)
> {editor._iframe.contentWindow.clearTimeout(obj.timeout);}else
> {window.clearTimeout(obj.timeout);};obj.timeout=null;};this.generate
> (editor);};var cssArray=obj.cssArray;var tagName="body";var
> className="";var parent=editor.getParentElement();if(parent)
> {tagName=parent.nodeName.toLowerCase
> ();className=parent.className;};var
> selTrimmed=editor.getSelectedHTMLContents();if(selTrimmed)
> selTrimmed=selTrimmed.replace(/(<[^>]*>| |\n|\r)/g,"");var
> endPointsInSameBlock=false;if((HTMLArea.is_gecko&&/\w/.test
> (selTrimmed)==true)||(HTMLArea.is_ie &&/\S/.test(selTrimmed)==true))
> {var sel=editor._getSelection();var range=editor._createRange
> (sel);if(HTMLArea.is_gecko){if(sel.rangeCount==1||
> HTMLArea.is_safari){var parentStart=range.startContainer;var
> parentEnd=range.endContainer;if(!
> (parentStart.nodeType==1&&parentStart.tagName.toLowerCase()=="tr"))
> {while(parentStart&&!HTMLArea.isBlockElement(parentStart))
> {parentStart=parentStart.parentNode;};while(parentEnd&&!
> HTMLArea.isBlockElement(parentEnd)){parentEnd=parentEnd.parentNode;}
> endPointsInSameBlock=(parentStart==parentEnd)&&
> (parent.tagName.toLowerCase()!="body")&&(parent.tagName.toLowerCase
> ()!="table")&&(parent.tagName.toLowerCase()!="tbody")&&
> (parent.tagName.toLowerCase()!="tr");}}}else{if(sel.type!="Control")
> {var rangeStart=range.duplicate();rangeStart.collapse(true);var
> rangeEnd=range.duplicate();rangeEnd.collapse(false);var
> parentStart=rangeStart.parentElement();var
> parentEnd=rangeEnd.parentElement();while(parentStart&&!
> HTMLArea.isBlockElement(parentStart))
> {parentStart=parentStart.parentNode;};while(parentEnd&&!
> HTMLArea.isBlockElement(parentEnd)){parentEnd=parentEnd.parentNode;}
> endPointsInSameBlock=(parentStart==parentEnd)&&
> (parent.tagName.toLowerCase()!="body");}}};var
> select=document.getElementById(editor._toolbarObjects
> [obj.id].elementId);select.disabled=!(/\w/.test(selTrimmed))||!
> (endPointsInSameBlock);obj.lastTag=tagName;obj.lastClass=className;whi
> le(select.options.length>0)select.options[select.length-1]
> =null;select.options[0]=new Option(InlineCSS.I18N
> ["Default"],'none');if(cssArray){if(cssArray['span']){for(cssClass
> in cssArray['span']){if(cssClass=='none'){select.options[0]=new
> Option(cssArray['span'][cssClass],cssClass);}else{select.options
> [select.options.length]=new Option(cssArray['span']
> [cssClass],cssClass);if(!
> editor.config.disablePCexamples&&HTMLArea.classesValues&&HTMLArea.clas
> sesValues[cssClass]&&!HTMLArea.classesNoShow[cssClass])
> select.options[select.options.length-1].setAttribute
> ("style",HTMLArea.classesValues[cssClass]);}}};if(cssArray['all'])
> {for(cssClass in cssArray['all']){select.options
> [select.options.length]=new Option(cssArray['all']
> [cssClass],cssClass);if(!
> editor.config.disablePCexamples&&HTMLArea.classesValues&&HTMLArea.clas
> sesValues[cssClass]&&!HTMLArea.classesNoShow[cssClass])
> select.options[select.options.length-1].setAttribute
> ("style",HTMLArea.classesValues
> [cssClass]);}}};select.selectedIndex=0;if(typeof className!
> ="undefined"&&/\S/.test(className)&&!
> HTMLArea.reservedClassNames.test(className)){for
> (i=select.options.length;--i>=0;){var option=select.options[i];if
> (className==option.value)
> {option.selected=true;select.selectedIndex=i;break;}};if
> (select.selectedIndex==0){select.options[select.options.length]=new
> Option(InlineCSS.I18N
> ["Undefined"],className);select.selectedIndex=select.options.length-1;
> }};select.disabled=!(select.options.length>1)||!
> endPointsInSameBlock||!((HTMLArea.is_gecko&&/\w/.test(selTrimmed)
> ==true)||(HTMLArea.is_ie &&/\S/.test(selTrimmed)
> ==true));select.className="";if(select.disabled)
> select.className="buttonDisabled";};
>
> Index: C:/apache/typo3/irre-trunk/typo3/sysext/rtehtmlarea/htmlarea/
> plugins/InlineCSS/inlinecss.js
> ===================================================================
> --- C:/apache/typo3/irre-trunk/typo3/sysext/rtehtmlarea/htmlarea/
> plugins/InlineCSS/inlinecss.js (revision 1794)
> +++ C:/apache/typo3/irre-trunk/typo3/sysext/rtehtmlarea/htmlarea/
> plugins/InlineCSS/inlinecss.js (working copy)
> @@ -42,7 +42,7 @@
> action : null,
> refresh : null,
> context : "*",
> - cssArray : new Array(),
> + cssArray : new Object(),
> parseCount : 1,
> loaded : false,
> timeout : null,
> @@ -78,7 +78,7 @@
> InlineCSS.parseStyleSheet = function(editor){
> var obj = editor.config.customSelects["InlineCSS-class"];
> var iframe = editor._iframe.contentWindow ?
> editor._iframe.contentWindow.document :
> editor._iframe.contentDocument;
> - var newCssArray = new Array();
> + var newCssArray = new Object();
> obj.loaded = true;
> for(var i=0;i<iframe.styleSheets.length;i++){
> // Mozilla
> @@ -103,7 +103,7 @@
> InlineCSS.applyCSSRule = function(editor,i18n,cssRules,cssArray){
> var cssElements = new Array();
> var cssElement = new Array();
> - var newCssArray = new Array();
> + var newCssArray = new Object();
> var tagName, className, rule, k;
> var obj = editor.config.customSelects["InlineCSS-class"];
> newCssArray = cssArray;
> @@ -120,7 +120,7 @@
> if(!tagName) tagName = 'all';
> className = cssElement[1];
> if( (!obj["classesCharacter"] && (tagName == 'span')) ||
> ((tagName != "all" || obj["showTagFreeClasses"] == true) && obj
> ["classesCharacter"] && obj["classesCharacter"].indexOf(className) !
> = -1)) {
> - if(!newCssArray[tagName]) newCssArray[tagName] = new Array();
> + if(!newCssArray[tagName]) newCssArray[tagName] = new Object();
> if(className){
> cssName = className;
> if (HTMLArea.classesLabels) cssName = HTMLArea.classesLabels
> [className] ? HTMLArea.classesLabels[className] : cssName ;
> @@ -144,7 +144,7 @@
> };
>
> InlineCSS.applyCSSIEImport=function
> (editor,i18n,cssIEImport,cssArray){
> - var newCssArray = new Array();
> + var newCssArray = new Object();
> newCssArray = cssArray;
>
> for(var i=0;i<cssIEImport.length;i++){
> Index: C:/apache/typo3/irre-trunk/typo3/sysext/t3skin/stylesheets/
> typo3-TCEforms.css
> ===================================================================
> --- C:/apache/typo3/irre-trunk/typo3/sysext/t3skin/stylesheets/
> typo3-TCEforms.css (revision 1794)
> +++ C:/apache/typo3/irre-trunk/typo3/sysext/t3skin/stylesheets/
> typo3-TCEforms.css (working copy)
> @@ -78,6 +78,18 @@
> background-repeat: repeat-x;
> }
>
> +TABLE.typo3-TCEforms TABLE.wrapperAttention .class-main2,
> +TABLE.typo3-TCEforms TABLE.wrapperAttention .class-main12,
> +TABLE.typo3-TCEforms TABLE.wrapperAttention .class-main22,
> +TABLE.typo3-TCEforms TABLE.wrapperAttention .class-main32,
> +TABLE.typo3-TCEforms TABLE.wrapperAttention .class-main42,
> +TABLE.typo3-TCEforms TABLE.wrapperAttention .class-main52 {
> + background-color: #A30904;
> + background-image: none;
> + background-position: top left;
> + background-repeat: repeat-x;
> +}
> +
> TABLE.typo3-TCEforms .class-main3,
> TABLE.typo3-TCEforms .class-main13,
> TABLE.typo3-TCEforms .class-main23,
> @@ -123,3 +135,12 @@
> border: 1px solid #A2AAB8;
> margin: 0 0 5px 0;
> }
> +
> +TABLE.typo3-TCEforms TABLE.wrapperAttention .wrapperTable,
> +TABLE.typo3-TCEforms TABLE.wrapperAttention .wrapperTable1,
> +TABLE.typo3-TCEforms TABLE.wrapperAttention .wrapperTable2,
> +TABLE.typo3-TCEforms TABLE.wrapperAttention .wrapperTable3,
> +TABLE.typo3-TCEforms TABLE.wrapperAttention .wrapperTable4,
> +TABLE.typo3-TCEforms TABLE.wrapperAttention .wrapperTable5 {
> + border: 1px solid #A30904;
> + }
> _______________________________________________
> TYPO3-team-core mailing list
> TYPO3-team-core at lists.netfielders.de
> http://lists.netfielders.de/cgi-bin/mailman/listinfo/typo3-team-core
- kasper
-------------------------------
kasper2006 at typo3.com | +45 20 999 115 | skype: kasperskaarhoej |
gizmo: kasper_typo3
"Peace be with you till we meet again
Where we walk those streets of Gold
And we'll never, never grow old
I found rest for my soul
Till we meet again"
More information about the TYPO3-team-core
mailing list