Documentation TYPO3 par Ameos

class.t3lib_tceforms.php

00001 <?php
00002 /***************************************************************
00003 *  Copyright notice
00004 *
00005 *  (c) 1999-2006 Kasper Skaarhoj (kasperYYYY@typo3.com)
00006 *  All rights reserved
00007 *
00008 *  This script is part of the TYPO3 project. The TYPO3 project is
00009 *  free software; you can redistribute it and/or modify
00010 *  it under the terms of the GNU General Public License as published by
00011 *  the Free Software Foundation; either version 2 of the License, or
00012 *  (at your option) any later version.
00013 *
00014 *  The GNU General Public License can be found at
00015 *  http://www.gnu.org/copyleft/gpl.html.
00016 *  A copy is found in the textfile GPL.txt and important notices to the license
00017 *  from the author is found in LICENSE.txt distributed with these scripts.
00018 *
00019 *
00020 *  This script is distributed in the hope that it will be useful,
00021 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
00022 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00023 *  GNU General Public License for more details.
00024 *
00025 *  This copyright notice MUST APPEAR in all copies of the script!
00026 ***************************************************************/
00183 require_once(PATH_t3lib.'class.t3lib_diff.php');
00184 require_once(PATH_t3lib.'class.t3lib_tceforms_inline.php');
00185 
00186 
00187 
00196 class t3lib_TCEforms    {
00197 
00198                 // variables not commented yet.... (do so...)
00199         var $palFieldArr = array();
00200         var $disableWizards = 0;
00201         var $isPalettedoc = 0;
00202         var $paletteMargin = 1;
00203         var $defStyle = ''; // 'font-family:Verdana;font-size:10px;';
00204         var $cachedTSconfig = array();
00205         var $cachedTSconfig_fieldLevel = array();
00206         var $cachedLanguageFlag = array();
00207         var $cachedAdditionalPreviewLanguages = NULL;
00208         var $transformedRow = array();
00209         var $extJSCODE = '';
00210         var $printNeededJS = array();
00211         var $hiddenFieldAccum=array();
00212         var $TBE_EDITOR_fieldChanged_func='';
00213         var $loadMD5_JS=1;
00214         var $prevBorderStyle='[nothing here...]';       // Something unique...
00215         var $allowUpload=0;                             // If set direct upload fields will be shown
00216         var $titleLen=15;                                       // @deprecated: $BE_USER->uc['titleLen'] but what is default??
00217         var $defaultLanguageData = array();     // Array where records in the default language is stored. (processed by transferdata)
00218         var $defaultLanguageData_diff = array();        // Array where records in the default language is stored (raw without any processing. used for making diff)
00219         var $additionalPreviewLanguageData = array();
00220 
00221 
00222                 // EXTERNAL, static
00223         var $backPath='';                                       // Set this to the 'backPath' pointing back to the typo3 admin directory from the script where this form is displayed.
00224         var $returnUrl='';                                      // Alternative return URL path (default is t3lib_div::linkThisScript())
00225         var $doSaveFieldName='';                        // Can be set to point to a field name in the form which will be set to '1' when the form is submitted with a *save* button. This way the recipient script can determine that the form was submitted for save and not "close" for example.
00226         var $palettesCollapsed=0;                       // Can be set true/false to whether palettes (secondary options) are in the topframe or in form. True means they are NOT IN-form. So a collapsed palette is one, which is shown in the top frame, not in the page.
00227         var $disableRTE=0;                                      // If set, the RTE is disabled (from form display, eg. by checkbox in the bottom of the page!)
00228         var $globalShowHelp=1;                          // If false, then all CSH will be disabled, regardless of settings in $this->edit_showFieldHelp
00229         var $localizationMode='';               // If true, the forms are rendering only localization relevant fields of the records.
00230         var $fieldOrder='';                                     // Overrule the field order set in TCA[types][showitem], eg for tt_content this value, 'bodytext,image', would make first the 'bodytext' field, then the 'image' field (if set for display)... and then the rest in the old order.
00231         var $doPrintPalette=1;                          // If set to false, palettes will NEVER be rendered.
00232         var $clipObj=FALSE;                                     // Set to initialized clipboard object; Then the element browser will offer a link to paste in records from clipboard.
00233         var $enableClickMenu=FALSE;                     // Enable click menu on reference icons.
00234         var $enableTabMenu = FALSE;                     // Enable Tab Menus. If set to true, the JavaScript content from template::getDynTabMenuJScode() must be included in the document.
00235         var $renderReadonly = FALSE;            // When enabled all fields are rendered non-editable.
00236 
00237         var $form_rowsToStylewidth = 9.58;      // Form field width compensation: Factor from NN4 form field widths to style-aware browsers (like NN6+ and MSIE, with the $CLIENT[FORMSTYLE] value set)
00238         var $form_largeComp = 1.33;                     // Form field width compensation: Compensation for large documents, doc-tab (editing)
00239         var $charsPerRow=40;                            // The number of chars expected per row when the height of a text area field is automatically calculated based on the number of characters found in the field content.
00240         var $maxTextareaWidth=48;                       // The maximum abstract value for textareas
00241         var $maxInputWidth=48;                          // The maximum abstract value for input fields
00242         var $defaultMultipleSelectorStyle='width:250px;';       // Default style for the selector boxes used for multiple items in "select" and "group" types.
00243 
00244 
00245                 // INTERNAL, static
00246         var $prependFormFieldNames = 'data';            // The string to prepend formfield names with.
00247         var $prependCmdFieldNames = 'cmd';                      // The string to prepend commands for tcemain::process_cmdmap with.
00248         var $prependFormFieldNames_file = 'data_files';         // The string to prepend FILE form field names with.
00249         var $formName = 'editform';                                     // The name attribute of the form.
00250         var $allowOverrideMatrix = array();                     // Whitelist that allows TCA field configuration to be overridden by TSconfig, @see overrideFieldConf()
00251 
00252 
00253 
00254                 // INTERNAL, dynamic
00255         var $perms_clause='';                                           // Set by readPerms()  (caching)
00256         var $perms_clause_set=0;                                        // Set by readPerms()  (caching-flag)
00257         var $edit_showFieldHelp='';                                     // Used to indicate the mode of CSH (Context Sensitive Help), whether it should be icons-only ('icon'), full description ('text') or not at all (blank).
00258         var $docLarge=0;                                                        // If set, the forms will be rendered a little wider, more precisely with a factor of $this->form_largeComp.
00259         var $clientInfo=array();                                        // Loaded with info about the browser when class is instantiated.
00260         var $RTEenabled=0;                                                      // True, if RTE is possible for the current user (based on result from BE_USER->isRTE())
00261         var $RTEenabled_notReasons='';                          // If $this->RTEenabled was false, you can find the reasons listed in this array which is filled with reasons why the RTE could not be loaded)
00262         var $RTEcounter = 0;                                            // Counter that is incremented before an RTE is created. Can be used for unique ids etc.
00263 
00264         var $colorScheme;                                                       // Contains current color scheme
00265         var $classScheme;                                                       // Contains current class scheme
00266         var $defColorScheme;                                            // Contains the default color scheme
00267         var $defClassScheme;                                            // Contains the default class scheme
00268         var $fieldStyle;                                                        // Contains field style values
00269         var $borderStyle;                                                       // Contains border style values.
00270 
00271         var $commentMessages=array();                           // An accumulation of messages from the class.
00272 
00273                 // INTERNAL, templates
00274         var $totalWrap='<hr />|<hr />';                         // Total wrapping for the table rows.
00275         var $fieldTemplate='<b>###FIELD_NAME###</b><br />###FIELD_ITEM###<hr />';       // Field template
00276         var $sectionWrap='';                                            // Wrapping template code for a section
00277         var $palFieldTemplateHeader='';                         // Template for palette headers
00278         var $palFieldTemplate='';                                       // Template for palettes
00279 
00280                 // INTERNAL, working memory
00281         var $excludeElements='';                                        // Set to the fields NOT to display, if any.
00282         var $palettesRendered=array();                          // During rendering of forms this will keep track of which palettes has already been rendered (so they are not rendered twice by mistake)
00283         var $hiddenFieldListArr = array();                      // This array of fields will be set as hidden-fields instead of rendered normally! For instance palette fields edited in the top frame are set as hidden fields since the main form has to submit the values. The top frame actually just sets the value in the main form!
00284         var $requiredFields=array();                            // Used to register input-field names, which are required. (Done during rendering of the fields). This information is then used later when the JavaScript is made.
00285         var $requiredElements=array();                          // Used to register the min and max number of elements for selectorboxes where that apply (in the "group" type for instance)
00286         var $renderDepth=0;                                                     // Keeps track of the rendering depth of nested records.
00287         var $savedSchemes=array();                                      // Color scheme buffer.
00288         var $dynTabLevelStack = array();                        // holds tab dividers which were cascaded, required for RTE&IRRE
00289 
00290                 // Internal, registers for user defined functions etc.
00291         var $additionalCode_pre = array();                      // Additional HTML code, printed before the form.
00292         var $additionalJS_pre = array();                        // Additional JavaScript, printed before the form
00293         var $additionalJS_post = array();                       // Additional JavaScript printed after the form
00294         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.
00295 
00296         var $inline;                                                            // Instance of t3lib_tceforms_inline
00297         var $hookObjectsMainFields = array();                   // Array containing hook class instances called once for a form
00298         var $hookObjectsSingleField = array();                  // Array containing hook class instances called for each field
00299         var $extraFormHeaders = array();                        // Rows gettings inserted into the alt_doc headers (when called from alt_doc.php)
00300 
00301 
00302 
00303 
00304 
00310         function t3lib_TCEforms()       {
00311                 global $CLIENT, $TYPO3_CONF_VARS;
00312 
00313                 $this->clientInfo = t3lib_div::clientInfo();
00314 
00315                 $this->RTEenabled = $GLOBALS['BE_USER']->isRTE();
00316                 if (!$this->RTEenabled) {
00317                         $this->RTEenabled_notReasons = implode(chr(10),$GLOBALS['BE_USER']->RTE_errors);
00318                         $this->commentMessages[] = 'RTE NOT ENABLED IN SYSTEM due to:'.chr(10).$this->RTEenabled_notReasons;
00319                 }
00320 
00321                         // Default color+class scheme
00322                 $this->defColorScheme = array(
00323                         $GLOBALS['SOBE']->doc->bgColor, // Background for the field AND palette
00324                         t3lib_div::modifyHTMLColorAll($GLOBALS['SOBE']->doc->bgColor,-20),      // Background for the field header
00325                         t3lib_div::modifyHTMLColorAll($GLOBALS['SOBE']->doc->bgColor,-10),      // Background for the palette field header
00326                         'black',        // Field header font color
00327                         '#666666'       // Palette field header font color
00328                 );
00329                 $this->defColorScheme = array();
00330 
00331                         // Override / Setting defaults from TBE_STYLES array
00332                 $this->resetSchemes();
00333 
00334                         // Setting the current colorScheme to default.
00335                 $this->defColorScheme = $this->colorScheme;
00336                 $this->defClassScheme = $this->classScheme;
00337 
00338                         // Define whitelist that allows TCA field configuration to be overridden by TSconfig, @see overrideFieldConf():
00339                 $this->allowOverrideMatrix = array(
00340                         'input' => array('size', 'max'),
00341                         'text' => array('cols', 'rows', 'wrap'),
00342                         'check' => array('cols', 'showIfRTE'),
00343                         'select' => array('size', 'autoSizeMax', 'maxitems', 'minitems'),
00344                         'group' => array('size', 'autoSizeMax', 'max_size', 'show_thumbs', 'maxitems', 'minitems'),
00345                         'inline' => array('appearance', 'foreign_label', 'foreign_selector', 'foreign_unique', 'maxitems', 'minitems', 'size', 'autoSizeMax', 'symmetric_label'),
00346                 );
00347 
00348                 $this->inline = t3lib_div::makeInstance('t3lib_TCEforms_inline');
00349 
00350                         // Prepare user defined objects (if any) for hooks which extend this function:
00351                 $this->hookObjectsMainFields = array();
00352                 if (is_array ($TYPO3_CONF_VARS['SC_OPTIONS']['t3lib/class.t3lib_tceforms.php']['getMainFieldsClass']))  {
00353                         foreach ($TYPO3_CONF_VARS['SC_OPTIONS']['t3lib/class.t3lib_tceforms.php']['getMainFieldsClass'] as $classRef)   {
00354                                 $this->hookObjectsMainFields[] = &t3lib_div::getUserObj($classRef);
00355                         }
00356                 }
00357                 $this->hookObjectsSingleField = array();
00358                 if (is_array ($TYPO3_CONF_VARS['SC_OPTIONS']['t3lib/class.t3lib_tceforms.php']['getSingleFieldClass'])) {
00359                         foreach ($TYPO3_CONF_VARS['SC_OPTIONS']['t3lib/class.t3lib_tceforms.php']['getSingleFieldClass'] as $classRef)  {
00360                                 $this->hookObjectsSingleField[] = &t3lib_div::getUserObj($classRef);
00361                         }
00362                 }
00363 
00364         }
00365 
00371         function initDefaultBEmode()    {
00372                 global $BE_USER;
00373                 $this->prependFormFieldNames = 'data';
00374                 $this->formName = 'editform';
00375                 $this->setNewBEDesign();
00376                 $this->docLarge = $BE_USER->uc['edit_wideDocument'] ? 1 : 0;
00377                 $this->edit_showFieldHelp = $BE_USER->uc['edit_showFieldHelp'];
00378 
00379                 $this->edit_docModuleUpload = $BE_USER->uc['edit_docModuleUpload'];
00380                 $this->titleLen = $BE_USER->uc['titleLen'];             // @deprecated
00381 
00382                 $this->inline->init($this);
00383         }
00384 
00385 
00386 
00387 
00388 
00389 
00390 
00391 
00392 
00393 
00394 
00395 
00396 
00397 
00398 
00399 
00400 
00401         /*******************************************************
00402          *
00403          * Rendering the forms, fields etc
00404          *
00405          *******************************************************/
00406 
00418         function getSoloField($table,$row,$theFieldToReturn)    {
00419                 global $TCA;
00420 
00421                 if ($TCA[$table])       {
00422                         t3lib_div::loadTCA($table);
00423                         $typeNum = $this->getRTypeNum($table,$row);
00424                         if ($TCA[$table]['types'][$typeNum])    {
00425                                 $itemList = $TCA[$table]['types'][$typeNum]['showitem'];
00426                                 if ($itemList)  {
00427                                         $fields = t3lib_div::trimExplode(',',$itemList,1);
00428                                         $excludeElements = $this->excludeElements = $this->getExcludeElements($table,$row,$typeNum);
00429 
00430                                         reset($fields);
00431                                         while(list(,$fieldInfo)=each($fields))  {
00432                                                 $parts = explode(';',$fieldInfo);
00433 
00434                                                 $theField = trim($parts[0]);
00435                                                 if (!in_array($theField,$excludeElements) && !strcmp($theField,$theFieldToReturn))      {
00436                                                         if ($TCA[$table]['columns'][$theField]) {
00437                                                                 $sField = $this->getSingleField($table,$theField,$row,$parts[1],1,$parts[3],$parts[2]);
00438                                                                 return $sField['ITEM'];
00439                                                         }
00440                                                 }
00441                                         }
00442                                 }
00443                         }
00444                 }
00445         }
00446 
00457         function getMainFields($table,$row,$depth=0)    {
00458                 global $TCA, $TYPO3_CONF_VARS;
00459 
00460                 $this->renderDepth=$depth;
00461 
00462                         // Init vars:
00463                 $out_array = array(array());
00464                 $out_array_meta = array(array(
00465                         'title' => $this->getLL('l_generalTab')
00466                 ));
00467 
00468                 $out_pointer=0;
00469                 $out_sheet=0;
00470                 $this->palettesRendered=array();
00471                 $this->palettesRendered[$this->renderDepth][$table]=array();
00472 
00473                         // Hook: getMainFields_preProcess (requested by Thomas Hempel for use with the "dynaflex" extension)
00474                 foreach ($this->hookObjectsMainFields as $hookObj)      {
00475                         if (method_exists($hookObj,'getMainFields_preProcess')) {
00476                                 $hookObj->getMainFields_preProcess($table,$row,$this);
00477                         }
00478                 }
00479 
00480                 if ($TCA[$table])       {
00481 
00482                                 // Load the full TCA for the table.
00483                         t3lib_div::loadTCA($table);
00484 
00485                                 // Load the description content for the table.
00486                         if ($this->edit_showFieldHelp || $this->doLoadTableDescr($table))       {
00487                                 $GLOBALS['LANG']->loadSingleTableDescription($table);
00488                         }
00489                                 // Get the current "type" value for the record.
00490                         $typeNum = $this->getRTypeNum($table,$row);
00491 
00492                                 // Find the list of fields to display:
00493                         if ($TCA[$table]['types'][$typeNum])    {
00494                                 $itemList = $TCA[$table]['types'][$typeNum]['showitem'];
00495                                 if ($itemList)  {       // If such a list existed...
00496                                                 // if TCEforms will render a tab menu in the next step, push the name to the tab stack
00497                                         if (strstr($itemList, '--div--') !== false && $this->enableTabMenu && $TCA[$table]['ctrl']['dividers2tabs']) {
00498                                                 $tabIdentString = 'TCEforms:'.$table.':'.$row['uid'];
00499                                                 $tabIdentStringMD5 = $GLOBALS['TBE_TEMPLATE']->getDynTabMenuId('TCEforms:'.$table.':'.$row['uid']);
00500                                                 $this->dynTabLevelStack[$tabIdentStringMD5] = 1;
00501                                         }
00502 
00503                                                 // Explode the field list and possibly rearrange the order of the fields, if configured for
00504                                         $fields = t3lib_div::trimExplode(',',$itemList,1);
00505                                         if ($this->fieldOrder)  {
00506                                                 $fields = $this->rearrange($fields);
00507                                         }
00508 
00509                                                 // Get excluded fields, added fiels and put it together:
00510                                         $excludeElements = $this->excludeElements = $this->getExcludeElements($table,$row,$typeNum);
00511                                         $fields = $this->mergeFieldsWithAddedFields($fields,$this->getFieldsToAdd($table,$row,$typeNum));
00512 
00513                                                 // Traverse the fields to render:
00514                                         $cc=0;
00515                                         foreach($fields as $fieldInfo)  {
00516                                                         // Exploding subparts of the field configuration:
00517                                                 $parts = explode(';',$fieldInfo);
00518 
00519                                                         // Getting the style information out:
00520                                                 $color_style_parts = t3lib_div::trimExplode('-',$parts[4]);
00521                                                 if (strcmp($color_style_parts[0],''))   {
00522                                                         $this->setColorScheme($GLOBALS['TBE_STYLES']['colorschemes'][intval($color_style_parts[0])]);
00523                                                 }
00524                                                 if (strcmp($color_style_parts[1],''))   {
00525                                                         $this->fieldStyle = $GLOBALS['TBE_STYLES']['styleschemes'][intval($color_style_parts[1])];
00526                                                         if (!isset($this->fieldStyle))  $this->fieldStyle = $GLOBALS['TBE_STYLES']['styleschemes'][0];
00527                                                 }
00528                                                 if (strcmp($color_style_parts[2],''))   {
00529                                                         $this->wrapBorder($out_array[$out_sheet],$out_pointer);
00530                                                         $this->borderStyle = $GLOBALS['TBE_STYLES']['borderschemes'][intval($color_style_parts[2])];
00531                                                         if (!isset($this->borderStyle)) $this->borderStyle = $GLOBALS['TBE_STYLES']['borderschemes'][0];
00532                                                 }
00533 
00534                                                         // Render the field:
00535                                                 $theField = $parts[0];
00536                                                 if (!in_array($theField,$excludeElements))      {
00537                                                         if ($TCA[$table]['columns'][$theField]) {
00538                                                                 $sFieldPal='';
00539 
00540                                                                 if ($parts[2] && !isset($this->palettesRendered[$this->renderDepth][$table][$parts[2]]))        {
00541                                                                         $sFieldPal=$this->getPaletteFields($table,$row,$parts[2]);
00542                                                                         $this->palettesRendered[$this->renderDepth][$table][$parts[2]] = 1;
00543                                                                 }
00544                                                                 $sField = $this->getSingleField($table,$theField,$row,$parts[1],0,$parts[3],$parts[2]);
00545                                                                 if ($sField)    { $sField.= $sFieldPal; }
00546 
00547                                                                 $out_array[$out_sheet][$out_pointer].= $sField;
00548                                                         } elseif ($theField=='--div--') {
00549                                                                 if ($cc>0)      {
00550                                                                         $out_array[$out_sheet][$out_pointer].=$this->getDivider();
00551 
00552                                                                         if ($this->enableTabMenu && $TCA[$table]['ctrl']['dividers2tabs'])      {
00553                                                                                 $this->wrapBorder($out_array[$out_sheet],$out_pointer);
00554                                                                                 $out_sheet++;
00555                                                                                         // remember what sheet we're currently in
00556                                                                                 $this->dynTabLevelStack[$tabIdentStringMD5] = $out_sheet+1;
00557                                                                                 $out_array[$out_sheet] = array();
00558                                                                                 $out_array_meta[$out_sheet]['title'] = $this->sL($parts[1]);
00559                                                                         }
00560                                                                 } else {        // Setting alternative title for "General" tab if "--div--" is the very first element.
00561                                                                         $out_array_meta[$out_sheet]['title'] = $this->sL($parts[1]);
00562                                                                 }
00563                                                         } elseif($theField=='--palette--')      {
00564                                                                 if ($parts[2] && !isset($this->palettesRendered[$this->renderDepth][$table][$parts[2]]))        {
00565                                                                                 // render a 'header' if not collapsed
00566                                                                         if ($TCA[$table]['palettes'][$parts[2]]['canNotCollapse'] AND $parts[1]) {
00567                                                                                 $out_array[$out_sheet][$out_pointer].=$this->getPaletteFields($table,$row,$parts[2],$this->sL($parts[1]));
00568                                                                         } else {
00569                                                                                 $out_array[$out_sheet][$out_pointer].=$this->getPaletteFields($table,$row,$parts[2],'','',$this->sL($parts[1]));
00570                                                                         }
00571                                                                         $this->palettesRendered[$this->renderDepth][$table][$parts[2]] = 1;
00572                                                                 }
00573                                                         }
00574                                                 }
00575 
00576                                                 $cc++;
00577                                         }
00578                                 }
00579                         }
00580                 }
00581 
00582                         // Hook: getMainFields_postProcess (requested by Thomas Hempel for use with the "dynaflex" extension)
00583                 foreach ($this->hookObjectsMainFields as $hookObj)      {
00584                         if (method_exists($hookObj,'getMainFields_postProcess'))        {
00585                                 $hookObj->getMainFields_postProcess($table,$row,$this);
00586                         }
00587                 }
00588 
00589                         // Wrapping a border around it all:
00590                 $this->wrapBorder($out_array[$out_sheet],$out_pointer);
00591 
00592                         // Resetting styles:
00593                 $this->resetSchemes();
00594 
00595                         // Rendering Main palettes, if any
00596                 $mParr = t3lib_div::trimExplode(',',$TCA[$table]['ctrl']['mainpalette']);
00597                 $i = 0;
00598                 if (count($mParr))      {
00599                         foreach ($mParr as $mP) {
00600                                 if (!isset($this->palettesRendered[$this->renderDepth][$table][$mP]))   {
00601                                         $temp_palettesCollapsed=$this->palettesCollapsed;
00602                                         $this->palettesCollapsed=0;
00603                                         $label = ($i==0?$this->getLL('l_generalOptions'):$this->getLL('l_generalOptions_more'));
00604                                         $out_array[$out_sheet][$out_pointer].=$this->getPaletteFields($table,$row,$mP,$label);
00605                                         $this->palettesCollapsed=$temp_palettesCollapsed;
00606                                         $this->palettesRendered[$this->renderDepth][$table][$mP] = 1;
00607                                 }
00608                                 $this->wrapBorder($out_array[$out_sheet],$out_pointer);
00609                                 $i++;
00610                                 if ($this->renderDepth) {
00611                                         $this->renderDepth--;
00612                                 }
00613                         }
00614                 }
00615 
00616                         // Return the imploded $out_array:
00617                 if ($out_sheet>0)       {       // There were --div-- dividers around...
00618 
00619                                 // Create parts array for the tab menu:
00620                         $parts = array();
00621                         foreach ($out_array as $idx => $sheetContent)   {
00622                                 $parts[] = array(
00623                                         'label' => $out_array_meta[$idx]['title'],
00624                                         'content' => '<table border="0" cellspacing="0" cellpadding="0" width="100%">'.
00625                                                         implode('',$sheetContent).
00626                                                 '</table>'
00627                                 );
00628                         }
00629 
00630                                 // unset the current level of tab menus
00631                         unset($this->dynTabLevelStack[$tabIdentStringMD5]);
00632 
00633                         return '
00634                                 <tr>
00635                                         <td colspan="2">
00636                                         '.$this->getDynTabMenu($parts, $tabIdentString).'
00637                                         </td>
00638                                 </tr>';
00639                 } else {        // Only one, so just implode:
00640                         return implode('',$out_array[$out_sheet]);
00641                 }
00642         }
00643 
00654         function getListedFields($table,$row,$list)     {
00655                 global $TCA;
00656 
00657                 t3lib_div::loadTCA($table);
00658                 if ($this->edit_showFieldHelp || $this->doLoadTableDescr($table))       {
00659                         $GLOBALS['LANG']->loadSingleTableDescription($table);
00660                 }
00661 
00662                 $out = '';
00663                 $types_fieldConfig = t3lib_BEfunc::getTCAtypes($table,$row,1);
00664 
00665                 $editFieldList=array_unique(t3lib_div::trimExplode(',',$list,1));
00666                 foreach($editFieldList as $theFieldC)   {
00667                         list($theField,$palFields) = split('\[|\]',$theFieldC);
00668                         $theField = trim($theField);
00669                         $palFields = trim($palFields);
00670                         if ($TCA[$table]['columns'][$theField]) {
00671                                 $parts = t3lib_div::trimExplode(';',$types_fieldConfig[$theField]['origString']);
00672                                 $sField = $this->getSingleField($table,$theField,$row,$parts[1],0,$parts[3],0); // Don't sent palette pointer - there are no options anyways for a field-list.
00673                                 $out.= $sField;
00674                         } elseif($theField=='--div--')  {
00675                                 $out.= $this->getDivider();
00676                         }
00677                         if ($palFields) {
00678                                 $out.= $this->getPaletteFields($table,$row,'','',implode(',',t3lib_div::trimExplode('|',$palFields,1)));
00679                         }
00680                 }
00681 
00682                 return $out;
00683         }
00684 
00696         function getPaletteFields($table,$row,$palette,$header='',$itemList='',$collapsedHeader='')     {
00697                 global $TCA;
00698                 if (!$this->doPrintPalette)     return '';
00699 
00700                 $out='';
00701                 $palParts = array();
00702                 t3lib_div::loadTCA($table);
00703 
00704                         // Getting excludeElements, if any.
00705                 if (!is_array($this->excludeElements))  {
00706                         $this->excludeElements = $this->getExcludeElements($table,$row,$this->getRTypeNum($table,$row));
00707                 }
00708 
00709                         // Render the palette TCEform elements.
00710                 if ($TCA[$table] && (is_array($TCA[$table]['palettes'][$palette]) || $itemList))        {
00711                         $itemList = $itemList?$itemList:$TCA[$table]['palettes'][$palette]['showitem'];
00712                         if ($itemList)  {
00713                                 $fields = t3lib_div::trimExplode(',',$itemList,1);
00714                                 reset($fields);
00715                                 while(list(,$fieldInfo)=each($fields))  {
00716                                         $parts = t3lib_div::trimExplode(';',$fieldInfo);
00717                                         $theField = $parts[0];
00718 
00719                                         if (!in_array($theField,$this->excludeElements) && $TCA[$table]['columns'][$theField])  {
00720                                                 $this->palFieldArr[$palette][] = $theField;
00721                                                 if ($this->isPalettesCollapsed($table,$palette))        {
00722                                                         $this->hiddenFieldListArr[] = $theField;
00723                                                 }
00724 
00725                                                 $part = $this->getSingleField($table,$theField,$row,$parts[1],1,'',$parts[2]);
00726                                                 if (is_array($part))    {
00727                                                         $palParts[] = $part;
00728                                                 }
00729                                         }
00730                                 }
00731                         }
00732                 }
00733                         // Put palette together if there are fields in it:
00734                 if (count($palParts))   {
00735                         if ($header)    {
00736                                 $out.= $this->intoTemplate(array(
00737                                                                 'HEADER' => htmlspecialchars($header)
00738                                                         ),
00739                                                         $this->palFieldTemplateHeader
00740                                                 );
00741                         }
00742                         $out.= $this->intoTemplate(array(
00743                                                         'PALETTE' => $this->printPalette($palParts)
00744                                                 ),
00745                                                 $this->palFieldTemplate
00746                                         );
00747                 }
00748                         // If a palette is collapsed (not shown in form, but in top frame instead) AND a collapse header string is given, then make that string a link to activate the palette.
00749                 if ($this->isPalettesCollapsed($table,$palette) && $collapsedHeader)    {
00750                         $pC = $this->intoTemplate(array(
00751                                                         'PALETTE' => $this->wrapOpenPalette('<img'.t3lib_iconWorks::skinImg($this->backPath,'gfx/options.gif','width="18" height="16"').' border="0" title="'.htmlspecialchars($this->getLL('l_moreOptions')).'" align="top" alt="" /><strong>'.$collapsedHeader.'</strong>',$table,$row,$palette),
00752                                                 ),
00753                                                 $this->palFieldTemplate
00754                                         );
00755                         $out.= $pC;
00756                 }
00757 
00758                 return $out;
00759         }
00760 
00773         function getSingleField($table,$field,$row,$altName='',$palette=0,$extra='',$pal=0)     {
00774                 global $TCA,$BE_USER;
00775 
00776                         // Hook: getSingleField_preProcess
00777                 foreach ($this->hookObjectsSingleField as $hookObj)     {
00778                         if (method_exists($hookObj,'getSingleField_preProcess'))        {
00779                                 $hookObj->getSingleField_preProcess($table, $field, $row, $altName, $palette, $extra, $pal, $this);
00780                         }
00781                 }
00782 
00783                 $out = '';
00784                 $PA = array();
00785                 $PA['altName'] = $altName;
00786                 $PA['palette'] = $palette;
00787                 $PA['extra'] = $extra;
00788                 $PA['pal'] = $pal;
00789 
00790                         // Make sure to load full $TCA array for the table:
00791                 t3lib_div::loadTCA($table);
00792 
00793                         // Get the TCA configuration for the current field:
00794                 $PA['fieldConf'] = $TCA[$table]['columns'][$field];
00795                 $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
00796 
00797                 $skipThisField = $this->inline->skipField($table, $field, $row, $PA['fieldConf']['config']);
00798 
00799                         // Now, check if this field is configured and editable (according to excludefields + other configuration)
00800                 if (    is_array($PA['fieldConf']) &&
00801                                 !$skipThisField &&
00802                                 (!$PA['fieldConf']['exclude'] || $BE_USER->check('non_exclude_fields',$table.':'.$field)) &&
00803                                 $PA['fieldConf']['config']['form_type']!='passthrough' &&
00804                                 ($this->RTEenabled || !$PA['fieldConf']['config']['showIfRTE']) &&
00805                                 (!$PA['fieldConf']['displayCond'] || $this->isDisplayCondition($PA['fieldConf']['displayCond'],$row)) &&
00806                                 (!$TCA[$table]['ctrl']['languageField'] || $PA['fieldConf']['l10n_display'] || strcmp($PA['fieldConf']['l10n_mode'],'exclude') || $row[$TCA[$table]['ctrl']['languageField']]<=0) &&
00807                                 (!$TCA[$table]['ctrl']['languageField'] || !$this->localizationMode || $this->localizationMode===$PA['fieldConf']['l10n_cat'])
00808                         )       {
00809 
00810 
00811 
00812                                 // Fetching the TSconfig for the current table/field. This includes the $row which means that
00813                         $PA['fieldTSConfig'] = $this->setTSconfig($table,$row,$field);
00814 
00815                                 // If the field is NOT disabled from TSconfig (which it could have been) then render it
00816                         if (!$PA['fieldTSConfig']['disabled'])  {
00817                                         // Override fieldConf by fieldTSconfig:
00818                                 $PA['fieldConf']['config'] = $this->overrideFieldConf($PA['fieldConf']['config'], $PA['fieldTSConfig']);
00819 
00820                                         // Init variables:
00821                                 $PA['itemFormElName']=$this->prependFormFieldNames.'['.$table.']['.$row['uid'].']['.$field.']';         // Form field name
00822                                 $PA['itemFormElName_file']=$this->prependFormFieldNames_file.'['.$table.']['.$row['uid'].']['.$field.']';       // Form field name, in case of file uploads
00823                                 $PA['itemFormElValue']=$row[$field];            // The value to show in the form field.
00824                                 $PA['itemFormElID']=$this->prependFormFieldNames.'_'.$table.'_'.$row['uid'].'_'.$field;
00825 
00826                                         // set field to read-only if configured for translated records to show default language content as readonly
00827                                 if ($PA['fieldConf']['l10n_display'] AND t3lib_div::inList($PA['fieldConf']['l10n_display'], 'defaultAsReadonly') AND $row[$TCA[$table]['ctrl']['languageField']]) {
00828                                         $PA['fieldConf']['config']['readOnly'] =  true;
00829                                         $PA['itemFormElValue'] = $this->defaultLanguageData[$table.':'.$row['uid']][$field];
00830                                 }
00831 
00832                                         // Create a JavaScript code line which will ask the user to save/update the form due to changing the element. This is used for eg. "type" fields and others configured with "requestUpdate"
00833                                 if (
00834                                         ($TCA[$table]['ctrl']['type'] && !strcmp($field,$TCA[$table]['ctrl']['type'])) ||
00835                                         ($TCA[$table]['ctrl']['requestUpdate'] && t3lib_div::inList($TCA[$table]['ctrl']['requestUpdate'],$field))) {
00836                                         if($GLOBALS['BE_USER']->jsConfirmation(1))      {
00837                                                 $alertMsgOnChange = 'if (confirm(TBE_EDITOR.labels.onChangeAlert) && TBE_EDITOR.checkSubmit(-1)){ TBE_EDITOR.submitForm() };';
00838                                         } else {
00839                                                 $alertMsgOnChange = 'if (TBE_EDITOR.checkSubmit(-1)){ TBE_EDITOR.submitForm() };';
00840                                         }
00841                                 } else {
00842                                         $alertMsgOnChange = '';
00843                                 }
00844 
00845                                         // Render as a hidden field?
00846                                 if (in_array($field,$this->hiddenFieldListArr)) {
00847                                         $this->hiddenFieldAccum[]='<input type="hidden" name="'.$PA['itemFormElName'].'" value="'.htmlspecialchars($PA['itemFormElValue']).'" />';
00848                                 } else {        // Render as a normal field:
00849 
00850                                                 // If the field is NOT a palette field, then we might create an icon which links to a palette for the field, if one exists.
00851                                         if (!$PA['palette'])    {
00852                                                 if ($PA['pal'] && $this->isPalettesCollapsed($table,$PA['pal']))        {
00853                                                         list($thePalIcon,$palJSfunc) = $this->wrapOpenPalette('<img'.t3lib_iconWorks::skinImg($this->backPath,'gfx/options.gif','width="18" height="16"').' border="0" title="'.htmlspecialchars($this->getLL('l_moreOptions')).'" alt="" />',$table,$row,$PA['pal'],1);
00854                                                 } else {
00855                                                         $thePalIcon = '';
00856                                                         $palJSfunc = '';
00857                                                 }
00858                                         }
00859                                                 // onFocus attribute to add to the field:
00860                                         $PA['onFocus'] = ($palJSfunc && !$BE_USER->uc['dontShowPalettesOnFocusInAB']) ? ' onfocus="'.htmlspecialchars($palJSfunc).'"' : '';
00861 
00862                                                 // Find item
00863                                         $item='';
00864                                         $PA['label'] = $PA['altName'] ? $PA['altName'] : $PA['fieldConf']['label'];
00865                                         $PA['label'] = $this->sL($PA['label']);
00866                                                 // JavaScript code for event handlers:
00867                                         $PA['fieldChangeFunc']=array();
00868                                         $PA['fieldChangeFunc']['TBE_EDITOR_fieldChanged'] = "TBE_EDITOR.fieldChanged('".$table."','".$row['uid']."','".$field."','".$PA['itemFormElName']."');";
00869                                         $PA['fieldChangeFunc']['alert']=$alertMsgOnChange;
00870                                                 // if this is the child of an inline type and it is the field creating the label
00871                                         if ($this->inline->isInlineChildAndLabelField($table, $field)) {
00872                                                 $PA['fieldChangeFunc']['inline'] = "inline.handleChangedField('".$PA['itemFormElName']."','".$this->inline->inlineNames['object']."[$table][".$row['uid']."]');";
00873                                         }
00874 
00875                                                 // Based on the type of the item, call a render function:
00876                                         $item = $this->getSingleField_SW($table,$field,$row,$PA);
00877 
00878                                                 // Add language + diff
00879                                         if ($PA['fieldConf']['l10n_display'] && (t3lib_div::inList($PA['fieldConf']['l10n_display'], 'hideDiff') || t3lib_div::inList($PA['fieldConf']['l10n_display'], 'defaultAsReadonly'))) {
00880                                                 $renderLanguageDiff = false;
00881                                         } else {
00882                                                 $renderLanguageDiff = true;
00883                                         }
00884 
00885                                         if ($renderLanguageDiff) {
00886                                                 $item = $this->renderDefaultLanguageContent($table,$field,$row,$item);
00887                                                 $item = $this->renderDefaultLanguageDiff($table,$field,$row,$item);
00888                                         }
00889 
00890                                                 // If the record has been saved and the "linkTitleToSelf" is set, we make the field name into a link, which will load ONLY this field in alt_doc.php
00891                                         $PA['label'] = t3lib_div::deHSCentities(htmlspecialchars($PA['label']));
00892                                         if (t3lib_div::testInt($row['uid']) && $PA['fieldTSConfig']['linkTitleToSelf']) {
00893                                                 $lTTS_url = $this->backPath.'alt_doc.php?edit['.$table.']['.$row['uid'].']=edit&columnsOnly='.$field.
00894                                                                         ($PA['fieldTSConfig']['linkTitleToSelf.']['returnUrl']?'&returnUrl='.rawurlencode($this->thisReturnUrl()):'');
00895                                                 $PA['label'] = '<a href="'.htmlspecialchars($lTTS_url).'">'.$PA['label'].'</a>';
00896                                         }
00897 
00898                                                 // Create output value:
00899                                         if ($PA['fieldConf']['config']['form_type']=='user' && $PA['fieldConf']['config']['noTableWrapping'])   {
00900                                                 $out = $item;
00901                                         } elseif ($PA['palette'])       {
00902                                                         // Array:
00903                                                 $out=array(
00904                                                         'NAME'=>$PA['label'],
00905                                                         'ID'=>$row['uid'],
00906                                                         'FIELD'=>$field,
00907                                                         'TABLE'=>$table,
00908                                                         'ITEM'=>$item,
00909                                                         'HELP_ICON' => $this->helpTextIcon($table,$field,1)
00910                                                 );
00911                                                 $out = $this->addUserTemplateMarkers($out,$table,$field,$row,$PA);
00912                                         } else {
00913                                                         // String:
00914                                                 $out=array(
00915                                                         'NAME'=>$PA['label'],
00916                                                         'ITEM'=>$item,
00917                                                         'TABLE'=>$table,
00918                                                         'ID'=>$row['uid'],
00919                                                         'HELP_ICON'=>$this->helpTextIcon($table,$field),
00920                                                         'HELP_TEXT'=>$this->helpText($table,$field),
00921                                                         'PAL_LINK_ICON'=>$thePalIcon,
00922                                                         'FIELD'=>$field
00923                                                 );
00924                                                 $out = $this->addUserTemplateMarkers($out,$table,$field,$row,$PA);
00925                                                         // String:
00926                                                 $out=$this->intoTemplate($out);
00927                                         }
00928                                 }
00929                         } else $this->commentMessages[]=$this->prependFormFieldNames.'['.$table.']['.$row['uid'].']['.$field.']: Disabled by TSconfig';
00930                 }
00931                         // Hook: getSingleField_postProcess
00932                 foreach ($this->hookObjectsSingleField as $hookObj)     {
00933                         if (method_exists($hookObj,'getSingleField_postProcess'))       {
00934                                 $hookObj->getSingleField_postProcess($table, $field, $row, $out, $PA, $this);
00935                         }
00936                 }
00937                         // Return value (string or array)
00938                 return $out;
00939         }
00940 
00952         function getSingleField_SW($table,$field,$row,&$PA)     {
00953                 $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
00954 
00955                 switch($PA['fieldConf']['config']['form_type']) {
00956                         case 'input':
00957                                 $item = $this->getSingleField_typeInput($table,$field,$row,$PA);
00958                         break;
00959                         case 'text':
00960                                 $item = $this->getSingleField_typeText($table,$field,$row,$PA);
00961                         break;
00962                         case 'check':
00963                                 $item = $this->getSingleField_typeCheck($table,$field,$row,$PA);
00964                         break;
00965                         case 'radio':
00966                                 $item = $this->getSingleField_typeRadio($table,$field,$row,$PA);
00967                         break;
00968                         case 'select':
00969                                 $item = $this->getSingleField_typeSelect($table,$field,$row,$PA);
00970                         break;
00971                         case 'group':
00972                                 $item = $this->getSingleField_typeGroup($table,$field,$row,$PA);
00973                         break;
00974                         case 'inline':
00975                                 $item = $this->inline->getSingleField_typeInline($table,$field,$row,$PA);
00976                         break;
00977                         case 'none':
00978                                 $item = $this->getSingleField_typeNone($table,$field,$row,$PA);
00979                         break;
00980                         case 'user':
00981                                 $item = $this->getSingleField_typeUser($table,$field,$row,$PA);
00982                         break;
00983                         case 'flex':
00984                                 $item = $this->getSingleField_typeFlex($table,$field,$row,$PA);
00985                         break;
00986                         default:
00987                                 $item = $this->getSingleField_typeUnknown($table,$field,$row,$PA);
00988                         break;
00989                 }
00990 
00991                 return $item;
00992         }
00993 
00994 
00995 
00996 
00997 
00998 
00999 
01000 
01001 
01002 
01003 
01004 
01005 
01006 
01007 
01008 
01009 
01010 
01011 
01012         /**********************************************************
01013          *
01014          * Rendering of each TCEform field type
01015          *
01016          ************************************************************/
01017 
01028         function getSingleField_typeInput($table,$field,$row,&$PA)      {
01029                 // typo3FormFieldSet(theField, evallist, is_in, checkbox, checkboxValue)
01030                 // typo3FormFieldGet(theField, evallist, is_in, checkbox, checkboxValue, checkbox_off)
01031 
01032                 $config = $PA['fieldConf']['config'];
01033 
01034 #               $specConf = $this->getSpecConfForField($table,$row,$field);
01035                 $specConf = $this->getSpecConfFromString($PA['extra'], $PA['fieldConf']['defaultExtras']);
01036                 $size = t3lib_div::intInRange($config['size']?$config['size']:30,5,$this->maxInputWidth);
01037                 $evalList = t3lib_div::trimExplode(',',$config['eval'],1);
01038 
01039 
01040                 if($this->renderReadonly || $config['readOnly'])  {
01041                         $itemFormElValue = $PA['itemFormElValue'];
01042                         if (in_array('date',$evalList)) {
01043                                 $config['format'] = 'date';
01044                         } elseif (in_array('date',$evalList))   {
01045                                 $config['format'] = 'date';
01046                         } elseif (in_array('datetime',$evalList))       {
01047                                 $config['format'] = 'datetime';
01048                         } elseif (in_array('time',$evalList))   {
01049                                 $config['format'] = 'time';
01050                         }
01051                         if (in_array('password',$evalList))     {
01052                                 $itemFormElValue = $itemFormElValue ? '*********' : '';
01053                         }
01054                         return $this->getSingleField_typeNone_render($config, $itemFormElValue);
01055                 }
01056 
01057                 if (in_array('required',$evalList))     {
01058                         $this->requiredFields[$table.'_'.$row['uid'].'_'.$field]=$PA['itemFormElName'];
01059                 }
01060 
01061                 $paramsList = "'".$PA['itemFormElName']."','".implode(',',$evalList)."','".trim($config['is_in'])."',".(isset($config['checkbox'])?1:0).",'".$config['checkbox']."'";
01062                 if (isset($config['checkbox'])) {
01063                                 // Setting default "click-checkbox" values for eval types "date" and "datetime":
01064                         $thisMidnight = mktime(0,0,0);
01065                         $checkSetValue = in_array('date',$evalList) ? $thisMidnight : '';
01066                         $checkSetValue = in_array('datetime',$evalList) ? time() : $checkSetValue;
01067 
01068                         $cOnClick = 'typo3form.fieldGet('.$paramsList.',1,\''.$checkSetValue.'\');'.implode('',$PA['fieldChangeFunc']);
01069                         $item.='<input type="checkbox"'.$this->insertDefStyle('check').' name="'.$PA['itemFormElName'].'_cb" onclick="'.htmlspecialchars($cOnClick).'" />';
01070                 }
01071 
01072                 $PA['fieldChangeFunc'] = array_merge(array('typo3form.fieldGet'=>'typo3form.fieldGet('.$paramsList.');'), $PA['fieldChangeFunc']);
01073                 $mLgd = ($config['max']?$config['max']:256);
01074                 $iOnChange = implode('',$PA['fieldChangeFunc']);
01075                 $item.='<input type="text" name="'.$PA['itemFormElName'].'_hr" value=""'.$this->formWidth($size).' maxlength="'.$mLgd.'" onchange="'.htmlspecialchars($iOnChange).'"'.$PA['onFocus'].' />';     // This is the EDITABLE form field.
01076                 $item.='<input type="hidden" name="'.$PA['itemFormElName'].'" value="'.htmlspecialchars($PA['itemFormElValue']).'" />';                 // This is the ACTUAL form field - values from the EDITABLE field must be transferred to this field which is the one that is written to the database.
01077                 $this->extJSCODE.='typo3form.fieldSet('.$paramsList.');';
01078 
01079                         // going through all custom evaluations configured for this field
01080                 foreach ($evalList as $evalData) {
01081                         if (substr($evalData, 0, 3) == 'tx_')   {
01082                                 $evalObj = t3lib_div::getUserObj($GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['tce']['formevals'][$evalData].':&'.$evalData);
01083                                 if(is_object($evalObj) && method_exists($evalObj, 'returnFieldJS'))     {
01084                                         $this->extJSCODE .= "\n\nfunction ".$evalData."(value) {\n".$evalObj->returnFieldJS()."\n}\n";
01085                                 }
01086                         }
01087                 }
01088 
01089                         // Creating an alternative item without the JavaScript handlers.
01090                 $altItem = '<input type="hidden" name="'.$PA['itemFormElName'].'_hr" value="" />';
01091                 $altItem.= '<input type="hidden" name="'.$PA['itemFormElName'].'" value="'.htmlspecialchars($PA['itemFormElValue']).'" />';
01092 
01093                         // Wrap a wizard around the item?
01094                 $item= $this->renderWizards(array($item,$altItem),$config['wizards'],$table,$row,$field,$PA,$PA['itemFormElName'].'_hr',$specConf);
01095 
01096                 return $item;
01097         }
01098 
01109         function getSingleField_typeText($table,$field,$row,&$PA)       {
01110 
01111                         // Init config:
01112                 $config = $PA['fieldConf']['config'];
01113 
01114                 if($this->renderReadonly || $config['readOnly'])  {
01115                         return $this->getSingleField_typeNone_render($config, $PA['itemFormElValue']);
01116                 }
01117 
01118                         // Setting columns number:
01119                 $cols = t3lib_div::intInRange($config['cols'] ? $config['cols'] : 30, 5, $this->maxTextareaWidth);
01120 
01121                         // Setting number of rows:
01122                 $origRows = $rows = t3lib_div::intInRange($config['rows'] ? $config['rows'] : 5, 1, 20);
01123                 if (strlen($PA['itemFormElValue']) > $this->charsPerRow*2)      {
01124                         $cols = $this->maxTextareaWidth;
01125                         $rows = t3lib_div::intInRange(round(strlen($PA['itemFormElValue'])/$this->charsPerRow), count(explode(chr(10),$PA['itemFormElValue'])), 20);
01126                         if ($rows<$origRows)    $rows = $origRows;
01127                 }
01128 
01129                         // Init RTE vars:
01130                 $RTEwasLoaded = 0;                              // Set true, if the RTE is loaded; If not a normal textarea is shown.
01131                 $RTEwouldHaveBeenLoaded = 0;    // Set true, if the RTE would have been loaded if it wasn't for the disable-RTE flag in the bottom of the page...
01132 
01133                         // "Extra" configuration; Returns configuration for the field based on settings found in the "types" fieldlist. Traditionally, this is where RTE configuration has been found.
01134                 $specConf = $this->getSpecConfFromString($PA['extra'], $PA['fieldConf']['defaultExtras']);
01135 
01136                         // Setting up the altItem form field, which is a hidden field containing the value
01137                 $altItem = '<input type="hidden" name="'.htmlspecialchars($PA['itemFormElName']).'" value="'.htmlspecialchars($PA['itemFormElValue']).'" />';
01138 
01139                         // If RTE is generally enabled (TYPO3_CONF_VARS and user settings)
01140                 if ($this->RTEenabled) {
01141                         $p = t3lib_BEfunc::getSpecConfParametersFromArray($specConf['rte_transform']['parameters']);
01142                         if (isset($specConf['richtext']) && (!$p['flag'] || !$row[$p['flag']])) {       // If the field is configured for RTE and if any flag-field is not set to disable it.
01143                                 t3lib_BEfunc::fixVersioningPid($table,$row);
01144                                 list($tscPID,$thePidValue) = $this->getTSCpid($table,$row['uid'],$row['pid']);
01145 
01146                                         // If the pid-value is not negative (that is, a pid could NOT be fetched)
01147                                 if ($thePidValue >= 0)  {
01148                                         $RTEsetup = $GLOBALS['BE_USER']->getTSConfig('RTE',t3lib_BEfunc::getPagesTSconfig($tscPID));
01149                                         $RTEtypeVal = t3lib_BEfunc::getTCAtypeValue($table,$row);
01150                                         $thisConfig = t3lib_BEfunc::RTEsetup($RTEsetup['properties'],$table,$field,$RTEtypeVal);
01151 
01152                                         if (!$thisConfig['disabled'])   {
01153                                                 if (!$this->disableRTE) {
01154                                                         $this->RTEcounter++;
01155 
01156                                                                 // Find alternative relative path for RTE images/links:
01157                                                         $eFile = t3lib_parsehtml_proc::evalWriteFile($specConf['static_write'], $row);
01158                                                         $RTErelPath = is_array($eFile) ? dirname($eFile['relEditFile']) : '';
01159 
01160                                                                 // Get RTE object, draw form and set flag:
01161                                                         $RTEobj = &t3lib_BEfunc::RTEgetObj();
01162                                                         $item = $RTEobj->drawRTE($this,$table,$field,$row,$PA,$specConf,$thisConfig,$RTEtypeVal,$RTErelPath,$thePidValue);
01163 
01164                                                                 // Wizard:
01165                                                         $item = $this->renderWizards(array($item,$altItem),$config['wizards'],$table,$row,$field,$PA,$PA['itemFormElName'],$specConf,1);
01166 
01167                                                         $RTEwasLoaded = 1;
01168                                                 } else {
01169                                                         $RTEwouldHaveBeenLoaded = 1;
01170                                                         $this->commentMessages[] = $PA['itemFormElName'].': RTE is disabled by the on-page RTE-flag (probably you can enable it by the check-box in the bottom of this page!)';
01171                                                 }
01172                                         } else $this->commentMessages[] = $PA['itemFormElName'].': RTE is disabled by the Page TSconfig, "RTE"-key (eg. by RTE.default.disabled=0 or such)';
01173                                 } else $this->commentMessages[] = $PA['itemFormElName'].': PID value could NOT be fetched. Rare error, normally with new records.';
01174                         } else {
01175                                 if (!isset($specConf['richtext']))      $this->commentMessages[] = $PA['itemFormElName'].': RTE was not configured for this field in TCA-types';
01176                                 if (!(!$p['flag'] || !$row[$p['flag']]))         $this->commentMessages[] = $PA['itemFormElName'].': Field-flag ('.$PA['flag'].') has been set to disable RTE!';
01177                         }
01178                 }
01179 
01180                         // Display ordinary field if RTE was not loaded.
01181                 if (!$RTEwasLoaded) {
01182                         if ($specConf['rte_only'])      {       // Show message, if no RTE (field can only be edited with RTE!)
01183                                 $item = '<p><em>'.htmlspecialchars($this->getLL('l_noRTEfound')).'</em></p>';
01184                         } else {
01185                                 if ($specConf['nowrap'])        {
01186                                         $wrap = 'off';
01187                                 } else {
01188                                         $wrap = ($config['wrap'] ? $config['wrap'] : 'virtual');
01189                                 }
01190 
01191                                 $classes = array();
01192                                 if ($specConf['fixed-font'])    { $classes[] = 'fixed-font'; }
01193                                 if ($specConf['enable-tab'])    { $classes[] = 'enable-tab'; }
01194 
01195                                 $formWidthText = $this->formWidthText($cols,$wrap);
01196 
01197                                         // Extract class attributes from $formWidthText (otherwise it would be added twice to the output)
01198                                 if (preg_match('/ class="(.+?)"/',$formWidthText,$res)) {
01199                                         $formWidthText = str_replace(' class="'.$res[1].'"','',$formWidthText);
01200                                         $classes = array_merge($classes, explode(' ',$res[1]));
01201                                 }
01202 
01203                                 if (count($classes))    {
01204                                         $class = ' class="'.implode(' ',$classes).'"';
01205                                 } else $class='';
01206 
01207                                 $iOnChange = implode('',$PA['fieldChangeFunc']);
01208                                 $item.= '
01209                                                         <textarea name="'.$PA['itemFormElName'].'"'.$formWidthText.$class.' rows="'.$rows.'" wrap="'.$wrap.'" onchange="'.htmlspecialchars($iOnChange).'"'.$PA['onFocus'].'>'.
01210                                                         t3lib_div::formatForTextarea($PA['itemFormElValue']).
01211                                                         '</textarea>';
01212                                 $item = $this->renderWizards(array($item,$altItem),$config['wizards'],$table,$row,$field,$PA,$PA['itemFormElName'],$specConf,$RTEwouldHaveBeenLoaded);
01213                         }
01214                 }
01215 
01216                         // Return field HTML:
01217                 return $item;
01218         }
01219 
01230         function getSingleField_typeCheck($table,$field,$row,&$PA)      {
01231                 $config = $PA['fieldConf']['config'];
01232 
01233                 $disabled = '';
01234                 if($this->renderReadonly || $config['readOnly'])  {
01235                         $disabled = ' disabled="disabled"';
01236                 }
01237 
01238                         // Traversing the array of items:
01239                 $selItems = $this->initItemArray($PA['fieldConf']);
01240                 if ($config['itemsProcFunc']) $selItems = $this->procItems($selItems,$PA['fieldTSConfig']['itemsProcFunc.'],$config,$table,$row,$field);
01241 
01242                 if (!count($selItems))  {
01243                         $selItems[]=array('','');
01244                 }
01245                 $thisValue = intval($PA['itemFormElValue']);
01246 
01247                 $cols = intval($config['cols']);
01248                 if ($cols > 1)  {
01249                         $item.= '<table border="0" cellspacing="0" cellpadding="0" class="typo3-TCEforms-checkboxArray">';
01250                         for ($c=0;$c<count($selItems);$c++) {
01251                                 $p = $selItems[$c];
01252                                 if(!($c%$cols)) { $item.='<tr>'; }
01253                                 $cBP = $this->checkBoxParams($PA['itemFormElName'],$thisValue,$c,count($selItems),implode('',$PA['fieldChangeFunc']));
01254                                 $cBName = $PA['itemFormElName'].'_'.$c;
01255                                 $cBID = $PA['itemFormElID'].'_'.$c;
01256                                 $item.= '<td nowrap="nowrap">'.
01257                                                 '<input type="checkbox"'.$this->insertDefStyle('check').' value="1" name="'.$cBName.'"'.$cBP.$disabled.' id="'.$cBID.'" />'.
01258                                                 $this->wrapLabels('<label for="'.$cBID.'">'.htmlspecialchars($p[0]).'</label>&nbsp;').
01259                                                 '</td>';
01260                                 if(($c%$cols)+1==$cols) {$item.='</tr>';}
01261                         }
01262                         if ($c%$cols)   {
01263                                 $rest=$cols-($c%$cols);
01264                                 for ($c=0;$c<$rest;$c++) {
01265                                         $item.= '<td></td>';
01266                                 }
01267                                 if ($c>0)       { $item.= '</tr>'; }
01268                         }
01269                         $item.= '</table>';
01270                 } else {
01271                         for ($c=0;$c<count($selItems);$c++) {
01272                                 $p = $selItems[$c];
01273                                 $cBP = $this->checkBoxParams($PA['itemFormElName'],$thisValue,$c,count($selItems),implode('',$PA['fieldChangeFunc']));
01274                                 $cBName = $PA['itemFormElName'].'_'.$c;
01275                                 $cBID = $PA['itemFormElID'].'_'.$c;
01276                                 $item.= ($c>0?'<br />':'').
01277                                                 '<input type="checkbox"'.$this->insertDefStyle('check').' value="1" name="'.$cBName.'"'.$cBP.$PA['onFocus'].$disabled.' id="'.$cBID.'" />'.
01278                                                 htmlspecialchars($p[0]);
01279                         }
01280                 }
01281                 if (!$disabled) {
01282                         $item.= '<input type="hidden" name="'.$PA['itemFormElName'].'" value="'.htmlspecialchars($thisValue).'" />';
01283                 }
01284 
01285                 return $item;
01286         }
01287 
01298         function getSingleField_typeRadio($table,$field,$row,&$PA)      {
01299                 $config = $PA['fieldConf']['config'];
01300 
01301                 $disabled = '';
01302                 if($this->renderReadonly || $config['readOnly'])  {
01303                         $disabled = ' disabled="disabled"';
01304                 }
01305 
01306                         // Get items for the array:
01307                 $selItems = $this->initItemArray($PA['fieldConf']);
01308                 if ($config['itemsProcFunc']) $selItems = $this->procItems($selItems,$PA['fieldTSConfig']['itemsProcFunc.'],$config,$table,$row,$field);
01309 
01310                         // Traverse the items, making the form elements:
01311                 for ($c=0;$c<count($selItems);$c++) {
01312                         $p = $selItems[$c];
01313                         $rID = $PA['itemFormElID'].'_'.$c;
01314                         $rOnClick = implode('',$PA['fieldChangeFunc']);
01315                         $rChecked = (!strcmp($p[1],$PA['itemFormElValue'])?' checked="checked"':'');
01316                         $item.= '<input type="radio"'.$this->insertDefStyle('radio').' name="'.$PA['itemFormElName'].'" value="'.htmlspecialchars($p[1]).'" onclick="'.htmlspecialchars($rOnClick).'"'.$rChecked.$PA['onFocus'].$disabled.' id="'.$rID.'" />
01317                                         <label for="'.$rID.'">'.htmlspecialchars($p[0]).'</label>
01318                                         <br />';
01319                 }
01320 
01321                 return $item;
01322         }
01323 
01334         function getSingleField_typeSelect($table,$field,$row,&$PA)     {
01335                 global $TCA;
01336 
01337                         // Field configuration from TCA:
01338                 $config = $PA['fieldConf']['config'];
01339 
01340                 $disabled = '';
01341                 if($this->renderReadonly || $config['readOnly'])  {
01342                         $disabled = ' disabled="disabled"';
01343                 }
01344 
01345                         // "Extra" configuration; Returns configuration for the field based on settings found in the "types" fieldlist. See http://typo3.org/documentation/document-library/doc_core_api/Wizards_Configuratio/.
01346                 $specConf = $this->getSpecConfFromString($PA['extra'], $PA['fieldConf']['defaultExtras']);
01347 
01348                         // Getting the selector box items from the system
01349                 $selItems = $this->addSelectOptionsToItemArray($this->initItemArray($PA['fieldConf']),$PA['fieldConf'],$this->setTSconfig($table,$row),$field);
01350                 $selItems = $this->addItems($selItems,$PA['fieldTSConfig']['addItems.']);
01351                 if ($config['itemsProcFunc']) $selItems = $this->procItems($selItems,$PA['fieldTSConfig']['itemsProcFunc.'],$config,$table,$row,$field);
01352 
01353                         // Possibly remove some items:
01354                 $removeItems = t3lib_div::trimExplode(',',$PA['fieldTSConfig']['removeItems'],1);
01355                 foreach($selItems as $tk => $p) {
01356 
01357                                 // Checking languages and authMode:
01358                         $languageDeny = $TCA[$table]['ctrl']['languageField'] && !strcmp($TCA[$table]['ctrl']['languageField'], $field) && !$GLOBALS['BE_USER']->checkLanguageAccess($p[1]);
01359                         $authModeDeny = $config['form_type']=='select' && $config['authMode'] && !$GLOBALS['BE_USER']->checkAuthMode($table,$field,$p[1],$config['authMode']);
01360                         if (in_array($p[1],$removeItems) || $languageDeny || $authModeDeny)     {
01361                                 unset($selItems[$tk]);
01362                         } elseif (isset($PA['fieldTSConfig']['altLabels.'][$p[1]])) {
01363                                 $selItems[$tk][0]=$this->sL($PA['fieldTSConfig']['altLabels.'][$p[1]]);
01364                         }
01365 
01366                                 // Removing doktypes with no access:
01367                         if ($table.'.'.$field == 'pages.doktype')       {
01368                                 if (!($GLOBALS['BE_USER']->isAdmin() || t3lib_div::inList($GLOBALS['BE_USER']->groupData['pagetypes_select'],$p[1])))   {
01369                                         unset($selItems[$tk]);
01370                                 }
01371                         }
01372                 }
01373 
01374                         // Creating the label for the "No Matching Value" entry.
01375                 $nMV_label = isset($PA['fieldTSConfig']['noMatchingValue_label']) ? $this->sL($PA['fieldTSConfig']['noMatchingValue_label']) : '[ '.$this->getLL('l_noMatchingValue').' ]';
01376 
01377                         // Prepare some values:
01378                 $maxitems = intval($config['maxitems']);
01379 
01380                         // If a SINGLE selector box...
01381                 if ($maxitems<=1)       {
01382                         $item = $this->getSingleField_typeSelect_single($table,$field,$row,$PA,$config,$selItems,$nMV_label);
01383                 } elseif (!strcmp($config['renderMode'],'checkbox'))    {       // Checkbox renderMode
01384                         $item = $this->getSingleField_typeSelect_checkbox($table,$field,$row,$PA,$config,$selItems,$nMV_label);
01385                 } elseif (!strcmp($config['renderMode'],'singlebox'))   {       // Single selector box renderMode
01386                         $item = $this->getSingleField_typeSelect_singlebox($table,$field,$row,$PA,$config,$selItems,$nMV_label);
01387                 } else {        // Traditional multiple selector box:
01388                         $item = $this->getSingleField_typeSelect_multiple($table,$field,$row,$PA,$config,$selItems,$nMV_label);
01389                 }
01390 
01391                         // Wizards:
01392                 if (!$disabled) {
01393                         $altItem = '<input type="hidden" name="'.$PA['itemFormElName'].'" value="'.htmlspecialchars($PA['itemFormElValue']).'" />';
01394                         $item = $this->renderWizards(array($item,$altItem),$config['wizards'],$table,$row,$field,$PA,$PA['itemFormElName'],$specConf);
01395                 }
01396 
01397                 return $item;
01398         }
01399 
01414         function getSingleField_typeSelect_single($table,$field,$row,&$PA,$config,$selItems,$nMV_label) {
01415                         // check against inline uniqueness
01416                 $inlineParent = $this->inline->getStructureLevel(-1);
01417                 if(is_array($inlineParent) && $inlineParent['uid']) {
01418                         if ($inlineParent['config']['foreign_table'] == $table && $inlineParent['config']['foreign_unique'] == $field) {
01419                                 $uniqueIds = $this->inline->inlineData['unique'][$this->inline->inlineNames['object'].'['.$table.']']['used'];
01420                                 $PA['fieldChangeFunc']['inlineUnique'] = "inline.updateUnique(this,'".$this->inline->inlineNames['object'].'['.$table."]','".$this->inline->inlineNames['form']."','".$row['uid']."');";
01421                         }
01422                                 // hide uid of parent record for symmetric relations
01423                         if ($inlineParent['config']['foreign_table'] == $table && ($inlineParent['config']['foreign_field'] == $field || $inlineParent['config']['symmetric_field'] == $field)) {
01424                                 $uniqueIds[] = $inlineParent['uid'];
01425                         }
01426                 }
01427 
01428                         // Initialization:
01429                 $c = 0;
01430                 $sI = 0;
01431                 $noMatchingValue = 1;
01432                 $opt = array();
01433                 $selicons = array();
01434                 $onlySelectedIconShown = 0;
01435                 $size = intval($config['size']);
01436 
01437                 $disabled = '';
01438                 if($this->renderReadonly || $config['readOnly'])  {
01439                         $disabled = ' disabled="disabled"';
01440                         $onlySelectedIconShown = 1;
01441                 }
01442 
01443                         // Icon configuration:
01444                 if ($config['suppress_icons']=='IF_VALUE_FALSE')        {
01445                         $suppressIcons = !$PA['itemFormElValue'] ? 1 : 0;
01446                 } elseif ($config['suppress_icons']=='ONLY_SELECTED')   {
01447                         $suppressIcons=0;
01448                         $onlySelectedIconShown=1;
01449                 } elseif ($config['suppress_icons'])    {
01450                         $suppressIcons = 1;
01451                 } else $suppressIcons = 0;
01452 
01453                         // Traverse the Array of selector box items:
01454                 foreach($selItems as $p)        {
01455                         $sM = (!strcmp($PA['itemFormElValue'],$p[1])?' selected="selected"':'');
01456                         if ($sM)        {
01457                                 $sI = $c;
01458                                 $noMatchingValue = 0;
01459                         }
01460 
01461                                 // Getting style attribute value (for icons):
01462                         if ($config['iconsInOptionTags'])       {
01463                                 $styleAttrValue = $this->optionTagStyle($p[2]);
01464                         }
01465 
01466                                 // Compiling the <option> tag:
01467                         if (!($p[1] != $PA['itemFormElValue'] && is_array($uniqueIds) && in_array($p[1], $uniqueIds))) {
01468                                 $opt[]= '<option value="'.htmlspecialchars($p[1]).'"'.
01469                                                         $sM.
01470                                                         ($styleAttrValue ? ' style="'.htmlspecialchars($styleAttrValue).'"' : '').
01471                                                         (!strcmp($p[1],'--div--') ? ' class="c-divider"' : '').
01472                                                         '>'.t3lib_div::deHSCentities(htmlspecialchars($p[0])).'</option>';
01473                         }
01474 
01475                                 // If there is an icon for the selector box (rendered in table under)...:
01476                         if ($p[2] && !$suppressIcons && (!$onlySelectedIconShown || $sM))       {
01477                                 list($selIconFile,$selIconInfo)=$this->getIcon($p[2]);
01478                                 $iOnClick = $this->elName($PA['itemFormElName']).'.selectedIndex='.$c.'; '.implode('',$PA['fieldChangeFunc']).$this->blur().'return false;';
01479                                 $selicons[]=array(
01480                                         (!$onlySelectedIconShown ? '<a href="#" onclick="'.htmlspecialchars($iOnClick).'">' : '').
01481                                         '<img src="'.$selIconFile.'" '.$selIconInfo[3].' vspace="2" border="0" title="'.htmlspecialchars($p[0]).'" alt="'.htmlspecialchars($p[0]).'" />'.
01482                                         (!$onlySelectedIconShown ? '</a>' : ''),
01483                                         $c,$sM);
01484                         }
01485                         $c++;
01486                 }
01487 
01488                         // No-matching-value:
01489                 if ($PA['itemFormElValue'] && $noMatchingValue && !$PA['fieldTSConfig']['disableNoMatchingValueElement'] && !$config['disableNoMatchingValueElement'])  {
01490                         $nMV_label = @sprintf($nMV_label, $PA['itemFormElValue']);
01491                         $opt[]= '<option value="'.htmlspecialchars($PA['itemFormElValue']).'" selected="selected">'.htmlspecialchars($nMV_label).'</option>';
01492                 }
01493 
01494                         // Create item form fields:
01495                 $sOnChange = 'if (this.options[this.selectedIndex].value==\'--div--\') {this.selectedIndex='.$sI.';} '.implode('',$PA['fieldChangeFunc']);
01496                 if(!$disabled) {
01497                         $item.= '<input type="hidden" name="'.$PA['itemFormElName'].'_selIconVal" value="'.htmlspecialchars($sI).'" />';        // MUST be inserted before the selector - else is the value of the hiddenfield here mysteriously submitted...
01498                 }
01499                 $item.= '<select name="'.$PA['itemFormElName'].'"'.
01500                                         $this->insertDefStyle('select').
01501                                         ($size?' size="'.$size.'"':'').
01502                                         ' onchange="'.htmlspecialchars($sOnChange).'"'.
01503                                         $PA['onFocus'].$disabled.'>';
01504                 $item.= implode('',$opt);
01505                 $item.= '</select>';
01506 
01507                         // Create icon table:
01508                 if (count($selicons))   {
01509                         $item.='<table border="0" cellpadding="0" cellspacing="0" class="typo3-TCEforms-selectIcons">';
01510                         $selicon_cols = intval($config['selicon_cols']);
01511                         if (!$selicon_cols)     $selicon_cols=count($selicons);
01512                         $sR = ceil(count($selicons)/$selicon_cols);
01513                         $selicons = array_pad($selicons,$sR*$selicon_cols,'');
01514                         for($sa=0;$sa<$sR;$sa++)        {
01515                                 $item.='<tr>';
01516                                 for($sb=0;$sb<$selicon_cols;$sb++)      {
01517                                         $sk=($sa*$selicon_cols+$sb);
01518                                         $imgN = 'selIcon_'.$table.'_'.$row['uid'].'_'.$field.'_'.$selicons[$sk][1];
01519                                         $imgS = ($selicons[$sk][2]?$this->backPath.'gfx/content_selected.gif':'clear.gif');
01520                                         $item.='<td><img name="'.htmlspecialchars($imgN).'" src="'.$imgS.'" width="7" height="10" alt="" /></td>';
01521                                         $item.='<td>'.$selicons[$sk][0].'</td>';
01522                                 }
01523                                 $item.='</tr>';
01524                         }
01525                         $item.='</table>';
01526                 }
01527 
01528                 return $item;
01529         }
01530 
01545         function getSingleField_typeSelect_checkbox($table,$field,$row,&$PA,$config,$selItems,$nMV_label)       {
01546 
01547                         // Get values in an array (and make unique, which is fine because there can be no duplicates anyway):
01548                 $itemArray = array_flip($this->extractValuesOnlyFromValueLabelList($PA['itemFormElValue']));
01549 
01550                 $disabled = '';
01551                 if($this->renderReadonly || $config['readOnly'])  {
01552                         $disabled = ' disabled="disabled"';
01553                 }
01554 
01555                         // Traverse the Array of selector box items:
01556                 $tRows = array();
01557                 $c=0;
01558                 if (!$disabled) {
01559                         $sOnChange = implode('',$PA['fieldChangeFunc']);
01560                         $setAll = array();      // Used to accumulate the JS needed to restore the original selection.
01561                         foreach($selItems as $p)        {
01562                                         // Non-selectable element:
01563                                 if (!strcmp($p[1],'--div--'))   {
01564                                         if (count($setAll))     {
01565                                                         $tRows[] = '
01566                                                                 <tr>
01567                                                                         <td colspan="2">'.
01568                                                                         '<a href="#" onclick="'.htmlspecialchars(implode('',$setAll).' return false;').'">'.
01569                                                                         htmlspecialchars($this->getLL('l_setAllCheckboxes')).
01570                                                                         '</a></td>
01571                                                                 </tr>';
01572                                                         $setAll = array();
01573                                         }
01574 
01575                                         $tRows[] = '
01576                                                 <tr class="c-header">
01577                                                         <td colspan="2">'.htmlspecialchars($p[0]).'</td>
01578                                                 </tr>';
01579                                 } else {
01580                                                 // Selected or not by default:
01581                                         $sM = '';
01582                                         if (isset($itemArray[$p[1]]))   {
01583                                                 $sM = ' checked="checked"';
01584                                                 unset($itemArray[$p[1]]);
01585                                         }
01586 
01587                                                 // Icon:
01588                                         $selIconFile = '';
01589                                         if ($p[2])      {
01590                                                 list($selIconFile,$selIconInfo) = $this->getIcon($p[2]);
01591                                         }
01592 
01593                                                 // Compile row:
01594                                         $onClickCell = $this->elName($PA['itemFormElName'].'['.$c.']').'.checked=!'.$this->elName($PA['itemFormElName'].'['.$c.']').'.checked;';
01595                                         $onClick = 'this.attributes.getNamedItem("class").nodeValue = '.$this->elName($PA['itemFormElName'].'['.$c.']').'.checked ? "c-selectedItem" : "";';
01596                                         $setAll[] = $this->elName($PA['itemFormElName'].'['.$c.']').'.checked=1;';
01597                                         $tRows[] = '
01598                                                 <tr class="'.($sM ? 'c-selectedItem' : '').'" onclick="'.htmlspecialchars($onClick).'" style="cursor: pointer;">
01599                                                         <td><input type="checkbox"'.$this->insertDefStyle('check').' name="'.htmlspecialchars($PA['itemFormElName'].'['.$c.']').'" value="'.htmlspecialchars($p[1]).'"'.$sM.' onclick="'.htmlspecialchars($sOnChange).'"'.$PA['onFocus'].' /></td>
01600                                                         <td class="c-labelCell" onclick="'.htmlspecialchars($onClickCell).'">'.
01601                                                                 ($selIconFile ? '<img src="'.$selIconFile.'" '.$selIconInfo[3].' vspace="2" border="0" class="absmiddle" style="margin-right: 4px;" alt="" />' : '').
01602                                                                 t3lib_div::deHSCentities(htmlspecialchars($p[0])).
01603                                                                 (strcmp($p[3],'') ? '<br/><p class="c-descr">'.nl2br(trim(htmlspecialchars($p[3]))).'</p>' : '').
01604                                                                 '</td>
01605                                                 </tr>';
01606                                         $c++;
01607                                 }
01608                         }
01609 
01610                                 // Remaining checkboxes will get their set-all link:
01611                         if (count($setAll))     {
01612                                         $tRows[] = '
01613                                                 <tr>
01614                                                         <td colspan="2">'.
01615                                                         '<a href="#" onclick="'.htmlspecialchars(implode('',$setAll).' return false;').'">'.
01616                                                         htmlspecialchars($this->getLL('l_setAllCheckboxes')).
01617                                                         '</a></td>
01618                                                 </tr>';
01619                         }
01620                 }
01621 
01622                         // Remaining values (invalid):
01623                 if (count($itemArray) && !$PA['fieldTSConfig']['disableNoMatchingValueElement'] && !$config['disableNoMatchingValueElement'])   {
01624                         foreach($itemArray as $theNoMatchValue => $temp)        {
01625                                         // Compile <checkboxes> tag:
01626                                 array_unshift($tRows,'
01627                                                 <tr class="c-invalidItem">
01628                                                         <td><input type="checkbox"'.$this->insertDefStyle('check').' name="'.htmlspecialchars($PA['itemFormElName'].'['.$c.']').'" value="'.htmlspecialchars($theNoMatchValue).'" checked="checked" onclick="'.htmlspecialchars($sOnChange).'"'.$PA['onFocus'].$disabled.' /></td>
01629                                                         <td class="c-labelCell">'.
01630                                                                 t3lib_div::deHSCentities(htmlspecialchars(@sprintf($nMV_label, $theNoMatchValue))).
01631                                                                 '</td>
01632                                                 </tr>');
01633                                 $c++;
01634                         }
01635                 }
01636 
01637                         // Add an empty hidden field which will send a blank value if all items are unselected.
01638                 $item.='<input type="hidden" name="'.htmlspecialchars($PA['itemFormElName']).'" value="" />';
01639 
01640                         // Implode rows in table:
01641                 $item.= '
01642                         <table border="0" cellpadding="0" cellspacing="0" class="typo3-TCEforms-select-checkbox">'.
01643                                 implode('',$tRows).'
01644                         </table>
01645                         ';
01646 
01647                 return $item;
01648         }
01649 
01664         function getSingleField_typeSelect_singlebox($table,$field,$row,&$PA,$config,$selItems,$nMV_label)      {
01665 
01666                         // Get values in an array (and make unique, which is fine because there can be no duplicates anyway):
01667                 $itemArray = array_flip($this->extractValuesOnlyFromValueLabelList($PA['itemFormElValue']));
01668 
01669                 $disabled = '';
01670                 if($this->renderReadonly || $config['readOnly'])  {
01671                         $disabled = ' disabled="disabled"';
01672                 }
01673 
01674                         // Traverse the Array of selector box items:
01675                 $opt = array();
01676                 $restoreCmd = array();  // Used to accumulate the JS needed to restore the original selection.
01677                 $c = 0;
01678                 foreach($selItems as $p)        {
01679                                 // Selected or not by default:
01680                         $sM = '';
01681                         if (isset($itemArray[$p[1]]))   {
01682                                 $sM = ' selected="selected"';
01683                                 $restoreCmd[] = $this->elName($PA['itemFormElName'].'[]').'.options['.$c.'].selected=1;';
01684                                 unset($itemArray[$p[1]]);
01685                         }
01686 
01687                                 // Non-selectable element:
01688                         $nonSel = '';
01689                         if (!strcmp($p[1],'--div--'))   {
01690                                 $nonSel = ' onclick="this.selected=0;" class="c-divider"';
01691                         }
01692 
01693                                 // Icon style for option tag:
01694                         if ($config['iconsInOptionTags']) {
01695                                 $styleAttrValue = $this->optionTagStyle($p[2]);
01696                         }
01697 
01698                                 // Compile <option> tag:
01699                         $opt[] = '<option value="'.htmlspecialchars($p[1]).'"'.
01700                                                 $sM.
01701                                                 $nonSel.
01702                                                 ($styleAttrValue ? ' style="'.htmlspecialchars($styleAttrValue).'"' : '').
01703                                                 '>'.t3lib_div::deHSCentities(htmlspecialchars($p[0])).'</option>';
01704                         $c++;
01705                 }
01706 
01707                         // Remaining values:
01708                 if (count($itemArray) && !$PA['fieldTSConfig']['disableNoMatchingValueElement'] && !$config['disableNoMatchingValueElement'])   {
01709                         foreach($itemArray as $theNoMatchValue => $temp)        {
01710                                         // Compile <option> tag:
01711                                 array_unshift($opt,'<option value="'.htmlspecialchars($theNoMatchValue).'" selected="selected">'.t3lib_div::deHSCentities(htmlspecialchars(@sprintf($nMV_label, $theNoMatchValue))).'</option>');
01712                         }
01713                 }
01714 
01715                         // Compile selector box:
01716                 $sOnChange = implode('',$PA['fieldChangeFunc']);
01717                 $selector_itemListStyle = isset($config['itemListStyle']) ? ' style="'.htmlspecialchars($config['itemListStyle']).'"' : ' style="'.$this->defaultMultipleSelectorStyle.'"';
01718                 $size = intval($config['size']);
01719                 $size = $config['autoSizeMax'] ? t3lib_div::intInRange(count($selItems)+1,t3lib_div::intInRange($size,1),$config['autoSizeMax']) : $size;
01720                 $selectBox = '<select name="'.$PA['itemFormElName'].'[]"'.
01721                                                 $this->insertDefStyle('select').
01722                                                 ($size ? ' size="'.$size.'"' : '').
01723                                                 ' multiple="multiple" onchange="'.htmlspecialchars($sOnChange).'"'.
01724                                                 $PA['onFocus'].
01725                                                 $selector_itemListStyle.
01726                                                 $disabled.'>
01727                                                 '.
01728                                         implode('
01729                                                 ',$opt).'
01730                                         </select>';
01731 
01732                         // Add an empty hidden field which will send a blank value if all items are unselected.
01733                 if (!$disabled) {
01734                         $item.='<input type="hidden" name="'.htmlspecialchars($PA['itemFormElName']).'" value="" />';
01735                 }
01736 
01737                         // Put it all into a table:
01738                 $item.= '
01739                         <table border="0" cellspacing="0" cellpadding="0" width="1" class="typo3-TCEforms-select-singlebox">
01740                                 <tr>
01741                                         <td>
01742                                         '.$selectBox.'
01743                                         <br/>
01744                                         <em>'.
01745                                                 htmlspecialchars($this->getLL('l_holdDownCTRL')).
01746                                                 '</em>
01747                                         </td>
01748                                         <td valign="top">
01749                                         <a href="#" onclick="'.htmlspecialchars($this->elName($PA['itemFormElName'].'[]').'.selectedIndex=-1;'.implode('',$restoreCmd).' return false;').'">'.
01750                                                 '<img'.t3lib_iconWorks::skinImg($this->backPath,'gfx/history.gif','width="13" height="12"').' title="'.htmlspecialchars($this->getLL('l_revertSelection')).'" alt="" />'.
01751                                                 '</a>
01752                                         </td>
01753                                 </tr>
01754                         </table>
01755                                 ';
01756 
01757                 return $item;
01758         }
01759 
01774         function getSingleField_typeSelect_multiple($table,$field,$row,&$PA,$config,$selItems,$nMV_label)       {
01775 
01776                 $disabled = '';
01777                 if($this->renderReadonly || $config['readOnly'])  {
01778                         $disabled = ' disabled="disabled"';
01779                 }
01780 
01781                         // Setting this hidden field (as a flag that JavaScript can read out)
01782                 if (!$disabled) {
01783                         $item.= '<input type="hidden" name="'.$PA['itemFormElName'].'_mul" value="'.($config['multiple']?1:0).'" />';
01784                 }
01785 
01786                         // Set max and min items:
01787                 $maxitems = t3lib_div::intInRange($config['maxitems'],0);
01788                 if (!$maxitems) $maxitems=100000;
01789                 $minitems = t3lib_div::intInRange($config['minitems'],0);
01790 
01791                         // Register the required number of elements:
01792                 $this->requiredElements[$PA['itemFormElName']] = array($minitems,$maxitems,'imgName'=>$table.'_'.$row['uid'].'_'.$field);
01793 
01794                         // Get "removeItems":
01795                 $removeItems = t3lib_div::trimExplode(',',$PA['fieldTSConfig']['removeItems'],1);
01796 
01797                         // Perform modification of the selected items array:
01798                 $itemArray = t3lib_div::trimExplode(',',$PA['itemFormElValue'],1);
01799                 foreach($itemArray as $tk => $tv) {
01800                         $tvP = explode('|',$tv,2);
01801                         $evalValue = rawurldecode($tvP[0]);
01802                         $isRemoved = in_array($evalValue,$removeItems)  || ($config['form_type']=='select' && $config['authMode'] && !$GLOBALS['BE_USER']->checkAuthMode($table,$field,$evalValue,$config['authMode']));
01803                         if ($isRemoved && !$PA['fieldTSConfig']['disableNoMatchingValueElement'] && !$config['disableNoMatchingValueElement'])  {
01804                                 $tvP[1] = rawurlencode(@sprintf($nMV_label, $evalValue));
01805                         } elseif (isset($PA['fieldTSConfig']['altLabels.'][$evalValue])) {
01806                                 $tvP[1] = rawurlencode($this->sL($PA['fieldTSConfig']['altLabels.'][$evalValue]));
01807                         }
01808                         $itemArray[$tk] = implode('|',$tvP);
01809                 }
01810                 $itemsToSelect = '';
01811 
01812                 if(!$disabled) {
01813                                 // Create option tags:
01814                         $opt = array();
01815                         $styleAttrValue = '';
01816                         foreach($selItems as $p)        {
01817                                 if ($config['iconsInOptionTags'])       {
01818                                         $styleAttrValue = $this->optionTagStyle($p[2]);
01819                                 }
01820                                 $opt[]= '<option value="'.htmlspecialchars($p[1]).'"'.
01821                                                                 ($styleAttrValue ? ' style="'.htmlspecialchars($styleAttrValue).'"' : '').
01822                                                                 '>'.htmlspecialchars($p[0]).'</option>';
01823                         }
01824 
01825                                 // Put together the selector box:
01826                         $selector_itemListStyle = isset($config['itemListStyle']) ? ' style="'.htmlspecialchars($config['itemListStyle']).'"' : ' style="'.$this->defaultMultipleSelectorStyle.'"';
01827                         $size = intval($config['size']);
01828                         $size = $config['autoSizeMax'] ? t3lib_div::intInRange(count($itemArray)+1,t3lib_div::intInRange($size,1),$config['autoSizeMax']) : $size;
01829                         if ($config['exclusiveKeys'])   {
01830                                 $sOnChange = 'setFormValueFromBrowseWin(\''.$PA['itemFormElName'].'\',this.options[this.selectedIndex].value,this.options[this.selectedIndex].text,\''.$config['exclusiveKeys'].'\'); ';
01831                         } else {
01832                                 $sOnChange = 'setFormValueFromBrowseWin(\''.$PA['itemFormElName'].'\',this.options[this.selectedIndex].value,this.options[this.selectedIndex].text); ';
01833                         }
01834                         $sOnChange .= implode('',$PA['fieldChangeFunc']);
01835                         $itemsToSelect = '
01836                                 <select name="'.$PA['itemFormElName'].'_sel"'.
01837                                                         $this->insertDefStyle('select').
01838                                                         ($size ? ' size="'.$size.'"' : '').
01839                                                         ' onchange="'.htmlspecialchars($sOnChange).'"'.
01840                                                         $PA['onFocus'].
01841                                                         $selector_itemListStyle.'>
01842                                         '.implode('
01843                                         ',$opt).'
01844                                 </select>';
01845                 }
01846 
01847                         // Pass to "dbFileIcons" function:
01848                 $params = array(
01849                         'size' => $size,
01850                         'autoSizeMax' => t3lib_div::intInRange($config['autoSizeMax'],0),
01851                         'style' => isset($config['selectedListStyle']) ? ' style="'.htmlspecialchars($config['selectedListStyle']).'"' : ' style="'.$this->defaultMultipleSelectorStyle.'"',
01852                         'dontShowMoveIcons' => ($maxitems<=1),
01853                         'maxitems' => $maxitems,
01854                         'info' => '',
01855                         'headers' => array(
01856                                 'selector' => $this->getLL('l_selected').':<br />',
01857                                 'items' => $this->getLL('l_items').':<br />'
01858                         ),
01859                         'noBrowser' => 1,
01860                         'thumbnails' => $itemsToSelect,
01861                         'readOnly' => $disabled
01862                 );
01863                 $item.= $this->dbFileIcons($PA['itemFormElName'],'','',$itemArray,'',$params,$PA['onFocus']);
01864 
01865                 return $item;
01866         }
01867 
01878         function getSingleField_typeGroup($table,$field,$row,&$PA)      {
01879                         // Init:
01880                 $config = $PA['fieldConf']['config'];
01881                 $internal_type = $config['internal_type'];
01882                 $show_thumbs = $config['show_thumbs'];
01883                 $size = intval($config['size']);
01884                 $maxitems = t3lib_div::intInRange($config['maxitems'],0);
01885                 if (!$maxitems) $maxitems=100000;
01886                 $minitems = t3lib_div::intInRange($config['minitems'],0);
01887                 $allowed = $config['allowed'];
01888                 $disallowed = $config['disallowed'];
01889 
01890                 $disabled = '';
01891                 if($this->renderReadonly || $config['readOnly'])  {
01892                         $disabled = ' disabled="disabled"';
01893                 }
01894 
01895                 $item.= '<input type="hidden" name="'.$PA['itemFormElName'].'_mul" value="'.($config['multiple']?1:0).'"'.$disabled.' />';
01896                 $this->requiredElements[$PA['itemFormElName']] = array($minitems,$maxitems,'imgName'=>$table.'_'.$row['uid'].'_'.$field);
01897                 $info='';
01898 
01899                         // "Extra" configuration; Returns configuration for the field based on settings found in the "types" fieldlist. See http://typo3.org/documentation/document-library/doc_core_api/Wizards_Configuratio/.
01900                 $specConf = $this->getSpecConfFromString($PA['extra'], $PA['fieldConf']['defaultExtras']);
01901 
01902                         // Acting according to either "file" or "db" type:
01903                 switch((string)$config['internal_type'])        {
01904                         case 'file':    // If the element is of the internal type "file":
01905 
01906                                         // Creating string showing allowed types:
01907                                 $tempFT = t3lib_div::trimExplode(',',$allowed,1);
01908                                 if (!count($tempFT))    {$info.='*';}
01909                                 foreach($tempFT as $ext)        {
01910                                         if ($ext)       {
01911                                                 $info.=strtoupper($ext).' ';
01912                                         }
01913                                 }
01914                                         // Creating string, showing disallowed types:
01915                                 $tempFT_dis = t3lib_div::trimExplode(',',$disallowed,1);
01916                                 if (count($tempFT_dis)) {$info.='<br />';}
01917                                 foreach($tempFT_dis as $ext)    {
01918                                         if ($ext)       {
01919                                                 $info.='-'.strtoupper($ext).' ';
01920                                         }
01921                                 }
01922 
01923                                         // Making the array of file items:
01924                                 $itemArray = t3lib_div::trimExplode(',',$PA['itemFormElValue'],1);
01925 
01926                                         // Showing thumbnails:
01927                                 $thumbsnail = '';
01928                                 if ($show_thumbs)       {
01929                                         $imgs = array();
01930                                         foreach($itemArray as $imgRead) {
01931                                                 $imgP = explode('|',$imgRead);
01932                                                 $imgPath = rawurldecode($imgP[0]);
01933 
01934                                                 $rowCopy = array();
01935                                                 $rowCopy[$field] = $imgPath;
01936 
01937                                                         // Icon + clickmenu:
01938                                                 $absFilePath = t3lib_div::getFileAbsFileName($config['uploadfolder'].'/'.$imgPath);
01939 
01940                                                 $fI = pathinfo($imgPath);
01941                                                 $fileIcon = t3lib_BEfunc::getFileIcon(strtolower($fI['extension']));
01942                                                 $fileIcon = '<img'.t3lib_iconWorks::skinImg($this->backPath,'gfx/fileicons/'.$fileIcon,'width="18" height="16"').' class="absmiddle" title="'.htmlspecialchars($fI['basename'].($absFilePath && @is_file($absFilePath) ? ' ('.t3lib_div::formatSize(filesize($absFilePath)).'bytes)' : ' - FILE NOT FOUND!')).'" alt="" />';
01943 
01944                                                 $imgs[] = '<span class="nobr">'.t3lib_BEfunc::thumbCode($rowCopy,$table,$field,$this->backPath,'thumbs.php',$config['uploadfolder'],0,' align="middle"').
01945                                                                         ($absFilePath ? $this->getClickMenu($fileIcon, $absFilePath) : $fileIcon).
01946                                                                         $imgPath.
01947                                                                         '</span>';
01948                                         }
01949                                         $thumbsnail = implode('<br />',$imgs);
01950                                 }
01951 
01952                                         // Creating the element:
01953                                 $params = array(
01954                                         'size' => $size,
01955                                         'dontShowMoveIcons' => ($maxitems<=1),
01956                                         'autoSizeMax' => t3lib_div::intInRange($config['autoSizeMax'],0),
01957                                         'maxitems' => $maxitems,
01958                                         'style' => isset($config['selectedListStyle']) ? ' style="'.htmlspecialchars($config['selectedListStyle']).'"' : ' style="'.$this->defaultMultipleSelectorStyle.'"',
01959                                         'info' => $info,
01960                                         'thumbnails' => $thumbsnail,
01961                                         'readOnly' => $disabled
01962                                 );
01963                                 $item.= $this->dbFileIcons($PA['itemFormElName'],'file',implode(',',$tempFT),$itemArray,'',$params,$PA['onFocus']);
01964 
01965                                 if(!$disabled) {
01966                                                 // Adding the upload field:
01967                                         if ($this->edit_docModuleUpload)        $item.='<input type="file" name="'.$PA['itemFormElName_file'].'"'.$this->formWidth().' size="60" />';
01968                                 }
01969                         break;
01970                         case 'db':      // If the element is of the internal type "db":
01971 
01972                                         // Creating string showing allowed types:
01973                                 $tempFT = t3lib_div::trimExplode(',',$allowed,1);
01974                                 if (!strcmp(trim($tempFT[0]),'*'))      {
01975                                         $info.='<span class="nobr">&nbsp;&nbsp;&nbsp;&nbsp;'.
01976                                                         htmlspecialchars($this->getLL('l_allTables')).
01977                                                         '</span><br />';
01978                                 } else {
01979                                         while(list(,$theT)=each($tempFT))       {
01980                                                 if ($theT)      {
01981                                                         $info.='<span class="nobr">&nbsp;&nbsp;&nbsp;&nbsp;'.
01982                                                                         t3lib_iconWorks::getIconImage($theT,array(),$this->backPath,'align="top"').
01983                                                                         htmlspecialchars($this->sL($GLOBALS['TCA'][$theT]['ctrl']['title'])).
01984                                                                         '</span><br />';
01985                                                 }
01986                                         }
01987                                 }
01988 
01989                                 $perms_clause = $GLOBALS['BE_USER']->getPagePermsClause(1);
01990                                 $itemArray = array();
01991                                 $imgs = array();
01992 
01993                                         // Thumbnails:
01994                                 $temp_itemArray = t3lib_div::trimExplode(',',$PA['itemFormElValue'],1);
01995                                 foreach($temp_itemArray as $dbRead)     {
01996                                         $recordParts = explode('|',$dbRead);
01997                                         list($this_table,$this_uid) = t3lib_BEfunc::splitTable_Uid($recordParts[0]);
01998                                         $itemArray[] = array('table'=>$this_table, 'id'=>$this_uid);
01999                                         if (!$disabled && $show_thumbs) {
02000                                                 $rr = t3lib_BEfunc::getRecordWSOL($this_table,$this_uid);
02001                                                 $imgs[] = '<span class="nobr">'.
02002                                                                 $this->getClickMenu(t3lib_iconWorks::getIconImage($this_table,$rr,$this->backPath,'align="top" title="'.htmlspecialchars(t3lib_BEfunc::getRecordPath($rr['pid'],$perms_clause,15)).' [UID: '.$rr['uid'].']"'),$this_table, $this_uid).
02003                                                                 '&nbsp;'.
02004                                                                 t3lib_BEfunc::getRecordTitle($this_table,$rr,TRUE).' <span class="typo3-dimmed"><em>['.$rr['uid'].']</em></span>'.
02005                                                                 '</span>';
02006                                         }
02007                                 }
02008                                 $thumbsnail='';
02009                                 if (!$disabled && $show_thumbs) {
02010                                         $thumbsnail = implode('<br />',$imgs);
02011                                 }
02012 
02013                                         // Creating the element:
02014                                 $params = array(
02015                                         'size' => $size,
02016                                         'dontShowMoveIcons' => ($maxitems<=1),
02017                                         'autoSizeMax' => t3lib_div::intInRange($config['autoSizeMax'],0),
02018                                         'maxitems' => $maxitems,
02019                                         'style' => isset($config['selectedListStyle']) ? ' style="'.htmlspecialchars($config['selectedListStyle']).'"' : ' style="'.$this->defaultMultipleSelectorStyle.'"',
02020                                         'info' => $info,
02021                                         'thumbnails' => $thumbsnail,
02022                                         'readOnly' => $disabled
02023                                 );
02024                                 $item.= $this->dbFileIcons($PA['itemFormElName'],'db',implode(',',$tempFT),$itemArray,'',$params,$PA['onFocus'],$table,$field,$row['uid']);
02025 
02026                         break;
02027                 }
02028 
02029                         // Wizards:
02030                 $altItem = '<input type="hidden" name="'.$PA['itemFormElName'].'" value="'.htmlspecialchars($PA['itemFormElValue']).'" />';
02031                 if (!$disabled) {
02032                         $item = $this->renderWizards(array($item,$altItem),$config['wizards'],$table,$row,$field,$PA,$PA['itemFormElName'],$specConf);
02033                 }
02034 
02035                 return $item;
02036         }
02037 
02048         function getSingleField_typeNone($table,$field,$row,&$PA)       {
02049                         // Init:
02050                 $config = $PA['fieldConf']['config'];
02051                 $itemValue = $PA['itemFormElValue'];
02052 
02053                 return $this->getSingleField_typeNone_render($config,$itemValue);
02054         }
02055 
02064         function getSingleField_typeNone_render($config,$itemValue)     {
02065 
02066                                 // is colorScheme[0] the right value?
02067                 $divStyle = 'border:solid 1px '.t3lib_div::modifyHTMLColorAll($this->colorScheme[0],-30).';'.$this->defStyle.$this->formElStyle('none').' background-color: '.$this->colorScheme[0].'; padding-left:1px;color:#555;';
02068 
02069                 if ($config['format'])  {
02070                         $itemValue = $this->formatValue($config, $itemValue);
02071                 }
02072 
02073                 $rows = intval($config['rows']);
02074                 if ($rows > 1) {
02075                         if(!$config['pass_content']) {
02076                                 $itemValue = nl2br(htmlspecialchars($itemValue));
02077                         }
02078                                 // like textarea
02079                         $cols = t3lib_div::intInRange($config['cols'] ? $config['cols'] : 30, 5, $this->maxTextareaWidth);
02080                         if (!$config['fixedRows']) {
02081                                 $origRows = $rows = t3lib_div::intInRange($rows, 1, 20);
02082                                 if (strlen($itemValue)>$this->charsPerRow*2)    {
02083                                         $cols = $this->maxTextareaWidth;
02084                                         $rows = t3lib_div::intInRange(round(strlen($itemValue)/$this->charsPerRow),count(explode(chr(10),$itemValue)),20);
02085                                         if ($rows<$origRows)    $rows=$origRows;
02086                                 }
02087                         }
02088 
02089                         if ($this->docLarge)    $cols = round($cols*$this->form_largeComp);
02090                         $width = ceil($cols*$this->form_rowsToStylewidth);
02091                                 // hardcoded: 12 is the height of the font
02092                         $height=$rows*12;
02093 
02094                         $item='
02095                                 <div style="'.htmlspecialchars($divStyle.' overflow:auto; height:'.$height.'px; width:'.$width.'px;').'" class="'.htmlspecialchars($this->formElClass('none')).'">'.
02096                                 $itemValue.
02097                                 '</div>';
02098                 } else {
02099                         if(!$config['pass_content']) {
02100                                 $itemValue = htmlspecialchars($itemValue);
02101                         }
02102 
02103                         $cols = $config['cols']?$config['cols']:($config['size']?$config['size']:$this->maxInputWidth);
02104                         if ($this->docLarge)    $cols = round($cols*$this->form_largeComp);
02105                         $width = ceil($cols*$this->form_rowsToStylewidth);
02106 
02107                                 // overflow:auto crashes mozilla here. Title tag is usefull when text is longer than the div box (overflow:hidden).
02108                         $item = '
02109                                 <div style="'.htmlspecialchars($divStyle.' overflow:hidden; width:'.$width.'px;').'" class="'.htmlspecialchars($this->formElClass('none')).'" title="'.$itemValue.'">'.
02110                                 '<span class="nobr">'.(strcmp($itemValue,'')?$itemValue:'&nbsp;').'</span>'.
02111                                 '</div>';
02112                 }
02113 
02114                 return $item;
02115         }
02116 
02126         function getSingleField_typeFlex($table,$field,$row,&$PA)       {
02127 
02128                         // Data Structure:
02129                 $dataStructArray = t3lib_BEfunc::getFlexFormDS($PA['fieldConf']['config'],$row,$table);
02130 
02131                         // Get data structure:
02132                 if (is_array($dataStructArray)) {
02133 
02134                                 // Get data:
02135                         $xmlData = $PA['itemFormElValue'];
02136                         $xmlHeaderAttributes = t3lib_div::xmlGetHeaderAttribs($xmlData);
02137                         $storeInCharset = strtolower($xmlHeaderAttributes['encoding']);
02138                         if ($storeInCharset)    {
02139                                 $currentCharset=$GLOBALS['LANG']->charSet;
02140                                 $xmlData = $GLOBALS['LANG']->csConvObj->conv($xmlData,$storeInCharset,$currentCharset,1);
02141                         }
02142                         $editData=t3lib_div::xml2array($xmlData);
02143                         if (!is_array($editData))       {       // Must be XML parsing error...
02144                                 $editData=array();
02145                         } elseif (!isset($editData['meta']) || !is_array($editData['meta']))    {
02146                             $editData['meta'] = array();
02147                         }
02148 
02149                                 // Find the data structure if sheets are found:
02150                         $sheet = $editData['meta']['currentSheetId'] ? $editData['meta']['currentSheetId'] : 'sDEF';    // Sheet to display
02151 
02152                                 // Create sheet menu:
02153 //                      if (is_array($dataStructArray['sheets']))       {
02154 //                              #$item.=$this->getSingleField_typeFlex_sheetMenu($dataStructArray['sheets'], $PA['itemFormElName'].'[meta][currentSheetId]', $sheet).'<br />';
02155 //                      }
02156 
02157                                 // Create language menu:
02158                         $langChildren = $dataStructArray['meta']['langChildren'] ? 1 : 0;
02159                         $langDisabled = $dataStructArray['meta']['langDisable'] ? 1 : 0;
02160 
02161                         $editData['meta']['currentLangId']=array();
02162                         $languages = $this->getAvailableLanguages();
02163 
02164                         foreach($languages as $lInfo)   {
02165                                 if ($GLOBALS['BE_USER']->checkLanguageAccess($lInfo['uid']))    {
02166                                         $editData['meta']['currentLangId'][] =  $lInfo['ISOcode'];
02167                                 }
02168                         }
02169                         if (!is_array($editData['meta']['currentLangId']) || !count($editData['meta']['currentLangId']))        {
02170                                 $editData['meta']['currentLangId']=array('DEF');
02171                         }
02172 
02173                         $editData['meta']['currentLangId'] = array_unique($editData['meta']['currentLangId']);
02174 
02175 
02176 //                      if (!$langDisabled && count($languages) > 1)    {
02177 //                              $item.=$this->getSingleField_typeFlex_langMenu($languages, $PA['itemFormElName'].'[meta][currentLangId]', $editData['meta']['currentLangId']).'<br />';
02178 //                      }
02179 
02180                         $PA['_noEditDEF'] = FALSE;
02181                         if ($langChildren || $langDisabled)     {
02182                                 $rotateLang = array('DEF');
02183                         } else {
02184                                 if (!in_array('DEF',$editData['meta']['currentLangId']))        {
02185                                         array_unshift($editData['meta']['currentLangId'],'DEF');
02186                                         $PA['_noEditDEF'] = TRUE;
02187                                 }
02188                                 $rotateLang = $editData['meta']['currentLangId'];
02189                         }
02190 
02191                                 // Tabs sheets
02192                         if (is_array($dataStructArray['sheets']))       {
02193                                 $tabsToTraverse = array_keys($dataStructArray['sheets']);
02194                         } else {
02195                                 $tabsToTraverse = array($sheet);
02196                         }
02197 
02198                         foreach ($rotateLang as $lKey)  {
02199                                 if (!$langChildren && !$langDisabled)   {
02200                                         $item.= '<b>'.$this->getLanguageIcon($table,$row,'v'.$lKey).$lKey.':</b>';
02201                                 }
02202 
02203                                 $tabParts = array();
02204                                 foreach ($tabsToTraverse as $sheet)     {
02205                                         $sheetCfg = $dataStructArray['sheets'][$sheet];
02206                                         list ($dataStruct, $sheet) = t3lib_div::resolveSheetDefInDS($dataStructArray,$sheet);
02207 
02208                                                 // Render sheet:
02209                                         if (is_array($dataStruct['ROOT']) && is_array($dataStruct['ROOT']['el']))               {
02210                                                 $cmdData = t3lib_div::_GP('flexFormsCmdData');
02211                                                 $lang = 'l'.$lKey;      // Default language, other options are "lUK" or whatever country code (independant of system!!!)
02212                                                 $PA['_valLang'] = $langChildren && !$langDisabled ? $editData['meta']['currentLangId'] : 'DEF'; // Default language, other options are "lUK" or whatever country code (independant of system!!!)
02213                                                 $PA['_lang'] = $lang;
02214 
02215                                                         // Render flexform:
02216                                                 $tRows = $this->getSingleField_typeFlex_draw(
02217                                                                         $dataStruct['ROOT']['el'],
02218                                                                         $editData['data'][$sheet][$lang],
02219                                                                         $cmdData['data'][$sheet][$lang],
02220                                                                         $table,
02221                                                                         $field,
02222                                                                         $row,
02223                                                                         $PA,
02224                                                                         '[data]['.$sheet.']['.$lang.']'
02225                                                                 );
02226                                                 $sheetContent= '<table border="0" cellpadding="1" cellspacing="1" class="typo3-TCEforms-flexForm">'.implode('',$tRows).'</table>';
02227 
02228                         #                       $item = '<div style=" position:absolute;">'.$item.'</div>';
02229                                                 //visibility:hidden;
02230                                         } else $sheetContent='Data Structure ERROR: No ROOT element found for sheet "'.$sheet.'".';
02231 
02232                                                 // Add to tab:
02233                                         $tabParts[] = array(
02234                                                 'label' => ($sheetCfg['ROOT']['TCEforms']['sheetTitle'] ? $this->sL($sheetCfg['ROOT']['TCEforms']['sheetTitle']) : $sheet),
02235                                                 'description' => ($sheetCfg['ROOT']['TCEforms']['sheetDescription'] ? $this->sL($sheetCfg['ROOT']['TCEforms']['sheetDescription']) : ''),
02236                                                 'linkTitle' => ($sheetCfg['ROOT']['TCEforms']['sheetShortDescr'] ? $this->sL($sheetCfg['ROOT']['TCEforms']['sheetShortDescr']) : ''),
02237                                                 'content' => $sheetContent
02238                                         );
02239                                 }
02240 
02241                                 if (is_array($dataStructArray['sheets']))       {
02242                                         $item.= $this->getDynTabMenu($tabParts,'TCEFORMS:flexform:'.$PA['itemFormElName'].$PA['_lang']);
02243                                 } else {
02244                                         $item.= $sheetContent;
02245                                 }
02246                         }
02247                 } else $item='Data Structure ERROR: '.$dataStructArray;
02248 
02249                 return $item;
02250         }
02251 
02261         function getSingleField_typeFlex_langMenu($languages,$elName,$selectedLanguage,$multi=1)        {
02262                 $opt=array();
02263                 foreach($languages as $lArr)    {
02264                         $opt[]='<option value="'.htmlspecialchars($lArr['ISOcode']).'"'.(in_array($lArr['ISOcode'],$selectedLanguage)?' selected="selected"':'').'>'.htmlspecialchars($lArr['title']).'</option>';
02265                 }
02266 
02267                 $output = '<select name="'.$elName.'[]"'.($multi ? ' multiple="multiple" size="'.count($languages).'"' : '').'>'.implode('',$opt).'</select>';
02268 
02269                 return $output;
02270         }
02271 
02280         function getSingleField_typeFlex_sheetMenu($sArr,$elName,$sheetKey)     {
02281 
02282                 $tCells =array();
02283                 $pct = round(100/count($sArr));
02284                 foreach($sArr as $sKey => $sheetCfg)    {
02285                         if ($GLOBALS['BE_USER']->jsConfirmation(1))     {
02286                                 $onClick = 'if (confirm(TBE_EDITOR.labels.onChangeAlert) && TBE_EDITOR.checkSubmit(-1)){'.$this->elName($elName).".value='".$sKey."'; TBE_EDITOR.submitForm()};";
02287                         } else {
02288                                 $onClick = 'if(TBE_EDITOR.checkSubmit(-1)){ '.$this->elName($elName).".value='".$sKey."'; TBE_EDITOR.submitForm();}";
02289                         }
02290 
02291 
02292                         $tCells[]='<td width="'.$pct.'%" style="'.($sKey==$sheetKey ? 'background-color: #9999cc; font-weight: bold;' : 'background-color: #aaaaaa;').' cursor: hand;" onclick="'.htmlspecialchars($onClick).'" align="center">'.
02293                                         ($sheetCfg['ROOT']['TCEforms']['sheetTitle'] ? $this->sL($sheetCfg['ROOT']['TCEforms']['sheetTitle']) : $sKey).
02294                                         '</td>';
02295                 }
02296 
02297                 return '<table border="0" cellpadding="0" cellspacing="2" class="typo3-TCEforms-flexForm-sheetMenu"><tr>'.implode('',$tCells).'</tr></table>';
02298         }
02299 
02315         function getSingleField_typeFlex_draw($dataStruct,$editData,$cmdData,$table,$field,$row,&$PA,$formPrefix='',$level=0,$tRows=array())    {
02316 
02317                         // Data Structure array must be ... and array of course...
02318                 if (is_array($dataStruct))      {
02319                         foreach($dataStruct as $key => $value)  {
02320                                 if (is_array($value))   {       // The value of each entry must be an array.
02321 
02322                                                 // ********************
02323                                                 // Making the row:
02324                                                 // ********************
02325                                         $rowCells=array();
02326 
02327                                                 // Icon:
02328                                         $rowCells['title'] = '<img src="clear.gif" width="'.($level*16).'" height="1" alt="" /><strong>'.htmlspecialchars(t3lib_div::fixed_lgd_cs($this->sL($value['tx_templavoila']['title']),30)).'</strong>';;
02329 
02330                                         $rowCells['formEl']='';
02331                                         if ($value['type']=='array')    {
02332                                                 if ($value['section'])  {
02333                                                                 // Render "NEW [container]" selectorbox:
02334                                                         if (is_array($value['el']))     {
02335                                                                 $opt=array();
02336                                                                 $opt[]='<option value=""></option>';
02337                                                                 foreach($value['el'] as $kk => $vv)     {
02338                                                                         $opt[]='<option value="'.$kk.'">'.htmlspecialchars($this->getLL('l_new') . ' "'.$this->sL($value['el'][$kk]['tx_templavoila']['title']).'"').'</option>';
02339                                                                 }
02340                                                                 $rowCells['formEl']='<select name="flexFormsCmdData'.$formPrefix.'['.$key.'][value]">'.implode('',$opt).'</select>';
02341                                                         }
02342 
02343                                                                 // Put row together
02344                                                         $tRows[]='<tr class="bgColor2">
02345                                                                 <td nowrap="nowrap" valign="top">'.$rowCells['title'].'</td>
02346                                                                 <td>'.$rowCells['formEl'].'</td>
02347                                                         </tr>';
02348 
02349                                                         $cc=0;
02350                                                         if (is_array($editData[$key]['el']))    {
02351                                                                 foreach ($editData[$key]['el'] as $k3 => $v3)   {
02352                                                                         $cc=$k3;
02353                                                                         $theType = key($v3);
02354                                                                         $theDat = $v3[$theType];
02355                                                                         $newSectionEl = $value['el'][$theType];
02356                                                                         if (is_array($newSectionEl))    {
02357                                                                                 $tRows = $this->getSingleField_typeFlex_draw(
02358                                                                                         array($theType => $newSectionEl),
02359                                                                                         array($theType => $theDat),
02360                                                                                         $cmdData[$key]['el'][$cc],
02361                                                                                         $table,
02362                                                                                         $field,
02363                                                                                         $row,
02364                                                                                         $PA,
02365                                                                                         $formPrefix.'['.$key.'][el]['.$cc.']',
02366                                                                                         $level+1,
02367                                                                                         $tRows
02368                                                                                 );
02369                                                                         }
02370                                                                 }
02371                                                         }
02372 
02373 
02374 
02375                                                                 // New form?
02376                                                         if ($cmdData[$key]['value'])    {
02377                                                                 $newSectionEl = $value['el'][$cmdData[$key]['value']];
02378                                                                 if (is_array($newSectionEl))    {
02379                                                                         $tRows = $this->getSingleField_typeFlex_draw(
02380                                                                                 array($cmdData[$key]['value'] => $newSectionEl),
02381                                                                                 array(),
02382                                                                                 array(),
02383                                                                                 $table,
02384                                                                                 $field,
02385                                                                                 $row,
02386                                                                                 $PA,
02387                                                                                 $formPrefix.'['.$key.'][el]['.($cc+1).']',
02388                                                                                 $level+1,
02389                                                                                 $tRows
02390                                                                         );
02391                                                                 }
02392                                                         }
02393                                                 } else {
02394                                                         $idTagPrefix = uniqid('id',true); // ID attributes are used for the move and delete checkboxes for referencing to them in the label tag (<label for="the form field id">) that's rendered around the icons
02395 
02396                                                                 // Put row together
02397                                                         $tRows[]='<tr class="bgColor2">
02398                                                                 <td nowrap="nowrap" valign="top">'.
02399                                                                 '<input name="_DELETE_FLEX_FORM'.$PA['itemFormElName'].$formPrefix.'" id="'.$idTagPrefix.'-del" type="checkbox"'.$this->insertDefStyle('check').' value="1" /><label for="'.$idTagPrefix.'-del"><img src="'.$this->backPath.'gfx/garbage.gif" border="0" alt="" /></label>'.
02400                                                                 '<input name="_MOVEUP_FLEX_FORM'.$PA['itemFormElName'].$formPrefix.'" id="'.$idTagPrefix.'-mvup" type="checkbox"'.$this->insertDefStyle('check').' value="1" /><label for="'.$idTagPrefix.'-mvup"><img src="'.$this->backPath.'gfx/button_up.gif" border="0" alt="" /></label>'.
02401                                                                 '<input name="_MOVEDOWN_FLEX_FORM'.$PA['itemFormElName'].$formPrefix.'" id="'.$idTagPrefix.'-mvdown" type="checkbox"'.$this->insertDefStyle('check').' value="1" /><label for="'.$idTagPrefix.'-mvdown"><img src="'.$this->backPath.'gfx/button_down.gif" border="0" alt="" /></label>'.
02402                                                                 $rowCells['title'].'</td>
02403                                                                 <td>'.$rowCells['formEl'].'</td>
02404                                                         </tr>';
02405 
02406                                                         $tRows = $this->getSingleField_typeFlex_draw(
02407                                                                 $value['el'],
02408                                                                 $editData[$key]['el'],
02409                                                                 $cmdData[$key]['el'],
02410                                                                 $table,
02411                                                                 $field,
02412                                                                 $row,
02413                                                                 $PA,
02414                                                                 $formPrefix.'['.$key.'][el]',
02415                                                                 $level+1,
02416                                                                 $tRows
02417                                                         );
02418                                                 }
02419 
02420                                         } elseif (is_array($value['TCEforms']['config'])) {     // Rendering a single form element:
02421 
02422                                                 if (is_array($PA['_valLang']))  {
02423                                                         $rotateLang = $PA['_valLang'];
02424                                                 } else {
02425                                                         $rotateLang = array($PA['_valLang']);
02426                                                 }
02427 
02428                                                 foreach($rotateLang as $vDEFkey)        {
02429                                                         $vDEFkey = 'v'.$vDEFkey;
02430 
02431                                                         if (!$value['TCEforms']['displayCond'] || $this->isDisplayCondition($value['TCEforms']['displayCond'],$editData,$vDEFkey)) {
02432                                                                 $fakePA=array();
02433                                                                 $fakePA['fieldConf']=array(
02434                                                                         'label' => $this->sL(trim($value['TCEforms']['label'])),
02435                                                                         'config' => $value['TCEforms']['config'],
02436                                                                         'defaultExtras' => $value['TCEforms']['defaultExtras'],
02437                                     'onChange' => $value['TCEforms']['onChange']
02438                                                                 );
02439                                                                 if ($PA['_noEditDEF'] && $PA['_lang']==='lDEF') {
02440                                                                         $fakePA['fieldConf']['config'] = array(
02441                                                                                 'type' => 'none',
02442                                                                                 'rows' => 2
02443                                                                         );
02444                                                                 }
02445 
02446                                                                 if (
02447                                     $fakePA['fieldConf']['onChange'] == 'reload' ||
02448                                                                         ($GLOBALS['TCA'][$table]['ctrl']['type'] && !strcmp($key,$GLOBALS['TCA'][$table]['ctrl']['type'])) ||
02449                                                                         ($GLOBALS['TCA'][$table]['ctrl']['requestUpdate'] && t3lib_div::inList($GLOBALS['TCA'][$table]['ctrl']['requestUpdate'],$key))) {
02450                                                                         if ($GLOBALS['BE_USER']->jsConfirmation(1))     {
02451                                                                                 $alertMsgOnChange = 'if (confirm(TBE_EDITOR.labels.onChangeAlert) && TBE_EDITOR.checkSubmit(-1)){ TBE_EDITOR.submitForm() };';
02452                                                                         } else {
02453                                                                                 $alertMsgOnChange = 'if(TBE_EDITOR.checkSubmit(-1)){ TBE_EDITOR.submitForm();}';
02454                                                                         }
02455                                                                 } else {
02456                                                                         $alertMsgOnChange = '';
02457                                                                 }
02458 
02459                                                                 $fakePA['fieldChangeFunc']=$PA['fieldChangeFunc'];
02460                                                                 if (strlen($alertMsgOnChange)) {
02461                                                                         $fakePA['fieldChangeFunc']['alert']=$alertMsgOnChange;
02462                                                                 }
02463                                                                 $fakePA['onFocus']=$PA['onFocus'];
02464                                                                 $fakePA['label']=$PA['label'];
02465 
02466                                                                 $fakePA['itemFormElName']=$PA['itemFormElName'].$formPrefix.'['.$key.']['.$vDEFkey.']';
02467                                                                 $fakePA['itemFormElName_file']=$PA['itemFormElName_file'].$formPrefix.'['.$key.']['.$vDEFkey.']';
02468 
02469                                                                 if(isset($editData[$key][$vDEFkey])) {
02470                                                                         $fakePA['itemFormElValue']=$editData[$key][$vDEFkey];
02471                                                                 } else {
02472                                                                         $fakePA['itemFormElValue']=$fakePA['fieldConf']['config']['default'];
02473                                                                 }
02474 
02475                                                                 $rowCells['formEl']= $this->getSingleField_SW($table,$field,$row,$fakePA);
02476                                                                 $rowCells['title']= htmlspecialchars($fakePA['fieldConf']['label']);
02477 
02478                                                                 if (!in_array('DEF',$rotateLang))       {
02479                                                                         $defInfo = '<div class="typo3-TCEforms-originalLanguageValue">'.$this->getLanguageIcon($table,$row,0).$this->previewFieldValue($editData[$key]['vDEF'], $fakePA['fieldConf']).'&nbsp;</div>';
02480                                                                 } else {
02481                                                                         $defInfo = '';
02482                                                                 }
02483                                                                 
02484                                                                 if (!$PA['_noEditDEF']) {
02485                                                                         $prLang = $this->getAdditionalPreviewLanguages();
02486                                                                         foreach($prLang as $prL)        {
02487                                                                                 $defInfo.= '<div class="typo3-TCEforms-originalLanguageValue">'.$this->getLanguageIcon($table,$row,'v'.$prL['ISOcode']).$this->previewFieldValue($editData[$key]['v'.$prL['ISOcode']], $fakePA['fieldConf']).'&nbsp;</div>';
02488                                                                         }
02489                                                                 }
02490 
02491                                                                         // Put row together
02492                                                                 $tRows[]='<tr>
02493                                                                         <td nowrap="nowrap" valign="top" class="bgColor5">'.($vDEFkey=='vDEF' ? '' : $this->getLanguageIcon($table,$row,$vDEFkey)).$rowCells['title'].'</td>
02494                                                                         <td class="bgColor4">'.$rowCells['formEl'].$defInfo.'</td>
02495                                                                 </tr>';
02496                                                         }
02497                                                 }
02498                                         }
02499                                 }
02500                         }
02501                 }
02502 
02503                 return $tRows;
02504         }
02505 
02515         function getSingleField_typeUnknown($table,$field,$row,&$PA)    {
02516                 $item='Unknown type: '.$PA['fieldConf']['config']['form_type'].'<br />';
02517 
02518                 return $item;
02519         }
02520 
02530         function getSingleField_typeUser($table,$field,$row,&$PA)       {
02531                 $PA['table']=$table;
02532                 $PA['field']=$field;
02533                 $PA['row']=$row;
02534 
02535                 $PA['pObj']=&$this;
02536 
02537                 return t3lib_div::callUserFunction($PA['fieldConf']['config']['userFunc'],$PA,$this);
02538         }
02539 
02540 
02541 
02542 
02543 
02544 
02545         /************************************************************
02546          *
02547          * Field content processing
02548          *
02549          ************************************************************/
02550 
02559         function formatValue ($config, $itemValue)      {
02560                 $format = trim($config['format']);
02561                 switch($format) {
02562                         case 'date':
02563                                 if ($itemValue) {
02564                                         $option = trim($config['format.']['option']);
02565                                         if ($option)    {
02566                                                 if ($config['format.']['strftime'])     {
02567                                                         $value = strftime($option,$itemValue);
02568                                                 } else {
02569                                                         $value = date($option,$itemValue);
02570                                                 }
02571                                         } else {
02572                                                 $value = date('d-m-Y',$itemValue);
02573                                         }
02574                                 } else {
02575                                         $value = '';
02576                                 }
02577                                 if ($config['format.']['appendAge'])    {
02578                                         $value .= ' ('.t3lib_BEfunc::calcAge((time()-$itemValue), $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.php:labels.minutesHoursDaysYears')).')';
02579                                 }
02580                                 $itemValue = $value;
02581                                 break;
02582                         case 'datetime':        // compatibility with "eval" (type "input")
02583                                 $itemValue = date('H:i d-m-Y',$itemValue);
02584                                 break;
02585                         case 'time':    // compatibility with "eval" (type "input")
02586                                 $itemValue = date('H:i',$itemValue);
02587                                 break;
02588                         case 'timesec': // compatibility with "eval" (type "input")
02589                                 $itemValue = date('H:i:s',$itemValue);
02590                                 break;
02591                         case 'year':    // compatibility with "eval" (type "input")
02592                                 $itemValue = date('Y',$itemValue);
02593                                 break;
02594                         case 'int':
02595                                 $baseArr = array('dec'=>'d','hex'=>'x','HEX'=>'X','oct'=>'o','bin'=>'b');
02596                                 $base = trim($config['format.']['base']);
02597                                 $format = $baseArr[$base] ? $baseArr[$base] : 'd';
02598                                 $itemValue = sprintf('%'.$format,$itemValue);
02599                                 break;
02600                         case 'float':
02601                                 $precision = t3lib_div::intInRange($config['format.']['precision'],1,10,2);
02602                                 $itemValue = sprintf('%.'.$precision.'f',$itemValue);
02603                                 break;
02604                         case 'number':
02605                                 $format = trim($config['format.']['option']);
02606                                 $itemValue = sprintf('%'.$format,$itemValue);
02607                                 break;
02608                         case 'md5':
02609                                 $itemValue = md5($itemValue);
02610                                 break;
02611                         case 'filesize':
02612                                 $value = t3lib_div::formatSize(intval($itemValue));
02613                                 if ($config['format.']['appendByteSize'])       {
02614                                         $value .= ' ('.$itemValue.')';
02615                                 }
02616                                 $itemValue = $value;
02617                                 break;
02618                         case 'user':
02619                                 $func = trim($config['format.']['userFunc']);
02620                                 if ($func)      {
02621                                         $params = array(
02622                                                 'value' => $itemValue,
02623                                                 'args' => $config['format.']['userFunc'],
02624                                                 'config' => $config,
02625                                                 'pObj' => &$this
02626                                         );
02627                                         $itemValue = t3lib_div::callUserFunction($func,$params,$this);
02628                                 }
02629                                 break;
02630                         default:
02631                         break;
02632                 }
02633 
02634                 return $itemValue;
02635         }
02636 
02637 
02638 
02639 
02640 
02641 
02642         /************************************************************
02643          *
02644          * "Configuration" fetching/processing functions
02645          *
02646          ************************************************************/
02647 
02655         function getRTypeNum($table,$row)       {
02656                 global $TCA;
02657                         // If there is a "type" field configured...
02658                 if ($TCA[$table]['ctrl']['type'])       {
02659                         $typeFieldName = $TCA[$table]['ctrl']['type'];
02660                         $typeNum=$row[$typeFieldName];  // Get value of the row from the record which contains the type value.
02661                         if (!strcmp($typeNum,''))       $typeNum=0;                     // If that value is an empty string, set it to "0" (zero)
02662                 } else {
02663                         $typeNum = 0;   // If no "type" field, then set to "0" (zero)
02664                 }
02665 
02666                 $typeNum = (string)$typeNum;            // Force to string. Necessary for eg '-1' to be recognized as a type value.
02667                 if (!$TCA[$table]['types'][$typeNum])   {       // However, if the type "0" is not found in the "types" array, then default to "1" (for historical reasons)
02668                         $typeNum = 1;
02669                 }
02670 
02671                 return $typeNum;
02672         }
02673 
02681         function rearrange($fields)     {
02682                 $fO = array_flip(t3lib_div::trimExplode(',',$this->fieldOrder,1));
02683                 reset($fields);
02684                 $newFields=array();
02685                 while(list($cc,$content)=each($fields)) {
02686                         $cP = t3lib_div::trimExplode(';',$content);
02687                         if (isset($fO[$cP[0]])) {
02688                                 $newFields[$fO[$cP[0]]] = $content;
02689                                 unset($fields[$cc]);
02690                         }
02691                 }
02692                 ksort($newFields);
02693                 $fields=array_merge($newFields,$fields);                // Candidate for t3lib_div::array_merge() if integer-keys will some day make trouble...
02694                 return $fields;
02695         }
02696 
02707         function getExcludeElements($table,$row,$typeNum)       {
02708                 global $TCA;
02709 
02710                         // Init:
02711                 $excludeElements=array();
02712 
02713                         // If a subtype field is defined for the type
02714                 if ($TCA[$table]['types'][$typeNum]['subtype_value_field'])     {
02715                         $sTfield = $TCA[$table]['types'][$typeNum]['subtype_value_field'];
02716                         if (trim($TCA[$table]['types'][$typeNum]['subtypes_excludelist'][$row[$sTfield]]))      {
02717                                 $excludeElements=t3lib_div::trimExplode(',',$TCA[$table]['types'][$typeNum]['subtypes_excludelist'][$row[$sTfield]],1);
02718                         }
02719                 }
02720 
02721                         // If a bitmask-value field has been configured, then find possible fields to exclude based on that:
02722                 if ($TCA[$table]['types'][$typeNum]['bitmask_value_field'])     {
02723                         $sTfield = $TCA[$table]['types'][$typeNum]['bitmask_value_field'];
02724                         $sTValue = t3lib_div::intInRange($row[$sTfield],0);
02725                         if (is_array($TCA[$table]['types'][$typeNum]['bitmask_excludelist_bits']))      {
02726                                 reset($TCA[$table]['types'][$typeNum]['bitmask_excludelist_bits']);
02727                                 while(list($bitKey,$eList)=each($TCA[$table]['types'][$typeNum]['bitmask_excludelist_bits']))   {
02728                                         $bit=substr($bitKey,1);
02729                                         if (t3lib_div::testInt($bit))   {
02730                                                 $bit = t3lib_div::intInRange($bit,0,30);
02731                                                 if (
02732                                                                 (substr($bitKey,0,1)=='-' && !($sTValue&pow(2,$bit))) ||
02733                                                                 (substr($bitKey,0,1)=='+' && ($sTValue&pow(2,$bit)))
02734                                                         )       {
02735                                                         $excludeElements = array_merge($excludeElements,t3lib_div::trimExplode(',',$eList,1));
02736                                                 }
02737                                         }
02738                                 }
02739                         }
02740                 }
02741 
02742                         // Return the array of elements:
02743                 return $excludeElements;
02744         }
02745 
02755         function getFieldsToAdd($table,$row,$typeNum)   {
02756                 global $TCA;
02757 
02758                         // Init:
02759                 $addElements=array();
02760 
02761                         // If a subtype field is defined for the type
02762                 if ($TCA[$table]['types'][$typeNum]['subtype_value_field'])     {
02763                         $sTfield = $TCA[$table]['types'][$typeNum]['subtype_value_field'];
02764                         if (trim($TCA[$table]['types'][$typeNum]['subtypes_addlist'][$row[$sTfield]]))  {
02765                                 $addElements=t3lib_div::trimExplode(',',$TCA[$table]['types'][$typeNum]['subtypes_addlist'][$row[$sTfield]],1);
02766                         }
02767                 }
02768                         // Return the return
02769                 return array($addElements,$sTfield);
02770         }
02771 
02780         function mergeFieldsWithAddedFields($fields,$fieldsToAdd)       {
02781                 if (count($fieldsToAdd[0]))     {
02782                         reset($fields);
02783                         $c=0;
02784                         while(list(,$fieldInfo)=each($fields))  {
02785                                 $parts = explode(';',$fieldInfo);
02786                                 if (!strcmp(trim($parts[0]),$fieldsToAdd[1]))   {
02787                                         array_splice(
02788                                                 $fields,
02789                                                 $c+1,
02790                                                 0,
02791                                                 $fieldsToAdd[0]
02792                                         );
02793                                         break;
02794                                 }
02795                                 $c++;
02796                         }
02797                 }
02798                 return $fields;
02799         }
02800 
02801 
02812         function setTSconfig($table,$row,$field='')     {
02813                 $mainKey = $table.':'.$row['uid'];
02814                 if (!isset($this->cachedTSconfig[$mainKey]))    {
02815                         $this->cachedTSconfig[$mainKey]=t3lib_BEfunc::getTCEFORM_TSconfig($table,$row);
02816                 }
02817                 if ($field)     {
02818                         return $this->cachedTSconfig[$mainKey][$field];
02819                 } else {
02820                         return $this->cachedTSconfig[$mainKey];
02821                 }
02822         }
02823 
02834         function overrideFieldConf($fieldConfig, $TSconfig) {
02835                 if (is_array($TSconfig)) {
02836                         $TSconfig = t3lib_div::removeDotsFromTS($TSconfig);
02837                         $type = $fieldConfig['type'];
02838                         if (is_array($TSconfig['config']) && is_array($this->allowOverrideMatrix[$type])) {
02839                                         // Check if the keys in TSconfig['config'] are allowed to override TCA field config:                    
02840                                 foreach (array_keys($TSconfig['config']) as $key) {
02841                                         if (!in_array($key, $this->allowOverrideMatrix[$type], true)) {
02842                                                 unset($TSconfig['config'][$key]);
02843                                         }
02844                                 }
02845                                         // Override TCA field config by remaining TSconfig['config']:
02846                                 if (count($TSconfig['config'])) {
02847                                         $fieldConfig = array_merge($fieldConfig, $TSconfig['config']);
02848                                 }
02849                         }
02850                 }
02851 
02852                 return $fieldConfig;
02853         }
02854 
02865         function getSpecConfForField($table,$row,$field)        {
02866                         // Finds the current "types" configuration for the table/row:
02867                 $types_fieldConfig = t3lib_BEfunc::getTCAtypes($table,$row);
02868 
02869                         // If this is an array, then traverse it:
02870                 if (is_array($types_fieldConfig))       {
02871                         foreach($types_fieldConfig as $vconf)   {
02872                                         // If the input field name matches one found in the 'types' list, then return the 'special' configuration.
02873                                 if ($vconf['field']==$field)    return $vconf['spec'];
02874                         }
02875                 }
02876         }
02877 
02886         function getSpecConfFromString($extraString, $defaultExtras)    {
02887                 return t3lib_BEfunc::getSpecConfParts($extraString, $defaultExtras);
02888         }
02889 
02890 
02891 
02892 
02893 
02894 
02895 
02896 
02897 
02898 
02899         /************************************************************
02900          *
02901          * Display of localized content etc.
02902          *
02903          ************************************************************/
02904 
02914         function registerDefaultLanguageData($table,$rec)       {
02915                 global $TCA;
02916 
02917                         // Add default language:
02918                 if ($TCA[$table]['ctrl']['languageField']
02919                                 && $rec[$TCA[$table]['ctrl']['languageField']] > 0
02920                                 && $TCA[$table]['ctrl']['transOrigPointerField']
02921                                 && intval($rec[$TCA[$table]['ctrl']['transOrigPointerField']]) > 0)     {
02922 
02923                         $lookUpTable = $TCA[$table]['ctrl']['transOrigPointerTable'] ? $TCA[$table]['ctrl']['transOrigPointerTable'] : $table;
02924 
02925                                 // Get data formatted:
02926                         $this->defaultLanguageData[$table.':'.$rec['uid']] = t3lib_BEfunc::getRecordWSOL($lookUpTable, intval($rec[$TCA[$table]['ctrl']['transOrigPointerField']]));
02927 
02928                                 // Get data for diff:
02929                         if ($TCA[$table]['ctrl']['transOrigDiffSourceField'])   {
02930                                 $this->defaultLanguageData_diff[$table.':'.$rec['uid']] = unserialize($rec[$TCA[$table]['ctrl']['transOrigDiffSourceField']]);
02931                         }
02932 
02933                                 // If there are additional preview languages, load information for them also:
02934                         $prLang = $this->getAdditionalPreviewLanguages();
02935                         foreach($prLang as $prL)        {
02936                                 $t8Tools = t3lib_div::makeInstance('t3lib_transl8tools');
02937                                 $tInfo = $t8Tools->translationInfo($lookUpTable,intval($rec[$TCA[$table]['ctrl']['transOrigPointerField']]),$prL['uid']);
02938                                 if (is_array($tInfo['translations'][$prL['uid']]))      {
02939                                         $this->additionalPreviewLanguageData[$table.':'.$rec['uid']][$prL['uid']] = t3lib_BEfunc::getRecordWSOL($lookUpTable, intval($tInfo['translations'][$prL['uid']]['uid']));
02940                                 }
02941                         }
02942                 }
02943         }
02944 
02956         function getLanguageOverlayRawValue($table, $row, $field, $fieldConf)   {
02957                 global $TCA;
02958 
02959                 $value = $row[$field];
02960 
02961                 if (is_array($this->defaultLanguageData[$table.':'.$row['uid']]))       {
02962 
02963                         if ($fieldConf['l10n_mode']=='exclude'
02964                                         || ($fieldConf['l10n_mode']=='mergeIfNotBlank' && strcmp(trim($this->defaultLanguageData[$table.':'.$row['uid']][$field]),''))) {
02965                                 $value = $this->defaultLanguageData[$table.':'.$row['uid']][$field];
02966                         }
02967 
02968                 }
02969 
02970                 return $value;
02971         }
02972 
02984         function renderDefaultLanguageContent($table,$field,$row,$item) {
02985                 if (is_array($this->defaultLanguageData[$table.':'.$row['uid']]))       {
02986                         $dLVal = t3lib_BEfunc::getProcessedValue($table,$field,$this->defaultLanguageData[$table.':'.$row['uid']][$field],0,1);
02987                         $fCfg = $GLOBALS['TCA'][$table]['columns'][$field];
02988 
02989                         if (strcmp($dLVal,''))  {
02990                                 $item.='<div class="typo3-TCEforms-originalLanguageValue">'.$this->getLanguageIcon($table,$row,0).$this->previewFieldValue($dLVal,$fCfg).'&nbsp;</div>';
02991                         }
02992                         
02993                         $prLang = $this->getAdditionalPreviewLanguages();
02994                         foreach($prLang as $prL)        {
02995                                 $dlVal = t3lib_BEfunc::getProcessedValue($table,$field,$this->additionalPreviewLanguageData[$table.':'.$row['uid']][$prL['uid']][$field],0,1);
02996                                 $item.= '<div class="typo3-TCEforms-originalLanguageValue">'.$this->getLanguageIcon($table,$row,'v'.$prL['ISOcode']).$this->previewFieldValue($dlVal, $fCfg).'&nbsp;</div>';
02997                         }
02998                         
02999                 }
03000 
03001                 return $item;
03002         }
03003 
03015         function renderDefaultLanguageDiff($table,$field,$row,$item)    {
03016                 if (is_array($this->defaultLanguageData_diff[$table.':'.$row['uid']]))  {
03017 
03018                                 // Initialize:
03019                         $dLVal = array(
03020                                 'old' => $this->defaultLanguageData_diff[$table.':'.$row['uid']],
03021                                 'new' => $this->defaultLanguageData[$table.':'.$row['uid']],
03022                         );
03023 
03024                         if (isset($dLVal['old'][$field]))       {       // There must be diff-data:
03025                                 if (strcmp($dLVal['old'][$field],$dLVal['new'][$field]))        {
03026 
03027                                                 // Create diff-result:
03028                                         $t3lib_diff_Obj = t3lib_div::makeInstance('t3lib_diff');
03029                                         $diffres = $t3lib_diff_Obj->makeDiffDisplay(
03030                                                 t3lib_BEfunc::getProcessedValue($table,$field,$dLVal['old'][$field],0,1),
03031                                                 t3lib_BEfunc::getProcessedValue($table,$field,$dLVal['new'][$field],0,1)
03032                                         );
03033 
03034                                         $item.='<div class="typo3-TCEforms-diffBox">'.
03035                                                 '<div class="typo3-TCEforms-diffBox-header">'.htmlspecialchars($this->getLL('l_changeInOrig')).':</div>'.
03036                                                 $diffres.
03037                                         '</div>';
03038                                 }
03039                         }
03040                 }
03041 
03042                 return $item;
03043         }
03044 
03045 
03046 
03047 
03048 
03049 
03050 
03051 
03052 
03053         /************************************************************
03054          *
03055          * Form element helper functions
03056          *
03057          ************************************************************/
03058 
03074         function dbFileIcons($fName,$mode,$allowed,$itemArray,$selector='',$params=array(),$onFocus='',$table='',$field='',$uid='')     {
03075 
03076 
03077                 $disabled = '';
03078                 if($this->renderReadonly || $params['readOnly'])  {
03079                         $disabled = ' disabled="disabled"';
03080                 }
03081 
03082                         // Sets a flag which means some JavaScript is included on the page to support this element.
03083                 $this->printNeededJS['dbFileIcons']=1;
03084 
03085                         // INIT
03086                 $uidList=array();
03087                 $opt=array();
03088                 $itemArrayC=0;
03089 
03090                         // Creating <option> elements:
03091                 if (is_array($itemArray))       {
03092                         $itemArrayC=count($itemArray);
03093                         reset($itemArray);
03094                         switch($mode)   {
03095                                 case 'db':
03096                                         while(list(,$pp)=each($itemArray))      {
03097                                                 $pRec = t3lib_BEfunc::getRecordWSOL($pp['table'],$pp['id']);
03098                                                 if (is_array($pRec))    {
03099                                                         $pTitle = t3lib_BEfunc::getRecordTitle($pp['table'], $pRec, FALSE, TRUE);
03100                                                         $pUid = $pp['table'].'_'.$pp['id'];
03101                                                         $uidList[]=$pUid;
03102                                                         $opt[]='<option value="'.htmlspecialchars($pUid).'">'.htmlspecialchars($pTitle).'</option>';
03103                                                 }
03104                                         }
03105                                 break;
03106                                 case 'file':
03107                                         while(list(,$pp)=each($itemArray))      {
03108                                                 $pParts = explode('|',$pp);
03109                                                 $uidList[]=$pUid=$pTitle = $pParts[0];
03110                                                 $opt[]='<option value="'.htmlspecialchars(rawurldecode($pParts[0])).'">'.htmlspecialchars(rawurldecode($pParts[0])).'</option>';
03111                                         }
03112                                 break;
03113                                 default:
03114                                         while(list(,$pp)=each($itemArray))      {
03115                                                 $pParts = explode('|',$pp, 2);
03116                                                 $uidList[]=$pUid=$pParts[0];
03117                                                 $pTitle = $pParts[1];
03118                                                 $opt[]='<option value="'.htmlspecialchars(rawurldecode($pUid)).'">'.htmlspecialchars(rawurldecode($pTitle)).'</option>';
03119                                         }
03120                                 break;
03121                         }
03122                 }
03123 
03124                         // Create selector box of the options
03125                 $sSize = $params['autoSizeMax'] ? t3lib_div::intInRange($itemArrayC+1,t3lib_div::intInRange($params['size'],1),$params['autoSizeMax']) : $params['size'];
03126                 if (!$selector) {
03127                         $selector = '<select size="'.$sSize.'"'.$this->insertDefStyle('group').' multiple="multiple" name="'.$fName.'_list" '.$onFocus.$params['style'].$disabled.'>'.implode('',$opt).'</select>';
03128                 }
03129 
03130 
03131                 $icons = array(
03132                         'L' => array(),
03133                         'R' => array(),
03134                 );
03135                 if (!$params['readOnly']) {
03136                         if (!$params['noBrowser'])      {
03137                                         // check against inline uniqueness
03138                                 $inlineParent = $this->inline->getStructureLevel(-1);
03139                                 if(is_array($inlineParent) && $inlineParent['uid']) {
03140                                         if ($inlineParent['config']['foreign_table'] == $table && $inlineParent['config']['foreign_unique'] == $field) {
03141                                                 $objectPrefix = $this->inline->inlineNames['object'].'['.$table.']';
03142                                                 $aOnClickInline = $objectPrefix.'|inline.checkUniqueElement|inline.setUniqueElement';
03143                                                 $rOnClickInline = 'inline.revertUnique(\''.$objectPrefix.'\',null,\''.$uid.'\');';
03144                                         }
03145                                 }
03146                                 $aOnClick='setFormValueOpenBrowser(\''.$mode.'\',\''.($fName.'|||'.$allowed.'|'.$aOnClickInline).'\'); return false;';
03147                                 $icons['R'][]='<a href="#" onclick="'.htmlspecialchars($aOnClick).'">'.
03148                                                 '<img'.t3lib_iconWorks::skinImg($this->backPath,'gfx/insert3.gif','width="14" height="14"').' border="0" '.t3lib_BEfunc::titleAltAttrib($this->getLL('l_browse_'.($mode=='file'?'file':'db'))).' />'.
03149                                                 '</a>';
03150                         }
03151                         if (!$params['dontShowMoveIcons'])      {
03152                                 if ($sSize>=5)  {
03153                                         $icons['L'][]='<a href="#" onclick="setFormValueManipulate(\''.$fName.'\',\'Top\'); return false;">'.
03154                                                         '<img'.t3lib_iconWorks::skinImg($this->backPath,'gfx/group_totop.gif','width="14" height="14"').' border="0" '.t3lib_BEfunc::titleAltAttrib($this->getLL('l_move_to_top')).' />'.
03155                                                         '</a>';
03156                                 }
03157                                 $icons['L'][]='<a href="#" onclick="setFormValueManipulate(\''.$fName.'\',\'Up\'); return false;">'.
03158                                                 '<img'.t3lib_iconWorks::skinImg($this->backPath,'gfx/up.gif','width="14" height="14"').' border="0" '.t3lib_BEfunc::titleAltAttrib($this->getLL('l_move_up')).' />'.
03159                                                 '</a>';
03160                                 $icons['L'][]='<a href="#" onclick="setFormValueManipulate(\''.$fName.'\',\'Down\'); return false;">'.
03161                                                 '<img'.t3lib_iconWorks::skinImg($this->backPath,'gfx/down.gif','width="14" height="14"').' border="0" '.t3lib_BEfunc::titleAltAttrib($this->getLL('l_move_down')).' />'.
03162                                                 '</a>';
03163                                 if ($sSize>=5)  {
03164                                         $icons['L'][]='<a href="#" onclick="setFormValueManipulate(\''.$fName.'\',\'Bottom\'); return false;">'.
03165                                                         '<img'.t3lib_iconWorks::skinImg($this->backPath,'gfx/group_tobottom.gif','width="14" height="14"').' border="0" '.t3lib_BEfunc::titleAltAttrib($this->getLL('l_move_to_bottom')).' />'.
03166                                                         '</a>';
03167                                 }
03168                         }
03169 
03170                         $clipElements = $this->getClipboardElements($allowed,$mode);
03171                         if (count($clipElements))       {
03172                                 $aOnClick = '';
03173         #                       $counter = 0;
03174                                 foreach($clipElements as $elValue)      {
03175                                         if ($mode=='file')      {
03176                                                 $itemTitle = 'unescape(\''.rawurlencode(basename($elValue)).'\')';
03177                                         } else {        // 'db' mode assumed
03178                                                 list($itemTable,$itemUid) = explode('|', $elValue);
03179                                                 $itemTitle = $GLOBALS['LANG']->JScharCode(t3lib_BEfunc::getRecordTitle($itemTable, t3lib_BEfunc::getRecordWSOL($itemTable,$itemUid)));
03180                                                 $elValue = $itemTable.'_'.$itemUid;
03181                                         }
03182                                         $aOnClick.= 'setFormValueFromBrowseWin(\''.$fName.'\',unescape(\''.rawurlencode(str_replace('%20',' ',$elValue)).'\'),'.$itemTitle.');';
03183 
03184         #                               $counter++;
03185         #                               if ($params['maxitems'] && $counter >= $params['maxitems'])     {       break;  }       // Makes sure that no more than the max items are inserted... for convenience.
03186                                 }
03187                                 $aOnClick.= 'return false;';
03188                                 $icons['R'][]='<a href="#" onclick="'.htmlspecialchars($aOnClick).'">'.
03189                                                 '<img'.t3lib_iconWorks::skinImg($this->backPath,'gfx/insert5.png','width="14" height="14"').' border="0" '.t3lib_BEfunc::titleAltAttrib(sprintf($this->getLL('l_clipInsert_'.($mode=='file'?'file':'db')),count($clipElements))).' />'.
03190                                                 '</a>';
03191                         }
03192                         $rOnClick = $rOnClickInline.'setFormValueManipulate(\''.$fName.'\',\'Remove\'); return false';
03193                         $icons['L'][]='<a href="#" onclick="'.htmlspecialchars($rOnClick).'">'.
03194                                         '<img'.t3lib_iconWorks::skinImg($this->backPath,'gfx/group_clear.gif','width="14" height="14"').' border="0" '.t3lib_BEfunc::titleAltAttrib($this->getLL('l_remove_selected')).' />'.
03195                                         '</a>';
03196                 }
03197 
03198                 $str='<table border="0" cellpadding="0" cellspacing="0" width="1">
03199                         '.($params['headers']?'
03200                                 <tr>
03201                                         <td>'.$this->wrapLabels($params['headers']['selector']).'</td>
03202                                         <td></td>
03203                                         <td></td>
03204                                         <td></td>
03205                                         <td>'.($params['thumbnails'] ? $this->wrapLabels($params['headers']['items']) : '').'</td>
03206                                 </tr>':'').
03207                         '
03208                         <tr>
03209                                 <td valign="top">'.
03210                                         $selector.'<br />'.
03211                                         $this->wrapLabels($params['info']).
03212                                 '</td>
03213                                 <td valign="top">'.
03214                                         implode('<br />',$icons['L']).'</td>
03215                                 <td valign="top">'.
03216                                         implode('<br />',$icons['R']).'</td>
03217                                 <td><img src="clear.gif" width="5" height="1" alt="" /></td>
03218                                 <td valign="top">'.
03219                                         $this->wrapLabels($params['thumbnails']).
03220                                 '</td>
03221                         </tr>
03222                 </table>';
03223 
03224                         // Creating the hidden field which contains the actual value as a comma list.
03225                 $str.='<input type="hidden" name="'.$fName.'" value="'.htmlspecialchars(implode(',',$uidList)).'" />';
03226 
03227                 return $str;
03228         }
03229 
03237         function getClipboardElements($allowed,$mode)   {
03238 
03239                 $output = array();
03240 
03241                 if (is_object($this->clipObj))  {
03242                         switch($mode)   {
03243                                 case 'file':
03244                                         $elFromTable = $this->clipObj->elFromTable('_FILE');
03245                                         $allowedExts = t3lib_div::trimExplode(',', $allowed, 1);
03246 
03247                                         if ($allowedExts)       {       // If there are a set of allowed extensions, filter the content:
03248                                                 foreach($elFromTable as $elValue)       {
03249                                                         $pI = pathinfo($elValue);
03250                                                         $ext = strtolower($pI['extension']);
03251                                                         if (in_array($ext, $allowedExts))       {
03252                                                                 $output[] = $elValue;
03253                                                         }
03254                                                 }
03255                                         } else {        // If all is allowed, insert all: (This does NOT respect any disallowed extensions, but those will be filtered away by the backend TCEmain)
03256                                                 $output = $elFromTable;
03257                                         }
03258                                 break;
03259                                 case 'db':
03260                                         $allowedTables = t3lib_div::trimExplode(',', $allowed, 1);
03261                                         if (!strcmp(trim($allowedTables[0]),'*'))       {       // All tables allowed for relation:
03262                                                 $output = $this->clipObj->elFromTable('');
03263                                         } else {        // Only some tables, filter them:
03264                                                 foreach($allowedTables as $tablename)   {
03265                                                         $elFromTable = $this->clipObj->elFromTable($tablename);
03266                                                         $output = array_merge($output,$elFromTable);
03267                                                 }
03268                                         }
03269                                         $output = array_keys($output);
03270                                 break;
03271                         }
03272                 }
03273 
03274                 return $output;
03275         }
03276 
03286         function getClickMenu($str,$table,$uid='')      {
03287                 if ($this->enableClickMenu)     {
03288                         $onClick = $GLOBALS['SOBE']->doc->wrapClickMenuOnIcon($str,$table,$uid,1,'','+copy,info,edit,view', TRUE);
03289                         return '<a href="#" onclick="'.htmlspecialchars($onClick).'">'.$str.'</a>';
03290                 }
03291         }
03292 
03307         function renderWizards($itemKinds,$wizConf,$table,$row,$field,&$PA,$itemName,$specConf,$RTE=0)  {
03308 
03309                         // Init:
03310                 $fieldChangeFunc = $PA['fieldChangeFunc'];
03311                 $item = $itemKinds[0];
03312                 $outArr = array();
03313                 $colorBoxLinks = array();
03314                 $fName = '['.$table.']['.$row['uid'].']['.$field.']';
03315                 $md5ID = 'ID'.t3lib_div::shortmd5($itemName);
03316                 $listFlag = '_list';
03317 
03318                         // Manipulate the field name (to be the true form field name) and remove a suffix-value if the item is a selector box with renderMode "singlebox":
03319                 if ($PA['fieldConf']['config']['form_type']=='select')  {
03320                         if ($PA['fieldConf']['config']['maxitems']<=1)  {       // Single select situation:
03321                                 $listFlag = '';
03322                         } elseif ($PA['fieldConf']['config']['renderMode']=='singlebox')        {
03323                                 $itemName.='[]';
03324                                 $listFlag = '';
03325                         }
03326                 }
03327 
03328                         // traverse wizards:
03329                 if (is_array($wizConf) && !$this->disableWizards)       {
03330                         foreach($wizConf as $wid => $wConf)     {
03331                                 if (substr($wid,0,1)!='_'
03332                                                 && (!$wConf['enableByTypeConfig'] || @in_array($wid,$specConf['wizards']['parameters']))
03333                                                 && ($RTE || !$wConf['RTEonly'])
03334                                         )       {
03335 
03336                                                 // Title / icon:
03337                                         $iTitle = htmlspecialchars($this->sL($wConf['title']));
03338                                         if ($wConf['icon'])     {
03339                                                 $iDat = $this->getIcon($wConf['icon']);
03340                                                 $icon = '<img src="'.$iDat[0].'" '.$iDat[1][3].' border="0"'.t3lib_BEfunc::titleAltAttrib($iTitle).' />';
03341                                         } else {
03342                                                 $icon = $iTitle;
03343                                         }
03344 
03345                                                 //
03346                                         switch((string)$wConf['type'])  {
03347                                                 case 'userFunc':
03348                                                 case 'script':
03349                                                 case 'popup':
03350                                                 case 'colorbox':
03351                                                         if (!$wConf['notNewRecords'] || t3lib_div::testInt($row['uid']))        {
03352 
03353                                                                         // Setting &P array contents:
03354                                                                 $params = array();
03355                                                                 $params['params'] = $wConf['params'];
03356                                                                 $params['exampleImg'] = $wConf['exampleImg'];
03357                                                                 $params['table'] = $table;
03358                                                                 $params['uid'] = $row['uid'];
03359                                                                 $params['pid'] = $row['pid'];
03360                                                                 $params['field'] = $field;
03361                                                                 $params['md5ID'] = $md5ID;
03362                                                                 $params['returnUrl'] = $this->thisReturnUrl();
03363 
03364                                                                         // Resolving script filename and setting URL.
03365                                                                 if (!strcmp(substr($wConf['script'],0,4), 'EXT:')) {
03366                                                                         $wScript = t3lib_div::getFileAbsFileName($wConf['script']);
03367                                                                         if ($wScript)   {
03368                                                                                 $wScript = '../'.substr($wScript,strlen(PATH_site));
03369                                                                         } else break;
03370                                                                 } else {
03371                                                                         $wScript = $wConf['script'];
03372                                                                 }
03373                                                                 $url = $this->backPath.$wScript.(strstr($wScript,'?') ? '' : '?');
03374 
03375                                                                         // If there is no script and the type is "colorbox", break right away:
03376                                                                 if ((string)$wConf['type']=='colorbox' && !$wConf['script'])    { break; }
03377 
03378                                                                         // If "script" type, create the links around the icon:
03379                                                                 if ((string)$wConf['type']=='script')   {
03380                                                                         $aUrl = $url.t3lib_div::implodeArrayForUrl('',array('P'=>$params));
03381                                                                         $outArr[]='<a href="'.htmlspecialchars($aUrl).'" onclick="'.$this->blur().'return !TBE_EDITOR.isFormChanged();">'.
03382                                                                                 $icon.
03383                                                                                 '</a>';
03384                                                                 } else {
03385 
03386                                                                                 // ... else types "popup", "colorbox" and "userFunc" will need additional parameters:
03387                                                                         $params['formName'] = $this->formName;
03388                                                                         $params['itemName'] = $itemName;
03389                                                                         $params['fieldChangeFunc'] = $fieldChangeFunc;
03390 
03391                                                                         switch((string)$wConf['type'])  {
03392                                                                                 case 'popup':
03393                                                                                 case 'colorbox':
03394                                                                                                 // Current form value is passed as P[currentValue]!
03395                                                                                         $addJS = $wConf['popup_onlyOpenIfSelected']?'if (!TBE_EDITOR.curSelected(\''.$itemName.$listFlag.'\')){alert('.$GLOBALS['LANG']->JScharCode($this->getLL('m_noSelItemForEdit')).'); return false;}':'';
03396                                                                                         $curSelectedValues='+\'&P[currentSelectedValues]=\'+TBE_EDITOR.curSelected(\''.$itemName.$listFlag.'\')';
03397                                                                                         $aOnClick=      $this->blur().
03398                                                                                                                 $addJS.
03399                                                                                                                 'vHWin=window.open(\''.$url.t3lib_div::implodeArrayForUrl('',array('P'=>$params)).'\'+\'&P[currentValue]=\'+TBE_EDITOR.rawurlencode('.$this->elName($itemName).'.value,200)'.$curSelectedValues.',\'popUp'.$md5ID.'\',\''.$wConf['JSopenParams'].'\');'.
03400                                                                                                                 'vHWin.focus();return false;';
03401                                                                                                 // Setting "colorBoxLinks" - user LATER to wrap around the color box as well:
03402                                                                                         $colorBoxLinks = Array('<a href="#" onclick="'.htmlspecialchars($aOnClick).'">','</a>');
03403                                                                                         if ((string)$wConf['type']=='popup')    {
03404                                                                                                 $outArr[] = $colorBoxLinks[0].$icon.$colorBoxLinks[1];
03405                                                                                         }
03406                                                                                 break;
03407                                                                                 case 'userFunc':
03408                                                                                         $params['item'] = &$item;       // Reference set!
03409                                                                                         $params['icon'] = $icon;
03410                                                                                         $params['iTitle'] = $iTitle;
03411                                                                                         $params['wConf'] = $wConf;
03412                                                                                         $params['row'] = $row;
03413                                                                                         $outArr[] = t3lib_div::callUserFunction($wConf['userFunc'],$params,$this);
03414                                                                                 break;
03415                                                                         }
03416                                                                 }
03417 
03418                                                                         // Hide the real form element?
03419                                                                 if (is_array($wConf['hideParent']) || $wConf['hideParent'])     {
03420                                                                         $item = $itemKinds[1];  // Setting the item to a hidden-field.
03421                                                                         if (is_array($wConf['hideParent']))     {
03422                                                                                 $item.= $this->getSingleField_typeNone_render($wConf['hideParent'], $PA['itemFormElValue']);
03423                                                                         }
03424                                                                 }
03425                                                         }
03426                                                 break;
03427                                                 case 'select':
03428                                                         $fieldValue = array('config' => $wConf);
03429                                                         $TSconfig = $this->setTSconfig($table, $row);
03430                                                         $TSconfig[$field] = $TSconfig[$field]['wizards.'][$wid.'.'];
03431                                                         $selItems = $this->addSelectOptionsToItemArray($this->initItemArray($fieldValue), $fieldValue, $TSconfig, $field);
03432 
03433                                                         $opt = array();
03434                                                         $opt[] = '<option>'.$iTitle.'</option>';
03435                                                         foreach($selItems as $p)        {
03436                                                                 $opt[] = '<option value="'.htmlspecialchars($p[1]).'">'.htmlspecialchars($p[0]).'</option>';
03437                                                         }
03438                                                         if ($wConf['mode']=='append')   {
03439                                                                 $assignValue = $this->elName($itemName).'.value=\'\'+this.options[this.selectedIndex].value+'.$this->elName($itemName).'.value';
03440                                                         } elseif ($wConf['mode']=='prepend')    {
03441                                                                 $assignValue = $this->elName($itemName).'.value+=\'\'+this.options[this.selectedIndex].value';
03442                                                         } else {
03443                                                                 $assignValue = $this->elName($itemName).'.value=this.options[this.selectedIndex].value';
03444                                                         }
03445                                                         $sOnChange = $assignValue.';this.selectedIndex=0;'.implode('',$fieldChangeFunc);
03446                                                         $outArr[] = '<select name="_WIZARD'.$fName.'" onchange="'.htmlspecialchars($sOnChange).'">'.implode('',$opt).'</select>';
03447                                                 break;
03448                                         }
03449 
03450                                                 // Color wizard colorbox:
03451                                         if ((string)$wConf['type']=='colorbox') {
03452                                                 $dim = t3lib_div::intExplode('x',$wConf['dim']);
03453                                                 $dX = t3lib_div::intInRange($dim[0],1,200,20);
03454                                                 $dY = t3lib_div::intInRange($dim[1],1,200,20);
03455                                                 $color = $row[$field] ? ' bgcolor="'.htmlspecialchars($row[$field]).'"' : '';
03456                                                 $outArr[] = '<table border="0" cellpadding="0" cellspacing="0" id="'.$md5ID.'"'.$color.' style="'.htmlspecialchars($wConf['tableStyle']).'">
03457                                                                         <tr>
03458                                                                                 <td>'.
03459                                                                                         $colorBoxLinks[0].
03460                                                                                         '<img src="clear.gif" width="'.$dX.'" height="'.$dY.'"'.t3lib_BEfunc::titleAltAttrib(trim($iTitle.' '.$row[$field])).' border="0" />'.
03461                                                                                         $colorBoxLinks[1].
03462                                                                                         '</td>
03463                                                                         </tr>
03464                                                                 </table>';
03465                                         }
03466                                 }
03467                         }
03468 
03469                                 // For each rendered wizard, put them together around the item.
03470                         if (count($outArr))     {
03471                                 if ($wizConf['_HIDDENFIELD'])   $item = $itemKinds[1];
03472 
03473                                 $outStr = '';
03474                                 $vAlign = $wizConf['_VALIGN'] ? ' valign="'.$wizConf['_VALIGN'].'"' : '';
03475                                 if (count($outArr)>1 || $wizConf['_PADDING'])   {
03476                                         $dist = intval($wizConf['_DISTANCE']);
03477                                         if ($wizConf['_VERTICAL'])      {
03478                                                 $dist = $dist ? '<tr><td><img src="clear.gif" width="1" height="'.$dist.'" alt="" /></td></tr>' : '';
03479                                                 $outStr = '<tr><td>'.implode('</td></tr>'.$dist.'<tr><td>',$outArr).'</td></tr>';
03480                                         } else {
03481                                                 $dist = $dist ? '<td><img src="clear.gif" height="1" width="'.$dist.'" alt="" /></td>' : '';
03482                                                 $outStr = '<tr><td'.$vAlign.'>'.implode('</td>'.$dist.'<td'.$vAlign.'>',$outArr).'</td></tr>';
03483                                         }
03484                                         $outStr = '<table border="0" cellpadding="'.intval($wizConf['_PADDING']).'" cellspacing="0">'.$outStr.'</table>';
03485                                 } else {
03486                                         $outStr = implode('',$outArr);
03487                                 }
03488 
03489                                 if (!strcmp($wizConf['_POSITION'],'left'))      {
03490                                         $outStr = '<tr><td'.$vAlign.'>'.$outStr.'</td><td'.$vAlign.'>'.$item.'</td></tr>';
03491                                 } elseif (!strcmp($wizConf['_POSITION'],'top')) {
03492                                         $outStr = '<tr><td>'.$outStr.'</td></tr><tr><td>'.$item.'</td></tr>';
03493                                 } elseif (!strcmp($wizConf['_POSITION'],'bottom'))      {
03494                                         $outStr = '<tr><td>'.$item.'</td></tr><tr><td>'.$outStr.'</td></tr>';
03495                                 } else {
03496                                         $outStr = '<tr><td'.$vAlign.'>'.$item.'</td><td'.$vAlign.'>'.$outStr.'</td></tr>';
03497                                 }
03498 
03499                                 $item = '<table border="0" cellpadding="0" cellspacing="0">'.$outStr.'</table>';
03500                         }
03501                 }
03502                 return $item;
03503         }
03504 
03511         function getIcon($icon) {
03512                 if (substr($icon,0,4)=='EXT:')  {
03513                         $file = t3lib_div::getFileAbsFileName($icon);
03514                         if ($file)      {
03515                                 $file = substr($file,strlen(PATH_site));
03516                                 $selIconFile = $this->backPath.'../'.$file;
03517                                 $selIconInfo = @getimagesize(PATH_site.$file);
03518                         }
03519                 } elseif (substr($icon,0,3)=='../')     {
03520                         $selIconFile = $this->backPath.t3lib_div::resolveBackPath($icon);
03521                         $selIconInfo = @getimagesize(PATH_site.t3lib_div::resolveBackPath(substr($icon,3)));
03522                 } elseif (substr($icon,0,4)=='ext/' || substr($icon,0,7)=='sysext/') {
03523                         $selIconFile = $this->backPath.$icon;
03524                         $selIconInfo = @getimagesize(PATH_typo3.$icon);
03525                 } else {
03526                         $selIconFile = t3lib_iconWorks::skinImg($this->backPath,'gfx/'.$icon,'',1);
03527                         $selIconInfo = @getimagesize(PATH_typo3.$selIconFile);
03528                 }
03529                 return array($selIconFile,$selIconInfo);
03530         }
03531 
03538         function optionTagStyle($iconString)    {
03539                 if ($iconString)        {
03540                         list($selIconFile,$selIconInfo) = $this->getIcon($iconString);
03541                         $padTop = t3lib_div::intInRange(($selIconInfo[1]-12)/2,0);
03542                         $styleAttr = 'background-image: url('.$selIconFile.'); background-repeat: no-repeat; height: '.t3lib_div::intInRange(($selIconInfo[1]+2)-$padTop,0).'px; padding-top: '.$padTop.'px; padding-left: '.($selIconInfo[0]+4).'px;';
03543                         return $styleAttr;
03544                 }
03545         }
03546 
03554         function extractValuesOnlyFromValueLabelList($itemFormElValue)  {
03555                         // Get values of selected items:
03556                 $itemArray = t3lib_div::trimExplode(',',$itemFormElValue,1);
03557                 foreach($itemArray as $tk => $tv) {
03558                         $tvP = explode('|',$tv,2);
03559                         $tvP[0] = rawurldecode($tvP[0]);
03560 
03561                         $itemArray[$tk] = $tvP[0];
03562                 }
03563                 return $itemArray;
03564         }
03565 
03576         function wrapOpenPalette($header,$table,$row,$palette,$retFunc=0)       {
03577                 $fieldL=array();
03578                 if (!is_array($this->palFieldArr[$palette]))    {$this->palFieldArr[$palette]=array();}
03579                 $palFieldN = is_array($this->palFieldArr[$palette]) ? count($this->palFieldArr[$palette]) : 0;
03580                 $palJSFunc = 'TBE_EDITOR.palUrl(\''.($table.':'.$row['uid'].':'.$palette).'\',\''.implode(',',$this->palFieldArr[$palette]).'\','.$palFieldN.',\''.$table.'\',\''.$row['uid'].'\',1);';
03581 
03582                 $aOnClick = $this->blur().substr($palJSFunc,0,-3).'0);return false;';
03583 
03584                 $iconCode = '<a href="#" onclick="'.htmlspecialchars($aOnClick).'" title="'.htmlspecialchars($table).'">'.
03585                                         $header.
03586                                         '</a>';
03587                 return $retFunc ? array($iconCode,$palJSFunc) : $iconCode;
03588         }
03589 
03600         function checkBoxParams($itemName,$thisValue,$c,$iCount,$addFunc='')    {
03601                 $onClick = $this->elName($itemName).'.value=this.checked?('.$this->elName($itemName).'.value|'.pow(2,$c).'):('.$this->elName($itemName).'.value&'.(pow(2,$iCount)-1-pow(2,$c)).');'.
03602                                         $addFunc;
03603                 $str = ' onclick="'.htmlspecialchars($onClick).'"'.
03604                                 (($thisValue&pow(2,$c))?' checked="checked"':'');
03605                 return $str;
03606         }
03607 
03614         function elName($itemName)      {
03615                 return 'document.'.$this->formName."['".$itemName."']";
03616         }
03617 
03628         function noTitle($str,$wrapParts=array())       {
03629                 return strcmp($str,'') ? $str : $wrapParts[0].'['.$GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.php:labels.no_title').']'.$wrapParts[1];
03630         }
03631 
03637         function blur() {
03638                 return $GLOBALS['CLIENT']['FORMSTYLE'] ? 'this.blur();':'';
03639         }
03640 
03646         function thisReturnUrl()        {
03647                 return $this->returnUrl ? $this->returnUrl : t3lib_div::linkThisScript();
03648         }
03649 
03659         function getSingleHiddenField($table,$field,$row)       {
03660                 global $TCA;
03661                 $out='';
03662                 t3lib_div::loadTCA($table);
03663                 if ($TCA[$table]['columns'][$field])    {
03664 
03665                         $uid=$row['uid'];
03666                         $itemName=$this->prependFormFieldNames.'['.$table.']['.$uid.']['.$field.']';
03667                         $itemValue=$row[$field];
03668                         $item.='<input type="hidden" name="'.$itemName.'" value="'.htmlspecialchars($itemValue).'" />';
03669                         $out = $item;
03670                 }
03671                 return $out;
03672         }
03673 
03681         function formWidth($size=48,$textarea=0)        {
03682                         // Input or text-field attribute (size or cols)
03683                 if ($this->docLarge)    $size = round($size*$this->form_largeComp);
03684                 $wAttrib = $textarea?'cols':'size';
03685                 if (!$GLOBALS['CLIENT']['FORMSTYLE'])   {       // If not setting the width by style-attribute
03686                         $retVal = ' '.$wAttrib.'="'.$size.'"';
03687                 } else {        // Setting width by style-attribute. 'cols' MUST be avoided with NN6+
03688                         $pixels = ceil($size*$this->form_rowsToStylewidth);
03689                         $theStyle = 'width:'.$pixels.'px;'.$this->defStyle.$this->formElStyle($textarea?'text':'input');
03690                         $retVal = ' style="'.htmlspecialchars($theStyle).'"';
03691 
03692                         $class = $this->formElClass($textarea?'text':'input');
03693                         if ($class)     {
03694                                 $retVal.= ' class="'.htmlspecialchars($class).'"';
03695                         }
03696                 }
03697                 return $retVal;
03698         }
03699 
03708         function formWidthText($size=48,$wrap='')       {
03709                 $wTags = $this->formWidth($size,1);
03710                         // Netscape 6+ seems to have this ODD problem where there WILL ALWAYS be wrapping with the cols-attribute set and NEVER without the col-attribute...
03711                 if (strtolower(trim($wrap))!='off' && $GLOBALS['CLIENT']['BROWSER']=='net' && $GLOBALS['CLIENT']['VERSION']>=5) {
03712                         $wTags.= ' cols="'.$size.'"';
03713                 }
03714                 return $wTags;
03715         }
03716 
03724         function formElStyle($type)     {
03725                 return $this->formElStyleClassValue($type);
03726         }
03727 
03735         function formElClass($type)     {
03736                 return $this->formElStyleClassValue($type, TRUE);
03737         }
03738 
03746         function formElStyleClassValue($type, $class=FALSE)     {
03747                         // Get value according to field:
03748                 if (isset($this->fieldStyle[$type]))    {
03749                         $style = trim($this->fieldStyle[$type]);
03750                 } else {
03751                         $style = trim($this->fieldStyle['all']);
03752                 }
03753 
03754                         // Check class prefixed:
03755                 if (substr($style,0,6)=='CLASS:')       {
03756                         $out = $class ? trim(substr($style,6)) : '';
03757                 } else {
03758                         $out = !$class ? $style : '';
03759                 }
03760 
03761                 return $out;
03762         }
03763 
03770         function insertDefStyle($type)  {
03771                 $out = '';
03772 
03773                 $style = trim($this->defStyle.$this->formElStyle($type));
03774                 $out.= $style?' style="'.htmlspecialchars($style).'"':'';
03775 
03776                 $class = $this->formElClass($type);
03777                 $out.= $class?' class="'.htmlspecialchars($class).'"':'';
03778 
03779                 return $out;
03780         }
03781 
03789         function getDynTabMenu($parts, $idString) {
03790                 if (is_object($GLOBALS['TBE_TEMPLATE']))        {
03791                         return $GLOBALS['TBE_TEMPLATE']->getDynTabMenu($parts, $idString);
03792                 } else {
03793                         $output = '';
03794                         foreach($parts as $singlePad)   {
03795                                 $output.='
03796                                 <h3>'.htmlspecialchars($singlePad['label']).'</h3>
03797                                 '.($singlePad['description'] ? '<p class="c-descr">'.nl2br(htmlspecialchars($singlePad['description'])).'</p>' : '').'
03798                                 '.$singlePad['content'];
03799                         }
03800 
03801                         return '<div class="typo3-dyntabmenu-divs">'.$output.'</div>';
03802                 }
03803         }
03804 
03805 
03806 
03807 
03808 
03809 
03810 
03811 
03812 
03813 
03814 
03815         /************************************************************
03816          *
03817          * Item-array manipulation functions (check/select/radio)
03818          *
03819          ************************************************************/
03820 
03828         function initItemArray($fieldValue)     {
03829                 $items = array();
03830                 if (is_array($fieldValue['config']['items']))   {
03831                         reset ($fieldValue['config']['items']);
03832                         while (list($itemName,$itemValue) = each($fieldValue['config']['items']))       {
03833                                 $items[] = array($this->sL($itemValue[0]), $itemValue[1], $itemValue[2]);
03834                         }
03835                 }
03836                 return $items;
03837         }
03838 
03846         function addItems($items,$iArray)       {
03847                 global $TCA;
03848                 if (is_array($iArray))  {
03849                         reset($iArray);
03850                         while(list($value,$label)=each($iArray))        {
03851                                 $items[]=array($this->sl($label),$value);
03852                         }
03853                 }
03854                 return $items;
03855         }
03856 
03868         function procItems($items,$iArray,$config,$table,$row,$field)   {
03869                 global $TCA;
03870 
03871                 $params=array();
03872                 $params['items'] = &$items;
03873                 $params['config'] = $config;
03874                 $params['TSconfig'] = $iArray;
03875                 $params['table'] = $table;
03876                 $params['row'] = $row;
03877                 $params['field'] = $field;
03878 
03879                 t3lib_div::callUserFunction($config['itemsProcFunc'],$params,$this);
03880                 return $items;
03881         }
03882 
03892         function addSelectOptionsToItemArray($items,$fieldValue,$TSconfig,$field)       {
03893                 global $TCA;
03894 
03895                         // Values from foreign tables:
03896                 if ($fieldValue['config']['foreign_table'])     {
03897                         $items = $this->foreignTable($items,$fieldValue,$TSconfig,$field);
03898                         if ($fieldValue['config']['neg_foreign_table']) {
03899                                 $items = $this->foreignTable($items,$fieldValue,$TSconfig,$field,1);
03900                         }
03901                 }
03902 
03903                         // Values from a file folder:
03904                 if ($fieldValue['config']['fileFolder'])        {
03905                         $fileFolder = t3lib_div::getFileAbsFileName($fieldValue['config']['fileFolder']);
03906                         if (@is_dir($fileFolder))       {
03907 
03908                                         // Configurations:
03909                                 $extList = $fieldValue['config']['fileFolder_extList'];
03910                                 $recursivityLevels = isset($fieldValue['config']['fileFolder_recursions']) ? t3lib_div::intInRange($fieldValue['config']['fileFolder_recursions'],0,99) : 99;
03911 
03912                                         // Get files:
03913                                 $fileFolder = ereg_replace('\/$','',$fileFolder).'/';
03914                                 $fileArr = t3lib_div::getAllFilesAndFoldersInPath(array(),$fileFolder,$extList,0,$recursivityLevels);
03915                                 $fileArr = t3lib_div::removePrefixPathFromList($fileArr, $fileFolder);
03916 
03917                                 foreach($fileArr as $fileRef)   {
03918                                         $fI = pathinfo($fileRef);
03919                                         $icon = t3lib_div::inList('gif,png,jpeg,jpg', strtolower($fI['extension'])) ? '../'.substr($fileFolder,strlen(PATH_site)).$fileRef : '';
03920                                         $items[] = array(
03921                                                 $fileRef,
03922                                                 $fileRef,
03923                                                 $icon
03924                                         );
03925                                 }
03926                         }
03927                 }
03928 
03929                         // If 'special' is configured:
03930                 if ($fieldValue['config']['special'])   {
03931                         switch ($fieldValue['config']['special'])       {
03932                                 case 'tables':
03933                                         $temp_tc = array_keys($TCA);
03934                                         $descr = '';
03935 
03936                                         foreach($temp_tc as $theTableNames)     {
03937                                                 if (!$TCA[$theTableNames]['ctrl']['adminOnly']) {
03938 
03939                                                                 // Icon:
03940                                                         $icon = '../'.TYPO3_mainDir.t3lib_iconWorks::skinImg($this->backPath,t3lib_iconWorks::getIcon($theTableNames, array()),'',1);
03941 
03942                                                                 // Add description texts:
03943                                                         if ($this->edit_showFieldHelp)  {
03944                                                                 $GLOBALS['LANG']->loadSingleTableDescription($theTableNames);
03945                                                                 $fDat = $GLOBALS['TCA_DESCR'][$theTableNames]['columns'][''];
03946                                                                 $descr = $fDat['description'];
03947                                                         }
03948 
03949                                                                 // Item configuration:
03950                                                         $items[] = array(
03951                                                                 $this->sL($TCA[$theTableNames]['ctrl']['title']),
03952                                                                 $theTableNames,
03953                                                                 $icon,
03954                                                                 $descr
03955                                                         );
03956                                                 }
03957                                         }
03958                                 break;
03959                                 case 'pagetypes':
03960                                         $theTypes = $TCA['pages']['columns']['doktype']['config']['items'];
03961 
03962                                         foreach($theTypes as $theTypeArrays)    {
03963                                                         // Icon:
03964                                                 $icon = $theTypeArrays[1]!='--div--' ? '../'.TYPO3_mainDir.t3lib_iconWorks::skinImg($this->backPath,t3lib_iconWorks::getIcon('pages', array('doktype' => $theTypeArrays[1])),'',1) : '';
03965 
03966                                                         // Item configuration:
03967                                                 $items[] = array(
03968                                                         $this->sL($theTypeArrays[0]),
03969                                                         $theTypeArrays[1],
03970                                                         $icon
03971                                                 );
03972                                         }
03973                                 break;
03974                                 case 'exclude':
03975                                         $theTypes = t3lib_BEfunc::getExcludeFields();
03976                                         $descr = '';
03977 
03978                                         foreach($theTypes as $theTypeArrays)    {
03979                                                 list($theTable, $theField) = explode(':', $theTypeArrays[1]);
03980 
03981                                                         // Add description texts:
03982                                                 if ($this->edit_showFieldHelp)  {
03983                                                         $GLOBALS['LANG']->loadSingleTableDescription($theTable);
03984                                                         $fDat = $GLOBALS['TCA_DESCR'][$theTable]['columns'][$theField];
03985                                                         $descr = $fDat['description'];
03986                                                 }
03987 
03988                                                         // Item configuration:
03989                                                 $items[] = array(
03990                                                         ereg_replace(':$','',$theTypeArrays[0]),
03991                                                         $theTypeArrays[1],
03992                                                         '',
03993                                                         $descr
03994                                                 );
03995                                         }
03996                                 break;
03997                                 case 'explicitValues':
03998                                         $theTypes = t3lib_BEfunc::getExplicitAuthFieldValues();
03999 
04000                                                         // Icons:
04001                                         $icons = array(
04002                                                 'ALLOW' => '../'.TYPO3_mainDir.t3lib_iconWorks::skinImg($this->backPath,'gfx/icon_ok2.gif','',1),
04003                                                 'DENY' => '../'.TYPO3_mainDir.t3lib_iconWorks::skinImg($this->backPath,'gfx/icon_fatalerror.gif','',1),
04004                                         );
04005 
04006                                                 // Traverse types:
04007                                         foreach($theTypes as $tableFieldKey => $theTypeArrays)  {
04008 
04009                                                 if (is_array($theTypeArrays['items']))  {
04010                                                                 // Add header:
04011                                                         $items[] = array(
04012                                                                 $theTypeArrays['tableFieldLabel'],
04013                                                                 '--div--',
04014                                                         );
04015 
04016                                                                 // Traverse options for this field:
04017                                                         foreach($theTypeArrays['items'] as $itemValue => $itemContent)  {
04018                                                                         // Add item to be selected:
04019                                                                 $items[] = array(
04020                                                                         '['.$itemContent[2].'] '.$itemContent[1],
04021                                                                         $tableFieldKey.':'.ereg_replace('[:|,]','',$itemValue).':'.$itemContent[0],
04022                                                                         $icons[$itemContent[0]]
04023                                                                 );
04024                                                         }
04025                                                 }
04026                                         }
04027                                 break;
04028                                 case 'languages':
04029                                         $items = array_merge($items,t3lib_BEfunc::getSystemLanguages());
04030                                 break;
04031                                 case 'custom':
04032                                                 // Initialize:
04033                                         $customOptions = $GLOBALS['TYPO3_CONF_VARS']['BE']['customPermOptions'];
04034                                         if (is_array($customOptions))   {
04035                                                 foreach($customOptions as $coKey => $coValue) {
04036                                                         if (is_array($coValue['items']))        {
04037                                                                         // Add header:
04038                                                                 $items[] = array(
04039                                                                         $GLOBALS['LANG']->sl($coValue['header']),
04040                                                                         '--div--',
04041                                                                 );
04042 
04043                                                                         // Traverse items:
04044                                                                 foreach($coValue['items'] as $itemKey => $itemCfg)      {
04045                                                                                 // Icon:
04046                                                                         if ($itemCfg[1])        {
04047                                                                                 list($icon) = $this->getIcon($itemCfg[1]);
04048                                                                                 if ($icon)      $icon = '../'.TYPO3_mainDir.$icon;
04049                                                                         } else $icon = '';
04050 
04051                                                                                 // Add item to be selected:
04052                                                                         $items[] = array(
04053                                                                                 $GLOBALS['LANG']->sl($itemCfg[0]),
04054                                                                                 $coKey.':'.ereg_replace('[:|,]','',$itemKey),
04055                                                                                 $icon,
04056                                                                                 $GLOBALS['LANG']->sl($itemCfg[2]),
04057                                                                         );
04058                                                                 }
04059                                                         }
04060                                                 }
04061                                         }
04062                                 break;
04063                                 case 'modListGroup':
04064                                 case 'modListUser':
04065                                         $loadModules = t3lib_div::makeInstance('t3lib_loadModules');
04066                                         $loadModules->load($GLOBALS['TBE_MODULES']);
04067 
04068                                         $modList = $fieldValue['config']['special']=='modListUser' ? $loadModules->modListUser : $loadModules->modListGroup;
04069                                         if (is_array($modList)) {
04070                                                 $descr = '';
04071 
04072                                                 foreach($modList as $theMod)    {
04073 
04074                                                                 // Icon:
04075                                                         $icon = $GLOBALS['LANG']->moduleLabels['tabs_images'][$theMod.'_tab'];
04076                                                         if ($icon)      {
04077                                                                 $icon = '../'.substr($icon,strlen(PATH_site));
04078                                                         }
04079 
04080                                                                 // Description texts:
04081                                                         if ($this->edit_showFieldHelp)  {
04082                                                                 $descr = $GLOBALS['LANG']->moduleLabels['labels'][$theMod.'_tablabel'].
04083                                                                                         chr(10).
04084                                                                                         $GLOBALS['LANG']->moduleLabels['labels'][$theMod.'_tabdescr'];
04085                                                         }
04086 
04087                                                                 // Item configuration:
04088                                                         $items[] = array(
04089                                                                 $this->addSelectOptionsToItemArray_makeModuleData($theMod),
04090                                                                 $theMod,
04091                                                                 $icon,
04092                                                                 $descr
04093                                                         );
04094                                                 }
04095                                         }
04096                                 break;
04097                         }
04098                 }
04099 
04100                         // Return the items:
04101                 return $items;
04102         }
04103 
04112         function addSelectOptionsToItemArray_makeModuleData($value)     {
04113                 $label = '';
04114                         // Add label for main module:
04115                 $pp = explode('_',$value);
04116                 if (count($pp)>1)       $label.=$GLOBALS['LANG']->moduleLabels['tabs'][$pp[0].'_tab'].'>';
04117                         // Add modules own label now:
04118                 $label.= $GLOBALS['LANG']->moduleLabels['tabs'][$value.'_tab'];
04119 
04120                 return $label;
04121         }
04122 
04134         function foreignTable($items,$fieldValue,$TSconfig,$field,$pFFlag=0)    {
04135                 global $TCA;
04136 
04137                         // Init:
04138                 $pF=$pFFlag?'neg_':'';
04139                 $f_table = $fieldValue['config'][$pF.'foreign_table'];
04140                 $uidPre = $pFFlag?'-':'';
04141 
04142                         // Get query:
04143                 $res = t3lib_BEfunc::exec_foreign_table_where_query($fieldValue,$field,$TSconfig,$pF);
04144 
04145                         // Perform lookup
04146                 if ($GLOBALS['TYPO3_DB']->sql_error())  {
04147                         echo($GLOBALS['TYPO3_DB']->sql_error()."\n\nThis may indicate a table defined in tables.php is not existing in the database!");
04148                         return array();
04149                 }
04150 
04151                         // Get label prefix.
04152                 $lPrefix = $this->sL($fieldValue['config'][$pF.'foreign_table_prefix']);
04153 
04154                         // Get icon field + path if any:
04155                 $iField = $TCA[$f_table]['ctrl']['selicon_field'];
04156                 $iPath = trim($TCA[$f_table]['ctrl']['selicon_field_path']);
04157 
04158                         // Traverse the selected rows to add them:
04159                 while ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res))      {
04160                         t3lib_BEfunc::workspaceOL($f_table, $row);
04161                                 // Prepare the icon if available:
04162                         if ($iField && $iPath && $row[$iField]) {
04163                                 $iParts = t3lib_div::trimExplode(',',$row[$iField],1);
04164                                 $icon = '../'.$iPath.'/'.trim($iParts[0]);
04165                         } elseif (t3lib_div::inList('singlebox,checkbox',$fieldValue['config']['renderMode'])) {
04166                                 $icon = '../'.TYPO3_mainDir.t3lib_iconWorks::skinImg($this->backPath,t3lib_iconWorks::getIcon($f_table, $row),'',1);
04167                         } else $icon = '';
04168 
04169                                 // Add the item:
04170                         $items[] = array(
04171                                 $lPrefix.strip_tags(t3lib_BEfunc::getRecordTitle($f_table,$row)),
04172                                 $uidPre.$row['uid'],
04173                                 $icon
04174                         );
04175                 }
04176                 return $items;
04177         }
04178 
04179 
04180 
04181 
04182 
04183 
04184 
04185 
04186 
04187 
04188 
04189 
04190 
04191 
04192 
04193 
04194 
04195 
04196 
04197 
04198 
04199 
04200 
04201 
04202 
04203         /********************************************
04204          *
04205          * Template functions
04206          *
04207          ********************************************/
04208 
04215         function setNewBEDesign()       {
04216 
04217                         // Wrapping all table rows for a particular record being edited:
04218                 $this->totalWrap='
04219                 <table border="0" cellspacing="0" cellpadding="0" width="'.($this->docLarge ? 440+150 : 440).'" class="typo3-TCEforms">'.
04220                         '<tr class="bgColor2">
04221                                 <td>&nbsp;</td>
04222                                 <td>###RECORD_ICON### <span class="typo3-TCEforms-recHeader">###TABLE_TITLE###</span> ###ID_NEW_INDICATOR### - ###RECORD_LABEL###</td>
04223                         </tr>'.
04224                         '|'.
04225                         '<tr>
04226                                 <td>&nbsp;</td>
04227                                 <td><img src="clear.gif" width="'.($this->docLarge ? 440+150 : 440).'" height="1" alt="" /></td>
04228                         </tr>
04229                 </table>';
04230 
04231                         // Wrapping a single field:
04232                 $this->fieldTemplate='
04233                         <tr ###BGCOLOR_HEAD######CLASSATTR_2###>
04234                                 <td>###FIELD_HELP_ICON###</td>
04235                                 <td width="99%"><span style="color:###FONTCOLOR_HEAD###;"###CLASSATTR_4###><b>###FIELD_NAME###</b></span>###FIELD_HELP_TEXT###</td>
04236                         </tr>
04237                         <tr ###BGCOLOR######CLASSATTR_1###>
04238                                 <td nowrap="nowrap"><img name="req_###FIELD_TABLE###_###FIELD_ID###_###FIELD_FIELD###" src="clear.gif" width="10" height="10" alt="" /><img name="cm_###FIELD_TABLE###_###FIELD_ID###_###FIELD_FIELD###" src="clear.gif" width="7" height="10" alt="" /></td>
04239                                 <td valign="top">###FIELD_ITEM######FIELD_PAL_LINK_ICON###</td>
04240                         </tr>';
04241 
04242                 $this->palFieldTemplate='
04243                         <tr ###BGCOLOR######CLASSATTR_1###>
04244                                 <td>&nbsp;</td>
04245                                 <td nowrap="nowrap" valign="top">###FIELD_PALETTE###</td>
04246                         </tr>';
04247                 $this->palFieldTemplateHeader='
04248                         <tr ###BGCOLOR_HEAD######CLASSATTR_2###>
04249                                 <td>&nbsp;</td>
04250                                 <td nowrap="nowrap" valign="top"><strong>###FIELD_HEADER###</strong></td>
04251                         </tr>';
04252 
04253                 $this->sectionWrap='
04254                         <tr>
04255                                 <td colspan="2"><img src="clear.gif" width="1" height="###SPACE_BEFORE###" alt="" /></td>
04256                         </tr>
04257                         <tr>
04258                                 <td colspan="2"><table ###TABLE_ATTRIBS###>###CONTENT###</table></td>
04259                         </tr>
04260                         ';
04261         }
04262 
04270         function intoTemplate($inArr,$altTemplate='')   {
04271                                 // Put into template_
04272                 $fieldTemplateParts = explode('###FIELD_',$this->rplColorScheme($altTemplate?$altTemplate:$this->fieldTemplate));
04273                 reset($fieldTemplateParts);
04274                 $out=current($fieldTemplateParts);
04275                 while(list(,$part)=each($fieldTemplateParts))   {
04276                         list($key,$val)=explode('###',$part,2);
04277                         $out.=$inArr[$key];
04278                         $out.=$val;
04279                 }
04280                 return $out;
04281         }
04282 
04294         function addUserTemplateMarkers($marker,$table,$field,$row,&$PA)        {
04295                 return $marker;
04296         }
04297 
04305         function wrapLabels($str)       {
04306                 return $str;
04307         }
04308 
04318         function wrapTotal($c,$rec,$table)      {
04319                 $parts = $this->replaceTableWrap(explode('|',$this->totalWrap,2),$rec,$table);
04320                 return $parts[0].$c.$parts[1].implode('',$this->hiddenFieldAccum);
04321         }
04322 
04331         function replaceTableWrap($arr,$rec,$table)     {
04332                 global $TCA;
04333 
04334                         // Make "new"-label
04335                 if (strstr($rec['uid'],'NEW'))  {
04336                         $newLabel = ' <span class="typo3-TCEforms-newToken">'.
04337                                                 $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.php:labels.new',1).
04338                                                 '</span>';
04339 
04340                         #t3lib_BEfunc::fixVersioningPid($table,$rec);   // Kasper: Should not be used here because NEW records are not offline workspace versions...
04341                         $truePid = t3lib_BEfunc::getTSconfig_pidValue($table,$rec['uid'],$rec['pid']);
04342                         $prec = t3lib_BEfunc::getRecordWSOL('pages',$truePid,'title');
04343                         $rLabel = '<em>[PID: '.$truePid.'] '.htmlspecialchars(trim(t3lib_div::fixed_lgd_cs(t3lib_BEfunc::getRecordTitle('pages',$prec),40))).'</em>';
04344                 } else {
04345                         $newLabel = ' <span class="typo3-TCEforms-recUid">['.$rec['uid'].']</span>';
04346                         $rLabel  = htmlspecialchars(trim(t3lib_div::fixed_lgd_cs(t3lib_BEfunc::getRecordTitle($table,$rec),40)));
04347                 }
04348 
04349                 foreach ($arr as $k => $v)      {
04350                                 // Make substitutions:
04351                         $arr[$k] = str_replace('###ID_NEW_INDICATOR###', $newLabel, $arr[$k]);
04352                         $arr[$k] = str_replace('###RECORD_LABEL###',$rLabel,$arr[$k]);
04353                         $arr[$k] = str_replace('###TABLE_TITLE###',htmlspecialchars($this->sL($TCA[$table]['ctrl']['title'])),$arr[$k]);
04354 
04355                         $titleA=t3lib_BEfunc::titleAltAttrib($this->getRecordPath($table,$rec));
04356                         $arr[$k]=str_replace('###RECORD_ICON###',t3lib_iconWorks::getIconImage($table,$rec,$this->backPath,'class="absmiddle"'.$titleA),$arr[$k]);
04357                 }
04358                 return $arr;
04359         }
04360 
04368         function wrapBorder(&$out_array,&$out_pointer)  {
04369                 if ($this->sectionWrap && $out_array[$out_pointer])     {
04370                         $tableAttribs='';
04371                         $tableAttribs.= $this->borderStyle[0] ? ' style="'.htmlspecialchars($this->borderStyle[0]).'"':'';
04372                         $tableAttribs.= $this->borderStyle[2] ? ' background="'.htmlspecialchars($this->backPath.$this->borderStyle[2]).'"':'';
04373                         $tableAttribs.= $this->borderStyle[3] ? ' class="'.htmlspecialchars($this->borderStyle[3]).'"':'';
04374                         if ($tableAttribs)      {
04375                                 $tableAttribs='border="0" cellspacing="0" cellpadding="0" width="100%"'.$tableAttribs;
04376                                 $out_array[$out_pointer] = str_replace('###CONTENT###',$out_array[$out_pointer],
04377                                         str_replace('###TABLE_ATTRIBS###',$tableAttribs,
04378                                                 str_replace('###SPACE_BEFORE###',intval($this->borderStyle[1]),$this->sectionWrap)));
04379                         }
04380                         $out_pointer++;
04381                 }
04382         }
04383 
04390         function rplColorScheme($inTemplate)    {
04391                         // Colors:
04392                 $inTemplate = str_replace('###BGCOLOR###',$this->colorScheme[0]?' bgcolor="'.$this->colorScheme[0].'"':'',$inTemplate);
04393                 $inTemplate = str_replace('###BGCOLOR_HEAD###',$this->colorScheme[1]?' bgcolor="'.$this->colorScheme[1].'"':'',$inTemplate);
04394                 $inTemplate = str_replace('###FONTCOLOR_HEAD###',$this->colorScheme[3],$inTemplate);
04395 
04396                         // Classes:
04397                 $inTemplate = str_replace('###CLASSATTR_1###',$this->classScheme[0]?' class="'.$this->classScheme[0].'"':'',$inTemplate);
04398                 $inTemplate = str_replace('###CLASSATTR_2###',$this->classScheme[1]?' class="'.$this->classScheme[1].'"':'',$inTemplate);
04399                 $inTemplate = str_replace('###CLASSATTR_4###',$this->classScheme[3]?' class="'.$this->classScheme[3].'"':'',$inTemplate);
04400 
04401                 return $inTemplate;
04402         }
04403 
04410         function getDivider()   {
04411                 //return "<hr />";
04412         }
04413 
04420         function printPalette($palArr)  {
04421 
04422                         // Init color/class attributes:
04423                 $ccAttr2 = $this->colorScheme[2] ? ' bgcolor="'.$this->colorScheme[2].'"' : '';
04424                 $ccAttr2.= $this->classScheme[2] ? ' class="'.$this->classScheme[2].'"' : '';
04425                 $ccAttr4 = $this->colorScheme[4] ? ' style="color:'.$this->colorScheme[4].'"' : '';
04426                 $ccAttr4.= $this->classScheme[4] ? ' class="'.$this->classScheme[4].'"' : '';
04427 
04428                         // Traverse palette fields and render them into table rows:
04429                 foreach($palArr as $content)    {
04430                         $hRow[]='<td'.$ccAttr2.'>&nbsp;</td>
04431                                         <td nowrap="nowrap"'.$ccAttr2.'>'.
04432                                                 '<span'.$ccAttr4.'>'.
04433                                                         $content['NAME'].
04434                                                 '</span>'.
04435                                         '</td>';
04436                         $iRow[]='<td valign="top">'.
04437                                                 '<img name="req_'.$content['TABLE'].'_'.$content['ID'].'_'.$content['FIELD'].'" src="clear.gif" width="10" height="10" vspace="4" alt="" />'.
04438                                                 '<img name="cm_'.$content['TABLE'].'_'.$content['ID'].'_'.$content['FIELD'].'" src="clear.gif" width="7" height="10" vspace="4" alt="" />'.
04439                                         '</td>
04440                                         <td nowrap="nowrap" valign="top">'.
04441                                                 $content['ITEM'].
04442                                                 $content['HELP_ICON'].
04443                                         '</td>';
04444                 }
04445 
04446                         // Final wrapping into the table:
04447                 $out='<table border="0" cellpadding="0" cellspacing="0" class="typo3-TCEforms-palette">
04448                         <tr>
04449                                 <td><img src="clear.gif" width="'.intval($this->paletteMargin).'" height="1" alt="" /></td>'.
04450                                         implode('
04451                                 ',$hRow).'
04452                         </tr>
04453                         <tr>
04454                                 <td></td>'.
04455                                         implode('
04456                                 ',$iRow).'
04457                         </tr>
04458                 </table>';
04459 
04460                 return $out;
04461         }
04462 
04471         function helpTextIcon($table,$field,$force=0)   {
04472                 if ($this->globalShowHelp && $GLOBALS['TCA_DESCR'][$table]['columns'][$field] && (($this->edit_showFieldHelp=='icon'&&!$this->doLoadTableDescr($table)) || $force))     {
04473                         $aOnClick = 'vHWin=window.open(\''.$this->backPath.'view_help.php?tfID='.($table.'.'.$field).'\',\'viewFieldHelp\',\'height=400,width=600,status=0,menubar=0,scrollbars=1\');vHWin.focus();return false;';
04474                         return '<a href="#" onclick="'.htmlspecialchars($aOnClick).'">'.
04475                                         '<img'.t3lib_iconWorks::skinImg($this->backPath,'gfx/helpbubble.gif','width="14" height="14"').' hspace="2" border="0" class="absmiddle"'.($GLOBALS['CLIENT']['FORMSTYLE']?' style="cursor:help;"':'').' alt="" />'.
04476                                         '</a>';
04477                 } else {
04478                                 // Detects fields with no CSH and outputs dummy line to insert into CSH locallang file:
04479                         #debug(array("'".$field.".description' => '[FILL IN] ".$table."->".$field."',"),$table);
04480                         return '<span class="nbsp">&nbsp;</span>';
04481                 }
04482         }
04483 
04491         function helpText($table,$field)        {
04492                 if ($this->globalShowHelp && $GLOBALS['TCA_DESCR'][$table]['columns'][$field] && ($this->edit_showFieldHelp=='text' || $this->doLoadTableDescr($table)))        {
04493                         $fDat = $GLOBALS['TCA_DESCR'][$table]['columns'][$field];
04494                         return '<table border="0" cellpadding="2" cellspacing="0" width="90%"><tr><td valign="top" width="14">'.
04495                                         $this->helpTextIcon(
04496                                                 $table,
04497                                                 $field,
04498                                                 $fDat['details']||$fDat['syntax']||$fDat['image_descr']||$fDat['image']||$fDat['seeAlso']
04499                                         ).
04500                                         '</td><td valign="top"><span class="typo3-TCEforms-helpText">'.
04501                                         $GLOBALS['LANG']->hscAndCharConv(strip_tags($fDat['description']),1).
04502                                         '</span></td></tr></table>';
04503                 }
04504         }
04505 
04512         function setColorScheme($scheme)        {
04513                 $this->colorScheme = $this->defColorScheme;
04514                 $this->classScheme = $this->defClassScheme;
04515 
04516                 $parts = t3lib_div::trimExplode(',',$scheme);
04517                 foreach($parts as $key => $col) {
04518                                 // Split for color|class:
04519                         list($color,$class) = t3lib_div::trimExplode('|',$col);
04520 
04521                                 // Handle color values:
04522                         if ($color)     $this->colorScheme[$key] = $color;
04523                         if ($color=='-')        $this->colorScheme[$key] = '';
04524 
04525                                 // Handle class values:
04526                         if ($class)     $this->classScheme[$key] = $class;
04527                         if ($class=='-')        $this->classScheme[$key] = '';
04528                 }
04529         }
04530 
04536         function resetSchemes() {
04537                 $this->setColorScheme($GLOBALS['TBE_STYLES']['colorschemes'][0]);
04538                 $this->fieldStyle = $GLOBALS['TBE_STYLES']['styleschemes'][0];
04539                 $this->borderStyle = $GLOBALS['TBE_STYLES']['borderschemes'][0];
04540         }
04541 
04547         function storeSchemes() {
04548                 $this->savedSchemes['classScheme'] = $this->classScheme;
04549                 $this->savedSchemes['colorScheme'] = $this->colorScheme;
04550                 $this->savedSchemes['fieldStyle'] = $this->fieldStyle;
04551                 $this->savedSchemes['borderStyle'] = $this->borderStyle;
04552         }
04553 
04559         function restoreSchemes()       {
04560                 $this->classScheme = $this->savedSchemes['classScheme'];
04561                 $this->colorScheme = $this->savedSchemes['colorScheme'];
04562                 $this->fieldStyle = $this->savedSchemes['fieldStyle'];
04563                 $this->borderStyle = $this->savedSchemes['borderStyle'];
04564         }
04565 
04566 
04567 
04568 
04569 
04570 
04571 
04572 
04573 
04574 
04575 
04576 
04577 
04578         /********************************************
04579          *
04580          * JavaScript related functions
04581          *
04582          ********************************************/
04583 
04589         function JStop()        {
04590 
04591                 $out = '';
04592 
04593                         // Additional top HTML:
04594                 if (count($this->additionalCode_pre))   {
04595                         $out.= implode('
04596 
04597                                 <!-- NEXT: -->
04598                         ',$this->additionalCode_pre);
04599                 }
04600 
04601                         // Additional top JavaScript
04602                 if (count($this->additionalJS_pre))     {
04603                         $out.='
04604 
04605 
04606                 <!--
04607                         JavaScript in top of page (before form):
04608                 -->
04609 
04610                 <script type="text/javascript">
04611                         /*<![CDATA[*/
04612 
04613                         '.implode('
04614 
04615                                 // NEXT:
04616                         ',$this->additionalJS_pre).'
04617 
04618                         /*]]>*/
04619                 </script>
04620                         ';
04621                 }
04622 
04623                         // Return result:
04624                 return $out;
04625         }
04626 
04641         function JSbottom($formname='forms[0]', $update = false)        {
04642                 $jsFile = array();
04643                 $elements = array();
04644 
04645                         // required:
04646                 foreach ($this->requiredFields as $itemImgName => $itemName) {
04647                         if (preg_match('/^(.+)\[((\w|\d|_)+)\]$/', $itemName, $match)) {
04648                                 $record = $match[1];
04649                                 $field = $match[2];
04650                                 $elements[$record][$field]['required'] = 1;
04651                                 $elements[$record][$field]['requiredImg'] = $itemImgName;
04652                         }
04653                 }
04654                         // range:
04655                 foreach ($this->requiredElements as $itemName => $range) {
04656                         if (preg_match('/^(.+)\[((\w|\d|_)+)\]$/', $itemName, $match)) {
04657                                 $record = $match[1];
04658                                 $field = $match[2];
04659                                 $elements[$record][$field]['range'] = array($range[0], $range[1]);
04660                                 $elements[$record][$field]['rangeImg'] = $range['imgName'];
04661                         }
04662                 }
04663 
04664                 $this->TBE_EDITOR_fieldChanged_func='TBE_EDITOR.fieldChanged_fName(fName,formObj[fName+"_list"]);';
04665 
04666                 if (!$update) {
04667                         if ($this->loadMD5_JS) {
04668                                 $jsFile[] =     '<script type="text/javascript" src="'.$this->backPath.'md5.js"></script>';
04669                         }
04670 
04671                         $jsFile[] = '<script type="text/javascript" src="'.$this->backPath.'contrib/prototype/prototype.js"></script>';
04672                         $jsFile[] =     '<script type="text/javascript" src="'.$this->backPath.'../t3lib/jsfunc.evalfield.js"></script>';
04673                         $jsFile[] =     '<script type="text/javascript" src="'.$this->backPath.'jsfunc.tbe_editor.js"></script>';
04674 
04675                                 // if IRRE fields were processed, add the JavaScript functions:
04676                         if ($this->inline->inlineCount) {
04677                                 $jsFile[] = '<script src="'.$this->backPath.'contrib/scriptaculous/scriptaculous.js" type="text/javascript"></script>';
04678                                 $jsFile[] = '<script src="'.$this->backPath.'../t3lib/jsfunc.inline.js" type="text/javascript"></script>';
04679                                 $out .= '
04680                                 inline.setPrependFormFieldNames("'.$this->inline->prependNaming.'");
04681                                 inline.setNoTitleString("'.addslashes(t3lib_BEfunc::getNoRecordTitle(true)).'");
04682                                 ';
04683                         }
04684 
04685                         $out .= '
04686                         TBE_EDITOR.images.req.src = "'.t3lib_iconWorks::skinImg($this->backPath,'gfx/required_h.gif','',1).'";
04687                         TBE_EDITOR.images.cm.src = "'.t3lib_iconWorks::skinImg($this->backPath,'gfx/content_client.gif','',1).'";
04688                         TBE_EDITOR.images.sel.src = "'.t3lib_iconWorks::skinImg($this->backPath,'gfx/content_selected.gif','',1).'";
04689                         TBE_EDITOR.images.clear.src = "'.$this->backPath.'clear.gif";
04690 
04691                         TBE_EDITOR.auth_timeout_field = '.intval($GLOBALS['BE_USER']->auth_timeout_field).';
04692                         TBE_EDITOR.formname = "'.$formname.'";
04693                         TBE_EDITOR.formnameUENC = "'.rawurlencode($formname).'";
04694                         TBE_EDITOR.backPath = "'.addslashes($this->backPath).'";
04695                         TBE_EDITOR.prependFormFieldNames = "'.$this->prependFormFieldNames.'";
04696                         TBE_EDITOR.prependFormFieldNamesUENC = "'.rawurlencode($this->prependFormFieldNames).'";
04697                         TBE_EDITOR.prependFormFieldNamesCnt = '.substr_count($this->prependFormFieldNames,'[').';
04698                         TBE_EDITOR.isPalettedoc = '.($this->isPalettedoc ? addslashes($this->isPalettedoc) : 'null').';
04699                         TBE_EDITOR.doSaveFieldName = "'.($this->doSaveFieldName ? addslashes($this->doSaveFieldName) : '').'";
04700                         TBE_EDITOR.labels.fieldsChanged = '.$GLOBALS['LANG']->JScharCode($GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.php:labels.fieldsChanged')).';
04701                         TBE_EDITOR.labels.fieldsMissing = '.$GLOBALS['LANG']->JScharCode($GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.php:labels.fieldsMissing')).';
04702                         TBE_EDITOR.labels.refresh_login = '.$GLOBALS['LANG']->JScharCode($this->getLL('m_refresh_login')).';
04703                         TBE_EDITOR.labels.onChangeAlert = '.$GLOBALS['LANG']->JScharCode($this->getLL('m_onChangeAlert')).';
04704                         evalFunc.USmode = '.($GLOBALS['TYPO3_CONF_VARS']['SYS']['USdateFormat']?'1':'0').';
04705                         ';
04706                 }
04707 
04708                         // add JS required for inline fields
04709                 if (count($this->inline->inlineData)) {
04710                         $out .= '
04711                         inline.addToDataArray('.$this->inline->getJSON($this->inline->inlineData).');
04712                         ';
04713                 }
04714                         // elements which are required or have a range definition:
04715                 if (count($elements)) {
04716                         $out .= '
04717                         TBE_EDITOR.addElements('.$this->inline->getJSON($elements).');
04718                         TBE_EDITOR.initRequired()
04719                         ';
04720                 }
04721                         // $this->additionalJS_post:
04722                 if ($this->additionalJS_submit) {
04723                         $additionalJS_submit = implode('', $this->additionalJS_submit);
04724                         $additionalJS_submit = str_replace("\r", '', $additionalJS_submit);
04725                         $additionalJS_submit = str_replace("\n", '', $additionalJS_submit);
04726                         $out .= '
04727                         TBE_EDITOR.addActionChecks("submit", "'.addslashes($additionalJS_submit).'");
04728                         ';
04729                 }
04730 
04731                 $out .= chr(10).implode(chr(10),$this->additionalJS_post).chr(10).$this->extJSCODE;
04732                 $out .= '
04733                         TBE_EDITOR.loginRefreshed();
04734                 ';
04735 
04736                         // Regular direct output:
04737                 if (!$update) {
04738                         $spacer = chr(10).chr(9);
04739                         $out  = $spacer.implode($spacer, $jsFile).t3lib_div::wrapJS($out);
04740                 }
04741 
04742                 return $out;
04743         }
04744 
04751         function dbFileCon($formObj='document.forms[0]')        {
04752                         // @TODO: Export this to an own file, it is more static than dynamic JavaScript -- olly
04753                 $str='
04754 
04755                         // ***************
04756                         // Used to connect the db/file browser with this document and the formfields on it!
04757                         // ***************
04758 
04759                         var browserWin="";
04760 
04761                         function setFormValueOpenBrowser(mode,params) { //
04762                                 var url = "'.$this->backPath.'browser.php?mode="+mode+"&bparams="+params;
04763 
04764                                 browserWin = window.open(url,"Typo3WinBrowser","height=350,width="+(mode=="db"?650:600)+",status=0,menubar=0,resizable=1,scrollbars=1");
04765                                 browserWin.focus();
04766                         }
04767                         function setFormValueFromBrowseWin(fName,value,label,exclusiveValues)   {       //
04768                                 var formObj = setFormValue_getFObj(fName)
04769                                 if (formObj && value!="--div--")        {
04770                                         fObj = formObj[fName+"_list"];
04771                                         var len = fObj.length;
04772                                                 // Clear elements if exclusive values are found
04773                                         if (exclusiveValues)    {
04774                                                 var m = new RegExp("(^|,)"+value+"($|,)");
04775                                                 if (exclusiveValues.match(m))   {
04776                                                                 // the new value is exclusive
04777                                                         for (a=len-1;a>=0;a--)  fObj[a] = null;
04778                                                         len = 0;
04779                                                 } else if (len == 1)    {
04780                                                         m = new RegExp("(^|,)"+fObj.options[0].value+"($|,)");
04781                                                         if (exclusiveValues.match(m))   {
04782                                                                         // the old value is exclusive
04783                                                                 fObj[0] = null;
04784                                                                 len = 0;
04785                                                         }
04786                                                 }
04787                                         }
04788                                                 // Inserting element
04789                                         var setOK = 1;
04790                                         if (!formObj[fName+"_mul"] || formObj[fName+"_mul"].value==0)   {
04791                                                 for (a=0;a<len;a++)     {
04792                                                         if (fObj.options[a].value==value)       {
04793                                                                 setOK = 0;
04794                                                         }
04795                                                 }
04796                                         }
04797                                         if (setOK)      {
04798                                                 fObj.length++;
04799                                                 fObj.options[len].value = value;
04800                                                 fObj.options[len].text = unescape(label);
04801 
04802                                                         // Traversing list and set the hidden-field
04803                                                 setHiddenFromList(fObj,formObj[fName]);
04804                                                 '.$this->TBE_EDITOR_fieldChanged_func.'
04805                                         }
04806                                 }
04807                         }
04808                         function setHiddenFromList(fObjSel,fObjHid)     {       //
04809                                 l=fObjSel.length;
04810                                 fObjHid.value="";
04811                                 for (a=0;a<l;a++)       {
04812                                         fObjHid.value+=fObjSel.options[a].value+",";
04813                                 }
04814                         }
04815                         function setFormValueManipulate(fName,type)     {       //
04816                                 var formObj = setFormValue_getFObj(fName)
04817                                 if (formObj)    {
04818                                         var localArray_V = new Array();
04819                                         var localArray_L = new Array();
04820                                         var localArray_S = new Array();
04821                                         var fObjSel = formObj[fName+"_list"];
04822                                         var l=fObjSel.length;
04823                                         var c=0;
04824                                         if (type=="Remove" || type=="Top" || type=="Bottom")    {
04825                                                 if (type=="Top")        {
04826                                                         for (a=0;a<l;a++)       {
04827                                                                 if (fObjSel.options[a].selected==1)     {
04828                                                                         localArray_V[c]=fObjSel.options[a].value;
04829                                                                         localArray_L[c]=fObjSel.options[a].text;
04830                                                                         localArray_S[c]=1;
04831                                                                         c++;
04832                                                                 }
04833                                                         }
04834                                                 }
04835                                                 for (a=0;a<l;a++)       {
04836                                                         if (fObjSel.options[a].selected!=1)     {
04837                                                                 localArray_V[c]=fObjSel.options[a].value;
04838                                                                 localArray_L[c]=fObjSel.options[a].text;
04839                                                                 localArray_S[c]=0;
04840                                                                 c++;
04841                                                         }
04842                                                 }
04843                                                 if (type=="Bottom")     {
04844                                                         for (a=0;a<l;a++)       {
04845                                                                 if (fObjSel.options[a].selected==1)     {
04846                                                                         localArray_V[c]=fObjSel.options[a].value;
04847                                                                         localArray_L[c]=fObjSel.options[a].text;
04848                                                                         localArray_S[c]=1;
04849                                                                         c++;
04850                                                                 }
04851                                                         }
04852                                                 }
04853                                         }
04854                                         if (type=="Down")       {
04855                                                 var tC = 0;
04856                                                 var tA = new Array();
04857 
04858                                                 for (a=0;a<l;a++)       {
04859                                                         if (fObjSel.options[a].selected!=1)     {
04860                                                                         // Add non-selected element:
04861                                                                 localArray_V[c]=fObjSel.options[a].value;
04862                                                                 localArray_L[c]=fObjSel.options[a].text;
04863                                                                 localArray_S[c]=0;
04864                                                                 c++;
04865 
04866                                                                         // Transfer any accumulated and reset:
04867                                                                 if (tA.length > 0)      {
04868                                                                         for (aa=0;aa<tA.length;aa++)    {
04869                                                                                 localArray_V[c]=fObjSel.options[tA[aa]].value;
04870                                                                                 localArray_L[c]=fObjSel.options[tA[aa]].text;
04871                                                                                 localArray_S[c]=1;
04872                                                                                 c++;
04873                                                                         }
04874 
04875                                                                         var tC = 0;
04876                                                                         var tA = new Array();
04877                                                                 }
04878                                                         } else {
04879                                                                 tA[tC] = a;
04880                                                                 tC++;
04881                                                         }
04882                                                 }
04883                                                         // Transfer any remaining:
04884                                                 if (tA.length > 0)      {
04885                                                         for (aa=0;aa<tA.length;aa++)    {
04886                                                                 localArray_V[c]=fObjSel.options[tA[aa]].value;
04887                                                                 localArray_L[c]=fObjSel.options[tA[aa]].text;
04888                                                                 localArray_S[c]=1;
04889                                                                 c++;
04890                                                         }
04891                                                 }
04892                                         }
04893                                         if (type=="Up") {
04894                                                 var tC = 0;
04895                                                 var tA = new Array();
04896                                                 var c = l-1;
04897 
04898                                                 for (a=l-1;a>=0;a--)    {
04899                                                         if (fObjSel.options[a].selected!=1)     {
04900 
04901                                                                         // Add non-selected element:
04902                                                                 localArray_V[c]=fObjSel.options[a].value;
04903                                                                 localArray_L[c]=fObjSel.options[a].text;
04904                                                                 localArray_S[c]=0;
04905                                                                 c--;
04906 
04907                                                                         // Transfer any accumulated and reset:
04908                                                                 if (tA.length > 0)      {
04909                                                                         for (aa=0;aa<tA.length;aa++)    {
04910                                                                                 localArray_V[c]=fObjSel.options[tA[aa]].value;
04911                                                                                 localArray_L[c]=fObjSel.options[tA[aa]].text;
04912                                                                                 localArray_S[c]=1;
04913                                                                                 c--;
04914                                                                         }
04915 
04916                                                                         var tC = 0;
04917                                                                         var tA = new Array();
04918                                                                 }
04919                                                         } else {
04920                                                                 tA[tC] = a;
04921                                                                 tC++;
04922                                                         }
04923                                                 }
04924                                                         // Transfer any remaining:
04925                                                 if (tA.length > 0)      {
04926                                                         for (aa=0;aa<tA.length;aa++)    {
04927                                                                 localArray_V[c]=fObjSel.options[tA[aa]].value;
04928                                                                 localArray_L[c]=fObjSel.options[tA[aa]].text;
04929                                                                 localArray_S[c]=1;
04930                                                                 c--;
04931                                                         }
04932                                                 }
04933                                                 c=l;    // Restore length value in "c"
04934                                         }
04935 
04936                                                 // Transfer items in temporary storage to list object:
04937                                         fObjSel.length = c;
04938                                         for (a=0;a<c;a++)       {
04939                                                 fObjSel.options[a].value = localArray_V[a];
04940                                                 fObjSel.options[a].text = localArray_L[a];
04941                                                 fObjSel.options[a].selected = localArray_S[a];
04942                                         }
04943                                         setHiddenFromList(fObjSel,formObj[fName]);
04944 
04945                                         '.$this->TBE_EDITOR_fieldChanged_func.'
04946                                 }
04947                         }
04948                         function setFormValue_getFObj(fName)    {       //
04949                                 var formObj = '.$formObj.';
04950                                 if (formObj)    {
04951                                         if (formObj[fName] && formObj[fName+"_list"] && formObj[fName+"_list"].type=="select-multiple") {
04952                                                 return formObj;
04953                                         } else {
04954                                                 alert("Formfields missing:\n fName: "+formObj[fName]+"\n fName_list:"+formObj[fName+"_list"]+"\n type:"+formObj[fName+"_list"].type+"\n fName:"+fName);
04955                                         }
04956                                 }
04957                                 return "";
04958                         }
04959 
04960                         // END: dbFileCon parts.
04961                 ';
04962                 return $str;
04963         }
04964 
04970         function printNeededJSFunctions()       {
04971                         // JS evaluation:
04972                 $out = $this->JSbottom($this->formName);
04973                         //
04974                 if ($this->printNeededJS['dbFileIcons'])        {
04975                         $out.= '
04976 
04977 
04978 
04979                         <!--
04980                                 JavaScript after the form has been drawn:
04981                         -->
04982 
04983                         <script type="text/javascript">
04984                                 /*<![CDATA[*/
04985                         '.$this->dbFileCon('document.'.$this->formName).'
04986                                 /*]]>*/
04987                         </script>';
04988                 }
04989                 return $out;
04990         }
04991 
04997         function printNeededJSFunctions_top()   {
04998                         // JS evaluation:
04999                 $out = $this->JStop($this->formName);
05000                 return $out;
05001         }
05002 
05003 
05004 
05005 
05006 
05007 
05008 
05009 
05010 
05011 
05012 
05013 
05014 
05015 
05016 
05017 
05018 
05019 
05020 
05021 
05022 
05023 
05024 
05025 
05026 
05027 
05028 
05029 
05030 
05031         /********************************************
05032          *
05033          * Various helper functions
05034          *
05035          ********************************************/
05036 
05037 
05045         function getDefaultRecord($table,$pid=0)        {
05046                 global $TCA;
05047                 if ($TCA[$table])       {
05048                         t3lib_div::loadTCA($table);
05049                         $row = array();
05050 
05051                         if ($pid<0 && $TCA[$table]['ctrl']['useColumnsForDefaultValues'])       {
05052                                         // Fetches the previous record:
05053                                 $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery('*', $table, 'uid='.abs($pid).t3lib_BEfunc::deleteClause($table));
05054                                 if ($drow = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res))        {
05055                                                 // Gets the list of fields to copy from the previous record.
05056                                         $fArr = explode(',',$TCA[$table]['ctrl']['useColumnsForDefaultValues']);
05057                                         foreach($fArr as $theF) {
05058                                                 if ($TCA[$table]['columns'][$theF])     {
05059                                                         $row[$theF] = $drow[$theF];
05060                                                 }
05061                                         }
05062                                 }
05063                                 $GLOBALS['TYPO3_DB']->sql_free_result($res);
05064                         }
05065 
05066                         foreach($TCA[$table]['columns'] as $field => $info)     {
05067                                 if (isset($info['config']['default']))  {
05068                                         $row[$field] = $info['config']['default'];
05069                                 }
05070                         }
05071 
05072                         return $row;
05073                 }
05074         }
05075 
05084         function getRecordPath($table,$rec)     {
05085                 t3lib_BEfunc::fixVersioningPid($table,$rec);
05086                 list($tscPID,$thePidValue)=$this->getTSCpid($table,$rec['uid'],$rec['pid']);
05087                 if ($thePidValue>=0)    {
05088                         return t3lib_BEfunc::getRecordPath($tscPID,$this->readPerms(),15);
05089                 }
05090         }
05091 
05098         function readPerms()    {
05099                 if (!$this->perms_clause_set)   {
05100                         $this->perms_clause = $GLOBALS['BE_USER']->getPagePermsClause(1);
05101                         $this->perms_clause_set=1;
05102                 }
05103                 return $this->perms_clause;
05104         }
05105 
05112         function sL($str)       {
05113                 return $GLOBALS['LANG']->sL($str);
05114         }
05115 
05125         function getLL($str)    {
05126                 $content = '';
05127 
05128                 switch(substr($str,0,2))        {
05129                         case 'l_':
05130                                 $content = $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.php:labels.'.substr($str,2));
05131                         break;
05132                         case 'm_':
05133                                 $content = $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.php:mess.'.substr($str,2));
05134                         break;
05135                 }
05136                 return $content;
05137         }
05138 
05146         function isPalettesCollapsed($table,$palette)   {
05147                 global $TCA;
05148 
05149                 if ($TCA[$table]['ctrl']['canNotCollapse']) return 0;
05150                 if (is_array($TCA[$table]['palettes'][$palette]) && $TCA[$table]['palettes'][$palette]['canNotCollapse'])       return 0;
05151                 return $this->palettesCollapsed;
05152         }
05153 
05162         function isDisplayCondition($displayCond,$row,$ffValueKey='')   {
05163                 $output = FALSE;
05164 
05165                 $parts = explode(':',$displayCond);
05166                 switch((string)$parts[0])       {       // Type of condition:
05167                         case 'FIELD':
05168                                 $theFieldValue = $ffValueKey ? $row[$parts[1]][$ffValueKey] : $row[$parts[1]];
05169 
05170                                 switch((string)$parts[2])       {
05171                                         case 'REQ':
05172                                                 if (strtolower($parts[3])=='true')      {
05173                                                         $output = $theFieldValue ? TRUE : FALSE;
05174                                                 } elseif (strtolower($parts[3])=='false') {
05175                                                         $output = !$theFieldValue ? TRUE : FALSE;
05176                                                 }
05177                                         break;
05178                                         case '>':
05179                                                 $output = $theFieldValue > $parts[3];
05180                                         break;
05181                                         case '<':
05182                                                 $output = $theFieldValue < $parts[3];
05183                                         break;
05184                                         case '>=':
05185                                                 $output = $theFieldValue >= $parts[3];
05186                                         break;
05187                                         case '<=':
05188                                                 $output = $theFieldValue <= $parts[3];
05189                                         break;
05190                                         case '-':
05191                                         case '!-':
05192                                                 $cmpParts = explode('-',$parts[3]);
05193                                                 $output = $theFieldValue >= $cmpParts[0] && $theFieldValue <= $cmpParts[1];
05194                                                 if ($parts[2]{0}=='!')  $output = !$output;
05195                                         break;
05196                                         case 'IN':
05197                                         case '!IN':
05198                                                 $output = t3lib_div::inList($parts[3],$theFieldValue);
05199                                                 if ($parts[2]{0}=='!')  $output = !$output;
05200                                         break;
05201                                         case '=':
05202                                         case '!=':
05203                                                 $output = t3lib_div::inList($parts[3],$theFieldValue);
05204                                                 if ($parts[2]{0}=='!')  $output = !$output;
05205                                         break;
05206                                 }
05207                         break;
05208                         case 'EXT':
05209                                 switch((string)$parts[2])       {
05210                                         case 'LOADED':
05211                                                 if (strtolower($parts[3])=='true')      {
05212                                                         $output = t3lib_extMgm::isLoaded($parts[1]) ? TRUE : FALSE;
05213                                                 } elseif (strtolower($parts[3])=='false') {
05214                                                         $output = !t3lib_extMgm::isLoaded($parts[1]) ? TRUE : FALSE;
05215                                                 }
05216                                         break;
05217                                 }
05218                         break;
05219                         case 'REC':
05220                                 switch((string)$parts[1])       {
05221                                         case 'NEW':
05222                                                 if (strtolower($parts[2])=='true')      {
05223                                                         $output = !(intval($row['uid']) > 0) ? TRUE : FALSE;
05224                                                 } elseif (strtolower($parts[2])=='false') {
05225                                                         $output = (intval($row['uid']) > 0) ? TRUE : FALSE;
05226                                                 }
05227                                         break;
05228                                 }
05229                         break;
05230                         case 'HIDE_L10N_SIBLINGS':
05231                                 if ($ffValueKey==='vDEF')       {
05232                                         $output = TRUE;
05233                                 } elseif ($parts[1]==='except_admin' && $GLOBALS['BE_USER']->isAdmin()) {
05234                                         $output = TRUE;
05235                                 }
05236                         break;
05237                         case 'HIDE_FOR_NON_ADMINS':
05238                                 $output = $GLOBALS['BE_USER']->isAdmin() ? TRUE : FALSE;
05239                         break;
05240                         case 'VERSION':
05241                                 switch((string)$parts[1])       {
05242                                         case 'IS':
05243                                                 if (strtolower($parts[2])=='true')      {
05244                                                         $output = intval($row['pid'])==-1 ? TRUE : FALSE;
05245                                                 } elseif (strtolower($parts[2])=='false') {
05246                                                         $output = !(intval($row['pid'])==-1) ? TRUE : FALSE;
05247                                                 }
05248                                         break;
05249                                 }
05250                         break;
05251                 }
05252 
05253                 return $output;
05254         }
05255 
05266         function getTSCpid($table,$uid,$pid)    {
05267                 $key = $table.':'.$uid.':'.$pid;
05268                 if (!isset($this->cache_getTSCpid[$key]))       {
05269                         $this->cache_getTSCpid[$key] = t3lib_BEfunc::getTSCpid($table,$uid,$pid);
05270                 }
05271                 return $this->cache_getTSCpid[$key];
05272         }
05273 
05280         function doLoadTableDescr($table)       {
05281                 global $TCA;
05282                 return $TCA[$table]['interface']['always_description'];
05283         }
05284 
05292         function getAvailableLanguages($onlyIsoCoded=1,$setDefault=1)   {
05293                 $isL = t3lib_extMgm::isLoaded('static_info_tables');
05294 
05295                         // Find all language records in the system:
05296                 $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery('static_lang_isocode,title,uid', 'sys_language', 'pid=0 AND hidden=0'.t3lib_BEfunc::deleteClause('sys_language'), '', 'title');
05297 
05298                         // Traverse them:
05299                 $output=array();
05300                 if ($setDefault)        {
05301                         $output[0]=array(
05302                                 'uid' => 0,
05303                                 'title' => 'Default language',
05304                                 'ISOcode' => 'DEF'
05305                         );
05306                 }
05307                 while($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res))       {
05308                         $output[$row['uid']]=$row;
05309 
05310                         if ($isL && $row['static_lang_isocode'])        {
05311                                 $rr = t3lib_BEfunc::getRecord('static_languages',$row['static_lang_isocode'],'lg_iso_2');
05312                                 if ($rr['lg_iso_2'])    $output[$row['uid']]['ISOcode']=$rr['lg_iso_2'];
05313                         }
05314 
05315                         if ($onlyIsoCoded && !$output[$row['uid']]['ISOcode'])  unset($output[$row['uid']]);
05316                 }
05317                 return $output;
05318         }
05319         
05328         function getLanguageIcon($table,$row,$sys_language_uid) {
05329                 global $TCA,$LANG;
05330 
05331                 $mainKey = $table.':'.$row['uid'];
05332 
05333                 if (!isset($this->cachedLanguageFlag[$mainKey]))        {
05334                         t3lib_BEfunc::fixVersioningPid($table,$row);
05335                         list($tscPID,$thePidValue) = $this->getTSCpid($table,$row['uid'],$row['pid']);
05336 
05337                         $t8Tools = t3lib_div::makeInstance('t3lib_transl8tools');
05338                         $this->cachedLanguageFlag[$mainKey] = $t8Tools->getSystemLanguages($tscPID, $this->backPath);
05339                 }
05340 
05341                         // Convert sys_language_uid to sys_language_uid if input was in fact a string (ISO code expected then)
05342                 if (!t3lib_div::testInt($sys_language_uid))     {
05343                         foreach($this->cachedLanguageFlag[$mainKey] as $rUid => $cD)    {
05344                                 if ('v'.$cD['ISOcode']===$sys_language_uid)     {
05345                                         $sys_language_uid = $rUid;
05346                                 }
05347                         }
05348                 }
05349 
05350                 return ($this->cachedLanguageFlag[$mainKey][$sys_language_uid]['flagIcon'] ? '<img src="'.$this->cachedLanguageFlag[$mainKey][$sys_language_uid]['flagIcon'].'" class="absmiddle" alt="" />' : ($this->cachedLanguageFlag[$mainKey][$sys_language_uid]['title'] ? '['.$this->cachedLanguageFlag[$mainKey][$sys_language_uid]['title'].']' : '')).'&nbsp;';
05351         }
05352 
05360         function previewFieldValue($value, $config)     {
05361                 if ($config['config']['type']==='group' && $config['config']['internal_type'] === 'file')       {
05362                         $show_thumbs = TRUE;
05363                         $table = 'tt_content';
05364 
05365                                 // Making the array of file items:
05366                         $itemArray = t3lib_div::trimExplode(',',$value,1);
05367 
05368                                 // Showing thumbnails:
05369                         $thumbsnail = '';
05370                         if ($show_thumbs)       {
05371                                 $imgs = array();
05372                                 foreach($itemArray as $imgRead) {
05373                                         $imgP = explode('|',$imgRead);
05374                                         $imgPath = rawurldecode($imgP[0]);
05375 
05376                                         $rowCopy = array();
05377                                         $rowCopy[$field] = $imgPath;
05378 
05379                                                 // Icon + clickmenu:
05380                                         $absFilePath = t3lib_div::getFileAbsFileName($config['config']['uploadfolder'].'/'.$imgPath);
05381 
05382                                         $fI = pathinfo($imgPath);
05383                                         $fileIcon = t3lib_BEfunc::getFileIcon(strtolower($fI['extension']));
05384                                         $fileIcon = '<img'.t3lib_iconWorks::skinImg($this->backPath,'gfx/fileicons/'.$fileIcon,'width="18" height="16"').' class="absmiddle" title="'.htmlspecialchars($fI['basename'].($absFilePath && @is_file($absFilePath) ? ' ('.t3lib_div::formatSize(filesize($absFilePath)).'bytes)' : ' - FILE NOT FOUND!')).'" alt="" />';
05385 
05386                                         $imgs[] = '<span class="nobr">'.t3lib_BEfunc::thumbCode($rowCopy,$table,$field,$this->backPath,'thumbs.php',$config['config']['uploadfolder'],0,' align="middle"').
05387                                                                 ($absFilePath ? $this->getClickMenu($fileIcon, $absFilePath) : $fileIcon).
05388                                                                 $imgPath.
05389                                                                 '</span>';
05390                                 }
05391                                 $thumbsnail = implode('<br />',$imgs);
05392                         }
05393 
05394                         return $thumbsnail;
05395                 } else {
05396                         return nl2br(htmlspecialchars($value));
05397                 }
05398         }
05399 
05405         function getAdditionalPreviewLanguages()        {
05406                 if (!isset($this->cachedAdditionalPreviewLanguages))    {
05407                         if ($GLOBALS['BE_USER']->getTSConfigVal('options.additionalPreviewLanguages'))  {
05408                                 $uids = t3lib_div::intExplode(',',$GLOBALS['BE_USER']->getTSConfigVal('options.additionalPreviewLanguages'));
05409                                 foreach($uids as $uid)  {
05410                                         if ($sys_language_rec = t3lib_BEfunc::getRecord('sys_language',$uid))   {
05411                                                 $this->cachedAdditionalPreviewLanguages[$uid] = array('uid' => $uid);
05412 
05413                                                 if ($sys_language_rec['static_lang_isocode'] && t3lib_extMgm::isLoaded('static_info_tables'))   {
05414                                                         $staticLangRow = t3lib_BEfunc::getRecord('static_languages',$sys_language_rec['static_lang_isocode'],'lg_iso_2');
05415                                                         if ($staticLangRow['lg_iso_2']) {
05416                                                                 $this->cachedAdditionalPreviewLanguages[$uid]['uid'] = $uid;
05417                                                                 $this->cachedAdditionalPreviewLanguages[$uid]['ISOcode'] = $staticLangRow['lg_iso_2'];
05418                                                         }
05419                                                 }
05420                                         }
05421                                 }
05422                         } else {
05423                                         // None:
05424                                 $this->cachedAdditionalPreviewLanguages = array();
05425                         }
05426                 }
05427                 return $this->cachedAdditionalPreviewLanguages;
05428         }
05429         
05437         function getDynTabLevelState($appendString = '') {
05438                 $levels = array();
05439                 foreach ($this->dynTabLevelStack as $tabIdent => $divId) {
05440                         $levels[] = $tabIdent.'-'.$divId.$appendString;
05441                 }
05442                 return implode(',', $levels);
05443         }
05444 }
05445 
05446 
05447 
05448 
05449 
05450 
05451 
05452 
05453 
05459 class t3lib_TCEforms_FE extends t3lib_TCEforms {
05460 
05467         function wrapLabels($str)       {
05468                 return '<font face="verdana" size="1" color="black">'.$str.'</font>';
05469         }
05470 
05477         function printPalette($palArr)  {
05478                 $out='';
05479                 reset($palArr);
05480                 $bgColor=' bgcolor="#D6DAD0"';
05481                 while(list(,$content)=each($palArr))    {
05482                         $hRow[]='<td'.$bgColor.'><font face="verdana" size="1">&nbsp;</font></td><td nowrap="nowrap"'.$bgColor.'><font color="#666666" face="verdana" size="1">'.$content['NAME'].'</font></td>';
05483                         $iRow[]='<td valign="top">'.
05484                                                 '<img name="req_'.$content['TABLE'].'_'.$content['ID'].'_'.$content['FIELD'].'" src="clear.gif" width="10" height="10" alt="" />'.
05485                                                 '<img name="cm_'.$content['TABLE'].'_'.$content['ID'].'_'.$content['FIELD'].'" src="clear.gif" width="7" height="10" alt="" />'.
05486                                                 '</td><td nowrap="nowrap" valign="top">'.$content['ITEM'].$content['HELP_ICON'].'</td>';
05487                 }
05488                 $out='<table border="0" cellpadding="0" cellspacing="0">
05489                         <tr><td><img src="clear.gif" width="'.intval($this->paletteMargin).'" height="1" alt="" /></td>'.implode('',$hRow).'</tr>
05490                         <tr><td></td>'.implode('',$iRow).'</tr>
05491                 </table>';
05492 
05493                 return $out;
05494         }
05495 
05502         function setFancyDesign()       {
05503                 $this->fieldTemplate='
05504         <tr>
05505                 <td nowrap="nowrap" bgcolor="#F6F2E6">###FIELD_HELP_ICON###<font face="verdana" size="1" color="black"><b>###FIELD_NAME###</b></font>###FIELD_HELP_TEXT###</td>
05506         </tr>
05507         <tr>
05508                 <td nowrap="nowrap" bgcolor="#ABBBB4"><img name="req_###FIELD_TABLE###_###FIELD_ID###_###FIELD_FIELD###" src="clear.gif" width="10" height="10" alt="" /><img name="cm_###FIELD_TABLE###_###FIELD_ID###_###FIELD_FIELD###" src="clear.gif" width="7" height="10" alt="" /><font face="verdana" size="1" color="black">###FIELD_ITEM###</font>###FIELD_PAL_LINK_ICON###</td>
05509         </tr>   ';
05510 
05511                 $this->totalWrap='<table border="0" cellpadding="1" cellspacing="0" bgcolor="black"><tr><td><table border="0" cellpadding="2" cellspacing="0">|</table></td></tr></table>';
05512 
05513                 $this->palFieldTemplate='
05514         <tr>
05515                 <td nowrap="nowrap" bgcolor="#ABBBB4"><font face="verdana" size="1" color="black">###FIELD_PALETTE###</font></td>
05516         </tr>   ';
05517                 $this->palFieldTemplateHeader='
05518         <tr>
05519                 <td nowrap="nowrap" bgcolor="#F6F2E6"><font face="verdana" size="1" color="black"><b>###FIELD_HEADER###</b></font></td>
05520         </tr>   ';
05521         }
05522 }
05523 
05524 if (defined('TYPO3_MODE') && $TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['t3lib/class.t3lib_tceforms.php'])  {
05525         include_once($TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['t3lib/class.t3lib_tceforms.php']);
05526 }
05527 ?>


Généré par Les spécialistes TYPO3 avec  doxygen 1.4.6