[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(/(<[^>]*>|&nbsp;|\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(/(<[^>]*>|&nbsp;|\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(/(<[^>]*>|&nbsp;|\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(/(<[^>]*>|&nbsp;|\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