Documentation TYPO3 par Ameos

class.tslib_content.php

00001 <?php
00002 /***************************************************************
00003 *  Copyright notice
00004 *
00005 *  (c) 1999-2005 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 ***************************************************************/
00219   // Includes this class since it is used for parsing HTML
00220 require_once(PATH_t3lib."class.t3lib_parsehtml.php");
00221 
00222         // Object TypoScript library included:
00223 if(t3lib_extMgm::isLoaded('obts')) {
00224         require_once(t3lib_extMgm::extPath('obts').'_tsobject/_tso.php');
00225 }
00226 
00227 
00228 
00229 
00230 
00231 
00232 
00233 
00234 
00235 
00236 
00237 
00238 
00239 
00240 
00241 
00242 
00257 class tslib_cObj {
00258         var $align = Array ('center', 'right', 'left');
00259 
00270         var $image_compression = Array(
00271                 10 => Array('params'=>'', 'ext'=>'gif'),
00272                 11 => Array('params'=>'-colors 128', 'ext'=>'gif'),
00273                 12 => Array('params'=>'-colors 64', 'ext'=>'gif'),
00274                 13 => Array('params'=>'-colors 32', 'ext'=>'gif'),
00275                 14 => Array('params'=>'-colors 16', 'ext'=>'gif'),
00276                 15 => Array('params'=>'-colors 8', 'ext'=>'gif'),
00277 
00278                 30 => Array('params'=>'-colors 256', 'ext'=>'png'),
00279                 31 => Array('params'=>'-colors 128', 'ext'=>'png'),
00280                 32 => Array('params'=>'-colors 64', 'ext'=>'png'),
00281                 33 => Array('params'=>'-colors 32', 'ext'=>'png'),
00282                 34 => Array('params'=>'-colors 16', 'ext'=>'png'),
00283                 35 => Array('params'=>'-colors 8', 'ext'=>'png'),
00284                 39 => Array('params'=>'', 'ext'=>'png'),
00285 
00286                 20 => Array('params'=>'-quality 100', 'ext'=>'jpg'),
00287                 21 => Array('params'=>'-quality 90', 'ext'=>'jpg'),
00288                 22 => Array('params'=>'-quality 80', 'ext'=>'jpg'),
00289                 23 => Array('params'=>'-quality 70', 'ext'=>'jpg'),
00290                 24 => Array('params'=>'-quality 60', 'ext'=>'jpg'),
00291                 25 => Array('params'=>'-quality 50', 'ext'=>'jpg'),
00292                 26 => Array('params'=>'-quality 40', 'ext'=>'jpg'),
00293                 27 => Array('params'=>'-quality 30', 'ext'=>'jpg'),
00294                 28 => Array('params'=>'-quality 20', 'ext'=>'jpg')
00295         );
00296 
00302         var $image_effects = Array(
00303                 1 => '-rotate 90',
00304                 2 => '-rotate 270',
00305                 3 => '-rotate 180',
00306                 10 => '-colorspace GRAY',
00307                 11 => '-sharpen 70',
00308                 20 => '-normalize',
00309                 23 => '-contrast',
00310                 25 => '-gamma 1.3',
00311                 26 => '-gamma 0.8'
00312         );
00313 
00321         var $data = Array();
00322         var $oldData = Array();                         // Used for backup...
00323         var $alternativeData ='';                       // If this is set with an array before stdWrap, it's used instead of $this->data in the data-property in stdWrap
00324         var $parameters = Array();                      // Used by the parseFunc function and is loaded with tag-parameters when parsing tags.
00325         var $currentValKey = 'currentValue_kidjls9dksoje';
00326         var $currentRecord = '';                        // This is set to the [table]:[uid] of the record delivered in the $data-array, if the cObjects CONTENT or RECORD is in operation. Note that $GLOBALS['TSFE']->currentRecord is set to an equal value but always indicating the latest record rendered.
00327         var $currentRecordTotal = 0;            // Set in cObj->RECORDS and cObj->CONTENT to the current number of records selected in a query.
00328         var $currentRecordNumber = 0;           // Incremented in cObj->RECORDS and cObj->CONTENT before each record rendering.
00329         var $parentRecordNumber = 0;            // Incremented in parent cObj->RECORDS and cObj->CONTENT before each record rendering.
00330         var $parentRecord = array();            // If the tslib_cObj was started from CONTENT, RECORD or SEARCHRESULT cObject's this array has two keys, 'data' and 'currentRecord' which indicates the record and data for the parent cObj.
00331         var $regObj;            // This may be set as a reference to the calling object of eg. cObjGetSingle. Anyway, just use it as you like. It's used in productsLib.inc for example.
00332 
00333         // internal
00334         var $INT_include=0;             // Is set to 1 if the instance of this cObj is executed from a PHP_SCRIPT_INT -include script (see pagegen, bottom of document)
00335         var $checkPid_cache = Array();          // This is used by checkPid, that checks if pages are accessible. The $checkPid_cache['page_uid'] is set true or false upon this check featuring a caching function for the next request.
00336         var $checkPid_badDoktypeList = '255';
00337         var $lastTypoLinkUrl='';        // This will be set by typoLink() to the url of the most recent link created.
00338         var $lastTypoLinkTarget='';     // DO. link target.
00339         var $substMarkerCache=array();  // Caching substituteMarkerArrayCached function
00340         var $recordRegister=array();    // Array that registers rendered content elements (or any table) to make sure they are not rendered recursively!
00341 
00351         function start($data,$table='') {
00352                 $this->data = $data;
00353                 $this->currentRecord = $table ? $table.':'.$this->data['uid'] : '';
00354                 $this->parameters = Array();
00355         }
00356 
00366         function setParent($data,$currentRecord)        {
00367                 $this->parentRecord=array('data'=>$data, 'currentRecord'=>$currentRecord);
00368         }
00369 
00370 
00371 
00372 
00373 
00374 
00375 
00376 
00377         /***********************************************
00378          *
00379          * CONTENT_OBJ:
00380          *
00381          ***********************************************/
00382 
00391         function getCurrentVal()        {
00392                 return $this->data[$this->currentValKey];
00393         }
00394 
00402         function setCurrentVal($value)  {
00403                 $this->data[$this->currentValKey] = $value;
00404         }
00405 
00415         function cObjGet($setup,$addKey='')     {
00416                 if (is_array($setup))   {
00417                         $sKeyArray=t3lib_TStemplate::sortedKeyList($setup);
00418                         $content ='';
00419                         foreach($sKeyArray as $theKey)  {
00420                                 $theValue=$setup[$theKey];
00421                                 if (intval($theKey) && !strstr($theKey,'.'))    {
00422                                         $conf=$setup[$theKey.'.'];
00423                                         $content.=$this->cObjGetSingle($theValue,$conf,$addKey.$theKey);        // Get the contentObject
00424                                 }
00425                         }
00426                         return $content;
00427                 }
00428         }
00429 
00439         function cObjGetSingle($name,$conf,$TSkey='__') {
00440                 $content='';
00441                         // Checking that the function is not called eternally. This is done by interrupting at a depth of 100
00442                 $GLOBALS['TSFE']->cObjectDepthCounter--;
00443                 if ($GLOBALS['TSFE']->cObjectDepthCounter>0)    {
00444                         $name = trim($name);
00445                         if ($GLOBALS['TT']->LR) $GLOBALS['TT']->push($TSkey, $name);
00446 
00447                                 // Checking if the COBJ is a reference to another object. (eg. name of 'blabla.blabla = < styles.something')
00448                         if (substr($name,0,1)=='<')     {
00449                                 $key = trim(substr($name,1));
00450                                 $cF = t3lib_div::makeInstance('t3lib_TSparser');
00451                                         // $name and $conf is loaded with the referenced values.
00452                                 $old_conf=$conf;
00453                                 list($name, $conf) = $cF->getVal($key,$GLOBALS['TSFE']->tmpl->setup);
00454                                 if (is_array($old_conf) && count($old_conf))    {
00455                                         $conf = $this->joinTSarrays($conf,$old_conf);
00456 //                                      debug($conf);
00457                                 }
00458                                         // Getting the cObject
00459                                 $GLOBALS['TT']->incStackPointer();
00460                                         $content.=$this->cObjGetSingle($name,$conf,$key);
00461                                 $GLOBALS['TT']->decStackPointer();
00462                         } else {
00463 
00464                                         // Object TypoScript hook:
00465                                 if(t3lib_extMgm::isLoaded('obts') && isset($GLOBALS['OBTS']['tso_list'][$name])) {
00466                                         $content.= obts_dtutil::renderDatatypeContent($name, $GLOBALS['OBTS']['tso_list'][$name], $conf, $this);
00467                                 } else {
00468                                                 // Traditional Content Object branching:
00469                                         switch($name)   {
00470                                                 case 'COBJ_ARRAY':
00471                                                 case 'COA':
00472                                                         $content.=$this->COBJ_ARRAY($conf);
00473                                                 break;
00474                                                 case 'COA_INT':
00475                                                         $content.=$this->COBJ_ARRAY($conf,'INT');
00476                                                 break;
00477                                                 case 'HTML':
00478                                                         $content.=$this->HTML($conf);
00479                                                 break;
00480                                                 case 'TEXT':
00481                                                         $content.=$this->TEXT($conf);
00482                                                 break;
00483                                                 case 'CLEARGIF':
00484                                                         $content.=$this->CLEARGIF($conf);
00485                                                 break;
00486                                                 case 'FILE':
00487                                                         $content.=$this->FILE($conf);
00488                                                 break;
00489                                                 case 'IMAGE':
00490                                                         $content.=$this->IMAGE($conf);
00491                                                 break;
00492                                                 case 'IMG_RESOURCE':
00493                                                         $content.=$this->IMG_RESOURCE($conf);
00494                                                 break;
00495                                                 case 'IMGTEXT':
00496                                                         $content.=$this->IMGTEXT($conf);
00497                                                 break;
00498                                                 case 'CONTENT':
00499                                                         $content.=$this->CONTENT($conf);
00500                                                 break;
00501                                                 case 'RECORDS':
00502                                                         $content.=$this->RECORDS($conf);
00503                                                 break;
00504                                                 case 'HMENU':
00505                                                         $content.=$this->HMENU($conf);
00506                                                 break;
00507                                                 case 'CTABLE':
00508                                                         $content.=$this->CTABLE($conf);
00509                                                 break;
00510                                                 case 'OTABLE':
00511                                                         $content.=$this->OTABLE($conf);
00512                                                 break;
00513                                                 case 'COLUMNS':
00514                                                         $content.=$this->COLUMNS($conf);
00515                                                 break;
00516                                                 case 'HRULER':
00517                                                         $content.=$this->HRULER($conf);
00518                                                 break;
00519                                                 case 'CASE':
00520                                                         $content.=$this->CASEFUNC($conf);
00521                                                 break;
00522                                                 case 'LOAD_REGISTER':
00523                                                 case 'RESTORE_REGISTER':
00524                                                         $this->LOAD_REGISTER($conf,$name);
00525                                                 break;
00526                                                 case 'FORM':
00527                                                         $content.=$this->FORM($conf);
00528                                                 break;
00529                                                 case 'SEARCHRESULT':
00530                                                         $content.=$this->SEARCHRESULT($conf);
00531                                                 break;
00532                                                 case 'PHP_SCRIPT':
00533                                                         $content.=$this->PHP_SCRIPT($conf);
00534                                                 break;
00535                                                 case 'PHP_SCRIPT_EXT':
00536                                                         $content.=$this->PHP_SCRIPT($conf,'EXT');
00537                                                 break;
00538                                                 case 'PHP_SCRIPT_INT':
00539                                                         $content.=$this->PHP_SCRIPT($conf,'INT');
00540                                                 break;
00541                                                 case 'USER':
00542                                                         $content.=$this->USER($conf);
00543                                                 break;
00544                                                 case 'USER_INT':
00545                                                         $content.=$this->USER($conf,'INT');
00546                                                 break;
00547                                                 case 'TEMPLATE':
00548                                                         $content.=$this->TEMPLATE($conf);
00549                                                 break;
00550                                                 case 'EDITPANEL':
00551                                                         if ($GLOBALS['TSFE']->beUserLogin)      {$content.=$this->editPanel($content, $conf);}
00552                                                 break;
00553                                                 case 'MULTIMEDIA':
00554                                                         $content.=$this->MULTIMEDIA($conf);
00555                                                 break;
00556                                         }
00557                                 }
00558                         }
00559                         if ($GLOBALS['TT']->LR) $GLOBALS['TT']->pull($content);
00560                 }
00561                         // Increasing on exit...
00562                 $GLOBALS['TSFE']->cObjectDepthCounter++;
00563                 return $content;
00564         }
00565 
00566 
00567 
00568 
00569 
00570 
00571 
00572         /********************************************
00573          *
00574          * Functions rendering content objects (cObjects)
00575          *
00576          ********************************************/
00577 
00585         function HTML($conf)    {
00586                 return $this->stdWrap($conf['value'],$conf['value.']);
00587         }
00588 
00596         function TEXT($conf)    {
00597                 return $this->stdWrap($conf['value'],$conf);
00598         }
00599 
00607         function CLEARGIF($conf)        {
00608                 $w = $this->stdWrap($conf['width'],$conf['width.']);
00609                 $h = $this->stdWrap($conf['height'],$conf['height.']);
00610                 $w = $w ? $w : 1;
00611                 $h = $h ? $h : 1;
00612                 $wrap = $conf['wrap'] ? $conf['wrap'] : '|<br />';
00613                 $theValue = $this->wrap('<img src="'.$GLOBALS['TSFE']->absRefPrefix.'clear.gif" width="'.$w.'" height="'.$h.'"'.$this->getBorderAttr(' border="0"').' alt="" title="" />', $wrap);
00614 
00615                 return $this->stdWrap($theValue,$conf['stdWrap.']);
00616         }
00617 
00626         function COBJ_ARRAY($conf,$ext='')      {
00627                 $content='';
00628                 switch($ext)    {
00629                         case 'INT':
00630                                 $substKey = $ext.'_SCRIPT.'.$GLOBALS['TSFE']->uniqueHash();
00631                                 $content.='<!--'.$substKey.'-->';
00632                                 $GLOBALS['TSFE']->config[$ext.'incScript'][$substKey] = array(
00633                                         'file'=>$incFile,
00634                                         'conf'=>$conf,
00635                                         'cObj'=>serialize($this),
00636                                         'type'=>'COA'
00637                                 );
00638                         break;
00639                         default:
00640                                 if ($this->checkIf($conf['if.']))       {
00641                                         $content=$this->cObjGet($conf);
00642                                         if ($conf['wrap']) {
00643                                                 $content=$this->wrap($content, $conf['wrap']);
00644                                         }
00645                                         if ($conf['stdWrap.']) {
00646                                                 $content=$this->stdWrap($content, $conf['stdWrap.']);
00647                                         }
00648                                 }
00649                         break;
00650                 }
00651                 return $content;
00652         }
00653 
00662         function USER($conf,$ext='')    {
00663                 $content='';
00664                 switch($ext)    {
00665                         case 'INT':
00666                                 $substKey = $ext.'_SCRIPT.'.$GLOBALS['TSFE']->uniqueHash();
00667                                 $content.='<!--'.$substKey.'-->';
00668                                 $GLOBALS['TSFE']->config[$ext.'incScript'][$substKey] = array(
00669                                         'file' => $incFile,
00670                                         'conf' => $conf,
00671                                         'cObj' => serialize($this),
00672                                         'type' => 'FUNC'
00673                                 );
00674                         break;
00675                         default:
00676                                 $content.=$this->callUserFunction($conf['userFunc'],$conf,'');
00677                         break;
00678                 }
00679                 return $content;
00680         }
00681 
00689         function FILE($conf)    {
00690                 $theValue = $this->fileResource($this->stdWrap($conf['file'],$conf['file.']), trim($this->getAltParam($conf)));
00691                 if ($conf['linkWrap'])  {
00692                         $theValue = $this->linkWrap($theValue,$conf['linkWrap']);
00693                 }
00694                 return $this->wrap($theValue,$conf['wrap']);
00695         }
00696 
00705         function IMAGE($conf)   {
00706                 $content='';
00707                 if ($this->checkIf($conf['if.']))       {
00708                         $theValue = $this->cImage($conf['file'],$conf);
00709                         if ($conf['stdWrap.'])  {
00710                                 $theValue = $this->stdWrap($theValue,$conf['stdWrap.']);
00711                         }
00712                         return $theValue;
00713                 }
00714         }
00715 
00724         function IMG_RESOURCE($conf)    {
00725                 $imgArray = $this->getImgResource($conf['file'],$conf['file.']);
00726                 return $this->stdWrap($imgArray[3],$conf['stdWrap.']);
00727         }
00728 
00736         function IMGTEXT($conf) {
00737                 $content='';
00738                 if (is_array($conf['text.']))   {
00739                         $content.= $this->stdWrap($this->cObjGet($conf['text.'],'text.'),$conf['text.']);       // this gets the surrounding content
00740                 }
00741                 $imgList=trim($this->stdWrap($conf['imgList'],$conf['imgList.']));      // gets images
00742                 if ($imgList)   {
00743                         $imgs = t3lib_div::trimExplode(',',$imgList);
00744                         $imgStart = intval($this->stdWrap($conf['imgStart'],$conf['imgStart.']));
00745 
00746                         $imgCount= count($imgs)-$imgStart;
00747 
00748                         $imgMax = intval($this->stdWrap($conf['imgMax'],$conf['imgMax.']));
00749                         if ($imgMax)    {
00750                                 $imgCount = t3lib_div::intInRange($imgCount,0,$conf['imgMax']); // reduces the number of images.
00751                         }
00752 
00753                         $imgPath = $this->stdWrap($conf['imgPath'],$conf['imgPath.']);
00754 
00755                                 // initialisation
00756                         $caption='';
00757                         if (!$conf['captionSplit'] && !$conf['imageTextSplit'] && is_array($conf['caption.']))  {
00758                                 $caption = $this->stdWrap($this->cObjGet($conf['caption.'], 'caption.'),$conf['caption.']);     // global caption, no splitting
00759                         }
00760 
00761                         $tablecode='';
00762                         $position=$this->stdWrap($conf['textPos'],$conf['textPos.']);
00763 
00764                         $tmppos = $position&7;
00765                         $contentPosition = $position&24;
00766                         $align = $this->align[$tmppos];
00767                         $cap = ($caption)?1:0;
00768                         $txtMarg = intval($this->stdWrap($conf['textMargin'],$conf['textMargin.']));
00769                         if (!$conf['textMargin_outOfText'] && $contentPosition<16)      {
00770                                 $txtMarg=0;
00771                         }
00772 
00773                         $cols = intval($this->stdWrap($conf['cols'],$conf['cols.']));
00774                         $rows = intval($this->stdWrap($conf['rows'],$conf['rows.']));
00775                         $colspacing = intval($this->stdWrap($conf['colSpace'],$conf['colSpace.']));
00776                         $rowspacing = intval($this->stdWrap($conf['rowSpace'],$conf['rowSpace.']));
00777 
00778                         $border = intval($this->stdWrap($conf['border'],$conf['border.'])) ? 1:0;
00779                         $borderColor = $this->stdWrap($conf['borderCol'],$conf['borderCol.']);
00780                         $borderThickness = intval($this->stdWrap($conf['borderThick'],$conf['borderThick.']));
00781 
00782                         $borderColor=$borderColor?$borderColor:'black';
00783                         $borderThickness=$borderThickness?$borderThickness:1;
00784 
00785                         $caption_align = $this->stdWrap($conf['captionAlign'],$conf['captionAlign.']);
00786                         if (!$caption_align) {
00787                                 $caption_align = $align;
00788                         }
00789                                 // generate cols
00790                         $colCount = ($cols > 1) ? $cols : 1;
00791                         if ($colCount > $imgCount)      {$colCount = $imgCount;}
00792                         $rowCount = ($colCount > 1) ? ceil($imgCount / $colCount) : $imgCount;
00793                                 // generate rows
00794                         if ($rows>1)  {
00795                                 $rowCount = $rows;
00796                                 if ($rowCount > $imgCount)      {$rowCount = $imgCount;}
00797                                 $colCount = ($rowCount>1) ? ceil($imgCount / $rowCount) : $imgCount;
00798                         }
00799 
00800                                 // max Width
00801                         $colRelations = trim($this->stdWrap($conf['colRelations'],$conf['colRelations.']));
00802                         $maxW = intval($this->stdWrap($conf['maxW'],$conf['maxW.']));
00803 
00804                         $maxWInText = intval($this->stdWrap($conf['maxWInText'],$conf['maxWInText.']));
00805                         if (!$maxWInText)       {       // If maxWInText is not set, it's calculated to the 70 % of the max...
00806                                 $maxWInText = round($maxW/100*50);
00807                         }
00808 
00809                         if ($maxWInText && $contentPosition>=16)        {       // inText
00810                                 $maxW = $maxWInText;
00811                         }
00812 
00813                         if ($maxW && $colCount > 0) {   // If there is a max width and if colCount is greater than  column
00814 /*                              debug($border*$borderThickness*2);
00815                                 debug($maxW);
00816                                 debug($colspacing);
00817                                 debug(($maxW-$colspacing*($colCount-1)-$colCount*$border*$borderThickness*2));
00818                                 */
00819                                 $maxW = ceil(($maxW-$colspacing*($colCount-1)-$colCount*$border*$borderThickness*2)/$colCount);
00820                         }
00821                                 // create the relation between rows
00822                         $colMaxW = Array();
00823                         if ($colRelations)      {
00824                                 $rel_parts = explode(':',$colRelations);
00825                                 $rel_total = 0;
00826                                 for ($a=0;$a<$colCount;$a++)    {
00827                                         $rel_parts[$a] = intval($rel_parts[$a]);
00828                                         $rel_total+= $rel_parts[$a];
00829                                 }
00830                                 if ($rel_total) {
00831                                         for ($a=0;$a<$colCount;$a++)    {
00832                                                 $colMaxW[$a] = round(($maxW*$colCount)/$rel_total*$rel_parts[$a]);
00833                                         }
00834                                         if (min($colMaxW)<=0 || max($rel_parts)/min($rel_parts)>10)     {               // The difference in size between the largest and smalles must be within a factor of ten.
00835                                                 $colMaxW = Array();
00836                                         }
00837                                 }
00838                         }
00839                         $image_compression = intval($this->stdWrap($conf['image_compression'],$conf['image_compression.']));
00840                         $image_effects = intval($this->stdWrap($conf['image_effects'],$conf['image_effects.']));
00841                         $image_frames = intval($this->stdWrap($conf['image_frames.']['key'],$conf['image_frames.']['key.']));
00842 
00843                                 // fetches pictures
00844                         $splitArr=array();
00845                         $splitArr['imgObjNum']=$conf['imgObjNum'];
00846                         $splitArr = $GLOBALS['TSFE']->tmpl->splitConfArray($splitArr,$imgCount);
00847 
00848                                 // EqualHeight
00849                         $equalHeight = intval($this->stdWrap($conf['equalH'],$conf['equalH.']));
00850                         if ($equalHeight)       {       // Initiate gifbuilder object in order to get dimensions AND calculate the imageWidth's
00851                                 $gifCreator = t3lib_div::makeInstance('tslib_gifbuilder');
00852                                 $gifCreator->init();
00853                                 $relations = Array();
00854                                 $relations_cols = Array();
00855                                 $totalMaxW = $maxW*$colCount;
00856                                 for($a=0;$a<$imgCount;$a++)     {
00857                                         $imgKey = $a+$imgStart;
00858                                         $imgInfo = $gifCreator->getImageDimensions($imgPath.$imgs[$imgKey]);
00859                                         $relations[$a] = $imgInfo[1] / $equalHeight;    // relationship between the original height and the wished height
00860                                         if ($relations[$a])     {       // if relations is zero, then the addition of this value is omitted as the image is not expected to display because of some error.
00861                                                 $relations_cols[floor($a/$colCount)] += $imgInfo[0]/$relations[$a];     // counts the total width of the row with the new height taken into consideration.
00862                                         }
00863                                 }
00864                         }
00865 
00866                         $imageRowsFinalWidths = Array();        // contains the width of every image row
00867                         $imageRowsMaxHeights = Array();
00868                         $imgsTag=array();
00869                         $origImages=array();
00870                         for($a=0;$a<$imgCount;$a++)     {
00871                                 $GLOBALS['TSFE']->register['IMAGE_NUM'] = $a;
00872 
00873                                 $imgKey = $a+$imgStart;
00874                                 $totalImagePath = $imgPath.$imgs[$imgKey];
00875                                 $this->data[$this->currentValKey] = $totalImagePath;
00876                                 $imgObjNum = intval($splitArr[$a]['imgObjNum']);
00877                                 $imgConf = $conf[$imgObjNum.'.'];
00878 
00879                                 if ($equalHeight)       {
00880                                         $scale = 1;
00881                                         if ($totalMaxW) {
00882                                                 $rowTotalMaxW = $relations_cols[floor($a/$colCount)];
00883                                                 if ($rowTotalMaxW > $totalMaxW) {
00884                                                         $scale = $rowTotalMaxW / $totalMaxW;
00885                                                 }
00886                                         }
00887                                                 // transfer info to the imageObject. Please note, that
00888                                         $imgConf['file.']['height'] = round($equalHeight/$scale);
00889 
00890                                         unset($imgConf['file.']['width']);
00891                                         unset($imgConf['file.']['maxW']);
00892                                         unset($imgConf['file.']['maxH']);
00893                                         unset($imgConf['file.']['minW']);
00894                                         unset($imgConf['file.']['minH']);
00895                                         unset($imgConf['file.']['width.']);
00896                                         unset($imgConf['file.']['maxW.']);
00897                                         unset($imgConf['file.']['maxH.']);
00898                                         unset($imgConf['file.']['minW.']);
00899                                         unset($imgConf['file.']['minH.']);
00900                                         $maxW = 0;      // setting this to zero, so that it doesn't disturb
00901                                 }
00902 
00903                                 if ($maxW) {
00904                                         if (count($colMaxW))    {
00905                                                 $imgConf['file.']['maxW'] = $colMaxW[($a%$colCount)];
00906                                         } else {
00907                                                 $imgConf['file.']['maxW'] = $maxW;
00908                                         }
00909                                 }
00910 
00911                                         // Image Object supplied:
00912                                 if (is_array($imgConf)) {
00913                                         if ($this->image_effects[$image_effects])       {
00914                                                 $imgConf['file.']['params'].= ' '.$this->image_effects[$image_effects];
00915                                         }
00916                                         if ($image_frames)      {
00917                                                 if (is_array($conf['image_frames.'][$image_frames.'.']))        {
00918                                                         $imgConf['file.']['m.'] = $conf['image_frames.'][$image_frames.'.'];
00919                                                 }
00920                                         }
00921                                         if ($image_compression && $imgConf['file']!='GIFBUILDER')       {
00922                                                 if ($image_compression==1)      {
00923                                                         $tempImport = $imgConf['file.']['import'];
00924                                                         $tempImport_dot = $imgConf['file.']['import.'];
00925                                                         unset($imgConf['file.']);
00926                                                         $imgConf['file.']['import'] = $tempImport;
00927                                                         $imgConf['file.']['import.'] = $tempImport_dot;
00928                                                 } elseif (isset($this->image_compression[$image_compression])) {
00929                                                         $imgConf['file.']['params'].= ' '.$this->image_compression[$image_compression]['params'];
00930                                                         $imgConf['file.']['ext'] = $this->image_compression[$image_compression]['ext'];
00931                                                         unset($imgConf['file.']['ext.']);
00932                                                 }
00933                                         }
00934 
00935                                                 // "alt", "title" and "longdesc" attributes:
00936                                         if (!strlen($imgConf['altText']) && !is_array($imgConf['altText.'])) {
00937                                                 $imgConf['altText'] = $conf['altText'];
00938                                                 $imgConf['altText.'] = $conf['altText.'];
00939                                         }
00940                                         if (!strlen($imgConf['titleText']) && !is_array($imgConf['titleText.'])) {
00941                                                 $imgConf['titleText'] = $conf['titleText'];
00942                                                 $imgConf['titleText.'] = $conf['titleText.'];
00943                                         }
00944                                         if (!strlen($imgConf['longdescURL']) && !is_array($imgConf['longdescURL.'])) {
00945                                                 $imgConf['longdescURL'] = $conf['longdescURL'];
00946                                                 $imgConf['longdescURL.'] = $conf['longdescURL.'];
00947                                         }
00948                                 } else {
00949                                         $imgConf = array(
00950                                                 'altText' => $conf['altText'],
00951                                                 'titleText' => $conf['titleText'],
00952                                                 'longdescURL' => $conf['longdescURL'],
00953                                                 'file' => $totalImagePath
00954                                         );
00955                                 }
00956 
00957                                 $imgsTag[$imgKey] = $this->IMAGE($imgConf);
00958 
00959                                         // Store the original filepath
00960                                 $origImages[$imgKey]=$GLOBALS['TSFE']->lastImageInfo;
00961 
00962                                 $imageRowsFinalWidths[floor($a/$colCount)] += $GLOBALS['TSFE']->lastImageInfo[0];
00963                                 if ($GLOBALS['TSFE']->lastImageInfo[1]>$imageRowsMaxHeights[floor($a/$colCount)])       {
00964                                         $imageRowsMaxHeights[floor($a/$colCount)] = $GLOBALS['TSFE']->lastImageInfo[1];
00965                                 }
00966                         }
00967                                 // calculating the tableWidth:
00968                                 // TableWidth problems: It creates problems if the pictures are NOT as wide as the tableWidth.
00969                         $tableWidth = max($imageRowsFinalWidths)+ $colspacing*($colCount-1) + $colCount*$border*$borderThickness*2;
00970 
00971                                 // make table for pictures
00972                         $index=$imgStart;
00973 
00974                         $noRows = $this->stdWrap($conf['noRows'],$conf['noRows.']);
00975                         $noCols = $this->stdWrap($conf['noCols'],$conf['noCols.']);
00976                         if ($noRows) {$noCols=0;}       // noRows overrides noCols. They cannot exist at the same time.
00977                         if ($equalHeight) {
00978                                 $noCols=1;
00979                                 $noRows=0;
00980                         }
00981 
00982                         $rowCount_temp=1;
00983                         $colCount_temp=$colCount;
00984                         if ($noRows)    {
00985                                 $rowCount_temp = $rowCount;
00986                                 $rowCount=1;
00987                         }
00988                         if ($noCols)    {
00989                                 $colCount=1;
00990                         }
00991                                 // col- and rowspans calculated
00992                         $colspan = (($colspacing) ? $colCount*2-1 : $colCount);
00993                         $rowspan = (($rowspacing) ? $rowCount*2-1 : $rowCount) + $cap;
00994 
00995 
00996                                 // Edit icons:
00997                         $editIconsHTML = $conf['editIcons']&&$GLOBALS['TSFE']->beUserLogin ? $this->editIcons('',$conf['editIcons'],$conf['editIcons.']) : '';
00998 
00999                                 // strech out table:
01000                         $tablecode='';
01001                         $flag=0;
01002                         if ($conf['noStretchAndMarginCells']!=1)        {
01003                                 $tablecode.='<tr>';
01004                                 if ($txtMarg && $align=='right')        {       // If right aligned, the textborder is added on the right side
01005                                         $tablecode.='<td rowspan="'.($rowspan+1).'" valign="top"><img src="'.$GLOBALS['TSFE']->absRefPrefix.'clear.gif" width="'.$txtMarg.'" height="1" alt="" title="" />'.($editIconsHTML?'<br />'.$editIconsHTML:'').'</td>';
01006                                         $editIconsHTML='';
01007                                         $flag=1;
01008                                 }
01009                                 $tablecode.='<td colspan="'.$colspan.'"><img src="'.$GLOBALS['TSFE']->absRefPrefix.'clear.gif" width="'.$tableWidth.'" height="1" alt="" /></td>';
01010                                 if ($txtMarg && $align=='left') {       // If left aligned, the textborder is added on the left side
01011                                         $tablecode.='<td rowspan="'.($rowspan+1).'" valign="top"><img src="'.$GLOBALS['TSFE']->absRefPrefix.'clear.gif" width="'.$txtMarg.'" height="1" alt="" title="" />'.($editIconsHTML?'<br />'.$editIconsHTML:'').'</td>';
01012                                         $editIconsHTML='';
01013                                         $flag=1;
01014                                 }
01015                                 if ($flag) $tableWidth+=$txtMarg+1;
01016         //                      $tableWidth=0;
01017                                 $tablecode.='</tr>';
01018                         }
01019 
01020                                 // draw table
01021                         for ($c=0;$c<$rowCount;$c++) {  // Looping through rows. If 'noRows' is set, this is '1 time', but $rowCount_temp will hold the actual number of rows!
01022                                 if ($c && $rowspacing)  {               // If this is NOT the first time in the loop AND if space is required, a row-spacer is added. In case of "noRows" rowspacing is done further down.
01023                                         $tablecode.='<tr><td colspan="'.$colspan.'"><img src="'.$GLOBALS['TSFE']->absRefPrefix.'clear.gif" width="1" height="'.$rowspacing.'"'.$this->getBorderAttr(' border="0"').' alt="" title="" /></td></tr>';
01024                                 }
01025                                 $tablecode.='<tr>';     // starting row
01026                                 for ($b=0; $b<$colCount_temp; $b++)     {       // Looping through the columns
01027                                         if ($b && $colspacing)  {               // If this is NOT the first iteration AND if column space is required. In case of "noCols", the space is done without a separate cell.
01028                                                 if (!$noCols)   {
01029                                                         $tablecode.='<td><img src="'.$GLOBALS['TSFE']->absRefPrefix.'clear.gif" width="'.$colspacing.'" height="1"'.$this->getBorderAttr(' border="0"').' alt="" title="" /></td>';
01030                                                 } else {
01031                                                         $colSpacer='<img src="'.$GLOBALS['TSFE']->absRefPrefix.'clear.gif" width="'.($border?$colspacing-6:$colspacing).'" height="'.($imageRowsMaxHeights[$c]+($border?$borderThickness*2:0)).'"'.$this->getBorderAttr(' border="0"').' align="'.($border?'left':'top').'" alt="" title="" />';
01032                                                         $colSpacer='<td valign="top">'.$colSpacer.'</td>';      // added 160301, needed for the new "noCols"-table...
01033                                                         $tablecode.=$colSpacer;
01034                                                 }
01035                                         }
01036                                         if (!$noCols || ($noCols && !$b))       {
01037                                                 $tablecode.='<td valign="top">';        // starting the cell. If "noCols" this cell will hold all images in the row, otherwise only a single image.
01038                                                 if ($noCols)    {$tablecode.='<table width="'.$imageRowsFinalWidths[$c].'" border="0" cellpadding="0" cellspacing="0"><tr>';}           // In case of "noCols" we must set the table-tag that surrounds the images in the row.
01039                                         }
01040                                         for ($a=0;$a<$rowCount_temp;$a++)       {       // Looping through the rows IF "noRows" is set. "noRows"  means that the rows of images is not rendered by physical table rows but images are all in one column and spaced apart with clear-gifs. This loop is only one time if "noRows" is not set.
01041                                                 $GLOBALS['TSFE']->register['IMAGE_NUM'] = $imgIndex;    // register previous imgIndex
01042                                                 $imgIndex = $index+$a*$colCount_temp;
01043                                                 if ($imgsTag[$imgIndex])        {
01044                                                         if ($rowspacing && $noRows && $a) {             // Puts distance between the images IF "noRows" is set and this is the first iteration of the loop
01045                                                                 $tablecode.= '<img src="'.$GLOBALS['TSFE']->absRefPrefix.'clear.gif" width="1" height="'.$rowspacing.'" alt="" title="" /><br />';
01046                                                         }
01047                                                         if ($conf['captionSplit'] || $conf['imageTextSplit'])   {
01048                                                                 $thisCaption = $this->stdWrap($this->cObjGet($conf['caption.'], 'caption.'), $conf['caption.']);
01049                                                         }
01050                                                         $imageHTML = $imgsTag[$imgIndex].'<br />';
01051                                                         $Talign = (!trim($thisCaption) && !$noRows && !$conf['netprintApplicationLink']) ? ' align="left"' : '';  // this is necessary if the tablerows are supposed to space properly together! "noRows" is excluded because else the images "layer" together.
01052                                                         if ($border)    {$imageHTML='<table border="0" cellpadding="'.$borderThickness.'" cellspacing="0" bgcolor="'.$borderColor.'"'.$Talign.'><tr><td>'.$imageHTML.'</td></tr></table>';}             // break-tag added 160301  , ($noRows?'':' align="left"')  removed 160301, break tag removed 160301 (later...)
01053                                                         $imageHTML.=$editIconsHTML;             $editIconsHTML='';
01054                                                         if ($conf['netprintApplicationLink'])   {$imageHTML = $this->netprintApplication_offsiteLinkWrap($imageHTML,$origImages[$imgIndex],$conf['netprintApplicationLink.']);}
01055                                                         $imageHTML.=$thisCaption;       // Adds caption.
01056                                                         if ($noCols)    {$imageHTML='<td valign="top">'.$imageHTML.'</td>';}            // If noCols, put in table cell.
01057                                                         $tablecode.=$imageHTML;
01058                                                 }
01059                                         }
01060                                         $index++;
01061                                         if (!$noCols || ($noCols && $b+1==$colCount_temp))      {
01062                                                 if ($noCols)    {$tablecode.='</tr></table>';}  // In case of "noCols" we must finish the table that surrounds the images in the row.
01063                                                 $tablecode.='</td>';    // Ending the cell. In case of "noCols" the cell holds all pictures!
01064                                         }
01065                                 }
01066                                 $tablecode.='</tr>';    // ending row
01067                         }
01068                         if ($c) {
01069                                 switch ($contentPosition)       {
01070                                         case '0':       // above
01071                                         case '8':       // below
01072                                                 switch ($align)        {        // These settings are needed for Firefox
01073                                                         case 'center':
01074                                                                 $table_align = 'margin-left: auto; margin-right: auto';
01075                                                         break;
01076                                                         case 'right':
01077                                                                 $table_align = 'margin-left: auto; margin-right: 0px';
01078                                                         break;
01079                                                         default:        // Most of all: left
01080                                                                 $table_align = 'margin-left: 0px; margin-right: auto';
01081                                                 }
01082                                                 $table_align = 'style="'.$table_align.'"';
01083                                         break;
01084                                         case '16':      // in text
01085                                                 $table_align = 'align="'.$align.'"';
01086                                         break;
01087                                         default:
01088                                                 $table_align = '';
01089                                 }
01090 
01091                                         // Table-tag is inserted
01092                                 $tablecode = '<table'.($tableWidth?' width="'.$tableWidth.'"':'').' border="0" cellspacing="0" cellpadding="0" '.$table_align.' class="imgtext-table">'.$tablecode;
01093                                 if ($editIconsHTML)     {       // IF this value is not long since reset.
01094                                         $tablecode.='<tr><td colspan="'.$colspan.'">'.$editIconsHTML.'</td></tr>';
01095                                         $editIconsHTML='';
01096                                 }
01097                                 if ($cap)       {
01098                                         $tablecode.='<tr><td colspan="'.$colspan.'" align="'.$caption_align.'">'.$caption.'</td></tr>';
01099                                 }
01100                                 $tablecode.='</table>';
01101                                 if ($conf['tableStdWrap.'])     {$tablecode=$this->stdWrap($tablecode,$conf['tableStdWrap.']);}
01102                         }
01103 
01104                         $spaceBelowAbove = intval($this->stdWrap($conf['spaceBelowAbove'],$conf['spaceBelowAbove.']));
01105                         switch ($contentPosition)       {
01106                                 case '0':       // above
01107                                         $output= '<div style="text-align:'.$align.';">'.$tablecode.'</div>'.$this->wrapSpace($content, $spaceBelowAbove.'|0');
01108                                 break;
01109                                 case '8':       // below
01110                                         $output= $this->wrapSpace($content, '0|'.$spaceBelowAbove).'<div style="text-align:'.$align.';">'.$tablecode.'</div>';
01111                                 break;
01112                                 case '16':      // in text
01113                                         $output= $tablecode.$content;
01114                                 break;
01115                                 case '24':      // in text, no wrap
01116                                         $theResult = '';
01117                                         $theResult.= '<table border="0" cellspacing="0" cellpadding="0" class="imgtext-nowrap"><tr>';
01118                                         if ($align=='right')    {
01119                                                 $theResult.= '<td valign="top">'.$content.'</td><td valign="top">'.$tablecode.'</td>';
01120                                         } else {
01121                                                 $theResult.= '<td valign="top">'.$tablecode.'</td><td valign="top">'.$content.'</td>';
01122                                         }
01123                                         $theResult.= '</tr></table>';
01124                                         $output= $theResult;
01125                                 break;
01126                         }
01127                 } else {
01128                         $output= $content;
01129                 }
01130 
01131                 if ($conf['stdWrap.']) {
01132                         $output = $this->stdWrap($output, $conf['stdWrap.']);
01133                 }
01134 
01135                 return $output;
01136         }
01137 
01145         function CONTENT($conf) {
01146                 $theValue='';
01147 
01148                 $originalRec = $GLOBALS['TSFE']->currentRecord;
01149                 if ($originalRec)       {               // If the currentRecord is set, we register, that this record has invoked this function. It's should not be allowed to do this again then!!
01150                         $GLOBALS['TSFE']->recordRegister[$originalRec]++;
01151                 }
01152 
01153                 if ($conf['table']=='pages' || substr($conf['table'],0,3)=='tt_' || substr($conf['table'],0,3)=='fe_' || substr($conf['table'],0,3)=='tx_' || substr($conf['table'],0,4)=='ttx_' || substr($conf['table'],0,5)=='user_')        {
01154 
01155                         $renderObjName = $conf['renderObj'] ? $conf['renderObj'] : '<'.$conf['table'];
01156                         $renderObjKey = $conf['renderObj'] ? 'renderObj' : '';
01157                         $renderObjConf = $conf['renderObj.'];
01158 
01159                         $slide = intval($conf['slide'])?intval($conf['slide']):0;
01160                         $slideCollect = intval($conf['slide.']['collect'])?intval($conf['slide.']['collect']):0;
01161                         $slideCollectReverse = intval($conf['slide.']['collectReverse'])?true:false;
01162                         $slideCollectFuzzy = $slideCollect?(intval($conf['slide.']['collectFuzzy'])?true:false):true;
01163                         $again = false;
01164 
01165                         do {
01166                                 $res = $this->exec_getQuery($conf['table'],$conf['select.']);
01167                                 if ($error = $GLOBALS['TYPO3_DB']->sql_error()) {
01168                                         $GLOBALS['TT']->setTSlogMessage($error,3);
01169                                 } else {
01170                                         $this->currentRecordTotal = $GLOBALS['TYPO3_DB']->sql_num_rows($res);
01171                                         $GLOBALS['TT']->setTSlogMessage('NUMROWS: '.$GLOBALS['TYPO3_DB']->sql_num_rows($res));
01172                                         $cObj =t3lib_div::makeInstance('tslib_cObj');
01173                                         $cObj->setParent($this->data,$this->currentRecord);
01174                                         $this->currentRecordNumber=0;
01175                                         $cobjValue = '';
01176                                         while ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) {
01177 
01178                                                         // Versioning preview:
01179                                                 $GLOBALS['TSFE']->sys_page->versionOL($conf['table'],$row);
01180 
01181                                                         // Language Overlay:
01182                                                 if (is_array($row) && $GLOBALS['TSFE']->sys_language_contentOL) {
01183                                                         $row = $GLOBALS['TSFE']->sys_page->getRecordOverlay($conf['table'],$row,$GLOBALS['TSFE']->sys_language_content,$GLOBALS['TSFE']->sys_language_contentOL);
01184                                                 }
01185 
01186                                                 if (is_array($row)) { // Might be unset in the sys_language_contentOL
01187                                                         if (!$GLOBALS['TSFE']->recordRegister[$conf['table'].':'.$row['uid']]) {
01188                                                                 $this->currentRecordNumber++;
01189                                                                 $cObj->parentRecordNumber = $this->currentRecordNumber;
01190                                                                 $GLOBALS['TSFE']->currentRecord = $conf['table'].':'.$row['uid'];
01191                                                                 $this->lastChanged($row['tstamp']);
01192                                                                 $cObj->start($row,$conf['table']);
01193                                                                 $tmpValue = $cObj->cObjGetSingle($renderObjName, $renderObjConf, $renderObjKey);
01194                                                                 $cobjValue .= $tmpValue;
01195                                                         }# else debug($GLOBALS['TSFE']->recordRegister,'CONTENT');
01196                                                 }
01197                                         }
01198                                 }
01199                                 if ($slideCollectReverse) {
01200                                         $theValue = $cobjValue.$theValue;
01201                                 } else {
01202                                         $theValue .= $cobjValue;
01203                                 }
01204                                 if ($slideCollect>0) {
01205                                         $slideCollect--;
01206                                 }
01207                                 if ($slide) {
01208                                         if ($slide>0) {
01209                                                 $slide--;
01210                                         }
01211                                         $conf['select.']['pidInList'] = $this->getSlidePids($conf['select.']['pidInList'], $conf['select.']['pidInList.']);
01212                                         $again = strlen($conf['select.']['pidInList'])?true:false;
01213                                 }
01214                         } while ($again&&(($slide&&!strlen($tmpValue)&&$slideCollectFuzzy)||($slide&&$slideCollect)));
01215                 }
01216 
01217                 $theValue = $this->wrap($theValue,$conf['wrap']);
01218                 if ($conf['stdWrap.']) $theValue = $this->stdWrap($theValue,$conf['stdWrap.']);
01219 
01220                 $GLOBALS['TSFE']->currentRecord = $originalRec; // Restore
01221                 return $theValue;
01222         }
01223 
01231         function RECORDS($conf) {
01232                 $theValue='';
01233 
01234                 $originalRec = $GLOBALS['TSFE']->currentRecord;
01235                 if ($originalRec)       {               // If the currentRecord is set, we register, that this record has invoked this function. It's should not be allowed to do this again then!!
01236                         $GLOBALS['TSFE']->recordRegister[$originalRec]++;
01237                 }
01238 
01239                 $conf['source'] = $this->stdWrap($conf['source'],$conf['source.']);
01240                 if ($conf['tables'] && $conf['source']) {
01241                         $allowedTables = $conf['tables'];
01242                         if (is_array($conf['conf.']))   {
01243                                 reset($conf['conf.']);
01244                                 while(list($k)=each($conf['conf.']))    {
01245                                         if (substr($k,-1)!='.')         $allowedTables.=','.$k;
01246                                 }
01247                         }
01248 
01249                         $loadDB = t3lib_div::makeInstance('FE_loadDBGroup');
01250                         $loadDB->start($conf['source'], $allowedTables);
01251                         reset($loadDB->tableArray);
01252                         while(list($table,)=each($loadDB->tableArray))  {
01253                                 if (is_array($GLOBALS['TCA'][$table]))  {
01254                                         $loadDB->additionalWhere[$table]=$this->enableFields($table);
01255                                 }
01256                         }
01257                         $loadDB->getFromDB();
01258 
01259                         reset($loadDB->itemArray);
01260                         $data = $loadDB->results;
01261 
01262                         $cObj =t3lib_div::makeInstance('tslib_cObj');
01263                         $cObj->setParent($this->data,$this->currentRecord);
01264                         $this->currentRecordNumber=0;
01265                         $this->currentRecordTotal = count($loadDB->itemArray);
01266                         reset($loadDB->itemArray);
01267                         while(list(,$val)=each($loadDB->itemArray))     {
01268                                 $row = $data[$val['table']][$val['id']];
01269 
01270                                         // Versioning preview:
01271                                 $GLOBALS['TSFE']->sys_page->versionOL($val['table'],$row);
01272 
01273                                         // Language Overlay:
01274                                 if (is_array($row) && $GLOBALS['TSFE']->sys_language_contentOL) {
01275                                         $row = $GLOBALS['TSFE']->sys_page->getRecordOverlay($val['table'],$row,$GLOBALS['TSFE']->sys_language_content,$GLOBALS['TSFE']->sys_language_contentOL);
01276                                 }
01277 
01278                                 if (is_array($row))     {       // Might be unset in the content overlay things...
01279                                         if (!$conf['dontCheckPid'])     {
01280                                                 $row = $this->checkPid($row['pid']) ? $row : '';
01281                                         }
01282                                         if ($row && !$GLOBALS['TSFE']->recordRegister[$val['table'].':'.$val['id']])    {
01283                                                 $renderObjName = $conf['conf.'][$val['table']] ? $conf['conf.'][$val['table']] : '<'.$val['table'];
01284                                                 $renderObjKey = $conf['conf.'][$val['table']] ? 'conf.'.$val['table'] : '';
01285                                                 $renderObjConf = $conf['conf.'][$val['table'].'.'];
01286                                                 $this->currentRecordNumber++;
01287                                                 $cObj->parentRecordNumber=$this->currentRecordNumber;
01288                                                 $GLOBALS['TSFE']->currentRecord = $val['table'].':'.$val['id'];
01289                                                 $this->lastChanged($row['tstamp']);
01290                                                 $cObj->start($row,$val['table']);
01291                                                 $tmpValue = $cObj->cObjGetSingle($renderObjName, $renderObjConf, $renderObjKey);
01292                                                 $theValue .= $tmpValue;
01293                                         }# else debug($GLOBALS['TSFE']->recordRegister,'RECORDS');
01294                                 }
01295                         }
01296                 }
01297                 if ($conf['wrap'])      $theValue = $this->wrap($theValue,$conf['wrap']);
01298                 if ($conf['stdWrap.'])  $theValue = $this->stdWrap($theValue,$conf['stdWrap.']);
01299 
01300                 $GLOBALS['TSFE']->currentRecord = $originalRec; // Restore
01301                 return $theValue;
01302         }
01303 
01311         function HMENU($conf)   {
01312                 $content='';
01313                 if ($this->checkIf($conf['if.']))       {
01314                         $cls = strtolower($conf[1]);
01315                         if (t3lib_div::inList($GLOBALS['TSFE']->tmpl->menuclasses,$cls))        {
01316                                 if ($conf['special.']['value.'])        {
01317                                         $conf['special.']['value']  = $this->stdWrap($conf['special.']['value'], $conf['special.']['value.']);
01318                                 }
01319                                 $GLOBALS['TSFE']->register['count_HMENU']++;
01320                                 $GLOBALS['TSFE']->register['count_HMENU_MENUOBJ']=0;
01321                                 $GLOBALS['TSFE']->applicationData['GMENU_LAYERS']['WMid']=array();
01322                                 $GLOBALS['TSFE']->applicationData['GMENU_LAYERS']['WMparentId']=array();
01323 
01324                                 $menu = t3lib_div::makeInstance('tslib_'.$cls);
01325                                 $menu->parent_cObj = $this;
01326                                 $menu->start($GLOBALS['TSFE']->tmpl, $GLOBALS['TSFE']->sys_page, '', $conf, 1);
01327                                 $menu->makeMenu();
01328                                 $content.=$menu->writeMenu();
01329                         }
01330                         if ($conf['wrap'])              $content=$this->wrap($content, $conf['wrap']);
01331                         if ($conf['stdWrap.'])  $content = $this->stdWrap($content, $conf['stdWrap.']);
01332                 }
01333                 return $content;
01334         }
01335 
01343         function CTABLE ($conf) {
01344                 $controlTable = t3lib_div::makeInstance('tslib_controlTable');
01345                         if ($conf['tableParams'])       {
01346                         $controlTable->tableParams = $conf['tableParams'];
01347                 }
01348                         // loads the pagecontent
01349                 $controlTable->contentW = $conf['cWidth'];
01350                         // loads the menues if any
01351                 if (is_array($conf['c.']))      {
01352                         $controlTable->content = $this->cObjGet($conf['c.'],'c.');
01353                         $controlTable->contentTDparams = isset($conf['c.']['TDParams']) ? $conf['c.']['TDParams'] : 'valign="top"';
01354                 }
01355                 if (is_array($conf['lm.']))     {
01356                         $controlTable->lm = $this->cObjGet($conf['lm.'],'lm.');
01357                         $controlTable->lmTDparams = isset($conf['lm.']['TDParams']) ? $conf['lm.']['TDParams'] : 'valign="top"';
01358                 }
01359                 if (is_array($conf['tm.']))     {
01360                         $controlTable->tm = $this->cObjGet($conf['tm.'],'tm.');
01361                         $controlTable->tmTDparams = isset($conf['tm.']['TDParams']) ? $conf['tm.']['TDParams'] : 'valign="top"';
01362                 }
01363                 if (is_array($conf['rm.']))     {
01364                         $controlTable->rm = $this->cObjGet($conf['rm.'],'rm.');
01365                         $controlTable->rmTDparams = isset($conf['rm.']['TDParams']) ? $conf['rm.']['TDParams'] : 'valign="top"';
01366                 }
01367                 if (is_array($conf['bm.']))     {
01368                         $controlTable->bm = $this->cObjGet($conf['bm.'],'bm.');
01369                         $controlTable->bmTDparams = isset($conf['bm.']['TDParams']) ? $conf['bm.']['TDParams'] : 'valign="top"';
01370                 }
01371                 return $controlTable->start($conf['offset'],$conf['cMargins']);
01372         }
01373 
01381         function OTABLE ($conf) {
01382                 $controlTable = t3lib_div::makeInstance('tslib_tableOffset');
01383                 if ($conf['tableParams'])       {
01384                         $controlTable->tableParams = $conf['tableParams'];
01385                 }
01386                 return $controlTable->start($this->cObjGet($conf),$conf['offset']);
01387         }
01388 
01396         function COLUMNS ($conf)        {
01397                 $content='';
01398                 if (is_array($conf) && $this->checkIf($conf['if.']))    {
01399                         $tdRowCount=0;
01400                         $tableParams = $conf['tableParams'] ? ' '.$conf['tableParams'] : ' border="0" cellspacing="0" cellpadding="0"';
01401                         $TDparams = $conf['TDparams'] ? ' '.$conf['TDparams']:' valign="top"';
01402                         $rows = t3lib_div::intInRange($conf['rows'],2,20);
01403                         $totalWidth = intval($conf['totalWidth']);
01404                         $columnWidth=0;
01405 
01406                         $totalGapWidth=0;
01407                         $gapData = Array(
01408                                 'gapWidth' => $this->stdWrap($conf['gapWidth'],$conf['gapWidth.']),
01409                                 'gapBgCol' => $this->stdWrap($conf['gapBgCol'],$conf['gapBgCol.']),
01410                                 'gapLineThickness' => $this->stdWrap($conf['gapLineThickness'],$conf['gapLineThickness.']),
01411                                 'gapLineCol' => $this->stdWrap($conf['gapLineCol'],$conf['gapLineCol.'])
01412                         );
01413                         $gapData = $GLOBALS['TSFE']->tmpl->splitConfArray($gapData,$rows-1);
01414                         reset($gapData);
01415                         while(list(,$val)=each($gapData))       {
01416                                 $totalGapWidth+=intval($val['gapWidth']);
01417                         }
01418 
01419                         if ($totalWidth)        {
01420                                 $columnWidth = ceil(($totalWidth-$totalGapWidth)/$rows);
01421                                 $TDparams.=' width="'.$columnWidth.'"';
01422                                 $tableParams.=' width="'.$totalWidth.'"';
01423                         } else {
01424                                 $TDparams.=' width="'.floor(100/$rows).'%"';
01425                                 $tableParams.=' width="100%"';
01426                         }
01427 
01428                         for ($a=1;$a<=$rows;$a++)       {
01429                                 $tdRowCount++;
01430                                 $content.='<td'.$TDparams.'>';
01431                                 $content.=$this->cObjGetSingle($conf[$a],$conf[$a.'.'], $a);
01432                                 $content.='</td>';
01433                                 if ($a < $rows) {
01434                                         $gapConf = $gapData[($a-1)];
01435                                         $gapWidth = intval($gapConf['gapWidth']);
01436                                         if ($gapWidth)  {
01437                                                 $tdPar = $gapConf['gapBgCol'] ? ' bgcolor="'.$gapConf['gapBgCol'].'"' : '';
01438                                                 $gapLine = intval($gapConf['gapLineThickness']);
01439                                                 if ($gapLine)   {
01440                                                         $gapSurround = t3lib_div::intInRange(($gapWidth-$gapLine)/2, 1, 1000);
01441                                                                 // right gap
01442                                                         $content.='<td'.$tdPar.'><img src="'.$GLOBALS['TSFE']->absRefPrefix.'clear.gif" width="'.$gapSurround.'" height="1" alt="" title="" /></td>';
01443                                                         $tdRowCount++;
01444                                                                 // line:
01445                                                         $GtdPar = $gapConf['gapLineCol'] ? ' bgcolor="'.$gapConf['gapLineCol'].'"' : ' bgcolor="black"';
01446                                                         $content.='<td'.$GtdPar.'><img src="'.$GLOBALS['TSFE']->absRefPrefix.'clear.gif" width="'.$gapLine.'" height="1" alt="" title="" /></td>';
01447                                                         $tdRowCount++;
01448                                                                 // left gap
01449                                                         $content.='<td'.$tdPar.'><img src="'.$GLOBALS['TSFE']->absRefPrefix.'clear.gif" width="'.$gapSurround.'" height="1" alt="" title="" /></td>';
01450                                                         $tdRowCount++;
01451                                                 } else {
01452                                                         $content.='<td'.$tdPar.'><img src="'.$GLOBALS['TSFE']->absRefPrefix.'clear.gif" width="'.$gapWidth.'" height="1" alt="" title="" /></td>';
01453                                                         $tdRowCount++;
01454                                                 }
01455                                         }
01456                                 }
01457                         }
01458                         $content='<tr>'.$content.'</tr>';
01459                         $content='<table'.$tableParams.'>'.$content.'</table>';
01460                         $content.=$this->cObjGetSingle($conf['after'],$conf['after.'], 'after');
01461                         if ($conf['stdWrap.'])  {
01462                                 $content = $this->stdWrap($content,$conf['stdWrap.']);
01463                         }
01464                 }
01465                 return $content;
01466         }
01467 
01475         function HRULER ($conf) {
01476                 $lineThickness = t3lib_div::intInRange($this->stdWrap($conf['lineThickness'],$conf['lineThickness.']),1,50);
01477                 $lineColor = $conf['lineColor'] ? $conf['lineColor'] : 'black';
01478                 $spaceBefore = intval($conf['spaceLeft']);
01479                 $spaceAfter = intval($conf['spaceRight']);
01480                 $tableWidth = $conf['tableWidth'] ? $conf['tableWidth'] : '99%';
01481                 $content='';
01482 
01483                 $content.='<table border="0" cellspacing="0" cellpadding="0" width="'.htmlspecialchars($tableWidth).'"><tr>';
01484                 if ($spaceBefore)       {$content.='<td width="1"><img src="'.$GLOBALS['TSFE']->absRefPrefix.'clear.gif" width="'.$spaceBefore.'" height="1" alt="" title="" /></td>'; }
01485                 $content.='<td bgcolor="'.$lineColor.'"><img src="'.$GLOBALS['TSFE']->absRefPrefix.'clear.gif" width="1" height="'.$lineThickness.'" alt="" title="" /></td>';
01486                 if ($spaceAfter)        {$content.='<td width="1"><img src="'.$GLOBALS['TSFE']->absRefPrefix.'clear.gif" width="'.$spaceAfter.'" height="1" alt="" title="" /></td>'; }
01487                 $content.='</tr></table>';
01488 
01489                 $content = $this->stdWrap($content, $conf['stdWrap.']);
01490                 return $content;
01491         }
01492 
01500         function CASEFUNC ($conf){
01501                 $content='';
01502                 if ($this->checkIf($conf['if.']))       {
01503                         if ($conf['setCurrent'] || $conf['setCurrent.']){$this->data[$this->currentValKey] = $this->stdWrap($conf['setCurrent'], $conf['setCurrent.']);}
01504                         $key = $this->stdWrap($conf['key'],$conf['key.']);
01505                         $key = strlen($conf[$key]) ? $key : 'default';
01506                         $name = $conf[$key];
01507                         $theValue = $this->cObjGetSingle($name,$conf[$key.'.'], $key);
01508                         if ($conf['stdWrap.'])  {
01509                                 $theValue = $this->stdWrap($theValue,$conf['stdWrap.']);
01510                         }
01511                         return $theValue;
01512                 }
01513         }
01514 
01525         function LOAD_REGISTER($conf,$name)     {
01526                 if ($name=='RESTORE_REGISTER')  {
01527                         $GLOBALS['TSFE']->register = array_pop($GLOBALS['TSFE']->registerStack);
01528                 } else {
01529                         array_push($GLOBALS['TSFE']->registerStack,$GLOBALS['TSFE']->register);
01530                         if (is_array($conf))    {
01531                                 reset($conf);
01532                                 while(list($theKey,$theValue)=each($conf))      {
01533                                         if (!strstr($theKey,'.') || !isset($conf[substr($theKey,0,-1)]))        {               // Only if 1) the property is set but not the value itself, 2) the value and/or any property
01534                                                 if (strstr($theKey,'.'))        {
01535                                                         $theKey = substr($theKey,0,-1);
01536                                                 }
01537                                                 $GLOBALS['TSFE']->register[$theKey] = $this->stdWrap($conf[$theKey],$conf[$theKey.'.']);
01538                                         }
01539                                 }
01540                         }
01541                 }
01542                 return '';
01543         }
01544 
01565         function FORM($conf,$formData='')    {
01566                 $content='';
01567                 if (is_array($formData))        {
01568                         $dataArr = $formData;
01569                 } else {
01570                         $data=$this->stdWrap($conf['data'],$conf['data.']);
01571                                 // Clearing dataArr
01572                         $dataArr=array();
01573                                 // Getting the original config
01574                         if (trim($data))        {
01575                                 $data = ereg_replace(chr(10),'||',$data);
01576                                 $dataArr = explode('||',$data);
01577                         }
01578                                 // Adding the new dataArray config form:
01579                         if (is_array($conf['dataArray.'])) {    // dataArray is supplied
01580                                 $sKeyArray = t3lib_TStemplate::sortedKeyList($conf['dataArray.'], TRUE);
01581                                 foreach($sKeyArray as $theKey)  {
01582                                         $dAA = $conf['dataArray.'][$theKey.'.'];
01583                                         if (is_array($dAA))     {
01584                                                 $temp=array();
01585                                                 list($temp[0])= explode('|',$dAA['label.'] ? $this->stdWrap($dAA['label'],$dAA['label.']) : $dAA['label']);
01586                                                 list($temp[1])= explode('|',$dAA['type']);
01587                                                 if ($dAA['required'])   {$temp[1]='*'.$temp[1];}
01588                                                 list($temp[2])= explode('|',$dAA['value.'] ? $this->stdWrap($dAA['value'],$dAA['value.']) : $dAA['value']);
01589                                                         // If value Array is set, then implode those values.
01590                                                 if (is_array($dAA['valueArray.']))      {
01591                                                         reset($dAA['valueArray.']);
01592                                                         $temp_accum = array();
01593                                                         while(list($dAKey_vA,$dAA_vA)=each($dAA['valueArray.']))        {
01594                                                                 if (is_array($dAA_vA) && !strcmp(intval($dAKey_vA).'.',$dAKey_vA))      {
01595                                                                         $temp_vA=array();
01596                                                                         list($temp_vA[0])= explode('=',$dAA_vA['label.'] ? $this->stdWrap($dAA_vA['label'],$dAA_vA['label.']) : $dAA_vA['label']);
01597                                                                         if ($dAA_vA['selected'])        {$temp_vA[0]='*'.$temp_vA[0];}
01598                                                                         list($temp_vA[1])= explode(',',$dAA_vA['value']);
01599                                                                 }
01600                                                                 $temp_accum[] = implode('=',$temp_vA);
01601                                                         }
01602                                                         $temp[2] = implode(',',$temp_accum);
01603                                                 }
01604                                                 list($temp[3])= explode('|',$dAA['specialEval.'] ? $this->stdWrap($dAA['specialEval'],$dAA['specialEval.']) : $dAA['specialEval']);
01605 
01606                                                         // adding the form entry to the dataArray
01607                                                 $dataArr[] = implode('|',$temp);
01608                                         }
01609                                 }
01610                         }
01611                 }
01612 
01613                 $attachmentCounter = '';
01614                 $hiddenfields = '';
01615                 $fieldlist = Array();
01616                 $propertyOverride = Array();
01617                 $fieldname_hashArray = Array();
01618                 $cc = 0;
01619 
01620                 $xhtmlStrict = t3lib_div::inList('xhtml_strict,xhtml_11,xhtml_2',$GLOBALS['TSFE']->xhtmlDoctype);
01621                         // Formname
01622                 if ($conf['formName'])  {
01623                         $formname = $this->cleanFormName($conf['formName']);
01624                 } else {
01625                         $formname = $GLOBALS['TSFE']->uniqueHash();
01626                         $formname = 'a'.$formname;      // form name has to start with a letter to reach XHTML compliance
01627                 }
01628 
01629                 if (isset($conf['fieldPrefix']))        {
01630                         if ($conf['fieldPrefix'])       {
01631                                 $prefix = $this->cleanFormName($conf['fieldPrefix']);
01632                         } else {
01633                                 $prefix = '';
01634                         }
01635                 } else {
01636                         $prefix = $formname;
01637                 }
01638 
01639                 foreach($dataArr as $val)       {
01640 
01641                         $cc++;
01642                         $confData=Array();
01643                         if (is_array($formData)) {
01644                                 $parts = $val;
01645                                 $val = 1;    // true...
01646                         } else {
01647                                 $val = trim($val);
01648                                 $parts = explode('|',$val);
01649                         }
01650                         if ($val && strcspn($val,'#/')) {
01651                                         // label:
01652                                 $confData['label'] = trim($parts[0]);
01653                                         // field:
01654                                 $fParts = explode(',',$parts[1]);
01655                                 $fParts[0]=trim($fParts[0]);
01656                                 if (substr($fParts[0],0,1)=='*')        {
01657                                         $confData['required']=1;
01658                                         $fParts[0] = substr($fParts[0],1);
01659                                 }
01660                                 $typeParts = explode('=',$fParts[0]);
01661                                 $confData['type'] = trim(strtolower(end($typeParts)));
01662                                 if (count($typeParts)==1)       {
01663                                         $confData['fieldname'] = $this->cleanFormName($parts[0]);
01664                                         if (strtolower(ereg_replace('[^[:alnum:]]','',$confData['fieldname']))=='email')        {$confData['fieldname']='email';}
01665                                                 // Duplicate fieldnames resolved
01666                                         if (isset($fieldname_hashArray[md5($confData['fieldname'])]))   {
01667                                                 $confData['fieldname'].='_'.$cc;
01668                                         }
01669                                         $fieldname_hashArray[md5($confData['fieldname'])]=$confData['fieldname'];
01670                                                 // Attachment names...
01671                                         if ($confData['type']=='file')  {
01672                                                 $confData['fieldname']='attachment'.$attachmentCounter;
01673                                                 $attachmentCounter=intval($attachmentCounter)+1;
01674                                         }
01675                                 } else {
01676                                         $confData['fieldname'] = str_replace(' ','_',trim($typeParts[0]));
01677                                 }
01678                                 $fieldCode='';
01679 
01680                                 if ($conf['wrapFieldName'])     {
01681                                         $confData['fieldname'] = $this->wrap($confData['fieldname'],$conf['wrapFieldName']);
01682                                 }
01683 
01684                                         // Set field name as current:
01685                                 $this->setCurrentVal($confData['fieldname']);
01686 
01687                                         // Additional parameters
01688                                 if (trim($confData['type']))    {
01689                                         $addParams=trim($conf['params']);
01690                                         if (is_array($conf['params.']) && isset($conf['params.'][$confData['type']]))   {
01691                                                 $addParams=trim($conf['params.'][$confData['type']]);
01692                                         }
01693                                         if (strcmp('',$addParams))      $addParams=' '.$addParams;
01694                                 } else $addParams='';
01695 
01696                                 if ($conf['dontMd5FieldNames']) {
01697                                         $fName = $confData['fieldname'];
01698                                 } else {
01699                                         $fName = md5($confData['fieldname']);
01700                                 }
01701 
01702                                         // Accessibility: Set id = fieldname attribute:
01703                                 if ($conf['accessibility'] || $xhtmlStrict)     {
01704                                         $elementIdAttribute = ' id="'.$prefix.$fName.'"';
01705                                 } else {
01706                                         $elementIdAttribute = '';
01707                                 }
01708 
01709                                         // Create form field based on configuration/type:
01710                                 switch($confData['type'])       {
01711                                         case 'textarea':
01712                                                 $cols=trim($fParts[1]) ? intval($fParts[1]) : 20;
01713                                                 $compWidth = doubleval($conf['compensateFieldWidth'] ? $conf['compensateFieldWidth'] : $GLOBALS['TSFE']->compensateFieldWidth);
01714                                                 $compWidth = $compWidth ? $compWidth : 1;
01715                                                 $cols = t3lib_div::intInRange($cols*$compWidth, 1, 120);
01716 
01717                                                 $rows=trim($fParts[2]) ? t3lib_div::intInRange($fParts[2],1,30) : 5;
01718                                                 $wrap=trim($fParts[3]);
01719                                                 if ($conf['noWrapAttr'] || $wrap === 'disabled')        {
01720                                                         $wrap='';
01721                                                 } else {
01722                                                         $wrap = $wrap ? ' wrap="'.$wrap.'"' : ' wrap="virtual"';
01723                                                 }
01724                                                 $default = $this->getFieldDefaultValue($conf['noValueInsert'], $confData['fieldname'], str_replace('\n',chr(10),trim($parts[2])));
01725                                                 $fieldCode=sprintf('<textarea name="%s"'.$elementIdAttribute.' cols="%s" rows="%s"%s'.$addParams.'>%s</textarea>',
01726                                                         $confData['fieldname'], $cols, $rows, $wrap, t3lib_div::formatForTextarea($default));
01727                                         break;
01728                                         case 'input':
01729                                         case 'password':
01730                                                 $size=trim($fParts[1]) ? intval($fParts[1]) : 20;
01731                                                 $compWidth = doubleval($conf['compensateFieldWidth'] ? $conf['compensateFieldWidth'] : $GLOBALS['TSFE']->compensateFieldWidth);
01732                                                 $compWidth = $compWidth ? $compWidth : 1;
01733                                                 $size = t3lib_div::intInRange($size*$compWidth, 1, 120);
01734                                                 $default = $this->getFieldDefaultValue($conf['noValueInsert'], $confData['fieldname'], trim($parts[2]));
01735 
01736                                                 if ($confData['type']=='password')      {
01737                                                         $default='';
01738                                                 }
01739 
01740                                                 $max=trim($fParts[2]) ? ' maxlength="'.t3lib_div::intInRange($fParts[2],1,1000).'"' : "";
01741                                                 $theType = $confData['type']=='input' ? 'text' : 'password';
01742 
01743                                                 $fieldCode=sprintf('<input type="'.$theType.'" name="%s"'.$elementIdAttribute.' size="%s"%s value="%s"'.$addParams.' />',
01744                                                         $confData['fieldname'], $size, $max, htmlspecialchars($default));
01745 
01746                                         break;
01747                                         case 'file':
01748                                                 $size=trim($fParts[1]) ? t3lib_div::intInRange($fParts[1],1,60) : 20;
01749                                                 $fieldCode=sprintf('<input type="file" name="%s"'.$elementIdAttribute.' size="%s"'.$addParams.' />',
01750                                                         $confData['fieldname'], $size);
01751                                         break;
01752                                         case 'check':
01753                                                         // alternative default value:
01754                                                 $default = $this->getFieldDefaultValue($conf['noValueInsert'], $confData['fieldname'], trim($parts[2]));
01755                                                 $checked = $default ? ' checked="checked"' : '';
01756                                                 $fieldCode=sprintf('<input type="checkbox" value="%s" name="%s"'.$elementIdAttribute.'%s'.$addParams.' />',
01757                                                         1, $confData['fieldname'], $checked);
01758                                         break;
01759                                         case 'select':
01760                                                 $option='';
01761                                                 $valueParts = explode(',',$parts[2]);
01762                                                         // size
01763                                                 if (strtolower(trim($fParts[1]))=='auto')       {$fParts[1]=count($valueParts);}                // Auto size set here. Max 20
01764                                                 $size=trim($fParts[1]) ? t3lib_div::intInRange($fParts[1],1,20) : 1;
01765                                                         // multiple
01766                                                 $multiple = strtolower(trim($fParts[2]))=='m' ? ' multiple="multiple"' : '';
01767 
01768                                                 $items=array();         // Where the items will be
01769                                                 $defaults=array(); //RTF
01770                                                 for($a=0;$a<count($valueParts);$a++)    {
01771                                                         $valueParts[$a]=trim($valueParts[$a]);
01772                                                         if (substr($valueParts[$a],0,1)=='*')   {       // Finding default value
01773                                                                 $sel='selected';
01774                                                                 $valueParts[$a] = substr($valueParts[$a],1);
01775                                                         } else $sel='';
01776                                                                 // Get value/label
01777                                                         $subParts=explode('=',$valueParts[$a]);
01778                                                         $subParts[1] = (isset($subParts[1])?trim($subParts[1]):trim($subParts[0]));             // Sets the value
01779                                                         $items[] = $subParts;   // Adds the value/label pair to the items-array
01780                                                         if ($sel) {$defaults[]=$subParts[1];}   // Sets the default value if value/label pair is marked as default.
01781                                                 }
01782                                                         // alternative default value:
01783                                                 $default = $this->getFieldDefaultValue($conf['noValueInsert'], $confData['fieldname'], $defaults);
01784                                                 if (!is_array($default)) {
01785                                                         $defaults=array();
01786                                                         $defaults[] = $default;
01787                                                 } else $defaults=$default;
01788                                                         // Create the select-box:
01789                                                 for($a=0;$a<count($items);$a++) {
01790                                                         $option.='<option value="'.$items[$a][1].'"'.(in_array($items[$a][1],$defaults)?' selected="selected"':'').'>'.trim($items[$a][0]).'</option>'; //RTF
01791                                                 }
01792 
01793                                                 if ($multiple)  $confData['fieldname'].='[]';   // The fieldname must be prepended '[]' if multiple select. And the reason why it's prepended is, because the required-field list later must also have [] prepended.
01794                                                 $fieldCode=sprintf('<select name="%s"'.$elementIdAttribute.' size="%s"%s'.$addParams.'>%s</select>',
01795                                                         $confData['fieldname'], $size, $multiple, $option); //RTF
01796                                         break;
01797                                         case 'radio':
01798                                                 $option='';
01799                                                 if ($conf['accessibility'])     {
01800                                                         $option.='<fieldset'.$elementIdAttribute.'><legend>'.$confData['label'].'</legend>';
01801                                                 }
01802                                                 $valueParts = explode(',',$parts[2]);
01803                                                 $items=array();         // Where the items will be
01804                                                 $default='';
01805                                                 for($a=0;$a<count($valueParts);$a++)    {
01806                                                         $valueParts[$a]=trim($valueParts[$a]);
01807                                                         if (substr($valueParts[$a],0,1)=='*')   {
01808                                                                 $sel='checked';
01809                                                                 $valueParts[$a] = substr($valueParts[$a],1);
01810                                                         } else $sel='';
01811                                                                 // Get value/label
01812                                                         $subParts=explode('=',$valueParts[$a]);
01813                                                         $subParts[1] = (isset($subParts[1])?trim($subParts[1]):trim($subParts[0]));             // Sets the value
01814                                                         $items[] = $subParts;   // Adds the value/label pair to the items-array
01815                                                         if ($sel) {$default=$subParts[1];}      // Sets the default value if value/label pair is marked as default.
01816                                                 }
01817                                                         // alternative default value:
01818                                                 $default = $this->getFieldDefaultValue($conf['noValueInsert'], $confData['fieldname'], $default);
01819                                                         // Create the select-box:
01820                                                 for($a=0;$a<count($items);$a++) {
01821                                                         $radioId = $prefix.$fName.$this->cleanFormName($items[$a][0]);
01822                                                         if ($conf['accessibility'])     {
01823                                                                 $radioLabelIdAttribute = ' id="'.$radioId.'"';
01824                                                         } else {
01825                                                                 $radioLabelIdAttribute = '';
01826                                                         }
01827                                                         $option .= '<input type="radio" name="'.$confData['fieldname'].'"'.$radioLabelIdAttribute.' value="'.$items[$a][1].'"'.(!strcmp($items[$a][1],$default)?' checked="checked"':'').''.$addParams.' />';
01828                                                         if ($conf['accessibility'])     {
01829                                                                 $option .= '<label for="'.$radioId.'">' . $this->stdWrap(trim($items[$a][0]), $conf['radioWrap.']) . '</label>';
01830                                                         } else {
01831                                                                 $option .= $this->stdWrap(trim($items[$a][0]), $conf['radioWrap.']);
01832                                                         }
01833                                                 }
01834                                                 if ($conf['accessibility'])     {
01835                                                         $option.='</fieldset>';
01836                                                 }
01837                                                 $fieldCode = $option;
01838                                         break;
01839                                         case 'hidden':
01840                                                 $value = trim($parts[2]);
01841                                                 if(strlen($value) && t3lib_div::inList('recipient_copy,recipient',$confData['fieldname']) && $GLOBALS['TYPO3_CONF_VARS']['FE']['secureFormmail']) {
01842                                                         break;
01843                                                 }
01844                                                 if (strlen($value) && t3lib_div::inList('recipient_copy,recipient',$confData['fieldname']))     {
01845                                                         $value = $GLOBALS['TSFE']->codeString($value);
01846                                                 }
01847                                                 $hiddenfields.=sprintf('<input type="hidden" name="%s"'.$elementIdAttribute.' value="%s" />',
01848                                                         $confData['fieldname'], htmlspecialchars($value));
01849                                         break;
01850                                         case 'property':
01851                                                 if (t3lib_div::inList('type,locationData,goodMess,badMess,emailMess',$confData['fieldname']))   {
01852                                                         $value=trim($parts[2]);
01853                                                         $propertyOverride[$confData['fieldname']] = $value;
01854                                                         $conf[$confData['fieldname']] = $value;
01855                                                 }
01856                                         break;
01857                                         case 'submit':
01858                                                 $value=trim($parts[2]);
01859                                                 if ($conf['image.'])    {
01860                                                         $this->data[$this->currentValKey]=$value;
01861                                                         $image=$this->IMAGE($conf['image.']);
01862                                                 } else $image='';
01863                                                 if($image)      {
01864                                                         $fieldCode = str_replace('<img','<input type="image"'.$addParams.' name="'.$confData['fieldname'].'"' ,$image);
01865                                                 } else  {
01866                                                         $fieldCode=sprintf('<input type="submit" name="%s"'.$elementIdAttribute.' value="%s"'.$addParams.' />',
01867                                                                 $confData['fieldname'], t3lib_div::deHSCentities(htmlspecialchars($value)));
01868                                                 }
01869                                         break;
01870                                         case 'reset':
01871                                                 $value=trim($parts[2]);
01872                                                 $fieldCode=sprintf('<input type="reset" name="%s"'.$elementIdAttribute.' value="%s"'.$addParams.' />',
01873                                                         $confData['fieldname'], t3lib_div::deHSCentities(htmlspecialchars($value)));
01874                                         break;
01875                                         case 'label':
01876                                                 $fieldCode = nl2br(htmlspecialchars(trim($parts[2])));
01877                                         break;
01878                                         default:
01879                                                 $confData['type'] = 'comment';
01880                                                 $fieldCode = trim($parts[2]).'&nbsp;';
01881                                         break;
01882                                 }
01883                                 if ($fieldCode) {
01884 
01885                                                 // Checking for special evaluation modes:
01886                                         if (t3lib_div::inList('textarea,input,password',$confData['type']) && strlen(trim($parts[3])))  {
01887                                                 $modeParameters = t3lib_div::trimExplode(':',$parts[3]);
01888                                         } else {
01889                                                 $modeParameters = array();
01890                                         }
01891 
01892                                                 // Adding evaluation based on settings:
01893                                         switch((string)$modeParameters[0])      {
01894                                                 case 'EREG':
01895                                                         $fieldlist[] = '_EREG';
01896                                                         $fieldlist[] = rawurlencode($modeParameters[1]);
01897                                                         $fieldlist[] = rawurlencode($modeParameters[2]);
01898                                                         $fieldlist[] = rawurlencode($confData['fieldname']);
01899                                                         $fieldlist[] = rawurlencode($confData['label']);
01900                                                         $confData['required'] = 1;      // Setting this so "required" layout is used.
01901                                                 break;
01902                                                 case 'EMAIL':
01903                                                         $fieldlist[] = '_EMAIL';
01904                                                         $fieldlist[] = rawurlencode($confData['fieldname']);
01905                                                         $fieldlist[] = rawurlencode($confData['label']);
01906                                                         $confData['required'] = 1;      // Setting this so "required" layout is used.
01907                                                 break;
01908                                                 default:
01909                                                         if ($confData['required'] && $confData['type']!='check')        {
01910                                                                 $fieldlist[] = rawurlencode($confData['fieldname']);
01911                                                                 $fieldlist[] = rawurlencode($confData['label']);
01912                                                         }
01913                                                 break;
01914                                         }
01915 
01916                                                 // Field:
01917                                         $fieldLabel = $confData['label'];
01918                                         if ($conf['accessibility'] && trim($fieldLabel) && !preg_match('/^(label|hidden|comment)$/',$confData['type'])) {
01919                                                 $fieldLabel = '<label for="'.$prefix.$fName.'">'.$fieldLabel.'</label>';
01920                                         }
01921 
01922                                                 // Getting template code:
01923                                         $fieldCode = $this->stdWrap($fieldCode, $conf['fieldWrap.']);
01924                                         $labelCode = $this->stdWrap($fieldLabel, $conf['labelWrap.']);
01925                                         $commentCode = $this->stdWrap($confData['label'], $conf['commentWrap.']); // RTF
01926                                         $result = $conf['layout'];
01927                                         if ($conf['REQ'] && $confData['required'])      {
01928                                                 if (is_array($conf['REQ.']['fieldWrap.']))
01929                                                         $fieldCode = $this->stdWrap($fieldCode, $conf['REQ.']['fieldWrap.']);
01930                                                 if (is_array($conf['REQ.']['labelWrap.']))
01931                                                         $labelCode = $this->stdWrap($fieldLabel, $conf['REQ.']['labelWrap.']);
01932                                                 if ($conf['REQ.']['layout'])    {
01933                                                         $result = $conf['REQ.']['layout'];
01934                                                 }
01935                                         }
01936                                         if ($confData['type']=='comment' && $conf['COMMENT.']['layout'])        {
01937                                                 $result = $conf['COMMENT.']['layout'];
01938                                         }
01939                                         if ($confData['type']=='check' && $conf['CHECK.']['layout'])    {
01940                                                 $result = $conf['CHECK.']['layout'];
01941                                         }
01942                                         if ($confData['type']=='radio' && $conf['RADIO.']['layout'])    {
01943                                                 $result = $conf['RADIO.']['layout'];
01944                                         }
01945                                         if ($confData['type']=='label' && $conf['LABEL.']['layout']) {
01946                                                 $result = $conf['LABEL.']['layout'];
01947                                         }
01948                                         $result = str_replace('###FIELD###',$fieldCode,$result);
01949                                         $result = str_replace('###LABEL###',$labelCode,$result);
01950                                         $result = str_replace('###COMMENT###',$commentCode,$result); //RTF
01951                                         $content.= $result;
01952                                 }
01953                         }
01954                 }
01955                 if ($conf['stdWrap.']) $content=$this->stdWrap($content, $conf['stdWrap.']);
01956 
01957 
01958                         // redirect (external: where to go afterwards. internal: where to submit to)
01959                 $theRedirect = $this->stdWrap($conf['redirect'], $conf['redirect.']);                   // redirect should be set to the page to redirect to after an external script has been used. If internal scripts is used, and if no 'type' is set that dictates otherwise, redirect is used as the url to jump to as long as it's an integer (page)
01960                 $page = $GLOBALS['TSFE']->page;
01961                 if (!$theRedirect)      {               // Internal: Just submit to current page
01962                         $LD = $GLOBALS['TSFE']->tmpl->linkData($page, $conf['target'], $conf['no_cache'],'index.php', '', $this->getClosestMPvalueForPage($page['uid']));
01963                 } elseif (t3lib_div::testInt($theRedirect))     {               // Internal: Submit to page with id $theRedirect
01964                         $page = $GLOBALS['TSFE']->sys_page->getPage_noCheck($theRedirect);
01965                         $LD = $GLOBALS['TSFE']->tmpl->linkData($page, $conf['target'], $conf['no_cache'],'index.php', '', $this->getClosestMPvalueForPage($page['uid']));
01966                 } else {        // External url, redirect-hidden field is rendered!
01967                         $LD = $GLOBALS['TSFE']->tmpl->linkData($page, $conf['target'], $conf['no_cache'],'', '', $this->getClosestMPvalueForPage($page['uid']));
01968                         $LD['totalURL'] = $theRedirect;
01969                         $hiddenfields.= '<input type="hidden" name="redirect" value="'.htmlspecialchars($LD['totalURL']).'" />';                // 18-09-00 added
01970                 }
01971 
01972                         // Formtype (where to submit to!):
01973                 $formtype = $propertyOverride['type'] ? $propertyOverride['type'] : $this->stdWrap($conf['type'], $conf['type.']);
01974                 if (t3lib_div::testInt($formtype))      {       // Submit to a specific page
01975                         $page = $GLOBALS['TSFE']->sys_page->getPage_noCheck($formtype);
01976                         $LD_A = $GLOBALS['TSFE']->tmpl->linkData($page, $conf['target'], $conf['no_cache'], '', '', $this->getClosestMPvalueForPage($page['uid']));
01977                         $action = $LD_A['totalURL'];
01978                 } elseif ($formtype){           // Submit to external script
01979                         $LD_A = $LD;
01980                         $action = $formtype;
01981                 } elseif (t3lib_div::testInt($theRedirect)) {
01982                         $LD_A = $LD;
01983                         $action = $LD_A['totalURL'];
01984                 } else {                // Submit to 'nothing' - which is current page
01985                         $LD_A = $GLOBALS['TSFE']->tmpl->linkData($GLOBALS['TSFE']->page, $conf['target'], $conf['no_cache'], '', '', $this->getClosestMPvalueForPage($page['uid']));
01986                         $action = $LD_A['totalURL'];
01987                 }
01988 
01989                         // Recipient:
01990                 $theEmail = $this->stdWrap($conf['recipient'], $conf['recipient.']);
01991                 if ($theEmail && !$GLOBALS['TYPO3_CONF_VARS']['FE']['secureFormmail'])  {
01992                         $theEmail = $GLOBALS['TSFE']->codeString($theEmail);
01993                         $hiddenfields.='<input type="hidden" name="recipient" value="'.htmlspecialchars($theEmail).'" />';
01994                 }
01995 
01996                         // location data:
01997                 if ($conf['locationData'])      {
01998                         if ($conf['locationData']=='HTTP_POST_VARS' && isset($_POST['locationData']))   {
01999                                 $locationData = t3lib_div::_POST('locationData');
02000                         } else {
02001                                 $locationData = $GLOBALS['TSFE']->id.':'.$this->currentRecord;  // locationData is [hte page id]:[tablename]:[uid of record]. Indicates on which page the record (from tablename with uid) is shown. Used to check access.
02002                         }
02003                         $hiddenfields.='<input type="hidden" name="locationData" value="'.htmlspecialchars($locationData).'" />';
02004                 }
02005 
02006                         // hidden fields:
02007                 if (is_array($conf['hiddenFields.']))   {
02008                         reset($conf['hiddenFields.']);
02009                         while(list($hF_key,$hF_conf) = each($conf['hiddenFields.']))    {
02010                                 if (substr($hF_key,-1)!='.')    {
02011                                         $hF_value = $this->cObjGetSingle($hF_conf,$conf['hiddenFields.'][$hF_key.'.'],'hiddenfields');
02012                                         if (strlen($hF_value) && t3lib_div::inList('recipient_copy,recipient',$hF_key)) {
02013                                                 if($GLOBALS['TYPO3_CONF_VARS']['FE']['secureFormmail']) {
02014                                                         continue;
02015                                                 }
02016                                                 $hF_value = $GLOBALS['TSFE']->codeString($hF_value);
02017                                         }
02018                                         $hiddenfields.='<input type="hidden" name="'.$hF_key.'" value="'.htmlspecialchars($hF_value).'" />';
02019                                 }
02020                         }
02021                 }
02022 
02023                         // Wrap all hidden fields in a div tag (see http://bugs.typo3.org/view.php?id=678)
02024                 $hiddenfields = '<div style="display:none;">'.$hiddenfields.'</div>';
02025 
02026                 if ($conf['REQ'])       {
02027                         $validateForm=' onsubmit="return validateForm(\''.$formname.'\',\''.implode(',',$fieldlist).'\','.t3lib_div::quoteJSvalue($conf['goodMess']).','.t3lib_div::quoteJSvalue($conf['badMess']).','.t3lib_div::quoteJSvalue($conf['emailMess']).')"';
02028                         $GLOBALS['TSFE']->additionalHeaderData['JSFormValidate'] = '<script type="text/javascript" src="'.$GLOBALS['TSFE']->absRefPrefix.'t3lib/jsfunc.validateform.js"></script>';
02029                 } else $validateForm='';
02030 
02031                         // Create form tag:
02032                 $theTarget = ($theRedirect?$LD['target']:$LD_A['target']);
02033                 $content = Array(
02034                         '<form'.
02035                                 ' action="'.htmlspecialchars($action).'"'.
02036                                 ' id="'.$formname.'"'.($xhtmlStrict ? '' : ' name="'.$formname.'"').
02037                                 ' enctype="'.$GLOBALS['TYPO3_CONF_VARS']['SYS']['form_enctype'].'"'.
02038                                 ' method="'.($conf['method']?$conf['method']:'post').'"'.
02039                                 ($theTarget ? ' target="'.$theTarget.'"' : '').
02040                                 $validateForm.
02041                                 '>',
02042                         $hiddenfields.$content,
02043                         '</form>'
02044                 );
02045                 if ($conf['arrayReturnMode'])   {
02046                         $content['validateForm']=$validateForm;
02047                         $content['formname']=$formname;
02048                         return $content;
02049                 } else {
02050                         return implode('',$content);
02051                 }
02052         }
02053 
02061         function SEARCHRESULT($conf)    {
02062                 if (t3lib_div::_GP('sword') && t3lib_div::_GP('scols')) {
02063                         $search = t3lib_div::makeInstance('tslib_search');
02064                         $search->register_and_explode_search_string(t3lib_div::_GP('sword'));
02065                         $search->register_tables_and_columns(t3lib_div::_GP('scols'),$conf['allowedCols']);
02066                                 // depth
02067                         $depth=100;
02068                                 // the startId is found
02069                         $theStartId=0;
02070                         if (t3lib_div::testInt(t3lib_div::_GP('stype')))        {
02071                                 $temp_theStartId=t3lib_div::_GP('stype');
02072                                 $rootLine = $GLOBALS['TSFE']->sys_page->getRootLine($temp_theStartId);
02073                                         // The page MUST have a rootline with the Level0-page of the current site inside!!
02074                                 while(list(,$val)=each($rootLine))      {
02075                                         if($val['uid']==$GLOBALS['TSFE']->tmpl->rootLine[0]['uid'])     {
02076                                                 $theStartId=$temp_theStartId;
02077                                         }
02078                                 }
02079                         } else if (t3lib_div::_GP('stype'))     {
02080                                 if (substr(t3lib_div::_GP('stype'),0,1)=='L')   {
02081                                         $pointer = intval(substr(t3lib_div::_GP('stype'),1));
02082                                         $theRootLine = $GLOBALS['TSFE']->tmpl->rootLine;
02083                                                 // location Data:
02084                                         $locDat_arr = explode(':',t3lib_div::_POST('locationData'));
02085                                         $pId = intval($locDat_arr[0]);
02086                                         if ($pId)       {
02087                                                 $altRootLine = $GLOBALS['TSFE']->sys_page->getRootLine($pId);
02088                                                 ksort($altRootLine);
02089                                                 if (count($altRootLine))        {
02090                                                                 // check if the rootline has the real Level0 in it!!
02091                                                         reset($altRootLine);
02092                                                         $hitRoot=0;
02093                                                         $theNewRoot=array();
02094                                                         while(list(,$val)=each($altRootLine))   {
02095                                                                 if($hitRoot || $val['uid']==$GLOBALS['TSFE']->tmpl->rootLine[0]['uid']) {
02096                                                                         $hitRoot=1;
02097                                                                         $theNewRoot[]=$val;
02098                                                                 }
02099                                                         }
02100                                                         if ($hitRoot)   {
02101                                                                 $theRootLine = $theNewRoot;             // Override the real rootline if any thing
02102                                                         }
02103                                                 }
02104                                         }
02105                                         $key = $this->getKey($pointer,$theRootLine);
02106                                         $theStartId = $theRootLine[$key]['uid'];
02107                                 }
02108                         }
02109                         if (!$theStartId)       {
02110                                         // If not set, we use current page
02111                                 $theStartId = $GLOBALS['TSFE']->id;
02112                         }
02113                                 // generate page-tree
02114                         $search->pageIdList.= $this->getTreeList(-1*$theStartId,$depth);
02115 
02116                         $endClause = 'pages.uid IN ('.$search->pageIdList.')
02117                                 AND pages.doktype in ('.$GLOBALS['TYPO3_CONF_VARS']['FE']['content_doktypes'].($conf['addExtUrlsAndShortCuts']?',3,4':'').')
02118                                 AND pages.no_search=0'.
02119                                 $this->enableFields($search->fTable).
02120                                 $this->enableFields('pages');
02121 
02122                         if ($conf['languageField.'][$search->fTable])   {
02123                                 $endClause.= ' AND '.$search->fTable.'.'.$conf['languageField.'][$search->fTable].' = '.intval($GLOBALS['TSFE']->sys_language_uid);     // (using sys_language_uid which is the ACTUAL language of the page. sys_language_content is only for selecting DISPLAY content!)
02124                         }
02125 
02126                                 // build query
02127                         $search->build_search_query($endClause);
02128 
02129                                 // count...
02130                         if (t3lib_div::testInt(t3lib_div::_GP('scount')))       {
02131                                 $search->res_count = t3lib_div::_GP('scount');
02132                         } else {
02133                                 $search->count_query();
02134                         }
02135 
02136                                 // range
02137                         $spointer = intval(t3lib_div::_GP('spointer'));
02138                         if (isset($conf['range']))      {
02139                                 $theRange = intval($conf['range']);
02140                         } else {
02141                                 $theRange = 20;
02142                         }
02143 
02144                                 // Order By:
02145                         if (!$conf['noOrderBy'])        {
02146                                 $search->queryParts['ORDERBY'] = 'pages.lastUpdated, pages.tstamp';
02147                         }
02148 
02149                         $search->queryParts['LIMIT'] = $spointer.','.$theRange;
02150 
02151                                 // search...
02152                         $search->execute_query();
02153                         if ($GLOBALS['TYPO3_DB']->sql_num_rows($search->result))        {
02154                                 $GLOBALS['TSFE']->register['SWORD_PARAMS'] = $search->get_searchwords();
02155 
02156                                 $total = $search->res_count;
02157                                 $rangeLow = t3lib_div::intInRange($spointer+1,1,$total);
02158                                 $rangeHigh = t3lib_div::intInRange($spointer+$theRange,1,$total);
02159                                         // prev/next url:
02160                                 $LD = $GLOBALS['TSFE']->tmpl->linkData($GLOBALS['TSFE']->page,$conf['target'],1,'', '', $this->getClosestMPvalueForPage($GLOBALS['TSFE']->page['uid']));
02161                                 $targetPart = $LD['target'] ? ' target="'.htmlspecialchars($LD['target']).'"' : '';
02162                                 $urlParams = $this->URLqMark($LD['totalURL'],
02163                                                 '&sword='.rawurlencode(t3lib_div::_GP('sword')).
02164                                                 '&scols='.rawurlencode(t3lib_div::_GP('scols')).
02165                                                 '&stype='.rawurlencode(t3lib_div::_GP('stype')).
02166                                                 '&scount='.$total);
02167                                         // substitution:
02168                                 $result= $this->cObjGetSingle($conf['layout'],$conf['layout.'], 'layout');
02169                                 $result = str_replace('###RANGELOW###',$rangeLow,$result);
02170                                 $result = str_replace('###RANGEHIGH###',$rangeHigh,$result);
02171                                 $result = str_replace('###TOTAL###',$total,$result);
02172 
02173                                 if ($rangeHigh<$total)  {
02174                                         $next = $this->cObjGetSingle($conf['next'], $conf['next.'], 'next');
02175                                         $next = '<a href="'.htmlspecialchars($urlParams.'&spointer='.($spointer+$theRange)).'"'.$targetPart.$GLOBALS['TSFE']->ATagParams.'>'.$next.'</a>';
02176                                 } else $next='';
02177                                 $result = str_replace('###NEXT###',$next,$result);
02178 
02179                                 if ($rangeLow>1)        {
02180                                         $prev = $this->cObjGetSingle($conf['prev'], $conf['prev.'], 'prev');
02181                                         $prev = '<a href="'.htmlspecialchars($urlParams.'&spointer='.($spointer-$theRange)).'"'.$targetPart.$GLOBALS['TSFE']->ATagParams.'>'.$prev.'</a>';
02182                                 } else $prev='';
02183                                 $result = str_replace('###PREV###',$prev,$result);
02184 
02185                                         // searching result
02186                                 $theValue = $this->cObjGetSingle($conf['resultObj'], $conf['resultObj.'],'resultObj');
02187                                 $cObj = t3lib_div::makeInstance('tslib_cObj');
02188                                 $cObj->setParent($this->data,$this->currentRecord);
02189                                 $renderCode='';
02190                                 while ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($search->result))   {
02191                                                 // versionOL() here? This is search result displays, is that possible to preview anyway? Or are records selected here already future versions?
02192                                         $cObj->start($row);
02193                                         $renderCode.=$cObj->cObjGetSingle($conf['renderObj'], $conf['renderObj.'],'renderObj');
02194                                 }
02195                                 $theValue.=$this->wrap($renderCode,$conf['renderWrap']);
02196                                 $theValue = str_replace('###RESULT###',$theValue,$result);
02197                         } else {
02198                                 $theValue = $this->cObjGetSingle($conf['noResultObj'], $conf['noResultObj.'],'noResultObj');
02199                         }
02200 
02201                         $GLOBALS['TT']->setTSlogMessage('Search in fields:   '.$search->listOfSearchFields);
02202 
02203                                 // wrapping
02204                         $content=$theValue;
02205                         if ($conf['wrap']) {
02206                                 $content=$this->wrap($content, $conf['wrap']);
02207                         }
02208                         if ($conf['stdWrap.']) {
02209                                 $content=$this->stdWrap($content, $conf['stdWrap.']);
02210                         }
02211                                 // returning
02212                         $GLOBALS['TSFE']->set_no_cache();
02213                         return $content;
02214                 }
02215         }
02216 
02227         function PHP_SCRIPT($conf,$ext='')      {
02228                 $incFile = $GLOBALS['TSFE']->tmpl->getFileName($conf['file']);
02229                 $content='';
02230                 if ($incFile && $GLOBALS['TSFE']->checkFileInclude($incFile))   {
02231                         switch($ext)    {
02232                                 case 'INT':
02233                                 case 'EXT':
02234                                         $substKey = $ext.'_SCRIPT.'.$GLOBALS['TSFE']->uniqueHash();
02235                                         $content.='<!--'.$substKey.'-->';
02236                                         $GLOBALS['TSFE']->config[$ext.'incScript'][$substKey] = array(
02237                                                 'file'=>$incFile,
02238                                                 'conf'=>$conf,
02239                                                 'type'=>'SCRIPT'
02240                                         );
02241                                         if ($ext=='INT')        {
02242                                                 $GLOBALS['TSFE']->config[$ext.'incScript'][$substKey]['cObj'] = serialize($this);
02243                                         } else {
02244                                                 $GLOBALS['TSFE']->config[$ext.'incScript'][$substKey]['data'] = $this->data;
02245                                         }
02246                                 break;
02247                                 default:
02248                                                 // Added 31-12-00: Make backup...
02249                                         $this->oldData = $this->data;
02250                                                 // Include file..
02251                                         include('./'.$incFile);
02252                                                 // Added 31-12-00: restore...
02253                                         if ($RESTORE_OLD_DATA)  {
02254                                                 $this->data = $this->oldData;
02255                                         }
02256                                 break;
02257                         }
02258                 }
02259                 return $content;
02260         }
02261 
02270         function TEMPLATE($conf)        {
02271                 $subparts = Array();
02272                 $marks = Array();
02273                 $wraps = Array();
02274                 $content='';
02275 
02276                 list($PRE,$POST) = explode('|',$conf['markerWrap'] ? $conf['markerWrap'] : '### | ###');
02277                 $POST = trim($POST);
02278                 $PRE  = trim($PRE);
02279 
02280                         // Getting the content
02281                 $content = $this->cObjGetSingle($conf['template'],$conf['template.'],'template');
02282                 if ($conf['workOnSubpart'])     {
02283                         $content = $this->getSubpart($content, $PRE.$conf['workOnSubpart'].$POST);
02284                 }
02285 
02286                         // Fixing all relative paths found:
02287                 if ($conf['relPathPrefix'])     {
02288                         $htmlParser = t3lib_div::makeInstance('t3lib_parsehtml');
02289                         $content = $htmlParser->prefixResourcePath($conf['relPathPrefix'],$content,$conf['relPathPrefix.']);
02290                 }
02291 
02292                 if ($content)   {
02293                         if ($conf['nonCachedSubst'])    {               // NON-CACHED:
02294                                         // Getting marks
02295                                 if (is_array($conf['marks.']))  {
02296                                         reset($conf['marks.']);
02297                                         while(list($theKey,$theValue)=each($conf['marks.']))    {
02298                                                 if (!strstr($theKey,'.'))       {
02299                                                         $content = str_replace(
02300                                                                 $PRE.$theKey.$POST,
02301                                                                 $this->cObjGetSingle($theValue,$conf['marks.'][$theKey.'.'],'marks.'.$theKey),
02302                                                                 $content);
02303                                                 }
02304                                         }
02305                                 }
02306 
02307                                         // Getting subparts.
02308                                 if (is_array($conf['subparts.']))       {
02309                                         reset($conf['subparts.']);
02310                                         while(list($theKey,$theValue)=each($conf['subparts.'])) {
02311                                                 if (!strstr($theKey,'.'))       {
02312                                                         $subpart = $this->getSubpart($content, $PRE.$theKey.$POST);
02313                                                         if ($subpart)   {
02314                                                                 $this->setCurrentVal($subpart);
02315                                                                 $content = $this->substituteSubpart(
02316                                                                         $content,
02317                                                                         $PRE.$theKey.$POST,
02318                                                                         $this->cObjGetSingle($theValue,$conf['subparts.'][$theKey.'.'],'subparts.'.$theKey),
02319                                                                         1
02320                                                                 );
02321                                                         }
02322                                                 }
02323                                         }
02324                                 }
02325                                         // Getting subpart wraps
02326                                 if (is_array($conf['wraps.']))  {
02327                                         reset($conf['wraps.']);
02328                                         while(list($theKey,$theValue)=each($conf['wraps.']))    {
02329                                                 if (!strstr($theKey,'.'))       {
02330                                                         $subpart = $this->getSubpart($content, $PRE.$theKey.$POST);
02331                                                         if ($subpart)   {
02332                                                                 $this->setCurrentVal($subpart);
02333                                                                 $content = $this->substituteSubpart(
02334                                                                         $content,
02335                                                                         $PRE.$theKey.$POST,
02336                                                                         explode('|',$this->cObjGetSingle($theValue,$conf['wraps.'][$theKey.'.'],'wraps.'.$theKey)),
02337                                                                         1
02338                                                                 );
02339                                                         }
02340                                                 }
02341                                         }
02342                                 }
02343                         } else {        // CACHED
02344                                         // Getting subparts.
02345                                 if (is_array($conf['subparts.']))       {
02346                                         reset($conf['subparts.']);
02347                                         while(list($theKey,$theValue)=each($conf['subparts.'])) {
02348                                                 if (!strstr($theKey,'.'))       {
02349                                                         $subpart = $this->getSubpart($content, $PRE.$theKey.$POST);
02350                                                         if ($subpart)   {
02351                                                                 $GLOBALS['TSFE']->register['SUBPART_'.$theKey] = $subpart;
02352                                                                 $subparts[$theKey]['name'] = $theValue;
02353                                                                 $subparts[$theKey]['conf'] = $conf['subparts.'][$theKey.'.'];
02354                                                         }
02355                                                 }
02356                                         }
02357                                 }
02358                                         // Getting marks
02359                                 if (is_array($conf['marks.']))  {
02360                                         reset($conf['marks.']);
02361                                         while(list($theKey,$theValue)=each($conf['marks.']))    {
02362                                                 if (!strstr($theKey,'.'))       {
02363                                                         $marks[$theKey]['name'] = $theValue;
02364                                                         $marks[$theKey]['conf'] = $conf['marks.'][$theKey.'.'];
02365                                                 }
02366                                         }
02367                                 }
02368                                         // Getting subpart wraps
02369                                 if (is_array($conf['wraps.']))  {
02370                                         reset($conf['wraps.']);
02371                                         while(list($theKey,$theValue)=each($conf['wraps.']))    {
02372                                                 if (!strstr($theKey,'.'))       {
02373                                                         $wraps[$theKey]['name'] = $theValue;
02374                                                         $wraps[$theKey]['conf'] = $conf['wraps.'][$theKey.'.'];
02375                                                 }
02376                                         }
02377                                 }
02378                                         // Getting subparts
02379                                 $subpartArray =array();
02380                                 reset($subparts);
02381                                 while(list($theKey,$theValue)=each($subparts))  {
02382                                                 // Set current with the content of the subpart...
02383                                         $this->data[$this->currentValKey] = $GLOBALS['TSFE']->register['SUBPART_'.$theKey];
02384                                                 // Get subpart cObject and substitute it!
02385                                         $subpartArray[$PRE.$theKey.$POST] = $this->cObjGetSingle($theValue['name'],$theValue['conf'],'subparts.'.$theKey);
02386                                 }
02387                                 $this->data[$this->currentValKey] = ''; // Reset current to empty
02388 
02389                                         // Getting marks
02390                                 $markerArray =array();
02391                                 reset($marks);
02392                                 while(list($theKey,$theValue)=each($marks))     {
02393                                         $markerArray[$PRE.$theKey.$POST] = $this->cObjGetSingle($theValue['name'],$theValue['conf'],'marks.'.$theKey);
02394                                 }
02395                                         // Getting wraps
02396                                 $subpartWraps =array();
02397                                 reset($wraps);
02398                                 while(list($theKey,$theValue)=each($wraps))     {
02399                                         $subpartWraps[$PRE.$theKey.$POST] = explode('|',$this->cObjGetSingle($theValue['name'],$theValue['conf'],'wraps.'.$theKey));
02400                                 }
02401 
02402                                         // Substitution
02403                                 if ($conf['substMarksSeparately'])      {
02404                                         $content = $this->substituteMarkerArrayCached($content,array(),$subpartArray,$subpartWraps);
02405                                         $content = $this->substituteMarkerArray($content, $markerArray);
02406                                 } else {
02407                                         $content = $this->substituteMarkerArrayCached($content,$markerArray,$subpartArray,$subpartWraps);
02408                                 }
02409                         }
02410                 }
02411                 return $content;
02412         }
02413 
02421         function MULTIMEDIA($conf)      {
02422                 $content='';
02423                 $filename=$this->stdWrap($conf['file'],$conf['file.']);
02424                 $incFile = $GLOBALS['TSFE']->tmpl->getFileName($filename);
02425                 if ($incFile)   {
02426                         $fileinfo = t3lib_div::split_fileref($incFile);
02427                         if (t3lib_div::inList('txt,html,htm',$fileinfo['fileext']))     {
02428                                 $content = $GLOBALS['TSFE']->tmpl->fileContent($incFile);
02429                         } else {
02430                                         // default params...
02431                                 $parArray=array();
02432                                         // src is added
02433                                 $parArray['src']='src="'.$GLOBALS['TSFE']->absRefPrefix.$incFile.'"';
02434                                 if (t3lib_div::inList('au,wav,mp3',$fileinfo['fileext']))       {
02435                                 }
02436                                 if (t3lib_div::inList('avi,mov,mpg,asf,wmv',$fileinfo['fileext']))      {
02437                                         $parArray['width'] = 'width="200"';
02438                                         $parArray['height'] = 'height="200"';
02439                                 }
02440                                 if (t3lib_div::inList('swf,swa,dcr',$fileinfo['fileext']))      {
02441                                         $parArray['quality'] = 'quality="high"';
02442                                 }
02443                                 if (t3lib_div::inList('class',$fileinfo['fileext']))    {
02444                                         $parArray['width'] = 'width="200"';
02445                                         $parArray['height'] = 'height="200"';
02446                                 }
02447 
02448                                         // fetching params
02449                                 $lines = explode(chr(10), $this->stdWrap($conf['params'],$conf['params.']));
02450                                 while(list(,$l)=each($lines))   {
02451                                         $parts = explode('=', $l);
02452                                         $parameter = strtolower(trim($parts[0]));
02453                                         $value = trim($parts[1]);
02454                                         if ((string)$value!='') {
02455                                                 $parArray[$parameter] = $parameter.'="'.htmlspecialchars($value).'"';
02456                                         } else {
02457                                                 unset($parArray[$parameter]);
02458                                         }
02459                                 }
02460                                 if ($fileinfo['fileext']=='class')      {
02461                                         unset($parArray['src']);
02462                                         $parArray['code'] = 'code="'.htmlspecialchars($fileinfo['file']).'"';
02463                                         $parArray['codebase'] = 'codebase="'.htmlspecialchars($fileinfo['path']).'"';
02464                                         $content='<applet '.implode(' ',$parArray).'></applet>';
02465                                 } else {
02466                                         $content='<embed '.implode(' ',$parArray).'></embed>';
02467                                 }
02468                         }
02469                 }
02470 
02471                 if ($conf['stdWrap.']) {
02472                         $content=$this->stdWrap($content, $conf['stdWrap.']);
02473                 }
02474 
02475                 return $content;
02476         }
02477 
02478 
02479 
02480 
02481 
02482 
02483 
02484 
02485 
02486 
02487 
02488 
02489 
02490 
02491 
02492 
02493 
02494         /************************************
02495          *
02496          * Various helper functions for content objects:
02497          *
02498          ************************************/
02499 
02508         function getSlidePids($pidList, $pidConf)       {
02509                 $pidList = trim($this->stdWrap($pidList,$pidConf));
02510                 if (!strcmp($pidList,''))       {
02511                         $pidList = 'this';
02512                 }
02513                 if (trim($pidList))     {
02514                         $listArr = t3lib_div::intExplode(',',str_replace('this',$GLOBALS['TSFE']->contentPid,$pidList));
02515                         $listArr = $this->checkPidArray($listArr);
02516                 }
02517                 $pidList = array();
02518                 if (is_array($listArr)&&count($listArr))        {
02519                         foreach ($listArr as $uid)      {
02520                                 $page = $GLOBALS['TSFE']->sys_page->getPage($uid);
02521                                 if (!$page['is_siteroot'])      {
02522                                         $pidList[] = $page['pid'];
02523                                 }
02524                         }
02525                 }
02526                 return implode(',', $pidList);
02527         }
02528 
02529 
02540         function netprintApplication_offsiteLinkWrap($str,$imgConf,$conf)       {
02541                 if ($conf['url'] && @is_file($imgConf['origFile']))     {
02542                         $thisUrl = $conf['thisUrl'] ? $conf['thisUrl'] : t3lib_div::getIndpEnv('TYPO3_REQUEST_DIR');
02543                         $origFile=$thisUrl.$imgConf['origFile'];
02544                                 // Original file dimensions:
02545                         $gifCreator = t3lib_div::makeInstance('tslib_gifbuilder');
02546                         $gifCreator->init();
02547                         $origDim = $gifCreator->getImageDimensions($imgConf['origFile']);
02548                         if (!$conf['linkOnlyPixelsAbove'] || $origDim[0]*$origDim[1]>$conf['linkOnlyPixelsAbove'])      {
02549                                         // Set parameters
02550                                 $thumbFile=$thisUrl.$imgConf['3'].'|'.$imgConf[0].'x'.$imgConf[1].'|'.$origDim[0].'x'.$origDim[1].'|'.filesize($imgConf['origFile']).'|'.filemtime($imgConf['origFile']);
02551                                         // Set url:
02552                                 $url = $conf['url']
02553                                         .'&NP[offsite][1]='.rawurlencode($origFile)
02554                                         .'&NP[offsite_thumb][1]='.rawurlencode($thumbFile);
02555                                 $linkCObject = $this->cObjGetSingle($conf['cObject'],$conf['cObject.']);
02556                                 if ($linkCObject)       {
02557                                         $ATagParams = $this->getATagParams($conf, 0);
02558                                         $linkCObject='<a href="'.htmlspecialchars($url).'"'.$ATagParams.'>'.$linkCObject.'</a>';
02559                                         $linkCObject=$this->stdWrap($linkCObject,$conf['outerStdWrap.']);
02560                                         if ($conf['before'])    {
02561                                                 $str=$linkCObject.$str;
02562                                         } else {
02563                                                 $str=$str.$linkCObject;
02564                                         }
02565                                 }
02566                         }
02567                 }
02568                 return $str;
02569         }
02570 
02581         function getFieldDefaultValue($noValueInsert, $fieldName, $defaultVal) {
02582                 if (!$GLOBALS['TSFE']->no_cache || (!isset($_POST[$fieldName]) && !isset($_GET[$fieldName])) || $noValueInsert) {
02583                         return $defaultVal;
02584                 } else {
02585                         return t3lib_div::_GP($fieldName);
02586                 }
02587         }
02588 
02599         function cImage($file,$conf) {
02600                 $info = $this->getImgResource($file,$conf['file.']);
02601                 $GLOBALS['TSFE']->lastImageInfo=$info;
02602                 if (is_array($info))    {
02603                         $info[3] = t3lib_div::png_to_gif_by_imagemagick($info[3]);
02604                         $GLOBALS['TSFE']->imagesOnPage[]=$info[3];              // This array is used to collect the image-refs on the page...
02605 
02606                         if (!strlen($conf['altText']) && !is_array($conf['altText.']))  {       // Backwards compatible:
02607                                 $conf['altText'] = $conf['alttext'];
02608                                 $conf['altText.'] = $conf['alttext.'];
02609                         }
02610                         $altParam = $this->getAltParam($conf);
02611 
02612                         $theValue = '<img src="'.htmlspecialchars($GLOBALS['TSFE']->absRefPrefix.t3lib_div::rawUrlEncodeFP($info[3])).'" width="'.$info[0].'" height="'.$info[1].'"'.$this->getBorderAttr(' border="'.intval($conf['border']).'"').($conf['params']?' '.$conf['params']:'').($altParam).' />';
02613                         if ($conf['linkWrap'])  {
02614                                 $theValue = $this->linkWrap($theValue,$conf['linkWrap']);
02615                         } elseif ($conf['imageLinkWrap']) {
02616                                 $theValue = $this->imageLinkWrap($theValue,$info['origFile'],$conf['imageLinkWrap.']);
02617                         }
02618                         return $this->wrap($theValue,$conf['wrap']);
02619                 }
02620         }
02627         function getBorderAttr($borderAttr) {
02628                 if (!t3lib_div::inList('xhtml_strict,xhtml_11,xhtml_2',$GLOBALS['TSFE']->xhtmlDoctype) && !$GLOBALS['TSFE']->config['config']['disableImgBorderAttr']) {
02629                         return $borderAttr;
02630                 }
02631         }
02632 
02643         function imageLinkWrap($string,$imageFile,$conf) {
02644                 $a1='';
02645                 $a2='';
02646                 $content=$string;
02647                 if ($this->stdWrap($conf['enable'],$conf['enable.']))   {
02648                         $content=$this->typolink($string, $conf['typolink.']);
02649                                 // imageFileLink:
02650                         if ($content==$string && @is_file($imageFile)) {
02651                                 $params = '';
02652                                 if ($conf['width']) {$params.='&width='.rawurlencode($conf['width']);}
02653                                 if ($conf['height']) {$params.='&height='.rawurlencode($conf['height']);}
02654                                 if ($conf['effects']) {$params.='&effects='.rawurlencode($conf['effects']);}
02655                                 if ($conf['sample']) {$params.='&sample=1';}
02656                                 if ($conf['alternativeTempPath']) {$params.='&alternativeTempPath='.rawurlencode($conf['alternativeTempPath']);}
02657 
02658                                 if ($conf['bodyTag']) {$params.='&bodyTag='.rawurlencode($conf['bodyTag']);}
02659                                 if ($conf['title']) {$params.='&title='.rawurlencode($conf['title']);}
02660                                 if ($conf['wrap']) {$params.='&wrap='.rawurlencode($conf['wrap']);}
02661 
02662                                 $md5_value = md5(
02663                                                 $imageFile.'|'.
02664                                                 $conf['width'].'|'.
02665                                                 $conf['height'].'|'.
02666                                                 $conf['effects'].'|'.
02667                                                 $conf['bodyTag'].'|'.
02668                                                 $conf['title'].'|'.
02669                                                 $conf['wrap'].'|'.
02670                                                 $GLOBALS['TYPO3_CONF_VARS']['SYS']['encryptionKey'].'|');
02671 
02672                                 $params.= '&md5='.$md5_value;
02673                                 $url = $GLOBALS['TSFE']->absRefPrefix.'index.php?eID=tx_cms_showpic&file='.rawurlencode($imageFile).$params;
02674                                 if ($conf['JSwindow.']['altUrl'] || $conf['JSwindow.']['altUrl.'])      {
02675                                         $altUrl = $this->stdWrap($conf['JSwindow.']['altUrl'], $conf['JSwindow.']['altUrl.']);
02676                                         if ($altUrl)    {
02677                                                 $url=$altUrl.'?file='.rawurlencode($imageFile).$params;
02678                                         }
02679                                 }
02680 
02681                                         // Create TARGET-attribute only if the right doctype is used
02682                                 if (!t3lib_div::inList('xhtml_strict,xhtml_11,xhtml_2', $GLOBALS['TSFE']->xhtmlDoctype))        {
02683                                         if (isset($conf['target']))     {
02684                                                 $target = sprintf(' target="%s"', $conf['target']);
02685                                         } else {
02686                                                 $target = ' target="thePicture"';
02687                                         }
02688                                 } else {
02689                                         $target = '';
02690                                 }
02691 
02692                                 if ($conf['JSwindow'])  {
02693                                         $gifCreator = t3lib_div::makeInstance('tslib_gifbuilder');
02694                                         $gifCreator->init();
02695                                         $gifCreator->mayScaleUp = 0;
02696                                         $dims = $gifCreator->getImageScale($gifCreator->getImageDimensions($imageFile),$conf['width'],$conf['height'],'');
02697                                         $offset = t3lib_div::intExplode(',',$conf['JSwindow.']['expand'].',');
02698 
02699                                         $a1='<a href="'. htmlspecialchars($url) .'" onclick="'.
02700                                                 htmlspecialchars('openPic(\''.$GLOBALS['TSFE']->baseUrlWrap($url).'\',\''.($conf['JSwindow.']['newWindow']?md5($url):'thePicture').'\',\'width='.($dims[0]+$offset[0]).',height='.($dims[1]+$offset[1]).',status=0,menubar=0\'); return false;').
02701                                                 '"'.$target.$GLOBALS['TSFE']->ATagParams.'>';
02702                                         $a2='</a>';
02703                                         $GLOBALS['TSFE']->setJS('openPic');
02704                                 } else {
02705                                         $a1='<a href="'.htmlspecialchars($url).'"'.$target.$GLOBALS['TSFE']->ATagParams.'>';
02706                                         $a2='</a>';
02707                                 }
02708                                 $content=$a1.$string.$a2;
02709                         }
02710                 }
02711 
02712                 return $content;
02713         }
02714 
02723         function fileResource($fName, $addParams='alt="" title=""')     {
02724                 $incFile = $GLOBALS['TSFE']->tmpl->getFileName($fName);
02725                 if ($incFile)   {
02726                         $fileinfo = t3lib_div::split_fileref($incFile);
02727                         if (t3lib_div::inList('jpg,gif,jpeg,png',$fileinfo['fileext'])) {
02728                                 $imgFile = $incFile;
02729                                 $imgInfo = @getImageSize($imgFile);
02730                                 return '<img src="'.$GLOBALS['TSFE']->absRefPrefix.$imgFile.'" width="'.$imgInfo[0].'" height="'.$imgInfo[1].'"'.$this->getBorderAttr(' border="0"').' '.$addParams.' />';
02731                         } elseif (filesize($incFile)<1024*1024) {
02732                                 return $GLOBALS['TSFE']->tmpl->fileContent($incFile);
02733                         }
02734                 }
02735         }
02736 
02746         function lastChanged($tstamp)   {
02747                 $tstamp = intval($tstamp);
02748                 if ($tstamp>intval($GLOBALS['TSFE']->register['SYS_LASTCHANGED']))      {
02749                         $GLOBALS['TSFE']->register['SYS_LASTCHANGED'] = $tstamp;
02750                 }
02751         }
02752 
02763         function linkWrap($content,$wrap)       {
02764                 $wrapArr = explode('|', $wrap);
02765                 if (ereg("\{([0-9]*)\}",$wrapArr[0],$reg))      {
02766                         if ($uid = $GLOBALS['TSFE']->tmpl->rootLine[$reg[1]]['uid'])    {
02767                                 $wrapArr[0] = str_replace($reg[0],$uid,$wrapArr[0]);
02768                         }
02769                 }
02770                 return trim($wrapArr[0]).$content.trim($wrapArr[1]);
02771         }
02772 
02781         function getAltParam($conf)     {
02782                 $altText = trim($this->stdWrap($conf['altText'], $conf['altText.']));
02783                 $titleText = trim($this->stdWrap($conf['titleText'],$conf['titleText.']));
02784                 $longDesc = trim($this->stdWrap($conf['longdescURL'],$conf['longdescURL.']));
02785 
02786                         // "alt":
02787                 $altParam = ' alt="'.htmlspecialchars(strip_tags($altText)).'"';
02788 
02789                         // "title":
02790                 $emptyTitleHandling = 'useAlt';
02791                 if ($conf['emptyTitleHandling'])        {
02792                                 // choices: 'keepEmpty' | 'useAlt' | 'removeAttr'
02793                         $emptyTitleHandling = $conf['emptyTitleHandling'];
02794                 }
02795                 if ($titleText || $emptyTitleHandling == 'keepEmpty')   {
02796                         $altParam.= ' title="'.htmlspecialchars(strip_tags($titleText)).'"';
02797                 } elseif (!$titleText && $emptyTitleHandling == 'useAlt')       {
02798                         $altParam.= ' title="'.htmlspecialchars(strip_tags($altText)).'"';
02799                 }
02800 
02801                         // "longDesc" URL
02802                 if ($longDesc)  {
02803                         $altParam.= ' longdesc="'.htmlspecialchars(strip_tags($longDesc)).'"';
02804                 }
02805 
02806                 return $altParam;
02807         }
02808 
02816         function cleanFormName($name) {
02817                         // turn data[x][y] into data:x:y:
02818                 $name = preg_replace('/\[|\]\[?/',':',trim($name));
02819                         // remove illegal chars like _
02820                 return preg_replace('#[^:a-zA-Z0-9]#','',$name);
02821         }
02822 
02832          function getATagParams($conf, $addGlobal=1)    {
02833                 $aTagParams = '';
02834                 if ($conf['ATagParams.'])       {
02835                         $aTagParams = ' '.$this->stdWrap($conf['ATagParams'], $conf['ATagParams.']);
02836                 } elseif ($conf['ATagParams'])  {
02837                         $aTagParams = ' '.$conf['ATagParams'];
02838                 }
02839                 if ($addGlobal) {
02840                         $aTagParams = ' '.trim($GLOBALS['TSFE']->ATagParams.$aTagParams);
02841                 }
02842                 return $aTagParams;
02843          }
02844 
02845 
02846 
02847 
02848 
02849 
02850 
02851 
02852 
02853 
02854 
02855 
02856 
02857 
02858 
02859 
02860 
02861 
02862         /***********************************************
02863          *
02864          * HTML template processing functions
02865          *
02866          ***********************************************/
02867 
02879         function getSubpart($content, $marker)  {
02880                 return t3lib_parsehtml::getSubpart($content, $marker);
02881         }
02882 
02895         function substituteSubpart($content,$marker,$subpartContent,$recursive=1)       {
02896                 return t3lib_parsehtml::substituteSubpart($content, $marker, $subpartContent, $recursive);
02897         }
02898 
02908         function substituteMarker($content,$marker,$markContent)        {
02909                 return str_replace($marker,$markContent,$content);
02910         }
02911 
02928         function substituteMarkerArrayCached($content,$markContentArray=array(),$subpartContentArray=array(),$wrappedSubpartContentArray=array())       {
02929                 $GLOBALS['TT']->push('/substituteMarkerArray/');
02930 
02931                         // If not arrays then set them
02932                 if (!is_array($markContentArray))       $markContentArray=array();      // Plain markers
02933                 if (!is_array($subpartContentArray))    $subpartContentArray=array();   // Subparts being directly substituted
02934                 if (!is_array($wrappedSubpartContentArray))     $wrappedSubpartContentArray=array();    // Subparts being wrapped
02935                         // Finding keys and check hash:
02936                 $sPkeys = array_keys($subpartContentArray);
02937                 $wPkeys = array_keys($wrappedSubpartContentArray);
02938                 $aKeys = array_merge(array_keys($markContentArray),$sPkeys,$wPkeys);
02939                 if (!count($aKeys))     {
02940                         $GLOBALS['TT']->pull();
02941                         return $content;
02942                 }
02943                 asort($aKeys);
02944                 $storeKey = md5('substituteMarkerArrayCached_storeKey:'.serialize(array($content,$aKeys)));
02945                 if ($this->substMarkerCache[$storeKey]) {
02946                         $storeArr = $this->substMarkerCache[$storeKey];
02947                         $GLOBALS['TT']->setTSlogMessage('Cached',0);
02948                 } else {
02949                         $storeArrDat = $GLOBALS['TSFE']->sys_page->getHash($storeKey,0);
02950                         if (!isset($storeArrDat))       {
02951                                         // Initialize storeArr
02952                                 $storeArr=array();
02953 
02954                                         // Finding subparts and substituting them with the subpart as a marker
02955                                 reset($sPkeys);
02956                                 while(list(,$sPK)=each($sPkeys))        {
02957                                         $content =$this->substituteSubpart($content,$sPK,$sPK);
02958                                 }
02959 
02960                                         // Finding subparts and wrapping them with markers
02961                                 reset($wPkeys);
02962                                 while(list(,$wPK)=each($wPkeys))        {
02963                                         $content =$this->substituteSubpart($content,$wPK,array($wPK,$wPK));
02964                                 }
02965 
02966                                         // traverse keys and quote them for reg ex.
02967                                 reset($aKeys);
02968                                 while(list($tK,$tV)=each($aKeys))       {
02969                                         $aKeys[$tK]=quotemeta($tV);
02970                                 }
02971                                 $regex = implode('|',$aKeys);
02972                                         // Doing regex's
02973                                 $storeArr['c'] = split($regex,$content);
02974                                 preg_match_all('/'.$regex.'/',$content,$keyList);
02975                                 $storeArr['k']=$keyList[0];
02976                                         // Setting cache:
02977                                 $this->substMarkerCache[$storeKey] = $storeArr;
02978 
02979                                         // Storing the cached data:
02980                                 $GLOBALS['TSFE']->sys_page->storeHash($storeKey, serialize($storeArr), 'substMarkArrayCached');
02981 
02982                                 $GLOBALS['TT']->setTSlogMessage('Parsing',0);
02983                         } else {
02984                                         // Unserializing
02985                                 $storeArr = unserialize($storeArrDat);
02986                                         // Setting cache:
02987                                 $this->substMarkerCache[$storeKey] = $storeArr;
02988                                 $GLOBALS['TT']->setTSlogMessage('Cached from DB',0);
02989                         }
02990                 }
02991 
02992                         // Substitution/Merging:
02993                         // Merging content types together, resetting
02994                 $valueArr = array_merge($markContentArray,$subpartContentArray,$wrappedSubpartContentArray);
02995 
02996                 $wSCA_reg=array();
02997                 reset($storeArr['k']);
02998                 $content = '';
02999                         // traversin the keyList array and merging the static and dynamic content
03000                 while(list($n,$keyN)=each($storeArr['k']))      {
03001                         $content.=$storeArr['c'][$n];
03002                         if (!is_array($valueArr[$keyN]))        {
03003                                 $content.=$valueArr[$keyN];
03004                         } else {
03005                                 $content.=$valueArr[$keyN][(intval($wSCA_reg[$keyN])%2)];
03006                                 $wSCA_reg[$keyN]++;
03007                         }
03008                 }
03009                 $content.=$storeArr['c'][count($storeArr['k'])];
03010 
03011                 $GLOBALS['TT']->pull();
03012                 return $content;
03013         }
03014 
03026         function substituteMarkerArray($content,$markContentArray,$wrap='',$uppercase=0)        {
03027                 if (is_array($markContentArray))        {
03028                         reset($markContentArray);
03029                         $wrapArr=t3lib_div::trimExplode('|',$wrap);
03030                         while(list($marker,$markContent)=each($markContentArray))       {
03031                                 if($uppercase)  $marker=strtoupper($marker);
03032                                 if(strcmp($wrap,''))            $marker=$wrapArr[0].$marker.$wrapArr[1];
03033                                 $content=str_replace($marker,$markContent,$content);
03034                         }
03035                 }
03036                 return $content;
03037         }
03038 
03047         function substituteMarkerInObject(&$tree, $markContentArray) {
03048                 if (is_array ($tree))   {
03049                         reset($tree);
03050                         while(list($key,$value)=each($tree))    {
03051                                 $this->substituteMarkerInObject ($tree[$key], $markContentArray);
03052                         }
03053                 } else {
03054                         $tree = $this->substituteMarkerArray($tree,$markContentArray);
03055                 }
03056                 return $tree;
03057         }
03058 
03070         function fillInMarkerArray($markContentArray, $row, $fieldList='', $nl2br=TRUE, $prefix='FIELD_', $HSC=FALSE)   {
03071                 if ($fieldList) {
03072                         $fArr = t3lib_div::trimExplode(',',$fieldList,1);
03073                         foreach($fArr as $field)        {
03074                                 $markContentArray['###'.$prefix.$field.'###'] = $nl2br?nl2br($row[$field]):$row[$field];
03075                         }
03076                 } else {
03077                         if (is_array($row))     {
03078                                 foreach($row as $field => $value)       {
03079                                         if (!t3lib_div::testInt($field))        {
03080                                                 if ($HSC)       $value = htmlspecialchars($value);
03081                                                 $markContentArray['###'.$prefix.$field.'###'] = $nl2br ? nl2br($value) : $value;
03082                                         }
03083                                 }
03084                         }
03085                 }
03086 
03087                 return $markContentArray;
03088         }
03089 
03090 
03091 
03092 
03093 
03094 
03095 
03096 
03097 
03098 
03099 
03100 
03101 
03102 
03103 
03104 
03105 
03106 
03107 
03108 
03109 
03110 
03111 
03112 
03113 
03114         /***********************************************
03115          *
03116          * "stdWrap" + sub functions
03117          *
03118          ***********************************************/
03119 
03120 
03133         function stdWrap($content,$conf)        {
03134                 if (is_array($conf))    {
03135 
03136                                 // Setting current value, if so
03137                         if ($conf['setContentToCurrent']){$this->data[$this->currentValKey]=$content;}
03138                         if ($conf['setCurrent'] || $conf['setCurrent.']){$this->data[$this->currentValKey] = $this->stdWrap($conf['setCurrent'], $conf['setCurrent.']);}
03139 
03140                                 // Getting data:
03141                         if (isset($conf['lang.']) && $GLOBALS['TSFE']->config['config']['language'] && isset($conf['lang.'][$GLOBALS['TSFE']->config['config']['language']]))   {
03142                                 $content = $conf['lang.'][$GLOBALS['TSFE']->config['config']['language']];
03143                         }
03144                         if ($conf['data']){$content=$this->getData($conf['data'], is_array($this->alternativeData)?$this->alternativeData:$this->data);}
03145                                 $this->alternativeData='';              // This must be unset directly after
03146                         if ($conf['field']) {$content=$this->getFieldVal($conf['field']);}
03147                         if ($conf['current']) {$content=$this->data[$this->currentValKey];}
03148                         if ($conf['cObject']) {$content=$this->cObjGetSingle($conf['cObject'],$conf['cObject.'],'/stdWrap/.cObject');}
03149                         if ($conf['numRows.']) {$content=$this->numRows($conf['numRows.']);}
03150                         if ($conf['filelist'] || $conf['filelist.'])    {$content=$this->filelist($this->stdWrap($conf['filelist'], $conf['filelist.']));}
03151                         if ($conf['preUserFunc'])       {$content = $this->callUserFunction($conf['preUserFunc'], $conf['preUserFunc.'], $content);}
03152 
03153                                 // Overriding values, evaluating conditions
03154                         if ($conf['override'] || $conf['override.']){
03155                                 $override = $this->stdWrap($conf['override'], $conf['override.']);
03156                                 if (trim($override)) {$content=$override;}
03157                         }
03158                         if (isset($conf['preIfEmptyListNum']) || isset($conf['preIfEmptyListNum.']['stdWrap.'])) {
03159                                 $preIfEmptyListNumber = isset($conf['preIfEmptyListNum.']['stdWrap.'])  ?  $this->stdWrap($conf['preIfEmptyListNum'], $conf['preIfEmptyListNum.']['stdWrap.'])  :  $conf['preIfEmptyListNum'];
03160                                 $content=$this->listNum($content,$preIfEmptyListNumber,$conf['preIfEmptyListNum.']['splitChar']);
03161                         }
03162                         if (!trim($content) && ($conf['ifEmpty'] || $conf['ifEmpty.'])) {
03163                                 $content = $this->stdWrap($conf['ifEmpty'], $conf['ifEmpty.']);
03164                         }
03165                         if (!strlen(trim($content)) && ($conf['ifBlank'] || $conf['ifBlank.'])) {
03166                                 $content = $this->stdWrap($conf['ifBlank'], $conf['ifBlank.']);
03167                         }
03168 
03169                                 // values...
03170                         if (isset($conf['listNum']) || isset($conf['listNum.']['stdWrap.'])) {
03171                                 $listNumber = isset($conf['listNum.']['stdWrap.'])  ?  $this->stdWrap($conf['listNum'], $conf['listNum.']['stdWrap.'])  :  $conf['listNum'];
03172                                 $content=$this->listNum($content,$listNumber,$conf['listNum.']['splitChar']);
03173                         }
03174 
03175                         if ($conf['trim'])      { $content=trim($content); }
03176 
03177                                 // Call stdWrap recursively
03178                         if ($conf['stdWrap'])   { $content=$this->stdWrap($content,$conf['stdWrap.']); }
03179 
03180                         if (   ($conf['required'] && (string)$content=='') || ($conf['if.'] && !$this->checkIf($conf['if.'])) || ($conf['fieldRequired'] && !trim($this->data[$conf['fieldRequired']]))    ){
03181                                 $content = '';
03182                         } else  {
03183                                         // Perform data processing:
03184                                 if ($conf['csConv'])    { $content=$GLOBALS['TSFE']->csConv($content,$conf['csConv']); }
03185                                 if ($conf['parseFunc.'] || $conf['parseFunc']) {$content=$this->parseFunc($content,$conf['parseFunc.'],$conf['parseFunc']);}
03186                                 if ($conf['HTMLparser'] && is_array($conf['HTMLparser.'])) {$content=$this->HTMLparser_TSbridge($content,$conf['HTMLparser.']);}
03187                                 if ($conf['split.']){$content=$this->splitObj($content,$conf['split.']);}
03188                                 if ($conf['prioriCalc']){$content=t3lib_div::calcParenthesis($content); if ($conf['prioriCalc']=='intval') $content=intval($content);}
03189                                 if ((string)$conf['char']!=''){$content=chr(intval($conf['char']));}
03190                                 if ($conf['intval']){$content=intval($content);}
03191                                 if ($conf['date']){$content=date($conf['date'], $content);}
03192                                 if ($conf['strftime']){
03193                                         $content = strftime($conf['strftime'], $content);
03194                                         $tmp_charset = $conf['strftime.']['charset'] ? $conf['strftime.']['charset'] : $GLOBALS['TSFE']->localeCharset;
03195                                         if ($tmp_charset)       {
03196                                                 $content = $GLOBALS['TSFE']->csConv($content,$tmp_charset);
03197                                         }
03198                                 }
03199                                 if ($conf['age']){$content=$this->calcAge(time()-$content,$conf['age']);}
03200 
03201                                 if ($conf['case']){$content=$this->HTMLcaseshift($content, $conf['case']);}
03202                                 if ($conf['bytes']){$content=$this->bytes($content,$conf['bytes.']['labels']);}
03203                                 if ($conf['substring']){$content=$this->substring($content,$conf['substring']);}
03204                                 if ($conf['removeBadHTML'])     {$content = $this->removeBadHTML($content, $conf['removeBadHTML.']);}
03205                                 if ($conf['stripHtml']){$content = strip_tags($content);}
03206                                 if ($conf['crop']){$content=$this->crop($content, $conf['crop']);}
03207                                 if ($conf['rawUrlEncode']){$content = rawurlencode($content);}
03208                                 if ($conf['htmlSpecialChars']){
03209                                         $content=htmlSpecialChars($content);
03210                                         if ($conf['htmlSpecialChars.']['preserveEntities'])     $content = t3lib_div::deHSCentities($content);
03211                                 }
03212 
03213                                 if ($conf['doubleBrTag']) {
03214                                         $content=ereg_replace("\r?\n[\t ]*\r?\n",$conf['doubleBrTag'],$content);
03215                                 }
03216                                 if ($conf['br']) {$content=nl2br($content);}
03217                                 if ($conf['brTag']) {$content= ereg_replace(chr(10),$conf['brTag'],$content);}
03218                                 if ($conf['encapsLines.']) {$content=$this->encaps_lineSplit($content,$conf['encapsLines.']);}
03219                                 if ($conf['keywords']) {$content= $this->keywords($content);}
03220                                 if ($conf['innerWrap'] || $conf['innerWrap.']){$content=$this->wrap($content, $this->stdWrap($conf['innerWrap'], $conf['innerWrap.']));}
03221                                 if ($conf['innerWrap2'] || $conf['innerWrap2.']){$content=$this->wrap($content, $this->stdWrap($conf['innerWrap2'], $conf['innerWrap2.']));}
03222                                 if ($conf['fontTag']){$content=$this->wrap($content, $conf['fontTag']);}
03223                                 if ($conf['addParams.']) {$content=$this->addParams($content,$conf['addParams.']);}
03224                                 if ($conf['textStyle.']) {$content=$this->textStyle($content,$conf['textStyle.']);}
03225                                 if ($conf['tableStyle.']) {$content=$this->tableStyle($content,$conf['tableStyle.']);}
03226                                 if ($conf['filelink.']) {$content=$this->filelink($content,$conf['filelink.']);}
03227                                 if ($conf['preCObject']) {$content=$this->cObjGetSingle($conf['preCObject'],$conf['preCObject.'],'/stdWrap/.preCObject').$content;}
03228                                 if ($conf['postCObject']) {$content.=$this->cObjGetSingle($conf['postCObject'],$conf['postCObject.'],'/stdWrap/.postCObject');}
03229 
03230                                 if ($conf['wrapAlign'] || $conf['wrapAlign.']){
03231                                         $wrapAlign = trim($this->stdWrap($conf['wrapAlign'], $conf['wrapAlign.']));
03232                                         if ($wrapAlign) {$content=$this->wrap($content, '<div style="text-align:'.$wrapAlign.';">|</div>');}
03233                                 }
03234                                 if ($conf['typolink.']){$content=$this->typolink($content, $conf['typolink.']);}
03235                                 if (is_array($conf['TCAselectItem.'])) {$content=$this->TCAlookup($content,$conf['TCAselectItem.']);}
03236 
03237                                         // Spacing
03238                                 if ($conf['space']){$content=$this->wrapSpace($content, $conf['space']);}
03239                                 $spaceBefore = '';
03240                                 if ($conf['spaceBefore'] || $conf['spaceBefore.'])      {$spaceBefore = trim($this->stdWrap($conf['spaceBefore'], $conf['spaceBefore.']));}
03241                                 $spaceAfter = '';
03242                                 if ($conf['spaceAfter'] || $conf['spaceAfter.'])        {$spaceAfter = trim($this->stdWrap($conf['spaceAfter'], $conf['spaceAfter.']));}
03243                                 if ($spaceBefore || $spaceAfter)        {$content=$this->wrapSpace($content, $spaceBefore.'|'.$spaceAfter);}
03244 
03245                                         // Wraps
03246                                 if ($conf['wrap']){$content=$this->wrap($content, $conf['wrap'], ($conf['wrap.']['splitChar']?$conf['wrap.']['splitChar']:'|'));}
03247                                 if ($conf['noTrimWrap']){$content=$this->noTrimWrap($content, $conf['noTrimWrap']);}
03248                                 if ($conf['wrap2']){$content=$this->wrap($content, $conf['wrap2'], ($conf['wrap2.']['splitChar']?$conf['wrap2.']['splitChar']:'|'));}
03249                                 if ($conf['dataWrap']){$content=$this->dataWrap($content, $conf['dataWrap']);}
03250                                 if ($conf['prepend']){$content=$this->cObjGetSingle($conf['prepend'],$conf['prepend.'],'/stdWrap/.prepend').$content;}
03251                                 if ($conf['append']){$content.=$this->cObjGetSingle($conf['append'],$conf['append.'],'/stdWrap/.append');}
03252                                 if ($conf['wrap3']){$content=$this->wrap($content, $conf['wrap3'], ($conf['wrap3.']['splitChar']?$conf['wrap3.']['splitChar']:'|'));}
03253                                 if ($conf['outerWrap'] || $conf['outerWrap.']){$content=$this->wrap($content, $this->stdWrap($conf['outerWrap'], $conf['outerWrap.']));}
03254                                 if ($conf['insertData'])        {$content = $this->insertData($content);}
03255                                 if ($conf['offsetWrap']){
03256                                         $controlTable = t3lib_div::makeInstance('tslib_tableOffset');
03257                                         if ($conf['offsetWrap.']['tableParams'] || $conf['offsetWrap.']['tableParams.'])        {$controlTable->tableParams = $this->stdWrap($conf['offsetWrap.']['tableParams'], $conf['offsetWrap.']['tableParams.']);}
03258                                         if ($conf['offsetWrap.']['tdParams'] || $conf['offsetWrap.']['tdParams.'])      {$controlTable->tdParams = ' '.$this->stdWrap($conf['offsetWrap.']['tdParams'], $conf['offsetWrap.']['tdParams.']);}
03259                                         $content=$controlTable->start($content,$conf['offsetWrap']);
03260                                         if ($conf['offsetWrap.']['stdWrap.'])   {       $content=$this->stdWrap($content,$conf['offsetWrap.']['stdWrap.']);     }
03261                                 }
03262                                 if ($conf['postUserFunc'])      {$content = $this->callUserFunction($conf['postUserFunc'], $conf['postUserFunc.'], $content);}
03263                                 if ($conf['postUserFuncInt'])   {
03264                                         $substKey = 'INT_SCRIPT.'.$GLOBALS['TSFE']->uniqueHash();
03265                                         $GLOBALS['TSFE']->config['INTincScript'][$substKey] = array(
03266                                                 'content' => $content,
03267                                                 'postUserFunc' => $conf['postUserFuncInt'],
03268                                                 'conf' => $conf['postUserFuncInt.'],
03269                                                 'type' => 'POSTUSERFUNC',
03270                                                 'cObj' => serialize($this),
03271                                         );
03272                                         $content ='<!--'.$substKey.'-->';
03273                                 }
03274                                         // Various:
03275                                 if ($conf['prefixComment'] && !$GLOBALS['TSFE']->config['config']['disablePrefixComment'])      {$content = $this->prefixComment($conf['prefixComment'], $conf['prefixComment.'], $content);}
03276 
03277                                 if ($conf['editIcons'] && $GLOBALS['TSFE']->beUserLogin){$content=$this->editIcons($content,$conf['editIcons'],$conf['editIcons.']);}
03278                                 if ($conf['editPanel'] && $GLOBALS['TSFE']->beUserLogin){$content=$this->editPanel($content, $conf['editPanel.']);}
03279                         }
03280 
03281                                 //Debug:
03282                         if ($conf['debug'])     {$content = '<pre>'.htmlspecialchars($content).'</pre>';}
03283                         if ($conf['debugFunc']) {debug($conf['debugFunc']==2?array($content):$content);}
03284                         if ($conf['debugData']) {
03285                                 echo '<b>$cObj->data:</b>';
03286                                 debug($this->data,'$cObj->data:');
03287                                 if (is_array($this->alternativeData))   {
03288                                         echo '<b>$cObj->alternativeData:</b>';
03289                                         debug($this->alternativeData,'$this->alternativeData');
03290                                 }
03291                         }
03292                 }
03293                 return $content;
03294         }
03295 
03307         function numRows($conf) {
03308                 $conf['select.']['selectFields'] = 'count(*)';
03309 
03310                 $res = $this->exec_getQuery($conf['table'],$conf['select.']);
03311 
03312                 if ($error = $GLOBALS['TYPO3_DB']->sql_error()) {
03313                         $GLOBALS['TT']->setTSlogMessage($error,3);
03314                 } else {
03315                         $row = $GLOBALS['TYPO3_DB']->sql_fetch_row($res);
03316                         return intval($row[0]);
03317                 }
03318         }
03319 
03328         function listNum($content,$listNum,$char) {
03329                 $char = $char ? $char : ',';
03330                 if (t3lib_div::testInt($char))  {
03331                         $char = chr($char);
03332                 }
03333                 $temp = explode($char,$content);
03334                 $last = ''.(count($temp)-1);
03335                 $index=$this->calc(eregi_replace('last',$last,$listNum));
03336                 return $temp[$index];
03337         }
03338 
03348         function checkIf($conf) {
03349                 if (!is_array($conf))   {return true;}
03350                 if (isset($conf['directReturn']))       {return $conf['directReturn'] ? 1 : 0;}
03351                 $flag = true;
03352                         if (isset($conf['isTrue']) || isset($conf['isTrue.']))  {
03353                                 $isTrue = trim($this->stdWrap($conf['isTrue'],$conf['isTrue.']));
03354                                 if (!$isTrue)   {
03355                                         $flag=0;
03356                                 }
03357                         }
03358                         if (isset($conf['isFalse']) || isset($conf['isFalse.']))        {
03359                                 $isFalse = trim($this->stdWrap($conf['isFalse'],$conf['isFalse.']));
03360                                 if ($isFalse)   {
03361                                         $flag=0;
03362                                 }
03363                         }
03364                         if (isset($conf['isPositive']) || isset($conf['isPositive.']))  {
03365                                 $number = $this->calc($this->stdWrap($conf['isPositive'],$conf['isPositive.']));
03366                                 if ($number<1)  {
03367                                         $flag=0;
03368                                 }
03369                         }
03370                         if ($flag)      {
03371                                 $value = trim($this->stdWrap($conf['value'],$conf['value.']));
03372 
03373                                 if (isset($conf['isGreaterThan']) || isset($conf['isGreaterThan.']))    {
03374                                         $number = trim($this->stdWrap($conf['isGreaterThan'],$conf['isGreaterThan.']));
03375                                         if ($number<=$value)    {
03376                                                 $flag=0;
03377                                         }
03378                                 }
03379                                 if (isset($conf['isLessThan']) || isset($conf['isLessThan.']))  {
03380                                         $number = trim($this->stdWrap($conf['isLessThan'],$conf['isLessThan.']));
03381                                         if ($number>=$value)    {
03382                                                 $flag=0;
03383                                         }
03384                                 }
03385                                 if (isset($conf['equals']) || isset($conf['equals.']))  {
03386                                         $number = trim($this->stdWrap($conf['equals'],$conf['equals.']));
03387                                         if ($number!=$value)    {
03388                                                 $flag=0;
03389                                         }
03390                                 }
03391                                 if (isset($conf['isInList']) || isset($conf['isInList.']))      {
03392                                         $number = trim($this->stdWrap($conf['isInList'],$conf['isInList.']));
03393                                         if (!t3lib_div::inList($value,$number)) {
03394                                                 $flag=0;
03395                                         }
03396                                 }
03397                         }
03398                 if ($conf['negate'])    {$flag = $flag ? 0 : 1;}
03399                 return $flag;
03400         }
03401 
03411         function filelist($data)        {
03412                 $data = trim($data);
03413                 if ($data)      {
03414                         $data_arr = explode('|',$data);
03415                                 // read directory:
03416                         if ($GLOBALS['TSFE']->lockFilePath)     {               // MUST exist!
03417                                 $path = $this->clean_directory($data_arr[0]);   // Cleaning name..., only relative paths accepted.
03418                                 $path = substr($path,0,strlen($GLOBALS['TSFE']->lockFilePath))==$GLOBALS['TSFE']->lockFilePath ? $path : '';
03419                         }
03420                         if ($path)      {
03421                                 $items = Array('files'=>array(), 'sorting'=>array());
03422                                 $ext_list = strtolower(t3lib_div::uniqueList($data_arr[1]));
03423                                 $sorting = trim($data_arr[2]);
03424                                         // read dir:
03425                                 $d = @dir($path);
03426                                 $tempArray=Array();
03427                                 if (is_object($d))      {
03428                                         $count=0;
03429                                         while($entry=$d->read()) {
03430                                                 if ($entry!='.' && $entry!='..')        {
03431                                                         $wholePath = $path.'/'.$entry;          // Because of odd PHP-error where  <br />-tag is sometimes placed after a filename!!
03432                                                         if (@file_exists($wholePath) && filetype($wholePath)=='file')   {
03433                                                                 $info = t3lib_div::split_fileref($wholePath);
03434                                                                 if (!$ext_list || t3lib_div::inList($ext_list,$info['fileext']))        {
03435                                                                         $items['files'][] = $info['file'];
03436                                                                         switch($sorting)        {
03437                                                                                 case 'name':
03438                                                                                         $items['sorting'][] = strtolower($info['file']);
03439                                                                                 break;
03440                                                                                 case 'size':
03441                                                                                         $items['sorting'][] = filesize($wholePath);
03442                                                                                 break;
03443                                                                                 case 'ext':
03444                                                                                         $items['sorting'][] = $info['fileext'];
03445                                                                                 break;
03446                                                                                 case 'date':
03447                                                                                         $items['sorting'][] = filectime($wholePath);
03448                                                                                 break;
03449                                                                                 case 'mdate':
03450                                                                                         $items['sorting'][] = filemtime($wholePath);
03451                                                                                 break;
03452                                                                                 default:
03453                                                                                         $items['sorting'][] = $count;
03454                                                                                 break;
03455                                                                         }
03456                                                                         $count++;
03457                                                                 }
03458                                                         }
03459                                                 }
03460                                         }
03461                                         $d->close();
03462                                 }
03463                                         // Sort if required
03464                                 if (count($items['sorting']))   {
03465                                         if (strtolower(trim($data_arr[3]))!='r')        {
03466                                                 asort($items['sorting']);
03467                                         } else {
03468                                                 arsort($items['sorting']);
03469                                         }
03470                                 }
03471                                 if (count($items['files']))     {
03472                                                 // make list
03473                                         reset($items['sorting']);
03474                                         $fullPath = trim($data_arr[4]);
03475                                         $list_arr=Array();
03476                                         while(list($key,)=each($items['sorting']))      {
03477                                                 $list_arr[]=  $fullPath ? $path.'/'.$items['files'][$key] : $items['files'][$key];
03478                                         }
03479                                         return implode(',',$list_arr);
03480                                 }
03481                         }
03482                 }
03483         }
03484 
03493         function clean_directory($theDir)       {
03494                 if (t3lib_div::validPathStr($theDir))   {               // proceeds if no '//', '..' or '\' is in the $theFile
03495                         $theDir = ereg_replace("[\/\. ]*$",'',$theDir);         // Removes all dots, slashes and spaces after a path...
03496                         if (!t3lib_div::isAbsPath($theDir) && @is_dir($theDir)) {
03497                                 return $theDir;
03498                         }
03499                 }
03500         }
03501 
03511         function HTMLparser_TSbridge($theValue, $conf)  {
03512                 $htmlParser = t3lib_div::makeInstance('t3lib_parsehtml');
03513                 $htmlParserCfg =  $htmlParser->HTMLparserConfig($conf);
03514                 return $htmlParser->HTMLcleaner($theValue,$htmlParserCfg[0],$htmlParserCfg[1],$htmlParserCfg[2],$htmlParserCfg[3]);
03515         }
03516 
03525         function dataWrap($content,$wrap)       {
03526                 return $this->wrap($content,$this->insertData($wrap));
03527         }
03528 
03538         function insertData($str)       {
03539                 $inside=0;
03540                 $newVal='';
03541                 $pointer=0;
03542                 $totalLen = strlen($str);
03543                 do      {
03544                         if (!$inside)   {
03545                                 $len = strcspn(substr($str,$pointer),'{');
03546                                 $newVal.= substr($str,$pointer,$len);
03547                                 $inside = 1;
03548                         } else {
03549                                 $len = strcspn(substr($str,$pointer),'}')+1;
03550                                 $newVal.= $this->getData(substr($str,$pointer+1,$len-2),$this->data);
03551                                 $inside = 0;
03552                         }
03553                         $pointer+=$len;
03554                 } while($pointer<$totalLen);
03555                 return $newVal;
03556         }
03557 
03568         function prefixComment($str,$conf,$content)     {
03569                 $parts = explode('|',$str);
03570 
03571                 $output =
03572                         chr(10).str_pad('',$parts[0],chr(9)).
03573                         '<!-- '.htmlspecialchars($this->insertData($parts[1])).' [begin] -->'.
03574                         chr(10).str_pad('',$parts[0]+1,chr(9)).
03575                                 $content.
03576                         chr(10).str_pad('',$parts[0],chr(9)).
03577                         '<!-- '.htmlspecialchars($this->insertData($parts[1])).' [end] -->'.
03578                         chr(10).str_pad('',$parts[0]+1,chr(9));
03579 
03580                 return $output;
03581         }
03582 
03592         function substring($content,$options)   {
03593                 $options = t3lib_div::intExplode(',',$options.',');
03594                 if ($options[1])        {
03595                         return $GLOBALS['TSFE']->csConvObj->substr($GLOBALS['TSFE']->renderCharset,$content,$options[0],$options[1]);
03596                 } else {
03597                         return $GLOBALS['TSFE']->csConvObj->substr($GLOBALS['TSFE']->renderCharset,$content,$options[0]);
03598                 }
03599         }
03600 
03610         function crop($content,$options)        {
03611                 $options = explode('|',$options);
03612                 $chars = intval($options[0]);
03613                 $afterstring = trim($options[1]);
03614                 $crop2space = trim($options[2]);
03615                 if ($chars)     {
03616                         if (strlen($content)>abs($chars))       {
03617                                 if ($chars<0)   {
03618                                         $content = $GLOBALS['TSFE']->csConvObj->substr($GLOBALS['TSFE']->renderCharset,$content,$chars);
03619                                         $trunc_at = strpos($content, ' ');
03620                                         $content = ($trunc_at&&$crop2space) ? $afterstring.substr($content,$trunc_at) : $afterstring.$content;
03621                                 } else {
03622                                         $content = $GLOBALS['TSFE']->csConvObj->substr($GLOBALS['TSFE']->renderCharset,$content,0,$chars);
03623                                         $trunc_at = strrpos($content, ' ');
03624                                         $content = ($trunc_at&&$crop2space) ? substr($content, 0, $trunc_at).$afterstring : $content.$afterstring;
03625                                 }
03626                         }
03627                 }
03628                 return $content;
03629         }
03630 
03642         function removeBadHTML($text, $conf)    {
03643 
03644                         // Copyright 2002-2003 Thomas Bley
03645                 $text = preg_replace(
03646                         array(
03647                                 "'<script[^>]*?>.*?</script[^>]*?>'si",
03648                                 "'<applet[^>]*?>.*?</applet[^>]*?>'si",
03649                                 "'<object[^>]*?>.*?</object[^>]*?>'si",
03650                                 "'<iframe[^>]*?>.*?</iframe[^>]*?>'si",
03651                                 "'<frameset[^>]*?>.*?</frameset[^>]*?>'si",
03652                                 "'<style[^>]*?>.*?</style[^>]*?>'si",
03653                                 "'<marquee[^>]*?>.*?</marquee[^>]*?>'si",
03654                                 "'<script[^>]*?>'si",
03655                                 "'<meta[^>]*?>'si",
03656                                 "'<base[^>]*?>'si",
03657                                 "'<applet[^>]*?>'si",
03658                                 "'<object[^>]*?>'si",
03659                                 "'<link[^>]*?>'si",
03660                                 "'<iframe[^>]*?>'si",
03661                                 "'<frame[^>]*?>'si",
03662                                 "'<frameset[^>]*?>'si",
03663                                 "'<input[^>]*?>'si",
03664                                 "'<form[^>]*?>'si",
03665                                 "'<embed[^>]*?>'si",
03666                                 "'background-image:url'si",
03667                                 "'<\w+.*?(onabort|onbeforeunload|onblur|onchange|onclick|ondblclick|ondragdrop|onerror|onfilterchange|onfocus|onhelp|onkeydown|onkeypress|onkeyup|onload|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|onmove|onreadystatechange|onreset|onresize|onscroll|onselect|onselectstart|onsubmit|onunload).*?>'si",
03668                         ), '', $text);
03669 
03670                         $text = eregi_replace('<a[^>]*href[[:space:]]*=[[:space:]]*["\']?[[:space:]]*javascript[^>]*','',$text);
03671 
03672                         // Return clean content
03673                 return $text;
03674         }
03675 
03686         function textStyle($theValue, $conf) {
03687                 $conf['face.'][1] = 'Times New Roman';
03688                 $conf['face.'][2] = 'Verdana,Arial,Helvetica,Sans serif';
03689                 $conf['face.'][3] = 'Arial,Helvetica,Sans serif';
03690 
03691                 $conf['size.'][1] = 1;
03692                 $conf['size.'][2] = 2;
03693                 $conf['size.'][3] = 3;
03694                 $conf['size.'][4] = 4;
03695                 $conf['size.'][5] = 5;
03696                 $conf['size.'][10] = '+1';
03697                 $conf['size.'][11] = '-1';
03698 
03699                 $conf['color.'][240] = 'black';
03700                 $conf['color.'][241] = 'white';
03701                 $conf['color.'][242] = '#333333';
03702                 $conf['color.'][243] = 'gray';
03703                 $conf['color.'][244] = 'silver';
03704                 $conf['color.'][245] = 'red';
03705                 $conf['color.'][246] = 'navy';
03706                 $conf['color.'][247] = 'yellow';
03707                 $conf['color.'][248] = 'green';
03708                 $conf['color.'][249] = 'olive';
03709                 $conf['color.'][250] = 'maroon';
03710 
03711                 $face = $this->data[$conf['face.']['field']];
03712                 $size = $this->data[$conf['size.']['field']];
03713                 $color = $this->data[$conf['color.']['field']];
03714                 $align = $this->data[$conf['align.']['field']];
03715                 $properties = $this->data[$conf['properties.']['field']];
03716                 if (!$properties)       {
03717                         $properties=$this->stdWrap($conf['properties.']['default'],$conf['properties.']['default.']);
03718                 }
03719 
03720                         // properties
03721                 if (($properties&8))    {$theValue=$this->HTMLcaseshift($theValue, 'upper');}
03722                 if (($properties&1))    {$theValue='<b>'.$theValue.'</b>';}
03723                 if (($properties&2))    {$theValue='<i>'.$theValue.'</i>';}
03724                 if (($properties&4))    {$theValue='<u>'.$theValue.'</u>';}
03725 
03726                         // Fonttag
03727                 $theFace = $conf['face.'][$face] ? $conf['face.'][$face] : $this->stdWrap($conf['face.']['default'],$conf['face.']['default.']);
03728                 $theSize = $conf['size.'][$size] ? $conf['size.'][$size] : $this->stdWrap($conf['size.']['default'],$conf['size.']['default.']);
03729                 $theColor = $conf['color.'][$color] ? $conf['color.'][$color] : $this->stdWrap($conf['color.']['default'],$conf['color.']['default.']);
03730 
03731                 if ($conf['altWrap'])   {
03732                         $theValue=$this->wrap($theValue, $conf['altWrap']);
03733                 } elseif ($theFace || $theSize || $theColor)    {
03734                         $fontWrap = '<font'.($theFace?' face="'.$theFace.'"':'').($theSize?' size="'.$theSize.'"':'').($theColor?' color="'.$theColor.'"':'').'>|</font>';
03735                         $theValue=$this->wrap($theValue, $fontWrap);
03736                 }
03737                         // align
03738                 if ($align)     {$theValue=$this->wrap($theValue, '<div style="text-align:'.$align.';">|</div>');}
03739                         // return
03740                 return $theValue;
03741         }
03742 
03753         function tableStyle($theValue, $conf) {
03754                 $conf['color.'][240] = 'black';
03755                 $conf['color.'][241] = 'white';
03756                 $conf['color.'][242] = '#333333';
03757                 $conf['color.'][243] = 'gray';
03758                 $conf['color.'][244] = 'silver';
03759 
03760                 $align = $this->stdWrap($conf['align'],$conf['align.']);
03761                 $border = intval($this->stdWrap($conf['border'],$conf['border.']));
03762                 $cellspacing = intval($this->stdWrap($conf['cellspacing'],$conf['cellspacing.']));
03763                 $cellpadding = intval($this->stdWrap($conf['cellpadding'],$conf['cellpadding.']));
03764 
03765                 $color = $this->data[$conf['color.']['field']];
03766                 $theColor = $conf['color.'][$color] ? $conf['color.'][$color] : $conf['color.']['default'];
03767                         // Assembling the table tag
03768                 $tableTagArray = Array('<table');
03769                 $tableTagArray[]='border="'.$border.'"';
03770                 $tableTagArray[]='cellspacing="'.$cellspacing.'"';
03771                 $tableTagArray[]='cellpadding="'.$cellpadding.'"';
03772                 if ($align)     {$tableTagArray[]='align="'.$align.'"';}
03773                 if ($theColor)  {$tableTagArray[]='bgcolor="'.$theColor.'"';}
03774 
03775                 if ($conf['params'])    {
03776                         $tableTagArray[] = $conf['params'];
03777                 }
03778 
03779                 $tableWrap = implode(' ',$tableTagArray).'> | </table>';
03780                 $theValue=$this->wrap($theValue, $tableWrap);
03781                         // return
03782                 return $theValue;
03783         }
03784 
03794         function addParams($content,$conf) {
03795                 $lowerCaseAttributes = TRUE;    // For XHTML compliance.
03796 
03797                 if (!is_array($conf))   { return $content; }
03798 
03799                 $key = 1;
03800                 $parts = explode('<',$content);
03801                 if (intval($conf['_offset']))   $key = intval($conf['_offset'])<0 ? count($parts)+intval($conf['_offset']) : intval($conf['_offset']);
03802                 $subparts=explode('>',$parts[$key]);
03803                 if (trim($subparts[0])) {
03804                                 // Get attributes and name
03805                         $attribs = t3lib_div::get_tag_attributes('<'.$subparts[0].'>');
03806                         if (!is_array($attribs))        {$attribs=array();}
03807                         list($tagName) = explode(' ',$subparts[0],2);
03808                                 // adds/overrides attributes
03809                         reset($conf);
03810                         while(list($pkey,$val)=each($conf))     {
03811                                 if (substr($pkey,-1)!='.' && substr($pkey,0,1)!='_')    {
03812                                         $tmpVal=$this->stdWrap($conf[$pkey],$conf[$pkey.'.']);
03813                                         if ($lowerCaseAttributes)       { $pkey = strtolower($pkey); }
03814                                         if (strcmp($tmpVal,'')) {$attribs[$pkey]=$tmpVal;}
03815                                 }
03816                         }
03817 
03818                                 // Re-assembles the tag and content
03819                         $subparts[0]=trim($tagName.' '.t3lib_div::implodeAttributes($attribs));
03820                         $parts[$key] = implode('>',$subparts);
03821                         $content = implode('<',$parts);
03822                 }
03823                 return $content;
03824         }
03825 
03837         function filelink($theValue, $conf)     {
03838                 $output = '';
03839                 $aTagParams = $this->getATagParams($conf);
03840                 $initP = '?id='.$GLOBALS['TSFE']->id.'&type='.$GLOBALS['TSFE']->type;
03841                 $conf['path'] = $this->stdWrap($conf['path'],$conf['path.']);
03842                 $theFile = trim($conf['path']).$theValue;
03843                 if (@is_file($theFile)) {
03844                         $theFileEnc = str_replace('%2F', '/', rawurlencode($theFile));
03845                         $locDataAdd = $conf['jumpurl.']['secure'] ? $this->locDataJU($theFileEnc,$conf['jumpurl.']['secure.']) : '';
03846                         $url = ($conf['jumpurl']) ? $GLOBALS['TSFE']->config['mainScript'].$initP.'&jumpurl='.rawurlencode($theFileEnc).$locDataAdd.$GLOBALS['TSFE']->getMethodUrlIdToken : $theFileEnc;                // && $GLOBALS['TSFE']->config['config']['jumpurl_enable']
03847                         $theLinkWrap = '<a href="'.htmlspecialchars($GLOBALS['TSFE']->absRefPrefix.$url).'"'.($conf['target']?' target="'.$conf['target'].'"':'').$aTagParams.'>|</a>';
03848 
03849                         $theSize = filesize($theFile);
03850                         $fI = t3lib_div::split_fileref($theFile);
03851                         if ($conf['icon'])      {
03852 // TODO the path should be configurable (see bug #1378)
03853                                 $iconP = t3lib_extMgm::siteRelPath('cms').'tslib/media/fileicons/';
03854                                 $icon = @is_file($iconP.$fI['fileext'].'.gif') ? $iconP.$fI['fileext'].'.gif' : $iconP.'default.gif';
03855                                         // Checking for images: If image, then return link to thumbnail.
03856                                 $IEList = $this->stdWrap($conf['icon_image_ext_list'],$conf['icon_image_ext_list.']);
03857                                 $image_ext_list = str_replace(' ','',strtolower($IEList));
03858                                 if ($fI['fileext'] && t3lib_div::inList($image_ext_list, $fI['fileext']))       {
03859                                         if ($conf['iconCObject'])       {
03860                                                 $icon = $this->cObjGetSingle($conf['iconCObject'],$conf['iconCObject.'],'iconCObject');
03861                                         } else {
03862                                                 if ($GLOBALS['TYPO3_CONF_VARS']['GFX']['thumbnails'])   {
03863                                                         $thumbSize = '';
03864                                                         if ($conf['icon_thumbSize'] || $conf['icon_thumbSize.'])        { $thumbSize = '&size='.$this->stdWrap($conf['icon_thumbSize'], $conf['icon_thumbSize.']); }
03865                                                         $icon = 't3lib/thumbs.php?dummy='.$GLOBALS['EXEC_TIME'].'&file='.rawurlencode('../'.$theFile).$thumbSize;
03866                                                 } else {
03867                                                         $icon = t3lib_extMgm::siteRelPath('cms').'media/miscicons/notfound_thumb.gif';
03868                                                 }
03869                                                 $icon = '<img src="'.htmlspecialchars($GLOBALS['TSFE']->absRefPrefix.$icon).'"'.$this->getBorderAttr(' border="0"').''.$this->getAltParam($conf).' />';
03870                                         }
03871                                 } else {
03872                                         $icon = '<img src="'.htmlspecialchars($GLOBALS['TSFE']->absRefPrefix.$icon).'" width="18" height="16"'.$this->getBorderAttr(' border="0"').''.$this->getAltParam($conf).' />';
03873                                 }
03874                                 if ($conf['icon_link']) {$icon = $this->wrap($icon, $theLinkWrap);}
03875                                 $icon = $this->stdWrap($icon,$conf['icon.']);
03876                         }
03877                         if ($conf['size'])      {
03878                                 $size = $this->stdWrap($theSize,$conf['size.']);
03879                         }
03880 
03881                                 // Wrapping file label
03882                         if ($conf['removePrependedNumbers']) $theValue=ereg_replace('_[0-9][0-9](\.[[:alnum:]]*)$','\1',$theValue);
03883                         $theValue = $this->stdWrap($theValue,$conf['labelStdWrap.']);
03884 
03885                                 // Wrapping file
03886                         if ($conf['ATagBeforeWrap'])    {
03887                                 $theValue = $this->wrap($this->wrap($theValue, $conf['wrap']), $theLinkWrap);
03888                         } else {
03889                                 $theValue = $this->wrap($this->wrap($theValue, $theLinkWrap), $conf['wrap']);
03890                         }
03891                         $file = $this->stdWrap($theValue,$conf['file.']);
03892                                 // output
03893                         return $this->stdWrap($icon.$file.$size, $conf['stdWrap.']);
03894                 }
03895         }
03896 
03907         function locDataJU($jumpUrl,$conf)      {
03908                 $fI = pathinfo($jumpUrl);
03909                 $mimetype='';
03910                 if ($fI['extension'])   {
03911                         $mimeTypes = t3lib_div::trimExplode(',',$conf['mimeTypes'],1);
03912                         reset($mimeTypes);
03913                         while(list(,$v)=each($mimeTypes))       {
03914                                 $parts = explode('=',$v,2);
03915                                 if (strtolower($fI['extension']) == strtolower(trim($parts[0])))        {
03916                                         $mimetype = '&mimeType='.rawurlencode(trim($parts[1]));
03917                                 }
03918                         }
03919                 }
03920                 $locationData = $GLOBALS['TSFE']->id.':'.$this->currentRecord;
03921                 $rec='&locationData='.rawurlencode($locationData);
03922                 $hArr = array(
03923                         $jumpUrl,
03924                         $locationData,
03925                         $GLOBALS['TSFE']->TYPO3_CONF_VARS['SYS']['encryptionKey']
03926                 );
03927                 $juHash='&juHash='.t3lib_div::shortMD5(serialize($hArr));
03928                 return '&juSecure=1'.$mimetype.$rec.$juHash;
03929         }
03930 
03938         function calc($val)     {
03939                 $parts= t3lib_div::splitCalc($val,'+-*/');
03940                 $value=0;
03941                 reset($parts);
03942                 while(list(,$part)=each($parts))        {
03943                         $theVal = $part[1];
03944                         $sign =  $part[0];
03945                         if ((string)intval($theVal)==(string)$theVal)   {
03946                                 $theVal = intval($theVal);
03947                         } else {
03948                                 $theVal =0;
03949                         }
03950                         if ($sign=='-') {$value-=$theVal;}
03951                         if ($sign=='+') {$value+=$theVal;}
03952                         if ($sign=='/') {if (intval($theVal)) $value/=intval($theVal);}
03953                         if ($sign=='*') {$value*=$theVal;}
03954                 }
03955                 return $value;
03956         }
03957 
03967         function calcIntExplode($delim, $string)        {
03968                 $temp = explode($delim,$string);
03969                 while(list($key,$val)=each($temp))      {
03970                         $temp[$key]=intval(tslib_cObj::calc($val));
03971                 }
03972                 return $temp;
03973         }
03974 
03987         function splitObj($value, $conf)        {
03988                 $conf['token']=$this->stdWrap($conf['token'],$conf['token.']);
03989                 if (!$conf['token'])    {
03990                         return $value;
03991                 }
03992                 $conf['max']=intval($this->stdWrap($conf['max'],$conf['max.']));
03993                 $conf['min']=intval($this->stdWrap($conf['min'],$conf['min.']));
03994 
03995                 $valArr=explode($conf['token'],$value);
03996 
03997                 if (count($valArr) && ($conf['returnKey'] || $conf['returnKey.']))      {
03998                         $key = intval($this->stdWrap($conf['returnKey'],$conf['returnKey.']));
03999                         $content = isset($valArr[$key]) ? $valArr[$key] : '';
04000                 } else {
04001                                 // calculate splitCount
04002                         $splitCount = count($valArr);
04003                         if ($conf['max'] && $splitCount>$conf['max'])   {
04004                                 $splitCount=$conf['max'];
04005                         }
04006                         if ($conf['min'] && $splitCount<$conf['min'])   {
04007                                 $splitCount=$conf['min'];
04008                         }
04009 
04010                         if ($conf['wrap'] || $conf['cObjNum'])  {
04011                                 $splitArr=array();
04012                                 $splitArr['wrap']=$conf['wrap'];
04013                                 $splitArr['cObjNum']=$conf['cObjNum'];
04014                                 $splitArr = $GLOBALS['TSFE']->tmpl->splitConfArray($splitArr,$splitCount);
04015                         }
04016 
04017                         $content='';
04018                         for($a=0;$a<$splitCount;$a++)   {
04019                                 $GLOBALS['TSFE']->register['SPLIT_COUNT']=$a;
04020                                 $value = ''.$valArr[$a];
04021                                 $this->data[$this->currentValKey] = $value;
04022                                 if ($splitArr[$a]['cObjNum'])   {
04023                                         $objName=intval($splitArr[$a]['cObjNum']);
04024                                         $value = $this->stdWrap($this->cObjGet($conf[$objName.'.'],$objName.'.'),$conf[$objName.'.']);
04025                                 }
04026                                 if ($splitArr[$a]['wrap'])      {
04027                                         $value=$this->wrap($value,$splitArr[$a]['wrap']);
04028                                 }
04029                                 $content.=$value;
04030                         }
04031                 }
04032                 return $content;
04033         }
04034 
04049         function parseFunc($theValue, $conf, $ref='') {
04050 
04051                         // Fetch / merge reference, if any
04052                 if ($ref)       {
04053                         $temp_conf = array(
04054                                                                 'parseFunc' => $ref,
04055                                                                 'parseFunc.' => $conf
04056                                                         );
04057                         $temp_conf = $this->mergeTSRef($temp_conf, 'parseFunc');
04058                         $conf = $temp_conf['parseFunc.'];
04059                 }
04060 
04061                         // Process:
04062                 if (strcmp($conf['externalBlocks'],'')) {
04063                         $tags = strtolower(implode(',',t3lib_div::trimExplode(',',$conf['externalBlocks'])));
04064                         $htmlParser = t3lib_div::makeInstance('t3lib_parsehtml');
04065                         $parts = $htmlParser->splitIntoBlock($tags,$theValue);
04066 
04067                         reset($parts);
04068                         while(list($k,$v)=each($parts)) {
04069                                 if ($k%2)       {       // font:
04070                                         $tagName=strtolower($htmlParser->getFirstTagName($v));
04071                                         $cfg=$conf['externalBlocks.'][$tagName.'.'];
04072                                         if ($cfg['stripNLprev'] || $cfg['stripNL'])     {
04073                                                 $parts[$k-1]=ereg_replace(chr(13).'?'.chr(10).'[ ]*$', '', $parts[$k-1]);
04074                                         }
04075                                         if ($cfg['stripNLnext'] || $cfg['stripNL'])     {
04076                                                 $parts[$k+1]=ereg_replace('^[ ]*'.chr(13).'?'.chr(10), '', $parts[$k+1]);
04077                                         }
04078                                 }
04079                         }
04080 
04081                         reset($parts);
04082                         while(list($k,$v)=each($parts)) {
04083                                 if ($k%2)       {
04084                                         $tag=$htmlParser->getFirstTag($v);
04085                                         $tagName=strtolower($htmlParser->getFirstTagName($v));
04086                                         $cfg=$conf['externalBlocks.'][$tagName.'.'];
04087                                         if ($cfg['callRecursive'])      {
04088                                                 $parts[$k]=$this->parseFunc($htmlParser->removeFirstAndLastTag($v), $conf);
04089                                                 if (!$cfg['callRecursive.']['dontWrapSelf'])    {
04090                                                         if ($cfg['callRecursive.']['alternativeWrap'])  {
04091                                                                 $parts[$k] = $this->wrap($parts[$k], $cfg['callRecursive.']['alternativeWrap']);
04092                                                         } else {
04093                                                                 if (is_array($cfg['callRecursive.']['tagStdWrap.']))    {
04094                                                                         $tag = $this->stdWrap($tag,$cfg['callRecursive.']['tagStdWrap.']);
04095                                                                 }
04096                                                                 $parts[$k]=$tag.$parts[$k].'</'.$tagName.'>';
04097                                                         }
04098                                                 }
04099                                         } elseif($cfg['HTMLtableCells']) {
04100                                                 $rowParts = $htmlParser->splitIntoBlock('tr',$parts[$k]);
04101                                                 reset($rowParts);
04102                                                 while(list($kk,$vv)=each($rowParts))    {
04103                                                         if ($kk%2)      {
04104                                                                 $colParts = $htmlParser->splitIntoBlock('td',$vv);
04105                                                                 reset($colParts);
04106                                                                 $cc=0;
04107                                                                 while(list($kkk,$vvv)=each($colParts))  {
04108                                                                         if ($kkk%2)     {
04109                                                                                 $cc++;
04110                                                                                 $tag=$htmlParser->getFirstTag($vvv);
04111                                                                                 $tagName=strtolower($htmlParser->getFirstTagName($vvv));
04112                                                                                 $colParts[$kkk] = $htmlParser->removeFirstAndLastTag($vvv);
04113 
04114                                                                                 if ($cfg['HTMLtableCells.'][$cc.'.']['callRecursive'] || (!isset($cfg['HTMLtableCells.'][$cc.'.']['callRecursive']) && $cfg['HTMLtableCells.']['default.']['callRecursive']))   {
04115                                                                                         if ($cfg['HTMLtableCells.']['addChr10BetweenParagraphs'])       $colParts[$kkk]=str_replace('</p><p>','</p>'.chr(10).'<p>',$colParts[$kkk]);
04116                                                                                         $colParts[$kkk] = $this->parseFunc($colParts[$kkk], $conf);
04117                                                                                 }
04118 
04119                                                                                 $tagStdWrap = is_array($cfg['HTMLtableCells.'][$cc.'.']['tagStdWrap.'])?$cfg['HTMLtableCells.'][$cc.'.']['tagStdWrap.']:$cfg['HTMLtableCells.']['default.']['tagStdWrap.'];
04120                                                                                 if (is_array($tagStdWrap))      {
04121                                                                                         $tag = $this->stdWrap($tag,$tagStdWrap);
04122                                                                                 }
04123 
04124                                                                                 $stdWrap = is_array($cfg['HTMLtableCells.'][$cc.'.']['stdWrap.'])?$cfg['HTMLtableCells.'][$cc.'.']['stdWrap.']:$cfg['HTMLtableCells.']['default.']['stdWrap.'];
04125                                                                                 if (is_array($stdWrap)) {
04126                                                                                         $colParts[$kkk] = $this->stdWrap($colParts[$kkk],$stdWrap);
04127                                                                                 }
04128 
04129                                                                                 $colParts[$kkk]=$tag.$colParts[$kkk].'</'.$tagName.'>';
04130                                                                         }
04131                                                                 }
04132                                                                 $rowParts[$kk] = implode('',$colParts);
04133                                                         }
04134                                                 }
04135                                                 $parts[$k] = implode('',$rowParts);
04136                                         }
04137 
04138                                         if (is_array($cfg['stdWrap.'])) {
04139                                                 $parts[$k] = $this->stdWrap($parts[$k],$cfg['stdWrap.']);
04140                                         }
04141                                 } else {
04142                                         $parts[$k]=$this->_parseFunc($parts[$k], $conf);
04143                                 }
04144                         }
04145 
04146                         return implode('',$parts);
04147                 } else return $this->_parseFunc($theValue, $conf);
04148         }
04149 
04159         function _parseFunc ($theValue, $conf) {
04160                 if (!$this->checkIf($conf['if.']))      {
04161                         return $theValue;
04162                 }
04163                 $inside=0;      // Indicates that the data is from within a tag.
04164                 $pointer=0;     // Pointer to the total string position
04165                 $currentTag=''; // Loaded with the current typo-tag if any.
04166                 $stripNL=0;
04167                 $contentAccum=array();
04168                 $contentAccumP=0;
04169 
04170                 $allowTags=strtolower(str_replace(' ','',$conf['allowTags']));
04171                 $denyTags=strtolower(str_replace(' ','',$conf['denyTags']));
04172 
04173                 $totalLen = strlen($theValue);
04174                 do      {
04175                         if (!$inside)   {
04176                                 if (!is_array($currentTag))     {                       // These operations should only be performed on code outside the typotags...
04177                                                 // data: this checks that we enter tags ONLY if the first char in the tag is alphanumeric OR '/'
04178                                         $len_p=0;
04179                                         $c=100;
04180                                         do      {
04181                                                 $len = strcspn(substr($theValue,$pointer+$len_p),'<');
04182                                                 $len_p+=$len+1;
04183                                                 $endChar = ord(strtolower(substr($theValue,$pointer+$len_p,1)));
04184                                                 $c--;
04185                                         } while ($c>0 && $endChar && ($endChar<97 || $endChar>122) && $endChar!=47);
04186                                         $len = $len_p-1;
04187                                 } else {
04188                                                 // If we're inside a currentTag, just take it to the end of that tag!
04189                                         $tempContent = strtolower(substr($theValue,$pointer));
04190                                         $len = strpos ($tempContent, '</'.$currentTag[0]);
04191                                         if (is_string ($len) && !$len) {
04192                                                 $len = strlen($tempContent);
04193                                         }
04194                                 }
04195 
04196                                 $data = substr($theValue,$pointer,$len);        // $data is the content until the next <tag-start or end is detected. In case of a currentTag set, this would mean all data between the start- and end-tags
04197                                 if ($data!='')  {
04198                                         if ($stripNL)   {               // If the previous tag was set to strip NewLines in the beginning of the next data-chunk.
04199                                                 $data = ereg_replace('^[ ]*'.chr(13).'?'.chr(10), '', $data);
04200                                         }
04201 
04202                                         if (!is_array($currentTag))     {                       // These operations should only be performed on code outside the tags...
04203                                                         // Constants
04204                                                 if ($conf['constants'] && is_array($GLOBALS['TSFE']->tmpl->setup['constants.']))        {
04205                                                         reset($GLOBALS['TSFE']->tmpl->setup['constants.']);
04206                                                         while(list($key,$val)=each($GLOBALS['TSFE']->tmpl->setup['constants.']))        {
04207                                                                 if (is_string($val))    {
04208                                                                         $data = str_replace('###'.$key.'###', $val, $data);
04209                                                                 }
04210                                                         }
04211                                                 }
04212                                                         // Short
04213                                                 if (is_array($conf['short.']))  {
04214                                                         $shortWords = $conf['short.'];
04215                                                         krsort($shortWords);
04216                                                         reset($shortWords);
04217                                                         while(list($key,$val)=each($shortWords))        {
04218                                                                 if (is_string($val))    {
04219                                                                         $data = str_replace($key, $val, $data);
04220                                                                 }
04221                                                         }
04222                                                 }
04223 
04224                                                         // stdWrap
04225                                                 if (is_array($conf['plainTextStdWrap.']))       {$data = $this->stdWrap($data,$conf['plainTextStdWrap.']);}
04226                                                         // userFunc
04227                                                 if ($conf['userFunc'])  {$data = $this->callUserFunction($conf['userFunc'], $conf['userFunc.'], $data);}
04228 
04229                                                         // Makelinks: (Before search-words as we need the links to be generated when searchwords go on...!)
04230                                                 if ($conf['makelinks']) {
04231                                                         $data = $this->http_makelinks($data,$conf['makelinks.']['http.']);
04232                                                         $data = $this->mailto_makelinks($data,$conf['makelinks.']['mailto.']);
04233                                                 }
04234 
04235                                                         // Search Words:
04236                                                 if ($GLOBALS['TSFE']->no_cache && $conf['sword'] && is_array($GLOBALS['TSFE']->sWordList) && $GLOBALS['TSFE']->sWordRegEx)      {
04237                                                         $newstring = '';
04238                                                         do {
04239                                                                 $pieces = split($GLOBALS['TSFE']->sWordRegEx,$data,2);
04240                                                                 $newstring.=$pieces[0];
04241                                                                 $match_len = strlen($data)-(strlen($pieces[0])+strlen($pieces[1]));
04242                                                                 if (strstr($pieces[0],'<') || strstr($pieces[0],'>'))   {
04243                                                                         $inTag = strrpos($pieces[0],'<') > strrpos($pieces[0],'>');             // Returns true, if a '<' is closer to the string-end than '>'. This is the case if we're INSIDE a tag (that could have been made by makelinks...) and we must secure, that the inside of a tag is not marked up.
04244                                                                 }
04245                                                                         // The searchword:
04246                                                                 $match = substr($data,strlen($pieces[0]),$match_len);
04247 
04248                                                                 if (trim($match) && strlen($match)>1 && !$inTag)        {
04249                                                                         $match = $this->wrap($match, $conf['sword']);
04250                                                                 }
04251                                                                         // Concatenate the Search Word again.
04252                                                                 $newstring.= $match;
04253                                                                 $data=$pieces[1];
04254                                                         } while ($pieces[1]);
04255                                                         $data = $newstring;
04256                                                 }
04257                                         }
04258                                         $contentAccum[$contentAccumP].=$data;
04259                                 }
04260                                 $inside = 1;
04261                         } else {
04262                                         // tags
04263                                 $len = strcspn(substr($theValue,$pointer),'>')+1;
04264                                 $data = substr($theValue,$pointer,$len);
04265 
04266                                 $tag = explode(' ',trim(substr($data,1,-1)),2);
04267                                 $tag[0]=strtolower($tag[0]);
04268                                 if (substr($tag[0],0,1)=='/')   {
04269                                         $tag[0]=substr($tag[0],1);
04270                                         $tag['out']=1;
04271                                 }
04272                                 if($conf['tags.'][$tag[0]])     {
04273                                         $treated=0;
04274                                         $stripNL = 0;
04275                                                 // in-tag
04276                                         if (!$currentTag && !$tag['out'])       {
04277                                                 $currentTag = $tag;             // $currentTag er lig med det tag (array!), man er igang med!
04278                                                 $contentAccumP++;
04279                                                 $treated=1;
04280                                         }
04281                                                 // out-tag
04282                                         if ($currentTag[0]==$tag[0] && $tag['out'])     {
04283                                                 $theName = $conf['tags.'][$tag[0]];
04284                                                 $theConf = $conf['tags.'][$tag[0].'.'];
04285                                                 $stripNL = ($theConf['stripNL'] ? 1 : 0);       // This flag indicates, that NL- (13-10-chars) should be stripped first and last.
04286                                                 $breakOut = ($theConf['breakoutTypoTagContent'] ? 1 : 0);       // This flag indicates, that this TypoTag section should NOT be included in the nonTypoTag content.
04287 
04288                                                 $this->parameters=Array();
04289                                                 if ($currentTag[1])     {
04290                                                         $params=t3lib_div::get_tag_attributes($currentTag[1]);
04291                                                         if (is_array($params))  {
04292                                                                 reset($params);
04293                                                                 while(list($option,$val)=each($params)) {
04294                                                                         $this->parameters[strtolower($option)]=$val;
04295                                                                 }
04296                                                         }
04297                                                 }
04298                                                 $this->parameters['allParams']=trim($currentTag[1]);
04299                                                 if ($stripNL)   {       // Removes NL in the beginning and end of the tag-content AND at the end of the currentTagBuffer. $stripNL depends on the configuration of the current tag
04300                                                         $contentAccum[$contentAccumP-1] = ereg_replace(chr(13).'?'.chr(10).'[ ]*$', '', $contentAccum[$contentAccumP-1]);
04301                                                         $contentAccum[$contentAccumP] = ereg_replace('^[ ]*'.chr(13).'?'.chr(10), '', $contentAccum[$contentAccumP]);
04302                                                         $contentAccum[$contentAccumP] = ereg_replace(chr(13).'?'.chr(10).'[ ]*$', '', $contentAccum[$contentAccumP]);
04303                                                 }
04304                                                 $this->data[$this->currentValKey] = $contentAccum[$contentAccumP];
04305                                                 $newInput=$this->cObjGetSingle($theName,$theConf,'/parseFunc/.tags.'.$tag[0]);  // fetch the content object
04306 
04307                                                 $contentAccum[$contentAccumP]=$newInput;
04308                                                 $contentAccumP++;
04309 
04310                                                         // If the TypoTag section
04311                                                 if (!$breakOut) {
04312                                                         $contentAccum[$contentAccumP-2].=$contentAccum[$contentAccumP-1].$contentAccum[$contentAccumP];
04313                                                         unset($contentAccum[$contentAccumP]);
04314                                                         unset($contentAccum[$contentAccumP-1]);
04315                                                         $contentAccumP-=2;
04316                                                 }
04317 
04318                                                 unset($currentTag);
04319                                                 $treated=1;
04320                                         }
04321                                                 // other tags...
04322                                         if (!$treated)  {
04323                                                 $contentAccum[$contentAccumP].=$data;
04324                                         }
04325                                 } else {
04326                                                 // If a tag was not a typo tag, then it is just added to the content
04327                                         $stripNL = 0;
04328                                         if (t3lib_div::inList($allowTags,$tag[0]) || ($denyTags!='*' && !t3lib_div::inList($denyTags,$tag[0]))) {
04329                                                 $contentAccum[$contentAccumP].=$data;
04330                                         } else {
04331                                                 $contentAccum[$contentAccumP].=HTMLSpecialChars($data);
04332                                         }
04333                                 }
04334                                 $inside = 0;
04335                         }
04336                         $pointer+=$len;
04337                 } while($pointer<$totalLen);
04338 
04339                         // Parsing nonTypoTag content (all even keys):
04340                 reset($contentAccum);
04341                 for ($a=0;$a<count($contentAccum);$a++) {
04342                         if ($a%2 != 1)  {
04343                                         // stdWrap
04344                                 if (is_array($conf['nonTypoTagStdWrap.']))      {$contentAccum[$a] = $this->stdWrap($contentAccum[$a],$conf['nonTypoTagStdWrap.']);}
04345                                         // userFunc
04346                                 if ($conf['nonTypoTagUserFunc'])        {$contentAccum[$a] = $this->callUserFunction($conf['nonTypoTagUserFunc'], $conf['nonTypoTagUserFunc.'], $contentAccum[$a]);}
04347                         }
04348                 }
04349                 return implode('',$contentAccum);
04350         }
04351 
04361         function encaps_lineSplit($theValue, $conf)     {
04362                 $lParts = explode(chr(10),$theValue);
04363 
04364                 $encapTags = t3lib_div::trimExplode(',',strtolower($conf['encapsTagList']),1);
04365                 $nonWrappedTag = $conf['nonWrappedTag'];
04366                 $defaultAlign=trim($this->stdWrap($conf['defaultAlign'],$conf['defaultAlign.']));
04367 
04368                 if (!strcmp('',$theValue))      return '';
04369 
04370                 while(list($k,$l)=each($lParts))        {
04371                         $sameBeginEnd=0;
04372                         $l=trim($l);
04373                         $attrib=array();
04374                         $nWrapped=0;
04375                         $byPass=0;
04376                         if (substr($l,0,1)=='<' && substr($l,-1)=='>')  {
04377                                 $fwParts = explode('>',substr($l,1),2);
04378                                 $backParts = t3lib_div::revExplode('<', substr($fwParts[1],0,-1), 2);
04379                                 $attrib = t3lib_div::get_tag_attributes('<'.$fwParts[0].'>');
04380                                 list($tagName) = explode(' ',$fwParts[0]);
04381                                 $str_content = $backParts[0];
04382                                 $sameBeginEnd = (substr(strtolower($backParts[1]),1,strlen($tagName))==strtolower($tagName));
04383                         }
04384 
04385                         if ($sameBeginEnd && in_array(strtolower($tagName),$encapTags)) {
04386                                 $uTagName = strtoupper($tagName);
04387                                 $uTagName = strtoupper($conf['remapTag.'][$uTagName]?$conf['remapTag.'][$uTagName]:$uTagName);
04388                         } else {
04389                                 $uTagName = strtoupper($nonWrappedTag);
04390                                 $str_content = $lParts[$k];
04391                                 $nWrapped=1;
04392                                 $attrib=array();
04393                         }
04394 
04395                                 // Wrapping all inner-content:
04396                         if (is_array($conf['innerStdWrap_all.']))       {$str_content = $this->stdWrap($str_content,$conf['innerStdWrap_all.']);}
04397 
04398                         if ($uTagName)  {
04399                                         // Setting common attributes
04400                                 if (is_array($conf['addAttributes.'][$uTagName.'.']))   {
04401                                         reset($conf['addAttributes.'][$uTagName.'.']);
04402                                         while(list($kk,$vv)=each($conf['addAttributes.'][$uTagName.'.']))       {
04403                                                 if (!is_array($vv))     {
04404                                                         if ((string)$conf['addAttributes.'][$uTagName.'.'][$kk.'.']['setOnly']=='blank')        {
04405                                                                 if (!strcmp($attrib[$kk],''))   $attrib[$kk]=$vv;
04406                                                         } elseif ((string)$conf['addAttributes.'][$uTagName.'.'][$kk.'.']['setOnly']=='exists') {
04407                                                                 if (!isset($attrib[$kk]))       $attrib[$kk]=$vv;
04408                                                         } else {
04409                                                                 $attrib[$kk]=$vv;
04410                                                         }
04411                                                 }
04412                                         }
04413                                 }
04414                                         // Wrapping all inner-content:
04415                                 if (is_array($conf['encapsLinesStdWrap.'][$uTagName.'.']))      {$str_content = $this->stdWrap($str_content,$conf['encapsLinesStdWrap.'][$uTagName.'.']);}
04416                                         // Default align
04417                                 if (!$attrib['align'] && $defaultAlign) $attrib['align']=$defaultAlign;
04418 
04419                                 $params = t3lib_div::implodeAttributes($attrib,1);
04420                                 if ($conf['removeWrapping'])    {
04421                                         $str_content=$str_content;
04422                                 } else {
04423                                         $str_content='<'.strtolower($uTagName).(trim($params)?' '.trim($params):'').'>'.$str_content.'</'.strtolower($uTagName).'>';
04424                                 }
04425                         }
04426 
04427                         if ($nWrapped && $conf['wrapNonWrappedLines'])  {$str_content = $this->wrap($str_content,$conf['wrapNonWrappedLines']);}
04428                         $lParts[$k] = $str_content;
04429                 }
04430 
04431                 return implode(chr(10),$lParts);
04432         }
04433 
04444         function http_makelinks($data,$conf)    {
04445                 $aTagParams = $this->getATagParams($conf);
04446                 $textpieces = explode('http://', $data);
04447                 $pieces = count($textpieces);
04448                 $textstr = $textpieces[0];
04449                 $initP = '?id='.$GLOBALS['TSFE']->id.'&type='.$GLOBALS['TSFE']->type;
04450                 for($i=1; $i<$pieces; $i++)     {
04451                         $len=strcspn($textpieces[$i],chr(32).chr(9).chr(13).chr(10));
04452                         if (trim(substr($textstr,-1))=='' && $len)      {
04453 
04454                                 $lastChar=substr($textpieces[$i],$len-1,1);
04455                                 if (!ereg('[A-Za-z0-9\/#_-]',$lastChar)) {$len--;}              // Included '\/' 3/12
04456 
04457                                 $parts[0]=substr($textpieces[$i],0,$len);
04458                                 $parts[1]=substr($textpieces[$i],$len);
04459 
04460                                 $keep=$conf['keep'];
04461                                 $linkParts=parse_url('http://'.$parts[0]);
04462                                 $linktxt='';
04463                                 if (strstr($keep,'scheme'))     {
04464                                         $linktxt='http://';
04465                                 }
04466                                 $linktxt.= $linkParts['host'];
04467                                 if (strstr($keep,'path'))       {
04468                                         $linktxt.= $linkParts['path'];
04469                                         if (strstr($keep,'query') && $linkParts['query'])       {               // added $linkParts['query'] 3/12
04470                                                 $linktxt.= '?'.$linkParts['query'];
04471                                         } elseif ($linkParts['path']=='/')      {  // If query is NOT added and the path is '/' then remove the slash ('/')   (added 3/12)
04472                                                 $linktxt=substr($linktxt,0,-1);
04473                                         }
04474                                 }
04475                                 $target = isset($conf['extTarget']) ? $conf['extTarget'] : $GLOBALS['TSFE']->extTarget;
04476                                 if ($GLOBALS['TSFE']->config['config']['jumpurl_enable'])       {
04477                                         $res = '<a'.
04478                                                         ' href="'.htmlspecialchars($GLOBALS['TSFE']->absRefPrefix.$GLOBALS['TSFE']->config['mainScript'].$initP.'&jumpurl='.rawurlencode('http://'.$parts[0]).$GLOBALS['TSFE']->getMethodUrlIdToken).'"'.
04479                                                         ($target ? ' target="'.$target.'"' : '').
04480                                                         $aTagParams.
04481                                                         '>';
04482                                 } else {
04483                                         $res = '<a'.
04484                                                         ' href="http://'.htmlspecialchars($parts[0]).'"'.
04485                                                         ($target ? ' target="'.$target.'"' : '').
04486                                                         $aTagParams.
04487                                                         '>';
04488                                 }
04489                                 if ($conf['ATagBeforeWrap'])    {
04490                                         $res= $res.$this->wrap($linktxt, $conf['wrap']).'</a>';
04491                                 } else {
04492                                         $res= $this->wrap($res.$linktxt.'</a>', $conf['wrap']);
04493                                 }
04494                                 $textstr.=$res.$parts[1];
04495                         } else {
04496                                 $textstr.='http://'.$textpieces[$i];
04497                         }
04498                 }
04499                 return $textstr;
04500         }
04501 
04511         function mailto_makelinks($data,$conf)  {
04512                 // http-split
04513                 $aTagParams = $this->getATagParams($conf);
04514                 $textpieces = explode('mailto:', $data);
04515                 $pieces = count($textpieces);
04516                 $textstr = $textpieces[0];
04517                 $initP = '?id='.$GLOBALS['TSFE']->id.'&type='.$GLOBALS['TSFE']->type;
04518                 for($i=1; $i<$pieces; $i++)     {
04519                         $len = strcspn($textpieces[$i],chr(32).chr(9).chr(13).chr(10));
04520                         if (trim(substr($textstr,-1))=='' && $len)      {
04521                                 $lastChar = substr($textpieces[$i],$len-1,1);
04522                                 if (!ereg('[A-Za-z0-9]',$lastChar)) {$len--;}
04523 
04524                                 $parts[0] = substr($textpieces[$i],0,$len);
04525                                 $parts[1] = substr($textpieces[$i],$len);
04526                                 $linktxt = ereg_replace('\?.*','',$parts[0]);
04527                                 list($mailToUrl,$linktxt) = $this->getMailTo($parts[0],$linktxt,$initP);
04528                                 $mailToUrl = $GLOBALS['TSFE']->spamProtectEmailAddresses === 'ascii'?$mailToUrl:htmlspecialchars($mailToUrl);
04529                                 $res = '<a href="'.$mailToUrl.'"'.$aTagParams.'>';
04530                                 if ($conf['ATagBeforeWrap'])    {
04531                                         $res= $res.$this->wrap($linktxt, $conf['wrap']).'</a>';
04532                                 } else {
04533                                         $res= $this->wrap($res.$linktxt.'</a>', $conf['wrap']);
04534                                 }
04535                                 $textstr.=$res.$parts[1];
04536                         } else {
04537                                 $textstr.='mailto:'.$textpieces[$i];
04538                         }
04539                 }
04540                 return $textstr;
04541         }
04542 
04554         function getImgResource($file,$fileArray)       {
04555                 if (is_array($fileArray))       {
04556                         switch($file)   {
04557                                 case 'GIFBUILDER':
04558                                         $gifCreator = t3lib_div::makeInstance('tslib_gifbuilder');
04559                                         $gifCreator->init();
04560                                         $theImage='';
04561                                         if ($GLOBALS['TYPO3_CONF_VARS']['GFX']['gdlib'])        {
04562                                                 $gifCreator->start($fileArray,$this->data);
04563                                                 $theImage = $gifCreator->gifBuild();
04564                                         }
04565                                         return $gifCreator->getImageDimensions($theImage);
04566                                 break;
04567                                 default:
04568                                         if ($fileArray['import.'])      {
04569                                                 $ifile = $this->stdWrap('',$fileArray['import.']);
04570                                                 if ($ifile)     {$file = $fileArray['import'].$ifile;}
04571                                         }
04572                                         $theImage = $GLOBALS['TSFE']->tmpl->getFileName($file);
04573                                         if ($theImage)  {
04574                                                 $fileArray['width']= $this->stdWrap($fileArray['width'],$fileArray['width.']);
04575                                                 $fileArray['height']= $this->stdWrap($fileArray['height'],$fileArray['height.']);
04576                                                 $fileArray['ext']= $this->stdWrap($fileArray['ext'],$fileArray['ext.']);
04577                                                 $fileArray['maxW']= intval($this->stdWrap($fileArray['maxW'],$fileArray['maxW.']));
04578                                                 $fileArray['maxH']= intval($this->stdWrap($fileArray['maxH'],$fileArray['maxH.']));
04579                                                 $fileArray['minW']= intval($fileArray['minW']);
04580                                                 $fileArray['minH']= intval($fileArray['minH']);
04581                                                 $maskArray=     $fileArray['m.'];
04582                                                 $maskImages=array();
04583                                                 if (is_array($fileArray['m.'])) {       // Must render mask images and include in hash-calculating - else we cannot be sure the filename is unique for the setup!
04584                                                         $maskImages['m_mask'] = $this->getImgResource($maskArray['mask'],$maskArray['mask.']);
04585                                                         $maskImages['m_bgImg'] = $this->getImgResource($maskArray['bgImg'],$maskArray['bgImg.']);
04586                                                         $maskImages['m_bottomImg'] = $this->getImgResource($maskArray['bottomImg'],$maskArray['bottomImg.']);
04587                                                         $maskImages['m_bottomImg_mask'] = $this->getImgResource($maskArray['bottomImg_mask'],$maskArray['bottomImg_mask.']);
04588                                                 }
04589                                                 $hash = t3lib_div::shortMD5($theImage.serialize($fileArray).serialize($maskImages));
04590                                                 if (!isset($GLOBALS['TSFE']->tmpl->fileCache[$hash]))   {
04591                                                         $gifCreator = t3lib_div::makeInstance('tslib_gifbuilder');
04592                                                         $gifCreator->init();
04593 
04594                                                         if ($GLOBALS['TSFE']->config['config']['meaningfulTempFilePrefix'])     {
04595                                                                 $gifCreator->filenamePrefix = $GLOBALS['TSFE']->fileNameASCIIPrefix(ereg_replace('\.[[:alnum:]]+$','',basename($theImage)),intval($GLOBALS['TSFE']->config['config']['meaningfulTempFilePrefix']),'_');
04596                                                         }
04597 
04598                                                         if ($fileArray['sample'])       {
04599                                                                 $gifCreator->scalecmd = '-sample';
04600                                                                 $GLOBALS['TT']->setTSlogMessage('Sample option: Images are scaled with -sample.');
04601                                                         }
04602                                                         if ($fileArray['alternativeTempPath'] && t3lib_div::inList($GLOBALS['TYPO3_CONF_VARS']['FE']['allowedTempPaths'],$fileArray['alternativeTempPath']))    {
04603                                                                 $gifCreator->tempPath = $fileArray['alternativeTempPath'];
04604                                                                 $GLOBALS['TT']->setTSlogMessage('Set alternativeTempPath: '.$fileArray['alternativeTempPath']);
04605                                                         }
04606 
04607                                                         if (!trim($fileArray['ext'])){$fileArray['ext']='web';}
04608                                                         $options = Array();
04609                                                         if ($fileArray['maxW']) {$options['maxW']=$fileArray['maxW'];}
04610                                                         if ($fileArray['maxH']) {$options['maxH']=$fileArray['maxH'];}
04611                                                         if ($fileArray['minW']) {$options['minW']=$fileArray['minW'];}
04612                                                         if ($fileArray['minH']) {$options['minH']=$fileArray['minH'];}
04613 
04614                                                                 // checks to see if m (the mask array) is defined
04615                                                         if (is_array($maskArray) && $GLOBALS['TYPO3_CONF_VARS']['GFX']['im'])   {
04616                                                                         // Filename:
04617                                                                 $fI = t3lib_div::split_fileref($theImage);
04618                                                                 $imgExt = (strtolower($fI['fileext'])==$gifCreator->gifExtension ? $gifCreator->gifExtension : 'jpg');
04619                                                                 $dest = $gifCreator->tempPath.$hash.'.'.$imgExt;
04620                                                                 if (!@file_exists($dest))       {               // Generate!
04621                                                                         $m_mask= $maskImages['m_mask'];
04622                                                                         $m_bgImg = $maskImages['m_bgImg'];
04623                                                                         if ($m_mask && $m_bgImg)        {
04624                                                                                 $negate = $GLOBALS['TYPO3_CONF_VARS']['GFX']['im_negate_mask'] ? ' -negate' : '';
04625 
04626                                                                                 $temp_ext='png';
04627                                                                                 if ($GLOBALS['TYPO3_CONF_VARS']['GFX']['im_mask_temp_ext_gif']) {               // If ImageMagick version 5+
04628                                                                                         $temp_ext=$gifCreator->gifExtension;
04629                                                                                 }
04630 
04631                                                                                 $tempFileInfo = $gifCreator->imageMagickConvert($theImage,$temp_ext,$fileArray['width'],$fileArray['height'],$fileArray['params'],$fileArray['frame'],$options);
04632                                                                                 if (is_array($tempFileInfo))    {
04633                                                                                         $m_bottomImg = $maskImages['m_bottomImg'];
04634                                                                                         if ($m_bottomImg)       {
04635                                                                                                 $m_bottomImg_mask = $maskImages['m_bottomImg_mask'];
04636                                                                                         }
04637                                                                                                 //      Scaling:        ****
04638                                                                                         $tempScale=array();
04639                                                                                         $command = '-geometry '.$tempFileInfo[0].'x'.$tempFileInfo[1].'!';
04640                                                                                         $tmpStr = $gifCreator->randomName();
04641 
04642                                                                                                 //      m_mask
04643                                                                                         $tempScale['m_mask']=$tmpStr.'_mask.'.$temp_ext;
04644                                                                                         $gifCreator->imageMagickExec($m_mask[3],$tempScale['m_mask'],$command.$negate);
04645                                                                                                 //      m_bgImg
04646                                                                                         $tempScale['m_bgImg']=$tmpStr.'_bgImg.'.trim($GLOBALS['TYPO3_CONF_VARS']['GFX']['im_mask_temp_ext_noloss']);
04647                                                                                         $gifCreator->imageMagickExec($m_bgImg[3],$tempScale['m_bgImg'],$command);
04648 
04649                                                                                                 //      m_bottomImg / m_bottomImg_mask
04650                                                                                         if ($m_bottomImg && $m_bottomImg_mask)  {
04651                                                                                                 $tempScale['m_bottomImg']=$tmpStr.'_bottomImg.'.$temp_ext;
04652                                                                                                 $gifCreator->imageMagickExec($m_bottomImg[3],$tempScale['m_bottomImg'],$command);
04653                                                                                                 $tempScale['m_bottomImg_mask']=$tmpStr.'_bottomImg_mask.'.$temp_ext;
04654                                                                                                 $gifCreator->imageMagickExec($m_bottomImg_mask[3],$tempScale['m_bottomImg_mask'],$command.$negate);
04655 
04656                                                                                                         // BEGIN combining:
04657                                                                                                         // The image onto the background
04658                                                                                                 $gifCreator->combineExec($tempScale['m_bgImg'],$tempScale['m_bottomImg'],$tempScale['m_bottomImg_mask'],$tempScale['m_bgImg']);
04659                                                                                         }
04660                                                                                                 // The image onto the background
04661                                                                                         $gifCreator->combineExec($tempScale['m_bgImg'],$tempFileInfo[3],$tempScale['m_mask'],$dest);
04662                                                                                                 // Unlink the temp-images...
04663                                                                                         reset($tempScale);
04664                                                                                         while(list(,$file)=each($tempScale))    {
04665                                                                                                 if (@is_file($file))    {
04666                                                                                                         unlink($file);
04667                                                                                                 }
04668                                                                                         }
04669                                                                                                 //      t3lib_div::print_array($GLOBALS['TSFE']->tmpl->fileCache[$hash]);
04670                                                                                 }
04671                                                                         }
04672                                                                 }
04673                                                                         // Finish off
04674                                                                 if (($fileArray['reduceColors'] || ($imgExt=='png' && !$gifCreateor->png_truecolor)) && is_file($dest)) {
04675                                                                         $reduced = $gifCreator->IMreduceColors($dest, t3lib_div::intInRange($fileArray['reduceColors'], 256, $gifCreator->truecolorColors, 256));
04676                                                                         if (is_file($reduced))  {
04677                                                                                 unlink($dest);
04678                                                                                 rename($reduced, $dest);
04679                                                                         }
04680                                                                 }
04681                                                                 $GLOBALS['TSFE']->tmpl->fileCache[$hash]= $gifCreator->getImageDimensions($dest);
04682                                                         } else {                // Normal situation:
04683                                                                 $GLOBALS['TSFE']->tmpl->fileCache[$hash]= $gifCreator->imageMagickConvert($theImage,$fileArray['ext'],$fileArray['width'],$fileArray['height'],$fileArray['params'],$fileArray['frame'],$options);
04684                                                                 if (($fileArray['reduceColors'] || ($imgExt=='png' && !$gifCreateor->png_truecolor)) && is_file($GLOBALS['TSFE']->tmpl->fileCache[$hash][3]))   {
04685                                                                         $reduced = $gifCreator->IMreduceColors($GLOBALS['TSFE']->tmpl->fileCache[$hash][3], t3lib_div::intInRange($fileArray['reduceColors'], 256, $gifCreator->truecolorColors, 256));
04686                                                                         if (is_file($reduced))  {
04687                                                                                 unlink($GLOBALS['TSFE']->tmpl->fileCache[$hash][3]);
04688                                                                                 rename($reduced, $GLOBALS['TSFE']->tmpl->fileCache[$hash][3]);
04689                                                                         }
04690                                                                 }
04691                                                         }
04692                                                         $GLOBALS['TSFE']->tmpl->fileCache[$hash]['origFile'] = $theImage;
04693                                                         $GLOBALS['TSFE']->tmpl->fileCache[$hash]['origFile_mtime'] = @filemtime($theImage);     // This is needed by tslib_gifbuilder, ln 100ff in order for the setup-array to create a unique filename hash.
04694                                                 }
04695                                                 return $GLOBALS['TSFE']->tmpl->fileCache[$hash];
04696                                         }
04697 
04698                                 break;
04699                         }
04700                 }
04701                 $theImage = $GLOBALS['TSFE']->tmpl->getFileName($file);
04702                 if ($theImage)  {
04703                         $gifCreator = t3lib_div::makeInstance('tslib_gifbuilder');
04704                         $gifCreator->init();
04705                         $info= $gifCreator->imageMagickConvert($theImage,'WEB','','','','','');
04706                         $info['origFile'] = $theImage;
04707                         $info['origFile_mtime'] = @filemtime($theImage);        // This is needed by tslib_gifbuilder, ln 100ff in order for the setup-array to create a unique filename hash.
04708                         return $info;
04709                 }
04710         }
04711 
04712 
04713 
04714 
04715 
04716 
04717 
04718 
04719 
04720 
04721 
04722 
04723 
04724 
04725 
04726 
04727 
04728 
04729 
04730 
04731 
04732 
04733         /***********************************************
04734          *
04735          * Data retrieval etc.
04736          *
04737          ***********************************************/
04738 
04739 
04746         function getFieldVal($field)    {
04747                 if (!strstr($field,'//'))       {
04748                         return $this->data[trim($field)];
04749                 } else {
04750                         $sections = t3lib_div::trimExplode('//',$field,1);
04751                         while (list(,$k)=each($sections)) {
04752                                 if (strcmp($this->data[$k],'')) return $this->data[$k];
04753                         }
04754                 }
04755         }
04756 
04766         function getData($string,$fieldArray)   {
04767                 if (!is_array($fieldArray))     {
04768                         $fieldArray=$GLOBALS['TSFE']->page;
04769                 }
04770                 $retVal = '';
04771                 $sections = explode('//',$string);
04772 
04773                 while (!$retVal AND list($secKey, $secVal)=each($sections)) {
04774                         $parts = explode(':',$secVal,2);
04775                         $key = trim($parts[1]);
04776                         if ((string)$key!='')   {
04777                                 switch(strtolower(trim($parts[0])))     {
04778                                         case 'gpvar':
04779                                                 list($firstKey, $rest) = explode('|', $key, 2);
04780                                                 if (strlen(trim($firstKey)))    {
04781                                                         $retVal = t3lib_div::_GP(trim($firstKey));
04782                                                                 // Look for deeper levels:
04783                                                         if (strlen(trim($rest)))        {
04784                                                                 $retVal = is_array($retVal) ? $this->getGlobal($rest, $retVal) : '';
04785                                                         }
04786                                                                 // Check that output is not an array:
04787                                                         if (is_array($retVal))  $retVal = '';
04788                                                 }
04789                                         break;
04790                                         case 'tsfe':
04791                                                 $retVal = $this->getGlobal ('TSFE|'.$key);
04792                                         break;
04793                                         case 'getenv':
04794                                                 $retVal = getenv($key);
04795                                         break;
04796                                         case 'getindpenv':
04797                                                 $retVal = t3lib_div::getIndpEnv($key);
04798                                         break;
04799                                         case 'field':
04800                                                 $retVal = $fieldArray[$key];
04801                                         break;
04802                                         case 'parameters':
04803                                                 $retVal = $this->parameters[$key];
04804                                         break;
04805                                         case 'register':
04806                                                 $retVal = $GLOBALS['TSFE']->register[$key];
04807                                         break;
04808                                         case 'global':
04809                                                 $retVal = $this->getGlobal($key);
04810                                         break;
04811                                         case 'leveltitle':
04812                                                 $nkey = $this->getKey($key,$GLOBALS['TSFE']->tmpl->rootLine);
04813                                                 $retVal = $this->rootLineValue($nkey,'title',stristr($key,'slide'));
04814                                         break;
04815                                         case 'levelmedia':
04816                                                 $nkey = $this->getKey($key,$GLOBALS['TSFE']->tmpl->rootLine);
04817                                                 $retVal = $this->rootLineValue($nkey,'media',stristr($key,'slide'));
04818                                         break;
04819                                         case 'leveluid':
04820                                                 $nkey = $this->getKey($key,$GLOBALS['TSFE']->tmpl->rootLine);
04821                                                 $retVal = $this->rootLineValue($nkey,'uid',stristr($key,'slide'));
04822                                         break;
04823                                         case 'levelfield':
04824                                                 $keyP = t3lib_div::trimExplode(',',$key);
04825                                                 $nkey = $this->getKey($keyP[0],$GLOBALS['TSFE']->tmpl->rootLine);
04826                                                 $retVal = $this->rootLineValue($nkey,$keyP[1],strtolower($keyP[2])=='slide');
04827                                         break;
04828                                         case 'fullrootline':
04829                                                 $keyP = t3lib_div::trimExplode(',',$key);
04830                                                 $fullKey = intval($keyP[0])-count($GLOBALS['TSFE']->tmpl->rootLine)+count($GLOBALS['TSFE']->rootLine);
04831                                                 if ($fullKey>=0)        {
04832                                                         $retVal = $this->rootLineValue($fullKey,$keyP[1],stristr($keyP[2],'slide'),$GLOBALS['TSFE']->rootLine);
04833                                                 }
04834                                         break;
04835                                         case 'date':
04836                                                 if (!$key) {$key = 'd/m Y';}
04837                                                 $retVal = date($key, time());
04838                                         break;
04839                                         case 'page':
04840                                                 $retVal = $GLOBALS['TSFE']->page[$key];
04841                                         break;
04842                                         case 'current':
04843                                                 $retVal = $this->data[$this->currentValKey];
04844                                         break;
04845                                         case 'level':
04846                                                 $retVal = count($GLOBALS['TSFE']->tmpl->rootLine)-1;
04847                                         break;
04848                                         case 'db':
04849                                                 $selectParts = t3lib_div::trimExplode(':',$key);
04850                                                 $db_rec = $GLOBALS['TSFE']->sys_page->getRawRecord($selectParts[0],$selectParts[1]);
04851                                                 if (is_array($db_rec) && $selectParts[2])       {$retVal = $db_rec[$selectParts[2]];}
04852                                         break;
04853                                         case 'lll':
04854                                                 $retVal = $GLOBALS['TSFE']->sL('LLL:'.$key);
04855                                         break;
04856                                         case 'path':
04857                                                 $retVal = $GLOBALS['TSFE']->tmpl->getFileName($key);
04858                                         break;
04859                                         case 'cobj':
04860                                                 switch((string)$key)    {
04861                                                         case 'parentRecordNumber':
04862                                                                 $retVal = $this->parentRecordNumber;
04863                                                         break;
04864                                                 }
04865                                         break;
04866                                         case 'debug':
04867                                                 switch((string)$key)    {
04868                                                         case 'rootLine':
04869                                                                 $retVal = t3lib_div::view_array($GLOBALS['TSFE']->tmpl->rootLine);
04870                                                         break;
04871                                                         case 'fullRootLine':
04872                                                                 $retVal = t3lib_div::view_array($GLOBALS['TSFE']->rootLine);
04873                                                         break;
04874                                                         case 'data':
04875                                                                 $retVal = t3lib_div::view_array($this->data);
04876                                                         break;
04877                                                 }
04878                                         break;
04879                                 }
04880                         }
04881                 }
04882                 return $retVal;
04883         }
04884 
04896         function rootLineValue($key,$field,$slideBack=0,$altRootLine='')        {
04897                 $rootLine = is_array($altRootLine) ? $altRootLine : $GLOBALS['TSFE']->tmpl->rootLine;
04898                 if (!$slideBack)        {
04899                         return $rootLine[$key][$field];
04900                 } else {
04901                         for ($a=$key;$a>=0;$a--)        {
04902                                 $val = $rootLine[$a][$field];
04903                                 if ($val)       {return $val;}
04904                         }
04905                 }
04906         }
04907 
04918         function getGlobal($var, $source=NULL)  {
04919                 $vars = explode('|', $var);
04920                 $c = count($vars);
04921                 $k = trim($vars[0]);
04922                 $theVar = isset($source) ? $source[$k] : $GLOBALS[$k];
04923 
04924                 for ($a=1;$a<$c;$a++)   {
04925                         if (!isset($theVar))    { break; }
04926 
04927                         $key = trim($vars[$a]);
04928                         if (is_object($theVar)) {
04929                                 $theVar = $theVar->$key;
04930                         } elseif (is_array($theVar))    {
04931                                 $theVar = $theVar[$key];
04932                         } else {
04933                                 return '';
04934                         }
04935                 }
04936 
04937                 if (!is_array($theVar) && !is_object($theVar))  {
04938                         return $theVar;
04939                 } else {
04940                         return '';
04941                 }
04942         }
04943 
04954         function getKey($key,$arr)      {
04955                 $key = intval($key);
04956                 if (is_array($arr))     {
04957                         if ($key < 0)   {
04958                                 $key = count($arr)+$key;
04959                         }
04960                         if ($key < 0)   {
04961                                 $key=0;
04962                         }
04963                 }
04964                 return $key;
04965         }
04966 
04967 
04977         function TCAlookup($inputValue,$conf)   {
04978                 global $TCA;
04979 
04980                 $table = $conf['table'];
04981                 $field = $conf['field'];
04982                 $delimiter = $conf['delimiter']?$conf['delimiter']:' ,';
04983 
04984                 $GLOBALS['TSFE']->includeTCA();
04985 
04986                 if (is_array($TCA[$table]) && is_array($TCA[$table]['columns'][$field]) && is_array($TCA[$table]['columns'][$field]['config']['items'])) {
04987                         $values = t3lib_div::trimExplode(',',$inputValue);
04988                         foreach ($values as $value)     {
04989                                         // Traverse the items-array...
04990                                 reset($TCA[$table]['columns'][$field]['config']['items']);
04991                                 while(list($key,$item)=each($TCA[$table]['columns'][$field]['config']['items']))        {
04992                                                 // ... and return the first found label where the value was equal to $key
04993                                         if (!strcmp($item[1],trim($value)))     $output[] = $GLOBALS['TSFE']->sL($item[0]);
04994                                 }
04995                         }
04996                         $returnValue = implode($delimiter,$output);
04997                 } else {
04998                         $returnValue = $inputValue;
04999                 }
05000                 return $returnValue;
05001         }
05002 
05003 
05004 
05005 
05006 
05007 
05008 
05009 
05010 
05011 
05012 
05013 
05014 
05015 
05016 
05017         /***********************************************
05018          *
05019          * Link functions (typolink)
05020          *
05021          ***********************************************/
05022 
05023 
05037         function typoLink($linktxt, $conf)      {
05038                 $finalTagParts = array();
05039                 $finalTagParts['aTagParams'] = $this->getATagParams($conf);
05040 
05041                 $link_param = trim($this->stdWrap($conf['parameter'],$conf['parameter.']));
05042 
05043                 $sectionMark = trim($this->stdWrap($conf['section'],$conf['section.']));
05044                 $sectionMark = $sectionMark ? (t3lib_div::testInt($sectionMark)?'#c':'#').$sectionMark : '';
05045                 $initP = '?id='.$GLOBALS['TSFE']->id.'&type='.$GLOBALS['TSFE']->type;
05046                 $this->lastTypoLinkUrl = '';
05047                 $this->lastTypoLinkTarget = '';
05048                 if ($link_param)        {
05049                         $link_paramA = t3lib_div::unQuoteFilenames($link_param,true);
05050                         $link_param = trim($link_paramA[0]);    // Link parameter value
05051                         $linkClass = trim($link_paramA[2]);             // Link class
05052                         if ($linkClass=='-')    $linkClass = '';        // The '-' character means 'no class'. Necessary in order to specify a title as fourth parameter without setting the target or class!
05053                         $forceTarget = trim($link_paramA[1]);   // Target value
05054                         $forceTitle = trim($link_paramA[3]);    // Title value
05055                         if ($forceTarget=='-')  $forceTarget = '';      // The '-' character means 'no target'. Necessary in order to specify a class as third parameter without setting the target!
05056                                 // Check, if the target is coded as a JS open window link:
05057                         $JSwindowParts = array();
05058                         $JSwindowParams = '';
05059                         $onClick = '';
05060                         if ($forceTarget && ereg('^([0-9]+)x([0-9]+)(:(.*)|.*)$',$forceTarget,$JSwindowParts))  {
05061                                         // Take all pre-configured and inserted parameters and compile parameter list, including width+height:
05062                                 $JSwindow_tempParamsArr = t3lib_div::trimExplode(',',strtolower($conf['JSwindow_params'].','.$JSwindowParts[4]),1);
05063                                 $JSwindow_paramsArr=array();
05064                                 foreach($JSwindow_tempParamsArr as $JSv)        {
05065                                         list($JSp,$JSv) = explode('=',$JSv);
05066                                         $JSwindow_paramsArr[$JSp]=$JSp.'='.$JSv;
05067                                 }
05068                                         // Add width/height:
05069                                 $JSwindow_paramsArr['width']='width='.$JSwindowParts[1];
05070                                 $JSwindow_paramsArr['height']='height='.$JSwindowParts[2];
05071                                         // Imploding into string:
05072                                 $JSwindowParams = implode(',',$JSwindow_paramsArr);
05073                                 $forceTarget = '';      // Resetting the target since we will use onClick.
05074                         }
05075 
05076                                 // Internal target:
05077                         $target = isset($conf['target']) ? $conf['target'] : $GLOBALS['TSFE']->intTarget;
05078                         if ($conf['target.'])   {$target=$this->stdWrap($target, $conf['target.']);}
05079 
05080                                 // Title tag
05081                         $title = $conf['title'];
05082                         if ($conf['title.'])    {$title=$this->stdWrap($title, $conf['title.']);}
05083 
05084                                 // Parse URL:
05085                         $pU = parse_url($link_param);
05086 
05087                                 // Detecting kind of link:
05088                         if(strstr($link_param,'@') && !$pU['scheme'])   {               // If it's a mail address:
05089                                 $link_param = eregi_replace('^mailto:','',$link_param);
05090                                 list($this->lastTypoLinkUrl,$linktxt) = $this->getMailTo($link_param,$linktxt,$initP);
05091                                 $finalTagParts['url']=$this->lastTypoLinkUrl;
05092                                 $finalTagParts['TYPE']='mailto';
05093                         } else {
05094                                 $isLocalFile=0;
05095                                 $fileChar=intval(strpos($link_param, '/'));
05096                                 $urlChar=intval(strpos($link_param, '.'));
05097 
05098                                         // Detects if a file is found in site-root (or is a 'virtual' simulateStaticDocument file!) and if so it will be treated like a normal file.
05099                                 list($rootFileDat) = explode('?',rawurldecode($link_param));
05100                                 $containsSlash = strstr($rootFileDat,'/');
05101                                 $rFD_fI = pathinfo($rootFileDat);
05102                                 if (trim($rootFileDat) && !$containsSlash && (@is_file(PATH_site.$rootFileDat) || t3lib_div::inList('php,html,htm',strtolower($rFD_fI['extension']))))  {
05103                                         $isLocalFile = 1;
05104                                 } elseif ($containsSlash)       {
05105                                         $isLocalFile = 2;               // Adding this so realurl directories are linked right (non-existing).
05106                                 }
05107 
05108                                 if($pU['scheme'] || ($isLocalFile!=1 && $urlChar && (!$containsSlash || $urlChar<$fileChar)))   {       // url (external): If doubleSlash or if a '.' comes before a '/'.
05109                                         $target = isset($conf['extTarget']) ? $conf['extTarget'] : $GLOBALS['TSFE']->extTarget;
05110                                         if ($conf['extTarget.'])        {$target = $this->stdWrap($target, $conf['extTarget.']);}
05111                                         if ($forceTarget)       {$target=$forceTarget;}
05112                                         if ($linktxt=='') $linktxt = $link_param;
05113                                         if (!$pU['scheme'])     {$scheme='http://';} else {$scheme='';}
05114                                         if ($GLOBALS['TSFE']->config['config']['jumpurl_enable'])       {
05115                                                 $this->lastTypoLinkUrl = $GLOBALS['TSFE']->absRefPrefix.$GLOBALS['TSFE']->config['mainScript'].$initP.'&jumpurl='.rawurlencode($scheme.$link_param).$GLOBALS['TSFE']->getMethodUrlIdToken;
05116                                         } else {
05117                                                 $this->lastTypoLinkUrl = $scheme.$link_param;
05118                                         }
05119                                         $this->lastTypoLinkTarget = $target;
05120                                         $finalTagParts['url']=$this->lastTypoLinkUrl;
05121                                         $finalTagParts['targetParams'] = $target ? ' target="'.$target.'"' : '';
05122                                         $finalTagParts['TYPE']='url';
05123                                 } elseif ($containsSlash || $isLocalFile)       {       // file (internal)
05124                                         $splitLinkParam = explode('?', $link_param);
05125                                         if (@file_exists(rawurldecode($splitLinkParam[0])) || $isLocalFile)     {
05126                                                 if ($linktxt=='') $linktxt = rawurldecode($link_param);
05127                                                 if ($GLOBALS['TSFE']->config['config']['jumpurl_enable'])       {
05128                                                         $this->lastTypoLinkUrl = $GLOBALS['TSFE']->absRefPrefix.$GLOBALS['TSFE']->config['mainScript'].$initP.'&jumpurl='.rawurlencode($link_param).$GLOBALS['TSFE']->getMethodUrlIdToken;
05129                                                 } else {
05130                                                         $this->lastTypoLinkUrl = $GLOBALS['TSFE']->absRefPrefix.$link_param;
05131                                                 }
05132                                                 if ($forceTarget)       {$target=$forceTarget;}
05133                                                 $this->lastTypoLinkTarget = $target;
05134 
05135                                                 $finalTagParts['url'] = $this->lastTypoLinkUrl;
05136                                                 $finalTagParts['targetParams'] = $target ? ' target="'.$target.'"' : '';
05137                                                 $finalTagParts['TYPE'] = 'file';
05138                                         } else {
05139                                                 $GLOBALS['TT']->setTSlogMessage("typolink(): File '".$splitLinkParam[0]."' did not exist, so '".$linktxt."' was not linked.",1);
05140                                                 return $linktxt;
05141                                         }
05142                                 } else {        // integer or alias (alias is without slashes or periods or commas, that is 'nospace,alphanum_x,lower,unique' according to definition in $TCA!)
05143                                         if ($conf['no_cache.']) $conf['no_cache']=$this->stdWrap($conf['no_cache'], $conf['no_cache.']);
05144                                         $link_params_parts=explode('#',$link_param);
05145                                         $link_param = trim($link_params_parts[0]);              // Link-data del
05146                                         if (!strcmp($link_param,''))    {$link_param=$GLOBALS['TSFE']->id;}     // If no id or alias is given
05147                                         if ($link_params_parts[1] && !$sectionMark)     {
05148                                                 $sectionMark = trim($link_params_parts[1]);
05149                                                 $sectionMark = (t3lib_div::testInt($sectionMark)?'#c':'#').$sectionMark;
05150                                         }
05151                                                 // Splitting the parameter by ',' and if the array counts more than 1 element it's a id/type/? pair
05152                                         unset($theTypeP);
05153                                         $pairParts = t3lib_div::trimExplode(',',$link_param);
05154                                         if (count($pairParts)>1)        {
05155                                                 $link_param = $pairParts[0];
05156                                                 $theTypeP = $pairParts[1];              // Overruling 'type'
05157                                         }
05158                                                 // Checking if the id-parameter is an alias.
05159                                         if (!t3lib_div::testInt($link_param))   {
05160                                                 $link_param = $GLOBALS['TSFE']->sys_page->getPageIdFromAlias($link_param);
05161                                         }
05162 
05163                                                 // Looking up the page record to verify its existence:
05164                                         $disableGroupAccessCheck = $GLOBALS['TSFE']->config['config']['typolinkLinkAccessRestrictedPages'] ? TRUE : FALSE;
05165                                         $page = $GLOBALS['TSFE']->sys_page->getPage($link_param,$disableGroupAccessCheck);
05166 
05167                                         if (count($page))       {
05168                                                         // MointPoints, look for closest MPvar:
05169                                                 $MPvarAcc = array();
05170                                                 if (!$GLOBALS['TSFE']->config['config']['MP_disableTypolinkClosestMPvalue'])    {
05171                                                         $temp_MP = $this->getClosestMPvalueForPage($page['uid'],TRUE);
05172                                                         if ($temp_MP)   $MPvarAcc['closest'] = $temp_MP;
05173                                                 }
05174                                                         // Look for overlay Mount Point:
05175                                                 $mount_info = $GLOBALS['TSFE']->sys_page->getMountPointInfo($page['uid'], $page);
05176                                                 if (is_array($mount_info) && $mount_info['overlay'])    {
05177                                                         $page = $GLOBALS['TSFE']->sys_page->getPage($mount_info['mount_pid'],$disableGroupAccessCheck);
05178                                                         if (!count($page))      {
05179                                                                 $GLOBALS['TT']->setTSlogMessage("typolink(): Mount point '".$mount_info['mount_pid']."' was not available, so '".$linktxt."' was not linked.",1);
05180                                                                 return $linktxt;
05181                                                         }
05182                                                         $MPvarAcc['re-map'] = $mount_info['MPvar'];
05183                                                 }
05184 
05185                                                         // Setting title if blank value to link:
05186                                                 if ($linktxt=='') $linktxt = $page['title'];
05187 
05188                                                         // Query Params:
05189                                                 $addQueryParams = $conf['addQueryString'] ? $this->getQueryArguments($conf['addQueryString.']) : '';
05190                                                 $addQueryParams .= trim($this->stdWrap($conf['additionalParams'],$conf['additionalParams.']));
05191                                                 if (substr($addQueryParams,0,1)!='&')           {
05192                                                         $addQueryParams = '';
05193                                                 } elseif ($conf['useCacheHash']) {      // cache hashing:
05194                                                         $pA = t3lib_div::cHashParams($addQueryParams.$GLOBALS['TSFE']->linkVars);       // Added '.$this->linkVars' dec 2003: The need for adding the linkVars is that they will be included in the link, but not the cHash. Thus the linkVars will always be the problem that prevents the cHash from working. I cannot see what negative implications in terms of incompatibilities this could bring, but for now I hope there are none. So here we go... (- kasper)
05195                                                         $addQueryParams.= '&cHash='.t3lib_div::shortMD5(serialize($pA));
05196                                                 }
05197 
05198                                                 $tCR_domain = '';
05199                                                 // Mount pages are always local and never link to another domain
05200                                                 if (count($MPvarAcc))   {
05201                                                         // Add "&MP" var:
05202                                                         $addQueryParams.= '&MP='.rawurlencode(implode(',',$MPvarAcc));
05203                                                 }
05204                                                 elseif ($GLOBALS['TSFE']->config['config']['typolinkCheckRootline'])    {
05205                                                         // This checks if the linked id is in the rootline of this site and if not it will find the domain for that ID and prefix it:
05206                                                         $tCR_rootline = $GLOBALS['TSFE']->sys_page->getRootLine($page['uid']);  // Gets rootline of linked-to page
05207                                                         $tCR_flag = 0;
05208                                                         foreach($tCR_rootline as $tCR_data)     {
05209                                                                 if ($tCR_data['uid']==$GLOBALS['TSFE']->tmpl->rootLine[0]['uid'])       {
05210                                                                         $tCR_flag = 1;  // OK, it was in rootline!
05211                                                                         break;
05212                                                                 }
05213                                                         }
05214                                                         if (!$tCR_flag) {
05215                                                                 foreach($tCR_rootline as $tCR_data)     {
05216                                                                         $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery('*', 'sys_domain', 'pid='.intval($tCR_data['uid']).' AND redirectTo=\'\''.$this->enableFields('sys_domain'), '', 'sorting');
05217                                                                         if ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) {
05218                                                                                 $tCR_domain = preg_replace('/\/$/','',$row['domainName']);
05219                                                                                 break;
05220                                                                         }
05221                                                                 }
05222                                                         }
05223                                                 }
05224                                                         // If other domain, overwrite
05225                                                 if (strlen($tCR_domain))        {
05226                                                         $target = isset($conf['extTarget']) ? $conf['extTarget'] : $GLOBALS['TSFE']->extTarget;
05227                                                         if ($conf['extTarget.'])        {$target = $this->stdWrap($target, $conf['extTarget.']);}
05228                                                         if ($forceTarget)       {$target=$forceTarget;}
05229                                                         $LD['target'] = $target;
05230                                                         $this->lastTypoLinkUrl = $this->URLqMark('http://'.$tCR_domain.'/index.php?id='.$page['uid'],$addQueryParams).$sectionMark;
05231                                                 } else {        // Internal link:
05232                                                         if ($forceTarget)       {$target=$forceTarget;}
05233                                                         $LD = $GLOBALS['TSFE']->tmpl->linkData($page,$target,$conf['no_cache'],'','',$addQueryParams,$theTypeP);
05234                                                         $this->lastTypoLinkUrl = $this->URLqMark($LD['totalURL'],'').$sectionMark;
05235                                                 }
05236 
05237                                                 $this->lastTypoLinkTarget = $LD['target'];
05238                                                 $targetPart = $LD['target'] ? ' target="'.$LD['target'].'"' : '';
05239 
05240                                                         // If sectionMark is set, there is no baseURL AND the current page is the page the link is to, check if there are any additional parameters and is not, drop the url.
05241                                                 if ($sectionMark && !trim($addQueryParams) && $page['uid']==$GLOBALS['TSFE']->id && !$GLOBALS['TSFE']->config['config']['baseURL'])     {
05242                                                         list(,$URLparams) = explode('?',$this->lastTypoLinkUrl);
05243                                                         list($URLparams) = explode('#',$URLparams);
05244                                                         parse_str ($URLparams.$LD['orig_type'], $URLparamsArray);
05245                                                         if (intval($URLparamsArray['type'])==$GLOBALS['TSFE']->type)    {       // type nums must match as well as page ids
05246                                                                 unset($URLparamsArray['id']);
05247                                                                 unset($URLparamsArray['type']);
05248                                                                 if (!count($URLparamsArray))    {       // If there are no parameters left.... set the new url.
05249                                                                         $this->lastTypoLinkUrl = $sectionMark;
05250                                                                 }
05251                                                         }
05252                                                 }
05253 
05254                                                         // If link is to a access restricted page which should be redirected, then find new URL:
05255                                                 if ($GLOBALS['TSFE']->config['config']['typolinkLinkAccessRestrictedPages'] &&
05256                                                                 $GLOBALS['TSFE']->config['config']['typolinkLinkAccessRestrictedPages']!=='NONE' &&
05257                                                                 !$GLOBALS['TSFE']->checkPageGroupAccess($page)) {
05258                                                                         $thePage = $GLOBALS['TSFE']->sys_page->getPage($GLOBALS['TSFE']->config['config']['typolinkLinkAccessRestrictedPages']);
05259 
05260                                                                         $addParams = $GLOBALS['TSFE']->config['config']['typolinkLinkAccessRestrictedPages_addParams'];
05261                                                                         $addParams = str_replace('###RETURN_URL###',rawurlencode($this->lastTypoLinkUrl),$addParams);
05262                                                                         $addParams = str_replace('###PAGE_ID###',$page['uid'],$addParams);
05263                                                                         $LD = $GLOBALS['TSFE']->tmpl->linkData($thePage,$target,'','','',$addParams,$theTypeP);
05264                                                                         $this->lastTypoLinkUrl = $this->URLqMark($LD['totalURL'],'');
05265                                                 }
05266 
05267                                                         // Rendering the tag.
05268                                                 $finalTagParts['url']=$this->lastTypoLinkUrl;
05269                                                 $finalTagParts['targetParams']=$targetPart;
05270                                                 $finalTagParts['TYPE']='page';
05271                                         } else {
05272                                                 $GLOBALS['TT']->setTSlogMessage("typolink(): Page id '".$link_param."' was not found, so '".$linktxt."' was not linked.",1);
05273                                                 return $linktxt;
05274                                         }
05275                                 }
05276                         }
05277 
05278                         if ($forceTitle)        {$title=$forceTitle;}
05279 
05280                         if ($JSwindowParams)    {
05281 
05282                                         // Create TARGET-attribute only if the right doctype is used
05283                                 if (!t3lib_div::inList('xhtml_strict,xhtml_11,xhtml_2', $GLOBALS['TSFE']->xhtmlDoctype))        {
05284                                         $target = ' target="FEopenLink"';
05285                                 } else {
05286                                         $target = '';
05287                                 }
05288 
05289                                 $onClick="vHWin=window.open('".$GLOBALS['TSFE']->baseUrlWrap($finalTagParts['url'])."','FEopenLink','".$JSwindowParams."');vHWin.focus();return false;";
05290                                 $res = '<a href="'.htmlspecialchars($finalTagParts['url']).'"'. $target .' onclick="'.htmlspecialchars($onClick).'"'.($title?' title="'.$title.'"':'').($linkClass?' class="'.$linkClass.'"':'').$finalTagParts['aTagParams'].'>';
05291                         } else {
05292                                 if ($GLOBALS['TSFE']->spamProtectEmailAddresses === 'ascii' && $finalTagParts['TYPE'] === 'mailto') {
05293                                         $res = '<a href="'.$finalTagParts['url'].'"'.($title?' title="'.$title.'"':'').$finalTagParts['targetParams'].($linkClass?' class="'.$linkClass.'"':'').$finalTagParts['aTagParams'].'>';
05294                                 } else {
05295                                         $res = '<a href="'.htmlspecialchars($finalTagParts['url']).'"'.($title?' title="'.$title.'"':'').$finalTagParts['targetParams'].($linkClass?' class="'.$linkClass.'"':'').$finalTagParts['aTagParams'].'>';
05296                                 }
05297                         }
05298 
05299                                 // Call user function:
05300                         if ($conf['userFunc'])  {
05301                                 $finalTagParts['TAG']=$res;
05302                                 $res = $this->callUserFunction($conf['userFunc'],$conf['userFunc.'],$finalTagParts);
05303                         }
05304 
05305                                 // If flag "returnLastTypoLinkUrl" set, then just return the latest URL made:
05306                         if ($conf['returnLast'])        {
05307                                 switch($conf['returnLast'])     {
05308                                         case 'url':
05309                                                 return $this->lastTypoLinkUrl;
05310                                         break;
05311                                         case 'target':
05312                                                 return $this->lastTypoLinkTarget;
05313                                         break;
05314                                 }
05315                         }
05316 
05317                         if ($conf['ATagBeforeWrap'])    {
05318                                 return $res.$this->wrap($linktxt, $conf['wrap']).'</a>';
05319                         } else {
05320                                 return $this->wrap($res.$linktxt.'</a>', $conf['wrap']);
05321                         }
05322                 } else {
05323                         return $linktxt;
05324                 }
05325         }
05326 
05335         function typoLink_URL($conf)    {
05336                 $this->typolink('|',$conf);
05337                 return $this->lastTypoLinkUrl;
05338         }
05339 
05353         function getTypoLink($label,$params,$urlParameters=array(),$target='')  {
05354                 $conf=array();
05355                 $conf['parameter'] = $params;
05356                 if ($target)    {
05357                         $conf['target']=$target;
05358                         $conf['extTarget']=$target;
05359                 }
05360                 if (is_array($urlParameters))   {
05361                         if (count($urlParameters))      {
05362                                 $conf['additionalParams'].= t3lib_div::implodeArrayForUrl('',$urlParameters);
05363                         }
05364                 } else {
05365                         $conf['additionalParams'].=$urlParameters;
05366                 }
05367                 $out = $this->typolink($label,$conf);
05368                 return $out;
05369         }
05370 
05380         function getTypoLink_URL($params,$urlParameters=array(),$target='')     {
05381                 $this->getTypoLink('',$params,$urlParameters,$target);
05382                 return $this->lastTypoLinkUrl;
05383         }
05384 
05392         function typolinkWrap($conf)    {
05393                 $k=md5(microtime());
05394                 return explode($k,$this->typolink($k,$conf));
05395         }
05396 
05405         function currentPageUrl($urlParameters=array(),$id=0)   {
05406                 return $this->getTypoLink_URL($id?$id:$GLOBALS['TSFE']->id,$urlParameters,$GLOBALS['TSFE']->sPre);
05407         }
05408 
05418         function getClosestMPvalueForPage($pageId, $raw=FALSE)  {
05419                         // MointPoints:
05420                 if ($GLOBALS['TYPO3_CONF_VARS']['FE']['enable_mount_pids'] && $GLOBALS['TSFE']->MP)     {
05421 
05422                         if (!strcmp($GLOBALS['TSFE']->id, $pageId))     {       // same page as current.
05423                                 $MP = $GLOBALS['TSFE']->MP;
05424                         } else { // ... otherwise find closest meeting point:
05425                                 $tCR_rootline = $GLOBALS['TSFE']->sys_page->getRootLine($pageId, '', TRUE);     // Gets rootline of linked-to page
05426                                 $inverseTmplRootline = array_reverse($GLOBALS['TSFE']->tmpl->rootLine);
05427 
05428                                 $rl_mpArray = array();
05429                                 $startMPaccu = FALSE;
05430 
05431                                         // Traverse root line of link uid and inside of that the REAL root line of current position.
05432                                 foreach($tCR_rootline as $tCR_data)     {
05433                                         foreach($inverseTmplRootline as $rlKey => $invTmplRLRec)        {
05434 
05435                                                         // Accumulate MP data:
05436                                                 if ($startMPaccu && $invTmplRLRec['_MP_PARAM']) {
05437                                                         $rl_mpArray[] = $invTmplRLRec['_MP_PARAM'];
05438                                                 }
05439 
05440                                                         // If two PIDs matches and this is NOT the site root, start accumulation of MP data (on the next level):
05441                                                         // (The check for site root is done so links to branches outsite the site but sharing the site roots PID is NOT detected as within the branch!)
05442                                                 if ($tCR_data['pid']==$invTmplRLRec['pid'] && count($inverseTmplRootline)!=$rlKey+1)    {
05443                                                         $startMPaccu = TRUE;
05444                                                 }
05445                                         }
05446                                         if ($startMPaccu)       break;  // Good enough...
05447                                 }
05448 
05449                                 if (count($rl_mpArray)) {
05450                                         $MP = implode(',', array_reverse($rl_mpArray));
05451                                 }
05452                         }
05453                 }
05454 
05455                 return !$raw  ? ($MP ? '&MP='.rawurlencode($MP) : '') : $MP;
05456         }
05457 
05468         function getMailTo($mailAddress,$linktxt,$initP='?') {
05469                 if(!strcmp($linktxt,''))        { $linktxt = $mailAddress; }
05470 
05471                 $mailToUrl = 'mailto:'.$mailAddress;
05472 
05473                 if (!$GLOBALS['TSFE']->config['config']['jumpurl_enable'] || $GLOBALS['TSFE']->config['config']['jumpurl_mailto_disable']) {
05474                         if ($GLOBALS['TSFE']->spamProtectEmailAddresses) {
05475                                 if ($GLOBALS['TSFE']->spamProtectEmailAddresses === 'ascii')    {
05476                                         $mailToUrl = $GLOBALS['TSFE']->encryptEmail($mailToUrl);
05477                                 } else {
05478                                         $mailToUrl = "javascript:linkTo_UnCryptMailto('".$GLOBALS['TSFE']->encryptEmail($mailToUrl)."');";
05479                                 }
05480                                 if ($GLOBALS['TSFE']->config['config']['spamProtectEmailAddresses_atSubst']) {
05481                                         $atLabel = trim($GLOBALS['TSFE']->config['config']['spamProtectEmailAddresses_atSubst']);
05482                                 }
05483                                 $linktxt = str_replace('@',$atLabel?$atLabel:'(at)',$linktxt);
05484 
05485                                 if ($GLOBALS['TSFE']->config['config']['spamProtectEmailAddresses_lastDotSubst']) {
05486                                         $lastDotLabel = trim($GLOBALS['TSFE']->config['config']['spamProtectEmailAddresses_lastDotSubst']);
05487                                         $lastDotLabel = $lastDotLabel ? $lastDotLabel : '(dot)';
05488                                         $linktxt = preg_replace('/\.([^\.]+)$/', $lastDotLabel.'$1', $linktxt);
05489                                 }
05490                         }
05491                 } else {
05492                         $mailToUrl = $GLOBALS['TSFE']->absRefPrefix.$GLOBALS['TSFE']->config['mainScript'].$initP.'&jumpurl='.rawurlencode($mailToUrl).$GLOBALS['TSFE']->getMethodUrlIdToken;
05493                 }
05494                 return array($mailToUrl,$linktxt);
05495         }
05496 
05506         function getQueryArguments($conf,$overruleQueryArgs=array(),$forceArgs=FALSE) {
05507                 $rawValues = FALSE;
05508                 switch((string)$conf['method']) {
05509                         case 'GET':
05510                                 $q_in = t3lib_div::_GET();
05511                         break;
05512                         case 'POST':
05513                                 $q_in = t3lib_div::_POST();
05514                         break;
05515                         default:
05516                                         // shortcut (no further processing necessary)
05517                                 if (!$conf['exclude'])  return '&'.t3lib_div::getIndpEnv('QUERY_STRING');
05518 
05519                                 $q_in = array();
05520                                 foreach (explode('&',t3lib_div::getIndpEnv('QUERY_STRING')) as $arg)    {
05521                                         list($k,$v) = explode('=',$arg);
05522                                         $q_in[$k] = $v;
05523                                 }
05524                                 $rawValues = TRUE;
05525                 }
05526 
05527                 if ($conf['exclude'])   {
05528                         $q_out = array();
05529                         $exclude = t3lib_div::trimExplode(',', $conf['exclude']);
05530                         $exclude[] = 'id';      // never repeat id
05531                         foreach ($q_in as $k => $v)   {
05532                                 if (!in_array($k, $exclude)) {
05533                                         if (isset($overruleQueryArgs[$k]))      {
05534                                                 $v = $overruleQueryArgs[$k];
05535                                                 unset($overruleQueryArgs[$k]);
05536                                         }
05537                                         $q_out[$k] = $v;
05538                                 }
05539                         }
05540                                 // any remaining overrule arguments?
05541                         if ($forceArgs) {
05542                                 foreach ($overruleQueryArgs as $k => $v)        {
05543                                         $q_out[$k] = $v;
05544                                 }
05545                         }
05546                 } else {
05547                         $q_out = &$q_in;
05548                 }
05549 
05550                 $content = '';
05551                 foreach ($q_out as $k => $v)    {
05552                         $content .= '&'.$k.'='.($rawValues ? $v : rawurlencode($v));
05553                 }
05554                 return $content;
05555         }
05556 
05557 
05558 
05559 
05560 
05561 
05562 
05563 
05564 
05565 
05566 
05567 
05568 
05569 
05570 
05571 
05572 
05573 
05574         /***********************************************
05575          *
05576          * Miscellaneous functions, stand alone
05577          *
05578          ***********************************************/
05579 
05591         function wrap($content,$wrap,$char='|') {
05592                 if ($wrap)      {
05593                         $wrapArr = explode($char, $wrap);
05594                         return trim($wrapArr[0]).$content.trim($wrapArr[1]);
05595                 } else return $content;
05596         }
05597 
05607         function noTrimWrap($content,$wrap)     {
05608                 if ($wrap)      {
05609                         $wrapArr = explode('|', $wrap);
05610                         return $wrapArr[1].$content.$wrapArr[2];
05611                 } else return $content;
05612         }
05613 
05621         function wrapSpace($content, $wrap)     {
05622                 $result = $content;
05623                 if (trim($wrap))        {
05624                         $wrapArray = explode('|',$wrap);
05625                         $wrapBefore = intval($wrapArray[0]);
05626                         $wrapAfter = intval($wrapArray[1]);
05627                         if ($wrapBefore)        {
05628                                 $result = '<img src="'.$GLOBALS['TSFE']->absRefPrefix.'clear.gif" width="1" height="'.$wrapBefore.'"'.$this->getBorderAttr(' border="0"').' class="spacer-gif" alt="" title="" /><br />'.$result;
05629                         }
05630                         if ($wrapAfter) {
05631                                 $result.='<img src="'.$GLOBALS['TSFE']->absRefPrefix.'clear.gif" width="1" height="'.$wrapAfter.'"'.$this->getBorderAttr(' border="0"').' class="spacer-gif" alt="" title="" /><br />';
05632                         }
05633                 }
05634                 return $result;
05635         }
05636 
05647         function callUserFunction($funcName,$conf,$content)     {
05648                 $pre = $GLOBALS['TSFE']->TYPO3_CONF_VARS['FE']['userFuncClassPrefix'];
05649                 if ($pre &&
05650                         !t3lib_div::isFirstPartOfStr(trim($funcName),$pre) &&
05651                         !t3lib_div::isFirstPartOfStr(trim($funcName),'tx_')
05652                         )       {
05653                         $GLOBALS['TT']->setTSlogMessage('Function "'.$funcName.'" was not prepended with "'.$pre.'"',3);
05654                         return $content;
05655                 }
05656                         // Split parts
05657                 $parts = explode('->',$funcName);
05658                 if (count($parts)==2)   {       // Class
05659                         $cls = t3lib_div::makeInstanceClassName($parts[0]);
05660                         if (class_exists ($cls))        {
05661                                 $classObj = new $cls;
05662                                 if (method_exists($classObj, $parts[1]))        {
05663                                         $classObj->cObj = &$this;
05664                                         $content = call_user_method($parts[1], $classObj, $content, $conf);
05665                                 } else {
05666                                         $GLOBALS['TT']->setTSlogMessage('Method "'.$parts[1].'" did not exist in class "'.$cls.'"',3);
05667                                 }
05668                         } else {
05669                                 $GLOBALS['TT']->setTSlogMessage('Class "'.$cls.'" did not exist',3);
05670                         }
05671                 } else {        // Function
05672                         if (function_exists($funcName)) {
05673                                 $content = call_user_func($funcName, $content, $conf);
05674                         } else {
05675                                 $GLOBALS['TT']->setTSlogMessage('Function "'.$funcName.'" did not exist',3);
05676                         }
05677                 }
05678                 return $content;
05679         }
05680 
05688         function processParams($params) {
05689                 $paramArr=array();
05690                 $lines=t3lib_div::trimExplode(chr(10),$params,1);
05691                 foreach($lines as $val) {
05692                         $pair = explode('=',$val,2);
05693                         if (!t3lib_div::inList('#,/',substr(trim($pair[0]),0,1)))       {
05694                                 $paramArr[trim($pair[0])] = trim($pair[1]);
05695                         }
05696                 }
05697                 return $paramArr;
05698         }
05699 
05706         function keywords($content)     {
05707                 $listArr = split(',|;|'.chr(10),$content);
05708                 reset($listArr);
05709                 while(list($k,$v)=each($listArr))       {
05710                         $listArr[$k]=trim($v);
05711                 }
05712                 return implode(',',$listArr);
05713         }
05714 
05723         function caseshift($theValue, $case)    {
05724                 $case = strtolower($case);
05725                 switch($case)   {
05726                         case 'upper':
05727                                 $theValue = $GLOBALS['TSFE']->csConvObj->conv_case($GLOBALS['TSFE']->renderCharset,$theValue,'toUpper');
05728                                 #$theValue = strtoupper($theValue);
05729                                 #$theValue = strtr($theValue, $this->caseConvStrings[0], $this->caseConvStrings[1]);
05730                         break;
05731                         case 'lower':
05732                                 $theValue = $GLOBALS['TSFE']->csConvObj->conv_case($GLOBALS['TSFE']->renderCharset,$theValue,'toLower');
05733                                 #$theValue = strtolower($theValue);
05734                                 #$theValue = strtr($theValue, $this->caseConvStrings[1], $this->caseConvStrings[0]);
05735                         break;
05736                 }
05737                 return $theValue;
05738         }
05739 
05748         function HTMLcaseshift($theValue, $case)        {
05749                 $inside = 0;
05750                 $newVal = '';
05751                 $pointer = 0;
05752                 $totalLen = strlen($theValue);
05753                 do      {
05754                         if (!$inside)   {
05755                                 $len = strcspn(substr($theValue,$pointer),'<');
05756                                 $newVal.= $this->caseshift(substr($theValue,$pointer,$len),$case);
05757                                 $inside = 1;
05758                         } else {
05759                                 $len = strcspn(substr($theValue,$pointer),'>')+1;
05760                                 $newVal.= substr($theValue,$pointer,$len);
05761                                 $inside = 0;
05762                         }
05763                         $pointer+=$len;
05764                 } while($pointer<$totalLen);
05765                 return $newVal;
05766         }
05767 
05777         function bytes($sizeInBytes,$labels)    {
05778                 return t3lib_div::formatSize($sizeInBytes,$labels);
05779         }
05780 
05788         function calcAge($seconds,$labels)      {
05789                 if (t3lib_div::testInt($labels)) {
05790                         $labels = ' min| hrs| days| yrs';
05791                 } else {
05792                         $labels=str_replace('"','',$labels);
05793                 }
05794 
05795                 $labelArr = explode('|',$labels);
05796                 $absSeconds = abs($seconds);
05797                 if ($absSeconds<3600)   {
05798                         $seconds = round ($seconds/60).$labelArr[0];
05799                 } elseif ($absSeconds<24*3600)  {
05800                         $seconds = round ($seconds/3600).$labelArr[1];
05801                 } elseif ($absSeconds<365*24*3600)      {
05802                         $seconds = round ($seconds/(24*3600)).$labelArr[2];
05803                 } else {
05804                         $seconds = round ($seconds/(365*24*3600)).$labelArr[3];
05805                 }
05806                 return $seconds;
05807         }
05808 
05820         function sendNotifyEmail($msg, $recipients, $cc, $email_from, $email_fromName='', $replyTo='')  {
05821                         // Sends order emails:
05822                 $headers=array();
05823                 if ($email_from)        {$headers[]='From: '.$email_fromName.' <'.$email_from.'>';}
05824                 if ($replyTo)           {$headers[]='Reply-To: '.$replyTo;}
05825 
05826                 $recipients=implode(',',t3lib_div::trimExplode(',',$recipients,1));
05827 
05828                 $emailContent = trim($msg);
05829                 if ($emailContent)      {
05830                         $parts = split(chr(10),$emailContent,2);                // First line is subject
05831                         $subject=trim($parts[0]);
05832                         $plain_message=trim($parts[1]);
05833 
05834                         if ($recipients)        $GLOBALS['TSFE']->plainMailEncoded($recipients, $subject, $plain_message, implode(chr(10),$headers));
05835                         if ($cc)        $GLOBALS['TSFE']->plainMailEncoded($cc, $subject, $plain_message, implode(chr(10),$headers));
05836                         return true;
05837                 }
05838         }
05839 
05847         function URLqMark($url,$params) {
05848                 if ($params && !strstr($url,'?'))       {
05849                         return $url.'?'.$params;
05850                 } else {
05851                         return $url.$params;
05852                 }
05853         }
05854 
05863         function checkEmail($email)     {
05864                 return t3lib_div::validEmail($email);
05865         }
05866 
05875         function clearTSProperties($TSArr,$propList)    {
05876                 $list = explode(',',$propList);
05877                 while(list(,$prop)=each($list)) {
05878                         $prop = trim($prop);
05879                         unset($TSArr[$prop]);
05880                         unset($TSArr[$prop.'.']);
05881                 }
05882                 return $TSArr;
05883         }
05884 
05894         function mergeTSRef($confArr,$prop)     {
05895                 if (substr($confArr[$prop],0,1)=='<')   {
05896                         $key = trim(substr($confArr[$prop],1));
05897                         $cF = t3lib_div::makeInstance('t3lib_TSparser');
05898                                 // $name and $conf is loaded with the referenced values.
05899                         $old_conf=$confArr[$prop.'.'];
05900                         list($name, $conf) = $cF->getVal($key,$GLOBALS['TSFE']->tmpl->setup);
05901                         if (is_array($old_conf) && count($old_conf))    {
05902                                 $conf = $this->joinTSarrays($conf,$old_conf);
05903                         }
05904                         $confArr[$prop.'.']=$conf;
05905                 }
05906                 return $confArr;
05907         }
05908 
05917         function joinTSarrays($conf,$old_conf)  {
05918                 if (is_array($old_conf))        {
05919                         reset($old_conf);
05920                         while(list($key,$val)=each($old_conf))  {
05921                                 if (is_array($val))     {
05922                                         $conf[$key] = $this->joinTSarrays($conf[$key],$val);
05923                                 } else {
05924                                         $conf[$key] = $val;
05925                                 }
05926                         }
05927                 }
05928                 return $conf;
05929         }
05930 
05940         function gifBuilderTextBox($gifbuilderConf, $conf, $text)       {
05941                 $chars = intval($conf['chars']) ? intval($conf['chars']) : 20;
05942                 $lineDist = intval($conf['lineDist']) ? intval($conf['lineDist']) : 20;
05943                 $Valign = strtolower(trim($conf['Valign']));
05944                 $tmplObjNumber = intval($conf['tmplObjNumber']);
05945                 $maxLines = intval($conf['maxLines']);
05946 
05947                 if ($tmplObjNumber && $gifbuilderConf[$tmplObjNumber]=='TEXT')  {
05948                         $textArr = $this->linebreaks($text,$chars,$maxLines);
05949                         $angle = intval($gifbuilderConf[$tmplObjNumber.'.']['angle']);
05950                         reset($textArr);
05951                         while(list($c,$textChunk)=each($textArr))       {
05952                                 $index = $tmplObjNumber+1+($c*2);
05953                                         // Workarea
05954                                 $gifbuilderConf = $this->clearTSProperties($gifbuilderConf,$index);
05955                                 $rad_angle = 2*pi()/360*$angle;
05956                                 $x_d = sin($rad_angle)*$lineDist;
05957                                 $y_d = cos($rad_angle)*$lineDist;
05958 
05959                                 $diff_x_d=0;
05960                                 $diff_y_d=0;
05961                                 if ($Valign=='center')  {
05962                                         $diff_x_d = $x_d*count($textArr);
05963                                         $diff_x_d = $diff_x_d/2;
05964                                         $diff_y_d = $y_d*count($textArr);
05965                                         $diff_y_d = $diff_y_d/2;
05966                                 }
05967 
05968 
05969                                 $x_d = round($x_d*$c - $diff_x_d);
05970                                 $y_d = round($y_d*$c - $diff_y_d);
05971 
05972                                 $gifbuilderConf[$index] = 'WORKAREA';
05973                                 $gifbuilderConf[$index.'.']['set'] = $x_d.','.$y_d;
05974                                         // Text
05975                                 $index++;
05976                                 $gifbuilderConf = $this->clearTSProperties($gifbuilderConf,$index);
05977                                 $gifbuilderConf[$index] = 'TEXT';
05978                                 $gifbuilderConf[$index.'.'] = $this->clearTSProperties($gifbuilderConf[$tmplObjNumber.'.'],'text');
05979                                 $gifbuilderConf[$index.'.']['text'] = $textChunk;
05980                         }
05981                         $gifbuilderConf = $this->clearTSProperties($gifbuilderConf,$tmplObjNumber);
05982                 }
05983                 return $gifbuilderConf;
05984         }
05985 
05996         function linebreaks($string,$chars,$maxLines=0) {
05997                 $lines = explode(chr(10),$string);
05998                 $lineArr=Array();
05999                 $c=0;
06000                 while(list(,$paragraph)=each($lines))   {
06001                         $words = explode(' ',$paragraph);
06002                         while(list(,$word)=each($words))        {
06003                                 if (strlen($lineArr[$c].$word)>$chars)  {
06004                                         $c++;
06005                                 }
06006                                 if (!$maxLines || $c<$maxLines) {
06007                                         $lineArr[$c].= $word.' ';
06008                                 }
06009                         }
06010                         $c++;
06011                 }
06012                 return $lineArr;
06013         }
06014 
06027         function getUpdateJS($dataArray, $formName, $arrPrefix, $fieldList)     {
06028                 $JSPart='';
06029                 $updateValues=t3lib_div::trimExplode(',',$fieldList);
06030                 while(list(,$fKey)=each($updateValues)) {
06031                         $value = $dataArray[$fKey];
06032                         if (is_array($value))   {
06033                                 reset($value);
06034                                 while(list(,$Nvalue)=each($value))      {
06035                                         $JSPart.="
06036         updateForm('".$formName."','".$arrPrefix."[".$fKey."][]',".t3lib_div::quoteJSvalue($Nvalue, true).")";
06037                                 }
06038 
06039                         } else {
06040                                 $JSPart.="
06041         updateForm('".$formName."','".$arrPrefix."[".$fKey."]',".t3lib_div::quoteJSvalue($value, true).")";
06042                         }
06043                 }
06044                 $JSPart='<script type="text/javascript">
06045         /*<![CDATA[*/ '.$JSPart.'
06046         /*]]>*/
06047 </script>
06048 ';
06049                 $GLOBALS['TSFE']->additionalHeaderData['JSincludeFormupdate']='<script type="text/javascript" src="'.$GLOBALS['TSFE']->absRefPrefix.'t3lib/jsfunc.updateform.js"></script>';
06050                 return $JSPart;
06051         }
06052 
06053 
06054 
06055 
06056 
06057 
06058 
06059 
06060 
06061 
06062 
06063 
06064 
06065 
06066 
06067 
06068 
06069 
06070 
06071 
06072 
06073 
06074 
06075 
06076 
06077 
06078 
06079 
06080         /***********************************************
06081          *
06082          * Database functions, making of queries
06083          *
06084          ***********************************************/
06085 
06096         function DBgetDelete($table, $uid, $doExec=FALSE)       {
06097                 if (intval($uid))       {
06098                         if ($GLOBALS['TCA'][$table]['ctrl']['delete'])  {
06099                                 if ($doExec)    {
06100                                         return $GLOBALS['TYPO3_DB']->exec_UPDATEquery($table, 'uid='.intval($uid), array($GLOBALS['TCA'][$table]['ctrl']['delete'] => 1));
06101                                 } else {
06102                                         return $GLOBALS['TYPO3_DB']->UPDATEquery($table, 'uid='.intval($uid), array($GLOBALS['TCA'][$table]['ctrl']['delete'] => 1));
06103                                 }
06104                         } else {
06105                                 if ($doExec)    {
06106                                         return $GLOBALS['TYPO3_DB']->exec_DELETEquery($table, 'uid='.intval($uid));
06107                                 } else {
06108                                         return $GLOBALS['TYPO3_DB']->DELETEquery($table, 'uid='.intval($uid));
06109                                 }
06110                         }
06111                 }
06112         }
06113 
06128         function DBgetUpdate($table, $uid, $dataArr, $fieldList, $doExec=FALSE) {
06129                 unset($dataArr['uid']); // uid can never be set
06130                 $uid=intval($uid);
06131 
06132                 if ($uid)       {
06133                         $fieldList = implode(',',t3lib_div::trimExplode(',',$fieldList,1));
06134                         $updateFields=array();
06135 
06136                         foreach($dataArr as $f => $v)   {
06137                                 if (t3lib_div::inList($fieldList,$f))   {
06138                                         $updateFields[$f] = $v;
06139                                 }
06140                         }
06141 
06142                         if ($GLOBALS['TCA'][$table]['ctrl']['tstamp'])  {
06143                                 $updateFields[$GLOBALS['TCA'][$table]['ctrl']['tstamp']] = time();
06144                         }
06145 
06146                         if (count($updateFields))       {
06147                                 if ($doExec)    {
06148                                         return $GLOBALS['TYPO3_DB']->exec_UPDATEquery($table, 'uid='.intval($uid), $updateFields);
06149                                 } else {
06150                                         return $GLOBALS['TYPO3_DB']->UPDATEquery($table, 'uid='.intval($uid), $updateFields);
06151                                 }
06152                         }
06153                 }
06154         }
06155 
06170         function DBgetInsert($table, $pid, $dataArr, $fieldList, $doExec=FALSE) {
06171                 $extraList='pid';
06172                 if ($GLOBALS['TCA'][$table]['ctrl']['tstamp'])  {$field=$GLOBALS['TCA'][$table]['ctrl']['tstamp']; $dataArr[$field]=time(); $extraList.=','.$field;}
06173                 if ($GLOBALS['TCA'][$table]['ctrl']['crdate'])  {$field=$GLOBALS['TCA'][$table]['ctrl']['crdate']; $dataArr[$field]=time(); $extraList.=','.$field;}
06174                 if ($GLOBALS['TCA'][$table]['ctrl']['cruser_id'])       {$field=$GLOBALS['TCA'][$table]['ctrl']['cruser_id']; $dataArr[$field]=0; $extraList.=','.$field;}
06175                 if ($GLOBALS['TCA'][$table]['ctrl']['fe_cruser_id'])    {$field=$GLOBALS['TCA'][$table]['ctrl']['fe_cruser_id']; $dataArr[$field]=intval($GLOBALS['TSFE']->fe_user->user['uid']); $extraList.=','.$field;}
06176                 if ($GLOBALS['TCA'][$table]['ctrl']['fe_crgroup_id'])   {$field=$GLOBALS['TCA'][$table]['ctrl']['fe_crgroup_id']; list($dataArr[$field])=explode(',',$GLOBALS['TSFE']->fe_user->user['usergroup']); $dataArr[$field]=intval($dataArr[$field]); $extraList.=','.$field;}
06177 
06178                 unset($dataArr['uid']); // uid can never be set
06179                 if ($pid>=0)    { $dataArr['pid'] = $pid; }             // Set pid < 0 and the dataarr-pid will be used!
06180                 $fieldList = implode(',',t3lib_div::trimExplode(',',$fieldList.','.$extraList,1));
06181 
06182                 $insertFields = array();
06183                 foreach($dataArr as $f => $v)   {
06184                         if (t3lib_div::inList($fieldList,$f))   {
06185                                 $insertFields[$f] = $v;
06186                         }
06187                 }
06188 
06189                 if ($doExec)    {
06190                         return $GLOBALS['TYPO3_DB']->exec_INSERTquery($table, $insertFields);
06191                 } else {
06192                         return $GLOBALS['TYPO3_DB']->INSERTquery($table, $insertFields);
06193                 }
06194         }
06195 
06207         function DBmayFEUserEdit($table,$row, $feUserRow, $allowedGroups='',$feEditSelf=0)      {
06208                 $groupList = $allowedGroups ? implode(',',array_intersect(t3lib_div::trimExplode(',',$feUserRow['usergroup'],1),t3lib_div::trimExplode(',',$allowedGroups,1))) : $feUserRow['usergroup'];
06209                 $ok=0;
06210                         // points to the field that allows further editing from frontend if not set. If set the record is locked.
06211                 if (!$GLOBALS['TCA'][$table]['ctrl']['fe_admin_lock'] || !$row[$GLOBALS['TCA'][$table]['ctrl']['fe_admin_lock']])       {
06212                                 // points to the field (integer) that holds the fe_users-id of the creator fe_user
06213                         if ($GLOBALS['TCA'][$table]['ctrl']['fe_cruser_id'])    {
06214                                 $rowFEUser = intval($row[$GLOBALS['TCA'][$table]['ctrl']['fe_cruser_id']]);
06215                                 if ($rowFEUser && $rowFEUser==$feUserRow['uid'])        {
06216                                         $ok=1;
06217                                 }
06218                         }
06219                                 // If $feEditSelf is set, fe_users may always edit them selves...
06220                         if ($feEditSelf && $table=='fe_users' && !strcmp($feUserRow['uid'],$row['uid']))        {
06221                                 $ok=1;
06222                         }
06223                                 // points to the field (integer) that holds the fe_group-id of the creator fe_user's first group
06224                         if ($GLOBALS['TCA'][$table]['ctrl']['fe_crgroup_id'])   {
06225                                 $rowFEUser = intval($row[$GLOBALS['TCA'][$table]['ctrl']['fe_crgroup_id']]);
06226                                 if ($rowFEUser) {
06227                                         if (t3lib_div::inList($groupList, $rowFEUser))  {
06228                                                 $ok=1;
06229                                         }
06230                                 }
06231                         }
06232                 }
06233                 return $ok;
06234         }
06235 
06247         function DBmayFEUserEditSelect($table,$feUserRow,$allowedGroups='',$feEditSelf=0)       {
06248                         // Returns where-definition that selects user-editable records.
06249                 $groupList = $allowedGroups ? implode(',',array_intersect(t3lib_div::trimExplode(',',$feUserRow['usergroup'],1),t3lib_div::trimExplode(',',$allowedGroups,1))) : $feUserRow['usergroup'];
06250                 $OR_arr=array();
06251                         // points to the field (integer) that holds the fe_users-id of the creator fe_user
06252                 if ($GLOBALS['TCA'][$table]['ctrl']['fe_cruser_id'])    {
06253                         $OR_arr[]=$GLOBALS['TCA'][$table]['ctrl']['fe_cruser_id'].'='.$feUserRow['uid'];
06254                 }
06255                         // points to the field (integer) that holds the fe_group-id of the creator fe_user's first group
06256                 if ($GLOBALS['TCA'][$table]['ctrl']['fe_crgroup_id'])   {
06257                         $values = t3lib_div::intExplode(',',$groupList);
06258                         while(list(,$theGroupUid)=each($values))        {
06259                                 if ($theGroupUid)       {$OR_arr[]=$GLOBALS['TCA'][$table]['ctrl']['fe_crgroup_id'].'='.$theGroupUid;}
06260                         }
06261                 }
06262                         // If $feEditSelf is set, fe_users may always edit them selves...
06263                 if ($feEditSelf && $table=='fe_users')  {
06264                         $OR_arr[]='uid='.intval($feUserRow['uid']);
06265                 }
06266 
06267                 $whereDef=' AND 1=0';
06268                 if (count($OR_arr))     {
06269                         $whereDef=' AND ('.implode(' OR ',$OR_arr).')';
06270                         if ($GLOBALS['TCA'][$table]['ctrl']['fe_admin_lock'])   {
06271                                 $whereDef.=' AND '.$GLOBALS['TCA'][$table]['ctrl']['fe_admin_lock'].'=0';
06272                         }
06273                 }
06274                 return $whereDef;
06275         }
06276 
06287         function enableFields($table,$show_hidden=0)    {
06288                 return $GLOBALS['TSFE']->sys_page->enableFields($table,$show_hidden?$show_hidden:($table=='pages' ? $GLOBALS['TSFE']->showHiddenPage : $GLOBALS['TSFE']->showHiddenRecords));
06289         }
06290 
06311         function getTreeList($id,$depth,$begin=0,$dontCheckEnableFields=FALSE,$addSelectFields='',$moreWhereClauses='', $prevId_array=array(), $recursionLevel=0)       {
06312 
06313                         // Init vars:
06314                 $allFields = 'uid,hidden,starttime,endtime,fe_group,extendToSubpages,doktype,php_tree_stop,mount_pid,mount_pid_ol,t3ver_state'.$addSelectFields;
06315                 $depth = intval($depth);
06316                 $begin = intval($begin);
06317                 $id = intval($id);
06318                 $theList = '';
06319                 $addId = 0;
06320 
06321                 if ($id)        {
06322 
06323                                 // First level, check id (second level, this is done BEFORE the recursive call)
06324                         if (!$recursionLevel)   {
06325                                         // If Id less than zero it means we should add the real id to list:
06326                                 if ($id < 0)    {
06327                                         $addId = $id = abs($id);
06328                                 }
06329                                         // Check start page:
06330                                 if ($GLOBALS['TSFE']->sys_page->getRawRecord('pages',$id,'uid'))        {
06331 
06332                                                 // Find mount point if any:
06333                                         $mount_info = $GLOBALS['TSFE']->sys_page->getMountPointInfo($id);
06334                                         if (is_array($mount_info))      {
06335                                                 $id = $mount_info['mount_pid'];
06336                                                         // In Overlay mode, use the mounted page uid as added ID!:
06337                                                 if ($addId && $mount_info['overlay'])   {
06338                                                         $addId = $id;
06339                                                 }
06340                                         }
06341                                 } else return '';       // Return blank if the start page was NOT found at all!
06342                         }
06343 
06344                                 // Add this ID to the array of IDs
06345                         if ($begin<=0)  {
06346                                 $prevId_array[] = $id;
06347                         }
06348 
06349                                 // Select sublevel:
06350                         if ($depth>0)   {
06351                                 $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery($allFields, 'pages', 'pid='.intval($id).' AND deleted=0'.$moreWhereClauses, '' ,'sorting');
06352                                 while ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res))      {
06353                                         $GLOBALS['TSFE']->sys_page->versionOL('pages',$row);
06354 
06355                                         if ($row['doktype']==255 || $row['doktype']==6 || $row['t3ver_state']==1)       { unset($row); }        // Doing this after the overlay to make sure changes in the overlay are respected.
06356 
06357                                         if (is_array($row))     {
06358                                                         // Find mount point if any:
06359                                                 $next_id = $row['uid'];
06360                                                 $mount_info = $GLOBALS['TSFE']->sys_page->getMountPointInfo($next_id, $row);
06361                                                         // Overlay mode:
06362                                                 if (is_array($mount_info) && $mount_info['overlay'])    {
06363                                                         $next_id = $mount_info['mount_pid'];
06364                                                         $res2 = $GLOBALS['TYPO3_DB']->exec_SELECTquery($allFields, 'pages', 'uid='.intval($next_id).' AND deleted=0'.$moreWhereClauses, '' ,'sorting');
06365                                                         $row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res2);
06366                                                         $GLOBALS['TSFE']->sys_page->versionOL('pages',$row);
06367 
06368                                                         if ($row['doktype']==255 || $row['doktype']==6 || $row['t3ver_state']==1)       { unset($row); }        // Doing this after the overlay to make sure changes in the overlay are respected.
06369                                                 }
06370                                                         // Add record:
06371                                                 if (is_array($row) && ($dontCheckEnableFields || $GLOBALS['TSFE']->checkPagerecordForIncludeSection($row)))     {
06372                                                                 // Add ID to list:
06373                                                         if ($begin<=0)  {
06374                                                                 if ($dontCheckEnableFields || $GLOBALS['TSFE']->checkEnableFields($row))        {
06375                                                                         $theList.= $next_id.',';
06376                                                                 }
06377                                                         }
06378                                                                 // Next level:
06379                                                         if ($depth>1 && !$row['php_tree_stop']) {
06380                                                                         // Normal mode:
06381                                                                 if (is_array($mount_info) && !$mount_info['overlay'])   {
06382                                                                         $next_id = $mount_info['mount_pid'];
06383                                                                 }
06384                                                                         // Call recursively, if the id is not in prevID_array:
06385                                                                 if (!in_array($next_id,$prevId_array))  {
06386                                                                         $theList.= tslib_cObj::getTreeList($next_id, $depth-1, $begin-1, $dontCheckEnableFields, $addSelectFields, $moreWhereClauses, $prevId_array, $recursionLevel+1);
06387                                                                 }
06388                                                         }
06389                                                 }
06390                                         }
06391                                 }
06392                         }
06393                 }
06394                         // If first run, check if the ID should be returned:
06395                 if (!$recursionLevel)   {
06396                         if ($addId)     {
06397                                 if ($begin>0)   {
06398                                         $theList.= 0;
06399                                 } else {
06400                                         $theList.= $addId;
06401                                 }
06402                         }
06403                 }
06404                         // Return list:
06405                 return $theList;
06406         }
06407 
06417         function whereSelectFromList($field,$value)     {
06418                 return $GLOBALS['TYPO3_DB']->listQuery($field,$value,'');
06419         }
06420 
06435         function exec_mm_query($select,$local_table,$mm_table,$foreign_table,$whereClause='',$groupBy='',$orderBy='',$limit='') {
06436                 return $GLOBALS['TYPO3_DB']->exec_SELECTquery(
06437                                         $select,
06438                                         $local_table.','.$mm_table.($foreign_table?','.$foreign_table:''),
06439                                         $local_table.'.uid='.$mm_table.'.uid_local'.($foreign_table?' AND '.$foreign_table.'.uid='.$mm_table.'.uid_foreign':'').
06440                                                 $whereClause,   // whereClauseMightContainGroupOrderBy
06441                                         $groupBy,
06442                                         $orderBy,
06443                                         $limit
06444                                 );
06445         }
06446 
06462         function exec_mm_query_uidList($select,$local_table_uidlist,$mm_table,$foreign_table='',$whereClause='',$groupBy='',$orderBy='',$limit='')      {
06463                 return $GLOBALS['TYPO3_DB']->exec_SELECTquery(
06464                                         $select,
06465                                         $mm_table.($foreign_table?','.$foreign_table:''),
06466                                         $mm_table.'.uid_local IN ('.$local_table_uidlist.')'.($foreign_table?' AND '.$foreign_table.'.uid='.$mm_table.'.uid_foreign':'').
06467                                                 $whereClause,   // whereClauseMightContainGroupOrderBy
06468                                         $groupBy,
06469                                         $orderBy,
06470                                         $limit
06471                                 );
06472         }
06473 
06483         function searchWhere($sw,$searchFieldList,$searchTable='')      {
06484                 global $TYPO3_DB;
06485 
06486                 $prefixTableName = $searchTable ? $searchTable.'.' : '';
06487                 $where = '';
06488                 if ($sw)        {
06489                         $searchFields = explode(',',$searchFieldList);
06490                         $kw = split('[ ,]',$sw);
06491 
06492                         while(list(,$val)=each($kw))    {
06493                                 $val = trim($val);
06494                                 $where_p = array();
06495                                 if (strlen($val)>=2)    {
06496                                         $val = $TYPO3_DB->escapeStrForLike($TYPO3_DB->quoteStr($val,$searchTable),$searchTable);
06497                                         reset($searchFields);
06498                                         while(list(,$field)=each($searchFields))        {
06499                                                 $where_p[] = $prefixTableName.$field.' LIKE \'%'.$val.'%\'';
06500                                         }
06501                                 }
06502                                 if (count($where_p))    {
06503                                         $where.=' AND ('.implode(' OR ',$where_p).')';
06504                                 }
06505                         }
06506                 }
06507                 return $where;
06508         }
06509 
06519         function exec_getQuery($table, $conf)   {
06520                 $queryParts = $this->getQuery($table, $conf, TRUE);
06521 
06522                 return $GLOBALS['TYPO3_DB']->exec_SELECT_queryArray($queryParts);
06523         }
06524 
06537         function getQuery($table, $conf, $returnQueryArray=FALSE)       {
06538 
06539                         // Construct WHERE clause:
06540                 $conf['pidInList'] = trim($this->stdWrap($conf['pidInList'],$conf['pidInList.']));
06541                 if (!strcmp($conf['pidInList'],''))     {
06542                         $conf['pidInList'] = 'this';
06543                 }
06544                 $queryParts = $this->getWhere($table,$conf,TRUE);
06545 
06546                         // Fields:
06547                 $queryParts['SELECT'] = $conf['selectFields'] ? $conf['selectFields'] : '*';
06548 
06549                         // Setting LIMIT:
06550                 if ($conf['max'] || $conf['begin']) {
06551                         $error=0;
06552 
06553                                 // Finding the total number of records, if used:
06554                         if (strstr(strtolower($conf['begin'].$conf['max']),'total'))    {
06555                                 $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery('uid', $table, $queryParts['WHERE'], $queryParts['GROUPBY']);
06556                                 if ($error = $GLOBALS['TYPO3_DB']->sql_error()) {
06557                                         $GLOBALS['TT']->setTSlogMessage($error);
06558                                 } else {
06559                                         $total = $GLOBALS['TYPO3_DB']->sql_num_rows($res);
06560                                         $conf['max'] = eregi_replace('total', (string)$total, $conf['max']);
06561                                         $conf['begin'] = eregi_replace('total', (string)$total, $conf['begin']);
06562                                 }
06563                         }
06564                         if (!$error)    {
06565                                 $conf['begin'] = t3lib_div::intInRange(ceil($this->calc($conf['begin'])),0);
06566                                 $conf['max'] = t3lib_div::intInRange(ceil($this->calc($conf['max'])),0);
06567                                 if ($conf['begin'] && !$conf['max'])    {
06568                                         $conf['max'] = 100000;
06569                                 }
06570 
06571                                 if ($conf['begin'] && $conf['max'])     {
06572                                         $queryParts['LIMIT'] = $conf['begin'].','.$conf['max'];
06573                                 } elseif (!$conf['begin'] && $conf['max'])      {
06574                                         $queryParts['LIMIT'] = $conf['max'];
06575                                 }
06576                         }
06577                 }
06578 
06579                 if (!$error)    {
06580 
06581                                 // Setting up tablejoins:
06582                         $joinPart='';
06583                         if ($conf['join'])      {
06584                                 $joinPart = 'JOIN ' .trim($conf['join']);
06585                         } elseif ($conf['leftjoin'])    {
06586                                 $joinPart = 'LEFT OUTER JOIN ' .trim($conf['leftjoin']);
06587                         } elseif ($conf['rightjoin'])   {
06588                                 $joinPart = 'RIGHT OUTER JOIN ' .trim($conf['rightjoin']);
06589                         }
06590 
06591                                 // Compile and return query:
06592                         $queryParts['FROM'] = trim($table.' '.$joinPart);
06593                         $query = $GLOBALS['TYPO3_DB']->SELECTquery(
06594                                                 $queryParts['SELECT'],
06595                                                 $queryParts['FROM'],
06596                                                 $queryParts['WHERE'],
06597                                                 $queryParts['GROUPBY'],
06598                                                 $queryParts['ORDERBY'],
06599                                                 $queryParts['LIMIT']
06600                                         );
06601                         return $returnQueryArray ? $queryParts : $query;
06602                 }
06603         }
06604 
06616         function getWhere($table,$conf, $returnQueryArray=FALSE)        {
06617                 global $TCA;
06618 
06619                         // Init:
06620                 $query = '';
06621                 $pid_uid_flag=0;
06622                 $queryParts = array(
06623                         'SELECT' => '',
06624                         'FROM' => '',
06625                         'WHERE' => '',
06626                         'GROUPBY' => '',
06627                         'ORDERBY' => '',
06628                         'LIMIT' => ''
06629                 );
06630 
06631                 if (trim($conf['uidInList']))   {
06632                         $listArr = t3lib_div::intExplode(',',str_replace('this',$GLOBALS['TSFE']->contentPid,$conf['uidInList']));  // str_replace instead of ereg_replace 020800
06633                         if (count($listArr)==1) {
06634                                 $query.=' AND '.$table.'.uid='.intval($listArr[0]);
06635                         } else {
06636                                 $query.=' AND '.$table.'.uid IN ('.implode(',',$GLOBALS['TYPO3_DB']->cleanIntArray($listArr)).')';
06637                         }
06638                         $pid_uid_flag++;
06639                 }
06640                 if (trim($conf['pidInList']))   {
06641                         $listArr = t3lib_div::intExplode(',',str_replace('this',$GLOBALS['TSFE']->contentPid,$conf['pidInList']));      // str_replace instead of ereg_replace 020800
06642                                 // removes all pages which are not visible for the user!
06643                         $listArr = $this->checkPidArray($listArr);
06644                         if (count($listArr))    {
06645                                 $query.=' AND '.$table.'.pid IN ('.implode(',',$GLOBALS['TYPO3_DB']->cleanIntArray($listArr)).')';
06646                                 $pid_uid_flag++;
06647                         } else {
06648                                 $pid_uid_flag=0;                // If not uid and not pid then uid is set to 0 - which results in nothing!!
06649                         }
06650                 }
06651                 if (!$pid_uid_flag)     {               // If not uid and not pid then uid is set to 0 - which results in nothing!!
06652                         $query.=' AND '.$table.'.uid=0';
06653                 }
06654                 if ($where = trim($conf['where']))      {
06655                         $query.=' AND '.$where;
06656                 }
06657 
06658                 if ($conf['languageField'])     {
06659                         if ($GLOBALS['TSFE']->sys_language_contentOL && $TCA[$table] && $TCA[$table]['ctrl']['languageField'] && $TCA[$table]['ctrl']['transOrigPointerField']) {
06660                                         // Sys language content is set to zero/-1 - and it is expected that whatever routine processes the output will OVERLAY the records with localized versions!
06661                                 $sys_language_content = '0,-1';
06662                         } else {
06663                                 $sys_language_content = intval($GLOBALS['TSFE']->sys_language_content);
06664                         }
06665                         $query.=' AND '.$conf['languageField'].' IN ('.$sys_language_content.')';
06666                 }
06667 
06668                 $andWhere = trim($this->stdWrap($conf['andWhere'],$conf['andWhere.']));
06669                 if ($andWhere)  {
06670                         $query.=' AND '.$andWhere;
06671                 }
06672 
06673                         // enablefields
06674                 if ($table=='pages')    {
06675                         $query.=' '.$GLOBALS['TSFE']->sys_page->where_hid_del.
06676                                                 $GLOBALS['TSFE']->sys_page->where_groupAccess;
06677                 } else {
06678                         $query.=$this->enableFields($table);
06679                 }
06680 
06681                         // MAKE WHERE:
06682                 if ($query)     {
06683                         $queryParts['WHERE'] = trim(substr($query,4));  // Stripping of " AND"...
06684                         $query = 'WHERE '.$queryParts['WHERE'];
06685                 }
06686 
06687                         // GROUP BY
06688                 if (trim($conf['groupBy']))     {
06689                         $queryParts['GROUPBY'] = trim($conf['groupBy']);
06690                         $query.=' GROUP BY '.$queryParts['GROUPBY'];
06691                 }
06692 
06693                         // ORDER BY
06694                 if (trim($conf['orderBy']))     {
06695                         $queryParts['ORDERBY'] = trim($conf['orderBy']);
06696                         $query.=' ORDER BY '.$queryParts['ORDERBY'];
06697                 }
06698 
06699                         // Return result:
06700                 return $returnQueryArray ? $queryParts : $query;
06701         }
06702 
06711         function checkPidArray($listArr)        {
06712                 $outArr = Array();
06713                 if (is_array($listArr) && count($listArr))      {
06714                         $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery('uid', 'pages', 'uid IN ('.implode(',',$listArr).')'.$this->enableFields('pages').' AND doktype NOT IN ('.$this->checkPid_badDoktypeList.')');
06715                         if ($error = $GLOBALS['TYPO3_DB']->sql_error()) {
06716                                 $GLOBALS['TT']->setTSlogMessage($error.': '.$query,3);
06717                         } else {
06718                                 while($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res))       {
06719                                         $outArr[] = $row['uid'];
06720                                 }
06721                         }
06722                 }
06723                 return $outArr;
06724         }
06725 
06734         function checkPid($uid) {
06735                 $uid = intval($uid);
06736                 if (!isset($this->checkPid_cache[$uid]))        {
06737                         $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery('uid', 'pages', 'uid='.intval($uid).$this->enableFields('pages').' AND doktype NOT IN ('.$this->checkPid_badDoktypeList.')');
06738                         if ($GLOBALS['TYPO3_DB']->sql_num_rows($res))   {
06739                                 $this->checkPid_cache[$uid] = 1;
06740                         } else {
06741                                 $this->checkPid_cache[$uid] = 0;
06742                         }
06743                 }
06744                 return $this->checkPid_cache[$uid];
06745         }
06746 
06747 
06748 
06749 
06750 
06751 
06752 
06753 
06754 
06755 
06756 
06757 
06758 
06759 
06760 
06761 
06762 
06763 
06764 
06765 
06766 
06767 
06768 
06769 
06770 
06771 
06772         /***********************************************
06773          *
06774          * Frontend editing functions
06775          *
06776          ***********************************************/
06777 
06790         function editPanel($content, $conf, $currentRecord='', $dataArr=array())        {
06791                 global $TCA,$BE_USER;
06792 
06793                         // If no backend user, return immediately
06794                 if (!$GLOBALS['TSFE']->beUserLogin)     { return $content; }
06795 
06796                         // If a backend user is logged in, then go on...
06797                 if ($conf['newRecordFromTable'])        {
06798                         $currentRecord = $conf['newRecordFromTable'].':NEW';
06799                         $conf['allow']='new';
06800                 }
06801 
06802                 if (!$currentRecord)    $currentRecord=$this->currentRecord;
06803                 if (!count($dataArr))   $dataArr=$this->data;
06804                 list($table,$uid) = explode(':',$currentRecord);
06805                 $mayEdit=0;
06806                 $nPid=intval($conf['newRecordInPid']);  // Page ID for new records, 0 if not specified
06807 
06808                         // If no access right to record languages, return immediately
06809                 if ($table === 'pages') {
06810                         $lang = $GLOBALS['TSFE']->sys_language_uid;
06811                 } elseif ($table === 'tt_content')      {
06812                         $lang = $GLOBALS['TSFE']->sys_language_content;
06813                 } elseif ($TCA[$table]['ctrl']['languageField'])        {
06814                         $lang = $currentRecord[$TCA[$table]['ctrl']['languageField']];
06815                 } else {
06816                         $lang = -1;
06817                 }
06818                 if (!$BE_USER->checkLanguageAccess($GLOBALS['TSFE']->sys_language_uid)) { return $content; }
06819 
06820                 if (!$conf['onlyCurrentPid'] || $dataArr['pid']==$GLOBALS['TSFE']->id)  {
06821                                 // Permissions:
06822                         $types = t3lib_div::trimExplode(',',strtolower($conf['allow']),1);
06823                         $allow = array_flip($types);
06824 
06825                         $perms = $GLOBALS['BE_USER']->calcPerms($GLOBALS['TSFE']->page);
06826                         if ($table=='pages')    {
06827                                 if (count($GLOBALS['TSFE']->config['rootLine'])==1)     {unset($allow['move']); unset($allow['hide']); unset($allow['delete']);}        // rootpage!
06828                                 if (!($perms&2))        {unset($allow['edit']);unset($allow['move']);unset($allow['hide']);}
06829                                 if (!($perms&4))        unset($allow['delete']);
06830                                 if (!($perms&8))        unset($allow['new']);
06831                                 if (count($allow))      $mayEdit=1;             // Can only display editbox if there are options in the menu
06832                                 $newUid = $uid;
06833                         } else {
06834                                 $mayEdit = count($allow)&&($perms&16);
06835                                 if ($conf['newRecordFromTable'])        {
06836                                         $newUid=$GLOBALS['TSFE']->id;
06837                                         if ($nPid) $newUid=$nPid;
06838                                 } else {
06839                                         $newUid = -1*$uid;
06840                                 }
06841                         }
06842                 }
06843 
06844                 if ($GLOBALS['TSFE']->displayEditIcons && $table && $mayEdit)   {
06845                         $GLOBALS['TSFE']->set_no_cache();               // Special content is about to be shown, so the cache must be disabled.
06846                         $formName = 'TSFE_EDIT_FORM_'.substr($GLOBALS['TSFE']->uniqueHash(),0,4);
06847                         $formTag = '<form name="'.$formName.'" action="'.htmlspecialchars(t3lib_div::getIndpEnv('REQUEST_URI')).'" method="post" enctype="'.$GLOBALS['TYPO3_CONF_VARS']['SYS']['form_enctype'].'" onsubmit="return TBE_EDITOR_checkSubmit(1);" style="margin: 0 0 0 0;">';
06848                         $sortField = $TCA[$table]['ctrl']['sortby'];
06849                         $labelField = $TCA[$table]['ctrl']['label'];
06850                         $hideField = $TCA[$table]['ctrl']['enablecolumns']['disabled'];
06851                         $blackLine = $conf['line']?'<img src="clear.gif" width="1" height="'.intval($conf['line']).'" alt="" title="" /><br /><table border="0" cellpadding="0" cellspacing="0" width="100%" bgcolor="black" style="border: 0px;"><tr style="border: 0px;"><td style="border: 0px;"><img src="clear.gif" width="1" height="1" alt="" title="" /></td></tr></table><br />':'';
06852 
06853                         $theCmd='';
06854                         $TSFE_EDIT = t3lib_div::_POST('TSFE_EDIT');
06855                         if (is_array($TSFE_EDIT) && $TSFE_EDIT['record']==$currentRecord && !$TSFE_EDIT['update_close'])        {
06856                                 $theCmd =$TSFE_EDIT['cmd'];
06857                         }
06858 
06859                         switch($theCmd) {
06860                                 case 'edit':
06861                                 case 'new':
06862                                         $tceforms = t3lib_div::makeInstance('t3lib_TCEforms_FE');
06863                                         $tceforms->prependFormFieldNames = 'TSFE_EDIT[data]';
06864                                         $tceforms->prependFormFieldNames_file = 'TSFE_EDIT_file';
06865                                         $tceforms->doSaveFieldName = 'TSFE_EDIT[doSave]';
06866                                         $tceforms->formName = $formName;
06867                                         $tceforms->backPath = TYPO3_mainDir;
06868                                         $tceforms->setFancyDesign();
06869                                         $tceforms->defStyle = 'font-family:Verdana;font-size:10px;';
06870                                         $tceforms->edit_showFieldHelp = $GLOBALS['BE_USER']->uc['edit_showFieldHelp'];
06871                                         $tceforms->helpTextFontTag='<font face="verdana,sans-serif" color="#333333" size="1">';
06872 
06873                                         $trData = t3lib_div::makeInstance('t3lib_transferData');
06874                                         $trData->addRawData = TRUE;
06875                                         $trData->defVals = t3lib_div::_GP('defVals');           // Added without testing - should provide ability to submit default values in frontend editing, in-page.
06876                                         $trData->fetchRecord($table,    ($theCmd=='new'?$newUid:$dataArr['uid']), ($theCmd=='new'?'new':'') );
06877                                         reset($trData->regTableItems_data);
06878                                         $processedDataArr = current($trData->regTableItems_data);
06879                                         $processedDataArr['uid']=$theCmd=='new'?'NEW':$dataArr['uid'];
06880                                         $processedDataArr['pid']=$theCmd=='new'?$newUid:$dataArr['pid'];
06881 
06882                                         $panel='';
06883                                         $buttons = '<input type="image" border="0" name="TSFE_EDIT[update]" src="'.$tceforms->backPath.'gfx/savedok.gif" hspace="2" width="21" height="16" title="'.$GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.php:rm.saveDoc',1).'" />';
06884                                         $buttons.= '<input type="image" border="0" name="TSFE_EDIT[update_close]" src="'.$tceforms->backPath.'gfx/saveandclosedok.gif" hspace="2" width="21" height="16" title="'.$GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.php:rm.saveCloseDoc',1).'" />';
06885                                         $buttons.= '<input type="image" border="0" name="TSFE_EDIT[cancel]" onclick="'.
06886                                                 htmlspecialchars('window.location.href=\''.t3lib_div::getIndpEnv('REQUEST_URI').'\';return false;').
06887                                                 '" src="'.$tceforms->backPath.'gfx/closedok.gif" hspace="2" width="21" height="16" title="'.$GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.php:rm.closeDoc',1).'" />';
06888                                         $panel.=$tceforms->intoTemplate(array('ITEM'=>$buttons));               // Buttons top
06889                                         $panel.=$tceforms->getMainFields($table,$processedDataArr);
06890 
06891                                         $hiddenF="";
06892                                         if ($theCmd=='new')     {
06893                                                 $hiddenF.='<input type="hidden" name="TSFE_EDIT[data]['.$table.'][NEW][pid]" value="'.$newUid.'" />';
06894                                                 if ($table=='pages')    $hiddenF.='<input type="hidden" name="TSFE_EDIT[data]['.$table.'][NEW][hidden]" value="0" />';          // If a new page is created in front-end, then show it by default!
06895                                         } else {
06896                                                 $hiddenF.='<input type="hidden" name="TSFE_EDIT[record]" value="'.$currentRecord.'" />';
06897                                                 $hiddenF.='<input type="hidden" name="TSFE_EDIT[cmd]" value="edit" />';
06898                                         }
06899                                         $hiddenF.='<input type="hidden" name="TSFE_EDIT[doSave]" value="0" />';
06900                                         $panel.=$tceforms->intoTemplate(array('ITEM'=>$buttons.$hiddenF));      // Buttons AND hidden fields bottom.
06901 
06902                                         $panel=$formTag.$tceforms->wrapTotal($panel,$dataArr,$table).'</form>'.($theCmd!='new'?$blackLine:'');
06903                                         $finalOut = $tceforms->printNeededJSFunctions_top().($conf['edit.']['displayRecord']?$content:'').$panel.($theCmd=='new'?$blackLine:'').$tceforms->printNeededJSFunctions();
06904                                 break;
06905                                 default:
06906                                         $panel = '';
06907                                         if (isset($allow['toolbar']))           $panel.=$GLOBALS['BE_USER']->ext_makeToolBar().'<img src="clear.gif" width="2" height="1" alt="" title="" />';
06908                                         if (isset($allow['edit']))              $panel.=$this->editPanelLinkWrap('<img src="'.TYPO3_mainDir.'gfx/edit2.gif" width="11" height="12" hspace="2" border="0" title="'.$BE_USER->extGetLL('p_editRecord').'" align="top" alt="" title="" />',$formName,'edit',$dataArr['_LOCALIZED_UID'] ? $table.':'.$dataArr['_LOCALIZED_UID'] : $currentRecord);
06909                                         if (isset($allow['move']) && $sortField && $BE_USER->workspace===0)     {       // Hiding in workspaces because implementation is incomplete
06910                                                 $panel.=$this->editPanelLinkWrap('<img src="'.TYPO3_mainDir.'gfx/button_up.gif" width="11" height="10" vspace="1" hspace="2" border="0" title="'.$BE_USER->extGetLL('p_moveUp').'" align="top" alt="" title="" />',$formName,'up');
06911                                                 $panel.=$this->editPanelLinkWrap('<img src="'.TYPO3_mainDir.'gfx/button_down.gif" width="11" height="10" vspace="1" hspace="2" border="0" title="'.$BE_USER->extGetLL('p_moveDown').'" align="top" alt="" title="" />',$formName,'down');
06912                                         }
06913                                         if (isset($allow['hide']) && $hideField && $BE_USER->workspace===0 && !$dataArr['_LOCALIZED_UID'])      {       // Hiding in workspaces because implementation is incomplete, Hiding for localizations because it is unknown what should be the function in that case
06914                                                 if ($dataArr[$hideField])       {
06915                                                         $panel.=$this->editPanelLinkWrap('<img src="'.TYPO3_mainDir.'gfx/button_unhide.gif" width="11" height="10" vspace="1" hspace="2" border="0" title="'.$BE_USER->extGetLL('p_unhide').'" align="top" alt="" title="" />',$formName,'unhide');
06916                                                 } else {
06917                                                         $panel.=$this->editPanelLinkWrap('<img src="'.TYPO3_mainDir.'gfx/button_hide.gif" width="11" height="10" vspace="1" hspace="2" border="0" title="'.$BE_USER->extGetLL('p_hide').'" align="top" alt="" title="" />',$formName,'hide','',$BE_USER->extGetLL('p_hideConfirm'));
06918                                                 }
06919                                         }
06920                                         if (isset($allow['new']))       {
06921                                                 if ($table=='pages')    {
06922                                                         $panel.=$this->editPanelLinkWrap('<img src="'.TYPO3_mainDir.'gfx/new_page.gif" width="13" height="12" vspace="1" hspace="2" border="0" title="'.$BE_USER->extGetLL('p_newSubpage').'" align="top" alt="" title="" />',$formName,'new',$currentRecord,'',$nPid);
06923                                                 } else {
06924                                                         $panel.=$this->editPanelLinkWrap('<img src="'.TYPO3_mainDir.'gfx/new_record.gif" width="16" height="12" vspace="1" hspace="2" border="0" title="'.$BE_USER->extGetLL('p_newRecordAfter').'" align="top" alt="" title="" />',$formName,'new',$currentRecord,'',$nPid);
06925                                                 }
06926                                         }
06927                                         if (isset($allow['delete']) && $BE_USER->workspace===0 && !$dataArr['_LOCALIZED_UID'])          {       // Hiding in workspaces because implementation is incomplete, Hiding for localizations because it is unknown what should be the function in that case
06928                                                 $panel.=$this->editPanelLinkWrap('<img src="'.TYPO3_mainDir.'gfx/delete_record.gif" width="12" height="12" vspace="1" hspace="2" border="0" title="'.$BE_USER->extGetLL('p_delete').'" align="top" alt="" title="" />',$formName,'delete','',$BE_USER->extGetLL('p_deleteConfirm'));
06929                                         }
06930 
06931                                                 //      Final
06932                                         $labelTxt = $this->stdWrap($conf['label'],$conf['label.']);
06933                                         $panel='
06934 
06935                                                                 <!-- BE_USER Edit Panel: -->
06936                                                                 '.$formTag.'
06937                                                                         <input type="hidden" name="TSFE_EDIT[cmd]" value="" />
06938                                                                         <input type="hidden" name="TSFE_EDIT[record]" value="'.$currentRecord.'" />
06939                                                                         <table border="0" cellpadding="0" cellspacing="0" border="1" bordercolor="black" class="typo3-editPanel">
06940                                                                                 <tr>
06941                                                                                         <td nowrap="nowrap" bgcolor="#ABBBB4" class="typo3-editPanel-controls">'.$panel.'</td>'.($labelTxt?'
06942                                                                                         <td nowrap="nowrap" bgcolor="#F6F2E6" class="typo3-editPanel-label"><font face="verdana" size="1" color="black">&nbsp;'.sprintf($labelTxt,htmlspecialchars(t3lib_div::fixed_lgd($dataArr[$labelField],50))).'&nbsp;</font></td>':'').'
06943                                                                                 </tr>
06944                                                                         </table>
06945                                                                 </form>';
06946                                                 // wrap the panel
06947                                         if ($conf['innerWrap']) $panel = $this->wrap($panel,$conf['innerWrap']);
06948                                         if ($conf['innerWrap.']) $panel = $this->stdWrap($panel,$conf['innerWrap.']);
06949                                                 // add black line:
06950                                         $panel.=$blackLine;
06951                                                 // wrap the complete panel
06952                                         if ($conf['outerWrap']) $panel = $this->wrap($panel,$conf['outerWrap']);
06953                                         if ($conf['outerWrap.']) $panel = $this->stdWrap($panel,$conf['outerWrap.']);
06954                                         $finalOut = $content.$panel;
06955                                 break;
06956                         }
06957 
06958                         if ($conf['previewBorder']) $finalOut = $this->editPanelPreviewBorder($table,$dataArr,$finalOut,$conf['previewBorder'],$conf['previewBorder.']);
06959                         return $finalOut;
06960                 } else {
06961                         return $content;
06962                 }
06963         }
06964 
06977         function editIcons($content,$params, $conf=array(), $currentRecord='', $dataArr=array(),$addUrlParamStr='')     {
06978                 global $BE_USER;
06979 
06980                         // If no backend user, return immediately
06981                 if (!$GLOBALS['TSFE']->beUserLogin)             {return $content;}
06982 
06983                         // Check incoming params:
06984                 $rParts = explode(':',$currentRecord?$currentRecord:$this->currentRecord);
06985 
06986                 list($table,$fieldList)=t3lib_div::trimExplode(':',$params,1);
06987                 if (!$fieldList)        {
06988                         $fieldList=$table;
06989                         $table=$rParts[0];
06990                 } else {
06991                         if ($table!=$rParts[0]) return $content;        // If the table is set as the first parameter, and does not match the table of the current record, then just return.
06992                 }
06993 
06994                         // Check if allowed to edit content:
06995                 $mayEdit=0;
06996                 $dataArr=count($dataArr)?$dataArr:$this->data;  // If pages-record, should contain correct perms-field, if not, should contain correct pid value.
06997 
06998                 $editUid = $dataArr['_LOCALIZED_UID'] ? $dataArr['_LOCALIZED_UID'] : $rParts[1];
06999 
07000                 if ($table=='pages')    {
07001                         $mayEdit = $BE_USER->isAdmin()||$BE_USER->doesUserHaveAccess($dataArr,2)?1:0;
07002                 } else {
07003                         $mayEdit = $BE_USER->isAdmin()||$BE_USER->doesUserHaveAccess(t3lib_BEfunc::getRecord('pages',$dataArr['pid']),16)?1:0;
07004                 }
07005 
07006                         // Check if allowed to edit language
07007                 if ($mayEdit)   {
07008                         if ($table === 'pages') {
07009                                 $lang = $GLOBALS['TSFE']->sys_language_uid;
07010                         } elseif ($table === 'tt_content')      {
07011                                 $lang = $GLOBALS['TSFE']->sys_language_content;
07012                         } elseif ($TCA[$table]['ctrl']['languageField'])        {
07013                                 $lang = $currentRecord[$TCA[$table]['ctrl']['languageField']];
07014                         } else {
07015                                 $lang = -1;
07016                         }
07017                         if (!$BE_USER->checkLanguageAccess($GLOBALS['TSFE']->sys_language_uid)) { $mayEdit = 0; }
07018                 }
07019 
07020                 if ($GLOBALS['TSFE']->displayFieldEditIcons && $table && $mayEdit && $fieldList)        {
07021                         $GLOBALS['TSFE']->set_no_cache();               // Special content is about to be shown, so the cache must be disabled.
07022                         $style = $conf['styleAttribute'] ? ' style="'.htmlspecialchars($conf['styleAttribute']).'"' : '';
07023                         $iconTitle = $this->stdWrap($conf['iconTitle'],$conf['iconTitle.']);
07024                         $iconImg = $conf['iconImg'] ? $conf['iconImg'] : '<img src="'.TYPO3_mainDir.'gfx/edit_fe.gif" width="11" height="12" border="0" align="top" title="'.t3lib_div::deHSCentities(htmlspecialchars($iconTitle)).'"'.$style.' class="frontEndEditIcons" alt="" title="" />';
07025                         $nV=t3lib_div::_GP('ADMCMD_view')?1:0;
07026                         $adminURL = t3lib_div::getIndpEnv('TYPO3_SITE_URL').TYPO3_mainDir;
07027                         $icon = $this->editPanelLinkWrap_doWrap($iconImg, $adminURL.'alt_doc.php?edit['.$rParts[0].']['.$editUid.']=edit&columnsOnly='.rawurlencode($fieldList).'&noView='.$nV.$addUrlParamStr,implode(':',$rParts));
07028                         if ($conf['beforeLastTag']<0)   {
07029                                 $content=$icon.$content;
07030                         } elseif ($conf['beforeLastTag']>0)     {
07031                                 $cBuf = rtrim($content);
07032                                 $securCount=30;
07033                                 while($securCount && substr($cBuf,-1)=='>' && substr($cBuf,-4)!='</a>') {
07034                                         $cBuf = rtrim(ereg_replace('<[^<]*>$','',$cBuf));
07035                                         $securCount--;
07036                                 }
07037                                 $content = strlen($cBuf)&&$securCount ? substr($content,0,strlen($cBuf)).$icon.substr($content,strlen($cBuf)) : $content=$icon.$content;
07038                         } else {
07039                                 $content.=$icon;
07040                         }
07041                 }
07042                 return $content;
07043         }
07044 
07059         function editPanelLinkWrap($string,$formName,$cmd,$currentRecord='',$confirm='',$nPid='')       {
07060                 $eFONPage = $GLOBALS['BE_USER']->uc['TSFE_adminConfig']['edit_editFormsOnPage'] &&  $BE_USER->workspace===0;    // Editing forms on page only supported in Live workspace (because of incomplete implementation)
07061                 $nV=t3lib_div::_GP('ADMCMD_view')?1:0;
07062                 $adminURL = t3lib_div::getIndpEnv('TYPO3_SITE_URL').TYPO3_mainDir;
07063 
07064                 if ($cmd=='edit' && !$eFONPage) {
07065                         $rParts = explode(':',$currentRecord);
07066                         $out=$this->editPanelLinkWrap_doWrap($string,$adminURL.'alt_doc.php?edit['.$rParts[0].']['.$rParts[1].']=edit&noView='.$nV,$currentRecord);
07067                 } elseif ($cmd=='new' && !$eFONPage)    {
07068                         $rParts = explode(':',$currentRecord);
07069                         if ($rParts[0]=='pages')        {
07070                                 $out=$this->editPanelLinkWrap_doWrap($string,$adminURL.'db_new.php?id='.$rParts[1].'&pagesOnly=1',$currentRecord);
07071                         } else {
07072                                 if (!intval($nPid))     {
07073                                         $nPid = t3lib_div::testInt($rParts[1]) ? -$rParts[1] : $GLOBALS['TSFE']->id;
07074                                 }
07075                                 $out=$this->editPanelLinkWrap_doWrap($string,$adminURL.'alt_doc.php?edit['.$rParts[0].']['.$nPid.']=new&noView='.$nV,$currentRecord);
07076                         }
07077                 } else {
07078                         if ($confirm && $GLOBALS['BE_USER']->jsConfirmation(8)) {
07079                                 $cf1="if (confirm(".t3lib_div::quoteJSvalue($confirm, true).")){";                      // Gets htmlspecialchared later
07080                                 $cf2='}';
07081                         } else {
07082                                 $cf1=$cf2='';
07083                         }
07084                         $out='<a href="#" onclick="'.
07085                                 htmlspecialchars($cf1.'document.'.$formName.'[\'TSFE_EDIT[cmd]\'].value=\''.$cmd.'\'; document.'.$formName.'.submit();'.$cf2.' return false;').
07086                                 '">'.$string.'</a>';
07087                 }
07088                 return $out;
07089         }
07090 
07101         function editPanelLinkWrap_doWrap($string,$url,$currentRecord)  {
07102                 if ($GLOBALS['BE_USER']->uc['TSFE_adminConfig']['edit_editNoPopup'] || $GLOBALS['BE_USER']->extAdminConfig['module.']['edit.']['forceNoPopup']) {
07103                         $retUrl = t3lib_div::getIndpEnv('REQUEST_URI');
07104                         $rParts = explode(':',$currentRecord);
07105                         if ($rParts[0]=='tt_content' && $this->parentRecordNumber>2)    {       // This parentRecordNumber is used to make sure that only elements 3- of ordinary content elements makes a 'anchor' jump down the page.
07106                                 $retUrl.='#'.$rParts[1];
07107                         }
07108                         return '<a href="'.htmlspecialchars($url.'&returnUrl='.rawurlencode($retUrl)).'">'.$string.'</a>';
07109                 } else {
07110                         return '<a href="#" onclick="'.
07111                                 htmlspecialchars('vHWin=window.open(\''.$url.'&returnUrl=close.html\',\'FEquickEditWindow\',\''.($GLOBALS['BE_USER']->uc['edit_wideDocument']?'width=690,height=500':'width=540,height=400').',status=0,menubar=0,scrollbars=1,resizable=1\');vHWin.focus();return false;').
07112                                 '">'.$string.'</a>';
07113                 }
07114         }
07115 
07129         function editPanelPreviewBorder($table,$row,$content,$thick,$conf=array())      {
07130                 if ($this->isDisabled($table,$row))     {
07131                         $thick = t3lib_div::intInRange($thick,1,100);
07132                         $color = $conf['color'] ? $conf['color'] : '#cccccc';
07133                         if ($conf['innerWrap']) $content = $this->wrap($content,$conf['innerWrap']);
07134                         if ($conf['innerWrap.'])        $content = $this->stdWrap($content,$conf['innerWrap.']);
07135                         $content='<table class="typo3-editPanel-previewBorder" border="'.$thick.'" cellpadding="0" cellspacing="0" bordercolor="'.$color.'" width="100%"><tr><td>'.$content.'</td></tr></table>';
07136                         if ($conf['outerWrap']) $content = $this->wrap($content,$conf['outerWrap']);
07137                         if ($conf['outerWrap.'])        $content = $this->stdWrap($panel,$conf['outerWrap.']);
07138                 }
07139                 return $content;
07140         }
07141 
07151         function isDisabled($table,$row)        {
07152                 global $TCA;
07153                 if (
07154                         ($TCA[$table]['ctrl']['enablecolumns']['disabled'] && $row[$TCA[$table]['ctrl']['enablecolumns']['disabled']]) ||
07155                         ($TCA[$table]['ctrl']['enablecolumns']['fe_group'] && $GLOBALS['TSFE']->simUserGroup && $row[$TCA[$table]['ctrl']['enablecolumns']['fe_group']]==$GLOBALS['TSFE']->simUserGroup) ||
07156                         ($TCA[$table]['ctrl']['enablecolumns']['starttime'] && $row[$TCA[$table]['ctrl']['enablecolumns']['starttime']]>time() ) ||
07157                         ($TCA[$table]['ctrl']['enablecolumns']['endtime'] && $row[$TCA[$table]['ctrl']['enablecolumns']['endtime']] && $row[$TCA[$table]['ctrl']['enablecolumns']['endtime']]<time())
07158                 )       return true;
07159         }
07160 }
07161 
07162 
07163 
07164 
07165 
07166 
07167 
07168 
07169 
07170 
07171 
07172 
07173 
07174 
07182 class tslib_frameset {
07183 
07192         function make($setup)   {
07193                 $content = '';
07194                 if (is_array($setup))   {
07195                         $sKeyArray=t3lib_TStemplate::sortedKeyList($setup);
07196                         reset($sKeyArray);
07197                         while(list(,$theKey)=each($sKeyArray))  {
07198                                 $theValue=$setup[$theKey];
07199                                 if (intval($theKey) && $conf=$setup[$theKey.'.'])       {
07200                                         switch($theValue)       {
07201                                                 case 'FRAME':
07202                                                         $typeNum = intval($GLOBALS['TSFE']->tmpl->setup[$conf['obj'].'.']['typeNum']);
07203                                                         if (!$conf['src'] && !$typeNum)         {
07204                                                                 $typeNum = -1;
07205                                                         }
07206                                                         $content.='<frame'.$this->frameParams($conf,$typeNum).' />'.chr(10);
07207                                                 break;
07208                                                 case 'FRAMESET':
07209                                                         $frameset = t3lib_div::makeInstance('tslib_frameset');
07210                                                         $content.=$frameset->make($conf).chr(10);
07211                                                 break;
07212                                         }
07213                                 }
07214                         }
07215                         return '<frameset'.$this->framesetParams($setup).'>'.chr(10).$content.'</frameset>';
07216                 }
07217         }
07218 
07229         function frameParams($setup, $typeNum)  {
07230                 $paramStr = '';
07231                 $name = $setup['obj'];
07232 
07233                 /*
07234                 if ($GLOBALS['TSFE']->config['config']['simulateStaticDocuments'])      {
07235                         $theCompURL='';
07236                         $theCompURL.=$GLOBALS['TSFE']->makeSimulFileName($GLOBALS['TSFE']->page['title'],
07237                                 ($GLOBALS['TSFE']->page['alias'] ? $GLOBALS['TSFE']->page['alias'] : $GLOBALS['TSFE']->page['uid']),
07238                                 intval($typeNum));
07239                         if ($GLOBALS['TSFE']->config['config']['simulateStaticDocuments']=='PATH_INFO') {
07240                                 $theCompURL = str_replace('.','/',$theCompURL);
07241                                 $theCompURL = 'index.php/'.$theCompURL.'/?';
07242                         } else {
07243                                 $theCompURL.='.html?';
07244                         }
07245                 } else {
07246                         $theCompURL = $GLOBALS['TSFE']->config['mainScript'].'?id='.$GLOBALS['TSFE']->page['uid'].'&type='.intval($typeNum);
07247                 }
07248                         // Add absRefPrefix if exists.
07249                 $finalURL = $GLOBALS['TSFE']->absRefPrefix.$theCompURL.($setup['options']?'&'.$setup['options']:'').$GLOBALS['TSFE']->linkVars.$GLOBALS['TSFE']->getMethodUrlIdToken.($GLOBALS['TSFE']->no_cache?'&no_cache=1':'');
07250                 $finalURL = $GLOBALS['TSFE']->tmpl->removeQueryString($finalURL);
07251                 */
07252 
07253                         // From 3.6.0, use "linkData" for ALL links:
07254                 $LD = $GLOBALS['TSFE']->tmpl->linkData($GLOBALS['TSFE']->page,'',$GLOBALS['TSFE']->no_cache,'','',($setup['options']?'&'.$setup['options']:'').$GLOBALS['TSFE']->cObj->getClosestMPvalueForPage($GLOBALS['TSFE']->page['uid']), intval($typeNum));
07255                 $finalURL = $LD['totalURL'];
07256 
07257 
07258                 if ($setup['src']) {$paramStr.=' src="'.htmlspecialchars($setup['src']).'"';} else {$paramStr.=' src="'.htmlspecialchars($finalURL).'"';}
07259                 if ($setup['name']) {$paramStr.=' name="'.$setup['name'].'"';} else {$paramStr.=' name="'.$name.'"';}
07260                 if ($setup['params']) {$paramStr.=' '.$setup['params'];}
07261                 return $paramStr;
07262         }
07263 
07272         function framesetParams($setup) {
07273                 $paramStr = '';
07274                 if ($setup['cols']) {           $paramStr.=' cols="'.$setup['cols'].'"';        }
07275                 if ($setup['rows']) {           $paramStr.=' rows="'.$setup['rows'].'"';        }
07276                 if ($setup['params']) { $paramStr.=' '.$setup['params'];        }
07277                 return $paramStr;
07278         }
07279 }
07280 
07281 
07282 
07283 
07284 
07285 
07286 
07287 
07288 
07289 
07290 
07291 
07292 
07293 
07294 
07295 
07296 
07305 class tslib_tableOffset {
07306         var $tableParams = 'border="0" cellspacing="0" cellpadding="0"';
07307         var $default_tableParams = 'border="0" cellspacing="0" cellpadding="0"';
07308         var $tdParams = ' width="99%" valign="top"';
07309 
07317         function start($content,$offset)        {
07318                 $valPairs = t3lib_div::intExplode(',',$offset.',,,,,');
07319 
07320                 if ($valPairs[0] || $valPairs[1] || $valPairs[2] || $valPairs[3] || $valPairs[4] || $valPairs[5])       {
07321                                 // If width is defined AND there has been no change to the default table params, then extend them to a tablewidth of 1
07322                         if ($valPairs[4] && $this->default_tableParams==$this->tableParams)     {$this->tableParams.=' width="1"';}
07323                                 // Init:
07324                         $this->begin = chr(10).'<table '.$this->tableParams.'>';
07325                         $this->end = '</table>';
07326                         $rows=array();
07327                         $widthImg = '';
07328                         $heightImg = '';
07329                                 // If width is required, set so bottom column will display for sure
07330                         if ($valPairs[4])       {
07331                                 if (!$valPairs[3])      $valPairs[3]=1;
07332                                 $widthImg='<img src="'.$GLOBALS['TSFE']->absRefPrefix.'clear.gif" width="'.$valPairs[4].'" height="1" alt="" title="" />';
07333                         }
07334                                 // If height is required, set so right column will display for sure
07335                         if ($valPairs[5])       {
07336                                 if (!$valPairs[2])      $valPairs[2]=1;
07337                                 $valPairs[2]=1; $heightImg='<img src="'.$GLOBALS['TSFE']->absRefPrefix.'clear.gif" width="1" height="'.$valPairs[5].'" alt="" title="" />';
07338                         }
07339 
07340                                 // First row:
07341                         if ($valPairs[1])       {       // top
07342                                 $rows[1].= '<tr>';
07343                                 $rows[1].= '<td><img src="'.$GLOBALS['TSFE']->absRefPrefix.'clear.gif" width="'.($valPairs[0]?$valPairs[0]:1).'" height="'.$valPairs[1].'" alt="" title="" /></td>';
07344                                 if ($valPairs[0])       $rows[1].= '<td></td>';
07345                                 if ($valPairs[2])       $rows[1].= '<td></td>';
07346                                 $rows[1].= '</tr>';
07347                         }
07348                                 // Middle row:
07349                         $rows[2].= '<tr>';
07350                         if ($valPairs[0])       {$rows[2].= $valPairs[1] ? '<td></td>' : '<td><img src="'.$GLOBALS['TSFE']->absRefPrefix.'clear.gif" width="'.$valPairs[0].'" height="1" alt="" title="" /></td>';}
07351                         $rows[2].= '<td'.$this->tdParams.'>'.$content.'</td>';
07352                         if ($valPairs[2])       {$rows[2].= $valPairs[3] ? '<td>'.$heightImg.'</td>' : '<td><img src="'.$GLOBALS['TSFE']->absRefPrefix.'clear.gif" width="'.$valPairs[2].'" height="'.($valPairs[5]?$valPairs[5]:1).'" alt="" title="" /></td>';}
07353                         $rows[2].= '</tr>';
07354                                 // Bottom row:
07355                         if ($valPairs[3])       {       // bottom
07356                                 $rows[3].= '<tr>';
07357                                 if ($valPairs[0])       $rows[3].= '<td></td>';
07358                                 if ($valPairs[2])       $rows[3].= '<td>'.$widthImg.'</td>';
07359                                 $rows[3].= '<td><img src="'.$GLOBALS['TSFE']->absRefPrefix.'clear.gif" width="'.($valPairs[2]?$valPairs[2]:($valPairs[4]?$valPairs[4]:1)).'" height="'.$valPairs[3].'" alt="" title="" /></td>';
07360                                 $rows[3].= '</tr>';
07361                         }
07362                         return $this->begin.implode('',$rows).$this->end;
07363                 } else return $content;
07364         }
07365 }
07366 
07367 
07368 
07369 
07370 
07371 
07372 
07373 
07374 
07375 
07376 
07377 
07378 
07379 
07380 
07381 
07382 
07383 
07384 
07385 
07386 
07395 class tslib_controlTable        {
07396         var $offX = 0;          // offset, x
07397         var $offY = 0;          // offset, y
07398 
07399         var $tm = '';           // top menu
07400         var $lm = '';           // left menu
07401         var $rm = '';           // right menu
07402         var $bm = '';           // bottom menu
07403         var $content = '';      // content
07404 
07405         var $tmTDparams = 'valign="top"';               // top menu TDparams
07406         var $lmTDparams = 'valign="top"';               // left menu TDparams
07407         var $rmTDparams = 'valign="top"';               // right menu TDparams
07408         var $bmTDparams = 'valign="top"';               // bottom menu TDparams
07409         var $contentTDparams = 'valign="top"';  // content TDparams
07410 
07411         var $cMl = 1;           // content margin, left
07412         var $cMr = 1;           // content margin, right
07413         var $cMt = 0;           // content margin, top
07414         var $cMb = 1;           // content margin, bottom
07415 
07416         var $contentW = 0;      // Places a little gif-spacer in the bottom of the content frame
07417 
07418         var $tableParams = 'border="0" cellspacing="0" cellpadding="0"';
07419 
07430         function start($offset,$cMargins)       {
07431                 $offArr = t3lib_div::intExplode(',',$offset);
07432                 $cMargArr = t3lib_div::intExplode(',',$cMargins);
07433 
07434                 $cols = 0;
07435                 $rows = 0;
07436 
07437                 if ($this->lm) $cols++;
07438                 if ($this->rm) $cols++;
07439                 if ($cMargArr[0]) $cols++;
07440                 if ($cMargArr[2]) $cols++;
07441                 if ($cMargArr[1]||$cMargArr[3]||$this->tm||$this->bm||$this->content||$this->contentW) $cols++;
07442 
07443                 if ($cMargArr[1]) $rows++;
07444                 if ($cMargArr[3]) $rows++;
07445                 if ($this->tm) $rows++;
07446                 if ($this->bm) $rows++;
07447                 if ($this->content) $rows++;
07448                 if ($this->contentW) $rows++;
07449                 if (!$rows && $cols) $rows=1;           // If there are no rows in the middle but still som columns...
07450 
07451                 if ($rows&&$cols)       {
07452                         $res = chr(10).'<table '.$this->tableParams.'>';
07453                                 // top offset:
07454                         if ($offArr[1]) {
07455                                 $xoff = $offArr[0] ? 1 : 0;
07456                                 if ($cols+$xoff > 1)    {$colspan =' colspan="'.($cols+$xoff).'"';}
07457                                 $res.= '<tr><td'.$colspan.'><img src="'.$GLOBALS['TSFE']->absRefPrefix.'clear.gif" width="1" height="'.$offArr[1].'" alt="" title="" /></td></tr>';
07458                         }
07459                                 // The rows:
07460                         if ($rows>1)    {$rowspan =' rowspan="'.($rows).'"';}
07461                         $res.= '<tr>';
07462                         if ($offArr[0]) {       $res.='<td'.$rowspan.'><img src="'.$GLOBALS['TSFE']->absRefPrefix.'clear.gif" height="1" width="'.$offArr[0].'" alt="" title="" /></td>';       }
07463                         if ($this->lm)  {       $res.='<td'.$rowspan.' '.$this->lmTDparams.'>'.$this->lm.'</td>';               }
07464                         if ($cMargArr[0])       {       $res.='<td'.$rowspan.'><img src="'.$GLOBALS['TSFE']->absRefPrefix.'clear.gif" height="1" width="'.$cMargArr[0].'" alt="" title="" /></td>';             }
07465                                 // content...
07466 
07467                         $middle=Array();
07468                         if ($this->tm)  {       $middle[]='<td '.$this->tmTDparams.'>'.$this->tm.'</td>';}
07469                         if ($cMargArr[1])       {       $middle[]='<td><img src="'.$GLOBALS['TSFE']->absRefPrefix.'clear.gif" width="1" height="'.$cMargArr[1].'" alt="" title="" /></td>';}
07470                         if ($this->content)     {       $middle[]='<td '.$this->contentTDparams.'>'.$this->content.'</td>';}
07471                         if ($cMargArr[3])       {       $middle[]='<td><img src="'.$GLOBALS['TSFE']->absRefPrefix.'clear.gif" width="1" height="'.$cMargArr[3].'" alt="" title="" /></td>';}
07472                         if ($this->bm)  {       $middle[]='<td '.$this->bmTDparams.'>'.$this->bm.'</td>';}
07473                         if ($this->contentW)    {       $middle[]='<td><img src="'.$GLOBALS['TSFE']->absRefPrefix.'clear.gif" height="1" width="'.$this->contentW.'" alt="" title="" /></td>';}
07474                         if (isset($middle[0]))  {$res.=$middle[0];}
07475 
07476                                 // Left of content
07477                         if ($cMargArr[2])       {       $res.='<td'.$rowspan.'><img src="'.$GLOBALS['TSFE']->absRefPrefix.'clear.gif" height="1" width="'.$cMargArr[2].'" alt="" title="" /></td>';             }
07478                         if ($this->rm)  {       $res.='<td'.$rowspan.' '.$this->rmTDparams.'>'.$this->rm.'</td>';               }
07479                         $res.= '</tr>';
07480 
07481                                 // More than the two rows
07482                         $mCount = count($middle);
07483                         for($a=1;$a<$mCount;$a++)       {
07484                                 $res.='<tr>'.$middle[$a].'</tr>';
07485                         }
07486                         $res.='</table>';
07487                         return $res;
07488                 }
07489         }
07490 }
07491 
07492 
07493 
07494 
07495 
07496 if (defined('TYPO3_MODE') && $TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['tslib/class.tslib_content.php'])   {
07497         include_once($TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['tslib/class.tslib_content.php']);
07498 }
07499 ?>


Généré par L'expert TYPO3 avec  doxygen 1.4.6