Documentation TYPO3 par Ameos

class.t3lib_div.php

00001 <?php
00002 /***************************************************************
00003 *  Copyright notice
00004 *
00005 *  (c) 1999-2006 Kasper Skaarhoj (kasperYYYY@typo3.com)
00006 *  All rights reserved
00007 *
00008 *  This script is part of the TYPO3 project. The TYPO3 project is
00009 *  free software; you can redistribute it and/or modify
00010 *  it under the terms of the GNU General Public License as published by
00011 *  the Free Software Foundation; either version 2 of the License, or
00012 *  (at your option) any later version.
00013 *
00014 *  The GNU General Public License can be found at
00015 *  http://www.gnu.org/copyleft/gpl.html.
00016 *  A copy is found in the textfile GPL.txt and important notices to the license
00017 *  from the author is found in LICENSE.txt distributed with these scripts.
00018 *
00019 *
00020 *  This script is distributed in the hope that it will be useful,
00021 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
00022 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00023 *  GNU General Public License for more details.
00024 *
00025 *  This copyright notice MUST APPEAR in all copies of the script!
00026 ***************************************************************/
00232 class t3lib_div {
00233 
00234 
00235 
00236 
00237 
00238         /*************************
00239          *
00240          * GET/POST Variables
00241          *
00242          * Background:
00243          * Input GET/POST variables in PHP may have their quotes escaped with "\" or not depending on configuration.
00244          * TYPO3 has always converted quotes to BE escaped if the configuration told that they would not be so.
00245          * But the clean solution is that quotes are never escaped and that is what the functions below offers.
00246          * Eventually TYPO3 should provide this in the global space as well.
00247          * In the transitional phase (or forever..?) we need to encourage EVERY to read and write GET/POST vars through the API functions below.
00248          *
00249          *************************/
00250 
00262         function _GP($var)      {
00263                 if(empty($var)) return;
00264                 $value = isset($_POST[$var]) ? $_POST[$var] : $_GET[$var];
00265                 if (isset($value))      {
00266                         if (is_array($value))   { t3lib_div::stripSlashesOnArray($value); } else { $value = stripslashes($value); }
00267                 }
00268                 return $value;
00269         }
00270 
00280         function _GET($var=NULL)        {
00281                 $value = ($var === NULL) ? $_GET : (empty($var) ? NULL : $_GET[$var]);
00282                 if (isset($value))      {       // Removes slashes since TYPO3 has added them regardless of magic_quotes setting.
00283                         if (is_array($value))   { t3lib_div::stripSlashesOnArray($value); } else { $value = stripslashes($value); }
00284                 }
00285                 return $value;
00286         }
00287 
00297         function _POST($var=NULL)       {
00298                 $value = ($var === NULL) ? $_POST : (empty($var) ? NULL : $_POST[$var]);
00299                 if (isset($value))      {       // Removes slashes since TYPO3 has added them regardless of magic_quotes setting.
00300                         if (is_array($value))   { t3lib_div::stripSlashesOnArray($value); } else { $value = stripslashes($value); }
00301                 }
00302                 return $value;
00303         }
00304 
00313         function _GETset($inputGet,$key='')     {
00314                         // ADDS slashes since TYPO3 standard currently is that slashes MUST be applied (regardless of magic_quotes setting).
00315                 if (strcmp($key,''))    {
00316                         if (is_array($inputGet))        { t3lib_div::addSlashesOnArray($inputGet); } else { $inputGet = addslashes($inputGet); }
00317                         $GLOBALS['HTTP_GET_VARS'][$key] = $_GET[$key] = $inputGet;
00318                 } elseif (is_array($inputGet)){
00319                         t3lib_div::addSlashesOnArray($inputGet);
00320                         $GLOBALS['HTTP_GET_VARS'] = $_GET = $inputGet;
00321                 }
00322         }
00323 
00336         function GPvar($var,$strip=0)   {
00337                 if(empty($var)) return;
00338                 $value = isset($_POST[$var]) ? $_POST[$var] : $_GET[$var];
00339                 if (isset($value) && is_string($value)) { $value = stripslashes($value); }      // Originally check '&& get_magic_quotes_gpc() ' but the values of $_GET are always slashed regardless of get_magic_quotes_gpc() because HTTP_POST/GET_VARS are run through addSlashesOnArray in the very beginning of index_ts.php eg.
00340                 if ($strip && isset($value) && is_array($value)) { t3lib_div::stripSlashesOnArray($value); }
00341                 return $value;
00342         }
00343 
00353         function GParrayMerged($var)    {
00354                 $postA = is_array($_POST[$var]) ? $_POST[$var] : array();
00355                 $getA = is_array($_GET[$var]) ? $_GET[$var] : array();
00356                 $mergedA = t3lib_div::array_merge_recursive_overrule($getA,$postA);
00357                 t3lib_div::stripSlashesOnArray($mergedA);
00358                 return $mergedA;
00359         }
00360 
00361 
00362 
00363 
00364 
00365 
00366 
00367 
00368 
00369 
00370         /*************************
00371          *
00372          * IMAGE FUNCTIONS
00373          *
00374          *************************/
00375 
00376 
00397         function gif_compress($theFile, $type)  {
00398                 $gfxConf = $GLOBALS['TYPO3_CONF_VARS']['GFX'];
00399                 $returnCode='';
00400                 if ($gfxConf['gif_compress'] && strtolower(substr($theFile,-4,4))=='.gif')      {       // GIF...
00401                         if (($type=='IM' || !$type) && $gfxConf['im'] && $gfxConf['im_path_lzw'])       {       // IM
00402                                 $cmd = t3lib_div::imageMagickCommand('convert', '"'.$theFile.'" "'.$theFile.'"', $gfxConf['im_path_lzw']);
00403                                 exec($cmd);
00404 
00405                                 $returnCode='IM';
00406                         } elseif (($type=='GD' || !$type) && $gfxConf['gdlib'] && !$gfxConf['gdlib_png'])       {       // GD
00407                                 $tempImage = imageCreateFromGif($theFile);
00408                                 imageGif($tempImage, $theFile);
00409                                 imageDestroy($tempImage);
00410                                 $returnCode='GD';
00411                         }
00412                 }
00413                 return $returnCode;
00414         }
00415 
00425         function png_to_gif_by_imagemagick($theFile)    {
00426                 if ($GLOBALS['TYPO3_CONF_VARS']['FE']['png_to_gif']
00427                         && $GLOBALS['TYPO3_CONF_VARS']['GFX']['im']
00428                         && $GLOBALS['TYPO3_CONF_VARS']['GFX']['im_path_lzw']
00429                         && strtolower(substr($theFile,-4,4))=='.png'
00430                         && @is_file($theFile))  {       // IM
00431                                 $newFile = substr($theFile,0,-4).'.gif';
00432                                 $cmd = t3lib_div::imageMagickCommand('convert', '"'.$theFile.'" "'.$newFile.'"', $GLOBALS['TYPO3_CONF_VARS']['GFX']['im_path_lzw']);
00433                                 exec($cmd);
00434                                 $theFile = $newFile;
00435                                         // unlink old file?? May be bad idea bacause TYPO3 would then recreate the file every time as TYPO3 thinks the file is not generated because it's missing!! So do not unlink $theFile here!!
00436                 }
00437                 return $theFile;
00438         }
00439 
00450         function read_png_gif($theFile,$output_png=0)   {
00451                 if ($GLOBALS['TYPO3_CONF_VARS']['GFX']['im'] && @is_file($theFile))     {
00452                         $ext = strtolower(substr($theFile,-4,4));
00453                         if (
00454                                         ((string)$ext=='.png' && $output_png)   ||
00455                                         ((string)$ext=='.gif' && !$output_png)
00456                                 )       {
00457                                 return $theFile;
00458                         } else {
00459                                 $newFile = PATH_site.'typo3temp/readPG_'.md5($theFile.'|'.filemtime($theFile)).($output_png?'.png':'.gif');
00460                                 exec($GLOBALS['TYPO3_CONF_VARS']['GFX']['im_path'].'convert "'.$theFile.'" "'.$newFile.'"');
00461                                 if (@is_file($newFile)) return $newFile;
00462                         }
00463                 }
00464         }
00465 
00466 
00467 
00468 
00469 
00470 
00471 
00472 
00473 
00474 
00475 
00476 
00477 
00478 
00479 
00480         /*************************
00481          *
00482          * STRING FUNCTIONS
00483          *
00484          *************************/
00485 
00499         function fixed_lgd($string,$origChars,$preStr='...')    {
00500                 $chars = abs($origChars);
00501                 if ($chars >= 4)        {
00502                         if(strlen($string)>$chars)  {
00503                                 return $origChars < 0 ?
00504                                         $preStr.trim(substr($string, -($chars-3))) :
00505                                         trim(substr($string, 0, $chars-3)).$preStr;
00506                         }
00507                 }
00508                 return $string;
00509         }
00510 
00524         function fixed_lgd_pre($string,$chars)  {
00525                 return strrev(t3lib_div::fixed_lgd(strrev($string),$chars));
00526         }
00527 
00538         function fixed_lgd_cs($string,$chars)   {
00539                 if (is_object($GLOBALS['LANG']))        {
00540                         return $GLOBALS['LANG']->csConvObj->crop($GLOBALS['LANG']->charSet,$string,$chars,'...');
00541                 } else {
00542                         return t3lib_div::fixed_lgd($string, $chars);
00543                 }
00544         }
00545 
00555         function breakTextForEmail($str,$implChar="\n",$charWidth=76)   {
00556                 $lines = explode(chr(10),$str);
00557                 $outArr=array();
00558                 while(list(,$lStr)=each($lines))        {
00559                         $outArr = array_merge($outArr,t3lib_div::breakLinesForEmail($lStr,$implChar,$charWidth));
00560                 }
00561                 return implode(chr(10),$outArr);
00562         }
00563 
00574         function breakLinesForEmail($str,$implChar="\n",$charWidth=76)  {
00575                 $lines=array();
00576                 $l=$charWidth;
00577                 $p=0;
00578                 while(strlen($str)>$p)  {
00579                         $substr=substr($str,$p,$l);
00580                         if (strlen($substr)==$l)        {
00581                                 $count = count(explode(' ',trim(strrev($substr))));
00582                                 if ($count>1)   {       // OK...
00583                                         $parts = explode(' ',strrev($substr),2);
00584                                         $theLine = strrev($parts[1]);
00585                                 } else {
00586                                         $afterParts = explode(' ',substr($str,$l+$p),2);
00587                                         $theLine = $substr.$afterParts[0];
00588                                 }
00589                                 if (!strlen($theLine))  {break; }       // Error, because this would keep us in an endless loop.
00590                         } else {
00591                                 $theLine=$substr;
00592                         }
00593 
00594                         $lines[]=trim($theLine);
00595                         $p+=strlen($theLine);
00596                         if (!trim(substr($str,$p,$l)))  break;  // added...
00597                 }
00598                 return implode($implChar,$lines);
00599         }
00600 
00610         function cmpIP($baseIP, $list)  {
00611                 if ($list==='*')        return TRUE;
00612                 if (strstr($baseIP, ':') && t3lib_div::validIPv6($baseIP))      {
00613                         return t3lib_div::cmpIPv6($baseIP, $list);
00614                 } else {
00615                         return t3lib_div::cmpIPv4($baseIP, $list);
00616                 }
00617         }
00618 
00626         function cmpIPv4($baseIP, $list)        {
00627                 $IPpartsReq = explode('.',$baseIP);
00628                 if (count($IPpartsReq)==4)      {
00629                         $values = t3lib_div::trimExplode(',',$list,1);
00630 
00631                         foreach($values as $test)       {
00632                                 list($test,$mask) = explode('/',$test);
00633 
00634                                 if(intval($mask)) {
00635                                                 // "192.168.3.0/24"
00636                                         $lnet = ip2long($test);
00637                                         $lip = ip2long($baseIP);
00638                                         $binnet = str_pad( decbin($lnet),32,'0','STR_PAD_LEFT');
00639                                         $firstpart = substr($binnet,0,$mask);
00640                                         $binip = str_pad( decbin($lip),32,'0','STR_PAD_LEFT');
00641                                         $firstip = substr($binip,0,$mask);
00642                                         $yes = (strcmp($firstpart,$firstip)==0);
00643                                 } else {
00644                                                 // "192.168.*.*"
00645                                         $IPparts = explode('.',$test);
00646                                         $yes = 1;
00647                                         reset($IPparts);
00648                                         while(list($index,$val)=each($IPparts)) {
00649                                                 $val = trim($val);
00650                                                 if (strcmp($val,'*') && strcmp($IPpartsReq[$index],$val))       {
00651                                                         $yes=0;
00652                                                 }
00653                                         }
00654                                 }
00655                                 if ($yes) return true;
00656                         }
00657                 }
00658                 return false;
00659         }
00660 
00668         function cmpIPv6($baseIP, $list)        {
00669                 $success = false;       // Policy default: Deny connection
00670                 $baseIP = t3lib_div::normalizeIPv6($baseIP);
00671 
00672                 $values = t3lib_div::trimExplode(',',$list,1);
00673                 foreach ($values as $test)      {
00674                         list($test,$mask) = explode('/',$test);
00675                         if (t3lib_div::validIPv6($test))        {
00676                                 $test = t3lib_div::normalizeIPv6($test);
00677                                 if (intval($mask))      {
00678                                         switch ($mask) {        // test on /48 /64
00679                                                 case '48':
00680                                                         $testBin = substr(t3lib_div::IPv6Hex2Bin($test), 0, 48);
00681                                                         $baseIPBin = substr(t3lib_div::IPv6Hex2Bin($baseIP), 0, 48);
00682                                                         $success = strcmp($testBin, $baseIPBin)==0 ? true : false;
00683                                                 break;
00684                                                 case '64':
00685                                                         $testBin = substr(t3lib_div::IPv6Hex2Bin($test), 0, 64);
00686                                                         $baseIPBin = substr(t3lib_div::IPv6Hex2Bin($baseIP), 0, 64);
00687                                                         $success = strcmp($testBin, $baseIPBin)==0 ? true : false;
00688                                                 break;
00689                                                 default:
00690                                                         $success = false;
00691                                         }
00692                                 } else {
00693                                         if (t3lib_div::validIPv6($test))        {       // test on full ip address 128 bits
00694                                                 $testBin = t3lib_div::IPv6Hex2Bin($test);
00695                                                 $baseIPBin = t3lib_div::IPv6Hex2Bin($baseIP);
00696                                                 $success = strcmp($testBin, $baseIPBin)==0 ? true : false;
00697                                         }
00698                                 }
00699                         }
00700                         if ($success) return true;
00701                 }
00702                 return false;
00703         }
00704 
00711         function IPv6Hex2Bin ($hex)     {
00712                 $bin = '';
00713                 $hex = str_replace(':', '', $hex);      // Replace colon to nothing
00714                 for ($i=0; $i<strlen($hex); $i=$i+2)    {
00715                         $bin.= chr(hexdec(substr($hex, $i, 2)));
00716                 }
00717                 return $bin;
00718         }
00719 
00726         function normalizeIPv6($address)        {
00727                 $normalizedAddress = '';
00728                 $stageOneAddress = '';
00729 
00730                 $chunks = explode('::', $address);      // Count 2 if if address has hidden zero blocks
00731                 if (count($chunks)==2)  {
00732                         $chunksLeft = explode(':', $chunks[0]);
00733                         $chunksRight = explode(':', $chunks[1]);
00734                         $left = count($chunksLeft);
00735                         $right = count($chunksRight);
00736 
00737                                 // Special case: leading zero-only blocks count to 1, should be 0
00738                         if ($left==1 && strlen($chunksLeft[0])==0)      $left=0;
00739 
00740                         $hiddenBlocks = 8 - ($left + $right);
00741                         $hiddenPart = '';
00742                         while ($h<$hiddenBlocks)        {
00743                                 $hiddenPart .= '0000:';
00744                                 $h++;
00745                         }
00746 
00747                         if ($left == 0) {
00748                                 $stageOneAddress = $hiddenPart . $chunks[1];
00749                         } else {
00750                                 $stageOneAddress = $chunks[0] . ':' . $hiddenPart . $chunks[1];
00751                         }
00752                 } else $stageOneAddress = $address;
00753 
00754                         // normalize the blocks:
00755                 $blocks = explode(':', $stageOneAddress);
00756                 $divCounter = 0;
00757                 foreach ($blocks as $block)     {
00758                         $tmpBlock = '';
00759                         $i = 0;
00760                         $hiddenZeros = 4 - strlen($block);
00761                         while ($i < $hiddenZeros)       {
00762                                 $tmpBlock .= '0';
00763                                 $i++;
00764                         }
00765                         $normalizedAddress .= $tmpBlock . $block;
00766                         if ($divCounter < 7)    {
00767                                 $normalizedAddress .= ':';
00768                                 $divCounter++;
00769                         }
00770                 }
00771                 return $normalizedAddress;
00772         }
00773 
00782         function validIPv6($ip) {
00783                 $uppercaseIP = strtoupper($ip);
00784 
00785                 $regex = '/^(';
00786                 $regex.= '(([\dA-F]{1,4}:){7}[\dA-F]{1,4})|';
00787                 $regex.= '(([\dA-F]{1,4}){1}::([\dA-F]{1,4}:){1,5}[\dA-F]{1,4})|';
00788                 $regex.= '(([\dA-F]{1,4}:){2}:([\dA-F]{1,4}:){1,4}[\dA-F]{1,4})|';
00789                 $regex.= '(([\dA-F]{1,4}:){3}:([\dA-F]{1,4}:){1,3}[\dA-F]{1,4})|';
00790                 $regex.= '(([\dA-F]{1,4}:){4}:([\dA-F]{1,4}:){1,2}[\dA-F]{1,4})|';
00791                 $regex.= '(([\dA-F]{1,4}:){5}:([\dA-F]{1,4}:){0,1}[\dA-F]{1,4})|';
00792                 $regex.= '(::([\dA-F]{1,4}:){0,6}[\dA-F]{1,4})';
00793                 $regex.= ')$/';
00794 
00795                 return preg_match($regex, $uppercaseIP) ? true : false;
00796         }
00797 
00805         function cmpFQDN($baseIP, $list)        {
00806                 if (count(explode('.',$baseIP))==4)     {
00807                         $resolvedHostName = explode('.', gethostbyaddr($baseIP));
00808                         $values = t3lib_div::trimExplode(',',$list,1);
00809 
00810                         foreach($values as $test)       {
00811                                 $hostNameParts = explode('.',$test);
00812                                 $yes = 1;
00813 
00814                                 foreach($hostNameParts as $index => $val)       {
00815                                         $val = trim($val);
00816                                         if (strcmp($val,'*') && strcmp($resolvedHostName[$index],$val)) {
00817                                                 $yes=0;
00818                                         }
00819                                 }
00820                                 if ($yes) return true;
00821                         }
00822                 }
00823                 return false;
00824         }
00825 
00835         function inList($list,$item)    {
00836                 return strstr(','.$list.',', ','.$item.',') ? true : false;
00837         }
00838 
00847         function rmFromList($element,$list)     {
00848                 $items = explode(',',$list);
00849                 while(list($k,$v)=each($items)) {
00850                         if ($v==$element)       {unset($items[$k]);}
00851                 }
00852                 return implode(',',$items);
00853         }
00854 
00863         function expandList($list)      {
00864                 $items = explode(',',$list);
00865                 $list = array();
00866                 while(list(,$item)=each($items))        {
00867                         $range = explode('-',$item);
00868                         if (isset($range[1]))   {
00869                                 $runAwayBrake = 1000;
00870                                 for ($n=$range[0]; $n<=$range[1]; $n++) {
00871                                         $list[] = $n;
00872 
00873                                         $runAwayBrake--;
00874                                         if ($runAwayBrake<=0)   break;
00875                                 }
00876                         } else {
00877                                 $list[] = $item;
00878                         }
00879                 }
00880 
00881                 return implode(',',$list);
00882         }
00883 
00894         function intInRange($theInt,$min,$max=2000000000,$zeroValue=0)  {
00895                 // Returns $theInt as an integer in the integerspace from $min to $max
00896                 $theInt = intval($theInt);
00897                 if ($zeroValue && !$theInt)     {$theInt=$zeroValue;}   // If the input value is zero after being converted to integer, zeroValue may set another default value for it.
00898                 if ($theInt<$min){$theInt=$min;}
00899                 if ($theInt>$max){$theInt=$max;}
00900                 return $theInt;
00901         }
00902 
00910         function intval_positive($theInt)       {
00911                 $theInt = intval($theInt);
00912                 if ($theInt<0){$theInt=0;}
00913                 return $theInt;
00914         }
00915 
00923         function int_from_ver($verNumberStr)    {
00924                 $verParts = explode('.',$verNumberStr);
00925                 return intval((int)$verParts[0].str_pad((int)$verParts[1],3,'0',STR_PAD_LEFT).str_pad((int)$verParts[2],3,'0',STR_PAD_LEFT));
00926         }
00927 
00934         function compat_version($verNumberStr)  {
00935                 global $TYPO3_CONF_VARS;
00936                 $currVersionStr = $TYPO3_CONF_VARS['SYS']['compat_version']?$TYPO3_CONF_VARS['SYS']['compat_version']:TYPO3_version;
00937 
00938                 if (t3lib_div::int_from_ver($currVersionStr) < t3lib_div::int_from_ver($verNumberStr))  {
00939                         return FALSE;
00940                 } else {
00941                         return TRUE;
00942                 }
00943         }
00944 
00952         function md5int($str)   {
00953                 return hexdec(substr(md5($str),0,7));
00954         }
00955 
00965         function shortMD5($input, $len=10)      {
00966                 return substr(md5($input),0,$len);
00967         }
00968 
00978         function uniqueList($in_list, $secondParameter=NULL)    {
00979                 if (is_array($in_list)) die('t3lib_div::uniqueList() does NOT support array arguments anymore! Only string comma lists!');
00980                 if (isset($secondParameter))    die('t3lib_div::uniqueList() does NOT support more than a single argument value anymore. You have specified more than one.');
00981 
00982                 return implode(',',array_unique(t3lib_div::trimExplode(',',$in_list,1)));
00983         }
00984 
00992         function split_fileref($fileref)        {
00993                 $reg = array();
00994                 if (    ereg('(.*/)(.*)$',$fileref,$reg)        )       {
00995                         $info['path'] = $reg[1];
00996                         $info['file'] = $reg[2];
00997                 } else {
00998                         $info['path'] = '';
00999                         $info['file'] = $fileref;
01000                 }
01001                 $reg='';
01002                 if (    ereg('(.*)\.([^\.]*$)',$info['file'],$reg)      )       {
01003                         $info['filebody'] = $reg[1];
01004                         $info['fileext'] = strtolower($reg[2]);
01005                         $info['realFileext'] = $reg[2];
01006                 } else {
01007                         $info['filebody'] = $info['file'];
01008                         $info['fileext'] = '';
01009                 }
01010                 reset($info);
01011                 return $info;
01012         }
01013 
01030         function dirname($path) {
01031                 $p=t3lib_div::revExplode('/',$path,2);
01032                 return count($p)==2?$p[0]:'';
01033         }
01034 
01046         function modifyHTMLColor($color,$R,$G,$B)       {
01047                 // This takes a hex-color (# included!) and adds $R, $G and $B to the HTML-color (format: #xxxxxx) and returns the new color
01048                 $nR = t3lib_div::intInRange(hexdec(substr($color,1,2))+$R,0,255);
01049                 $nG = t3lib_div::intInRange(hexdec(substr($color,3,2))+$G,0,255);
01050                 $nB = t3lib_div::intInRange(hexdec(substr($color,5,2))+$B,0,255);
01051                 return '#'.
01052                         substr('0'.dechex($nR),-2).
01053                         substr('0'.dechex($nG),-2).
01054                         substr('0'.dechex($nB),-2);
01055         }
01056 
01066         function modifyHTMLColorAll($color,$all)        {
01067                 return t3lib_div::modifyHTMLColor($color,$all,$all,$all);
01068         }
01069 
01077         function rm_endcomma($string)   {
01078                 return ereg_replace(',$','',$string);
01079         }
01080 
01090         function danish_strtoupper($string)     {
01091                 $value = strtoupper($string);
01092                 return strtr($value, 'áéúíâêûôîæøåäöü', 'ÁÉÚÍÄËÜÖÏÆØÅÄÖÜ');
01093         }
01094 
01105         function convUmlauts($str)      {
01106                 $pat  = array ( '/ä/',  '/Ä/',  '/ö/',  '/Ö/',  '/ü/',  '/Ü/',  '/ß/',  '/å/',  '/Å/',  '/ø/',  '/Ø/',  '/æ/',  '/Æ/'   );
01107                 $repl = array ( 'ae',   'Ae',   'oe',   'Oe',   'ue',   'Ue',   'ss',   'aa',   'AA',   'oe',   'OE',   'ae',   'AE'    );
01108                 return preg_replace($pat,$repl,$str);
01109         }
01110 
01118         function testInt($var)  {
01119                 return !strcmp($var,intval($var));
01120         }
01121 
01130         function isFirstPartOfStr($str,$partStr)        {
01131                 // Returns true, if the first part of a $str equals $partStr and $partStr is not ''
01132                 $psLen = strlen($partStr);
01133                 if ($psLen)     {
01134                         return substr($str,0,$psLen)==(string)$partStr;
01135                 } else return false;
01136         }
01137 
01146         function formatSize($sizeInBytes,$labels='')    {
01147 
01148                         // Set labels:
01149                 if (strlen($labels) == 0) {
01150                     $labels = ' | K| M| G';
01151                 } else {
01152                     $labels = str_replace('"','',$labels);
01153                 }
01154                 $labelArr = explode('|',$labels);
01155 
01156                         // Find size:
01157                 if ($sizeInBytes>900)   {
01158                         if ($sizeInBytes>900000000)     {       // GB
01159                                 $val = $sizeInBytes/(1024*1024*1024);
01160                                 return number_format($val, (($val<20)?1:0), '.', '').$labelArr[3];
01161                         }
01162                         elseif ($sizeInBytes>900000)    {       // MB
01163                                 $val = $sizeInBytes/(1024*1024);
01164                                 return number_format($val, (($val<20)?1:0), '.', '').$labelArr[2];
01165                         } else {        // KB
01166                                 $val = $sizeInBytes/(1024);
01167                                 return number_format($val, (($val<20)?1:0), '.', '').$labelArr[1];
01168                         }
01169                 } else {        // Bytes
01170                         return $sizeInBytes.$labelArr[0];
01171                 }
01172         }
01173 
01181         function convertMicrotime($microtime)   {
01182                 $parts = explode(' ',$microtime);
01183                 return round(($parts[0]+$parts[1])*1000);
01184         }
01185 
01195         function splitCalc($string,$operators)  {
01196                 $res = Array();
01197                 $sign='+';
01198                 while($string)  {
01199                         $valueLen=strcspn($string,$operators);
01200                         $value=substr($string,0,$valueLen);
01201                         $res[] = Array($sign,trim($value));
01202                         $sign=substr($string,$valueLen,1);
01203                         $string=substr($string,$valueLen+1);
01204                 }
01205                 reset($res);
01206                 return $res;
01207         }
01208 
01217         function calcPriority($string)  {
01218                 $string=ereg_replace('[[:space:]]*','',$string);        // removing all whitespace
01219                 $string='+'.$string;    // Ensuring an operator for the first entrance
01220                 $qm='\*\/\+-^%';
01221                 $regex = '(['.$qm.'])(['.$qm.']?[0-9\.]*)';
01222                         // split the expression here:
01223                 $reg = array();
01224                 preg_match_all('/'.$regex.'/',$string,$reg);
01225 
01226                 reset($reg[2]);
01227                 $number=0;
01228                 $Msign='+';
01229                 $err='';
01230                 $buffer=doubleval(current($reg[2]));
01231                 next($reg[2]);  // Advance pointer
01232                 while(list($k,$v)=each($reg[2]))        {
01233                         $v=doubleval($v);
01234                         $sign = $reg[1][$k];
01235                         if ($sign=='+' || $sign=='-')   {
01236                                 $number = $Msign=='-' ? $number-=$buffer : $number+=$buffer;
01237                                 $Msign = $sign;
01238                                 $buffer=$v;
01239                         } else {
01240                                 if ($sign=='/') {if ($v) $buffer/=$v; else $err='dividing by zero';}
01241                                 if ($sign=='%') {if ($v) $buffer%=$v; else $err='dividing by zero';}
01242                                 if ($sign=='*') {$buffer*=$v;}
01243                                 if ($sign=='^') {$buffer=pow($buffer,$v);}
01244                         }
01245                 }
01246                 $number = $Msign=='-' ? $number-=$buffer : $number+=$buffer;
01247                 return $err ? 'ERROR: '.$err : $number;
01248         }
01249 
01258         function calcParenthesis($string)       {
01259                 $securC=100;
01260                 do {
01261                         $valueLenO=strcspn($string,'(');
01262                         $valueLenC=strcspn($string,')');
01263                         if ($valueLenC==strlen($string) || $valueLenC < $valueLenO)     {
01264                                 $value = t3lib_div::calcPriority(substr($string,0,$valueLenC));
01265                                 $string = $value.substr($string,$valueLenC+1);
01266                                 return $string;
01267                         } else {
01268                                 $string = substr($string,0,$valueLenO).t3lib_div::calcParenthesis(substr($string,$valueLenO+1));
01269                         }
01270                                 // Security:
01271                         $securC--;
01272                         if ($securC<=0) break;
01273                 } while($valueLenO<strlen($string));
01274                 return $string;
01275         }
01276 
01284         function htmlspecialchars_decode($value)        {
01285                 $value = str_replace('&gt;','>',$value);
01286                 $value = str_replace('&lt;','<',$value);
01287                 $value = str_replace('&quot;','"',$value);
01288                 $value = str_replace('&amp;','&',$value);
01289                 return $value;
01290         }
01291 
01299         function deHSCentities($str)    {
01300                 return ereg_replace('&amp;([#[:alnum:]]*;)','&\1',$str);
01301         }
01302 
01312         function slashJS($string,$extended=0,$char="'") {
01313                 if ($extended)  {$string = str_replace ("\\", "\\\\", $string);}
01314                 return str_replace ($char, "\\".$char, $string);
01315         }
01316 
01325         function rawUrlEncodeJS($str)   {
01326                 return str_replace('%20',' ',rawurlencode($str));
01327         }
01328 
01337         function rawUrlEncodeFP($str)   {
01338                 return str_replace('%2F','/',rawurlencode($str));
01339         }
01340 
01348         function validEmail($email)     {
01349                 $email = trim ($email);
01350                 if (strstr($email,' '))  return FALSE;
01351                 return ereg('^[A-Za-z0-9\._-]+[@][A-Za-z0-9\._-]+[\.].[A-Za-z0-9]+$',$email) ? TRUE : FALSE;
01352         }
01353 
01363         function formatForTextarea($content)    {
01364                 return chr(10).htmlspecialchars($content);
01365         }
01366 
01367 
01368 
01369 
01370 
01371 
01372 
01373 
01374 
01375 
01376 
01377 
01378         /*************************
01379          *
01380          * ARRAY FUNCTIONS
01381          *
01382          *************************/
01383 
01394         function inArray($in_array,$item)       {
01395                 if (is_array($in_array))        {
01396                         while (list(,$val)=each($in_array))     {
01397                                 if (!is_array($val) && !strcmp($val,$item)) return true;
01398                         }
01399                 }
01400         }
01401 
01411         function intExplode($delim, $string)    {
01412                 $temp = explode($delim,$string);
01413                 while(list($key,$val)=each($temp))      {
01414                         $temp[$key]=intval($val);
01415                 }
01416                 reset($temp);
01417                 return $temp;
01418         }
01419 
01430         function revExplode($delim, $string, $count=0)  {
01431                 $temp = explode($delim,strrev($string),$count);
01432                 while(list($key,$val)=each($temp))      {
01433                         $temp[$key]=strrev($val);
01434                 }
01435                 $temp=array_reverse($temp);
01436                 reset($temp);
01437                 return $temp;
01438         }
01439 
01450         function trimExplode($delim, $string, $onlyNonEmptyValues=0)    {
01451                 $temp = explode($delim,$string);
01452                 $newtemp=array();
01453                 while(list($key,$val)=each($temp))      {
01454                         if (!$onlyNonEmptyValues || strcmp('',trim($val)))      {
01455                                 $newtemp[]=trim($val);
01456                         }
01457                 }
01458                 reset($newtemp);
01459                 return $newtemp;
01460         }
01461 
01472         function uniqueArray($valueArray)       {
01473                 return array_unique($valueArray);
01474         }
01475 
01484         function removeArrayEntryByValue($array,$cmpValue)      {
01485                 if (is_array($array))   {
01486                         reset($array);
01487                         while(list($k,$v)=each($array)) {
01488                                 if (is_array($v))       {
01489                                         $array[$k] = t3lib_div::removeArrayEntryByValue($v,$cmpValue);
01490                                 } else {
01491                                         if (!strcmp($v,$cmpValue))      {
01492                                                 unset($array[$k]);
01493                                         }
01494                                 }
01495                         }
01496                 }
01497                 reset($array);
01498                 return $array;
01499         }
01500 
01513         function implodeArrayForUrl($name,$theArray,$str='',$skipBlank=0,$rawurlencodeParamName=0)      {
01514                 if (is_array($theArray))        {
01515                         foreach($theArray as $Akey => $AVal)    {
01516                                 $thisKeyName = $name ? $name.'['.$Akey.']' : $Akey;
01517                                 if (is_array($AVal))    {
01518                                         $str = t3lib_div::implodeArrayForUrl($thisKeyName,$AVal,$str,$skipBlank,$rawurlencodeParamName);
01519                                 } else {
01520                                         if (!$skipBlank || strcmp($AVal,''))    {
01521                                                 $str.='&'.($rawurlencodeParamName ? rawurlencode($thisKeyName) : $thisKeyName).
01522                                                         '='.rawurlencode($AVal);
01523                                         }
01524                                 }
01525                         }
01526                 }
01527                 return $str;
01528         }
01529 
01538         function explodeUrl2Array($string,$multidim=FALSE)      {
01539                 $output = array();
01540                 if ($multidim)  {
01541                         parse_str($string,$output);
01542                 } else {
01543                         $p = explode('&',$string);
01544                         foreach($p as $v)       {
01545                                 if (strlen($v)) {
01546                                         list($pK,$pV) = explode('=',$v,2);
01547                                         $output[rawurldecode($pK)] = rawurldecode($pV);
01548                                 }
01549                         }
01550                 }
01551                 return $output;
01552         }
01553 
01564         function compileSelectedGetVarsFromArray($varList,$getArray,$GPvarAlt=1)        {
01565                 $keys = t3lib_div::trimExplode(',',$varList,1);
01566                 $outArr=array();
01567                 foreach($keys as $v)    {
01568                         if (isset($getArray[$v]))       {
01569                                 $outArr[$v]=$getArray[$v];
01570                         } elseif ($GPvarAlt) {
01571                                 $outArr[$v]=t3lib_div::_GP($v);
01572                         }
01573                 }
01574                 return $outArr;
01575         }
01576 
01587         function addSlashesOnArray(&$theArray)  {
01588                 if (is_array($theArray))        {
01589                         reset($theArray);
01590                         while(list($Akey,$AVal)=each($theArray))        {
01591                                 if (is_array($AVal))    {
01592                                         t3lib_div::addSlashesOnArray($theArray[$Akey]);
01593                                 } else {
01594                                         $theArray[$Akey] = addslashes($AVal);
01595                                 }
01596                         }
01597                         reset($theArray);
01598                 }
01599         }
01600 
01611         function stripSlashesOnArray(&$theArray)        {
01612                 if (is_array($theArray))        {
01613                         reset($theArray);
01614                         while(list($Akey,$AVal)=each($theArray))        {
01615                                 if (is_array($AVal))    {
01616                                         t3lib_div::stripSlashesOnArray($theArray[$Akey]);
01617                                 } else {
01618                                         $theArray[$Akey] = stripslashes($AVal);
01619                                 }
01620                         }
01621                         reset($theArray);
01622                 }
01623         }
01624 
01633         function slashArray($arr,$cmd)  {
01634                 if ($cmd=='strip')      t3lib_div::stripSlashesOnArray($arr);
01635                 if ($cmd=='add')        t3lib_div::addSlashesOnArray($arr);
01636                 return $arr;
01637         }
01638 
01650         function array_merge_recursive_overrule($arr0,$arr1,$notAddKeys=0,$includeEmtpyValues=true) {
01651                 reset($arr1);
01652                 while(list($key,$val) = each($arr1)) {
01653                         if(is_array($arr0[$key])) {
01654                                 if (is_array($arr1[$key]))      {
01655                                         $arr0[$key] = t3lib_div::array_merge_recursive_overrule($arr0[$key],$arr1[$key],$notAddKeys);
01656                                 }
01657                         } else {
01658                                 if ($notAddKeys) {
01659                                         if (isset($arr0[$key])) {
01660                                                 if ($includeEmtpyValues OR $val) {
01661                                                         $arr0[$key] = $val;
01662                                                 }
01663                                         }
01664                                 } else {
01665                                         if ($includeEmtpyValues OR $val) {
01666                                                 $arr0[$key] = $val;
01667                                         }
01668                                 }
01669                         }
01670                 }
01671                 reset($arr0);
01672                 return $arr0;
01673         }
01674 
01683         function array_merge($arr1,$arr2)       {
01684                 return $arr2+$arr1;
01685         }
01686 
01696         function csvValues($row,$delim=',',$quote='"')  {
01697                 reset($row);
01698                 $out=array();
01699                 while(list(,$value)=each($row)) {
01700                         list($valPart) = explode(chr(10),$value);
01701                         $valPart = trim($valPart);
01702                         $out[]=str_replace($quote,$quote.$quote,$valPart);
01703                 }
01704                 $str = $quote.implode($quote.$delim.$quote,$out).$quote;
01705                 return $str;
01706         }
01707 
01708 
01709 
01710 
01711 
01712 
01713 
01714 
01715 
01716 
01717 
01718 
01719 
01720 
01721 
01722 
01723         /*************************
01724          *
01725          * HTML/XML PROCESSING
01726          *
01727          *************************/
01728 
01738         function get_tag_attributes($tag)       {
01739                 $components = t3lib_div::split_tag_attributes($tag);
01740                 $name = '';      // attribute name is stored here
01741                 $valuemode = '';
01742                 if (is_array($components))      {
01743                         while (list($key,$val) = each ($components))    {
01744                                 if ($val != '=')        {       // Only if $name is set (if there is an attribute, that waits for a value), that valuemode is enabled. This ensures that the attribute is assigned it's value
01745                                         if ($valuemode) {
01746                                                 if ($name)      {
01747                                                         $attributes[$name] = $val;
01748                                                         $name = '';
01749                                                 }
01750                                         } else {
01751                                                 if ($key = strtolower(ereg_replace('[^a-zA-Z0-9]','',$val)))    {
01752                                                         $attributes[$key] = '';
01753                                                         $name = $key;
01754                                                 }
01755                                         }
01756                                         $valuemode = '';
01757                                 } else {
01758                                         $valuemode = 'on';
01759                                 }
01760                         }
01761                         if (is_array($attributes))      reset($attributes);
01762                         return $attributes;
01763                 }
01764         }
01765 
01775         function split_tag_attributes($tag)     {
01776                 $tag_tmp = trim(eregi_replace ('^<[^[:space:]]*','',trim($tag)));
01777                         // Removes any > in the end of the string
01778                 $tag_tmp = trim(eregi_replace ('>$','',$tag_tmp));
01779 
01780                 while (strcmp($tag_tmp,''))     {       // Compared with empty string instead , 030102
01781                         $firstChar=substr($tag_tmp,0,1);
01782                         if (!strcmp($firstChar,'"') || !strcmp($firstChar,"'")) {
01783                                 $reg=explode($firstChar,$tag_tmp,3);
01784                                 $value[]=$reg[1];
01785                                 $tag_tmp=trim($reg[2]);
01786                         } elseif (!strcmp($firstChar,'=')) {
01787                                 $value[] = '=';
01788                                 $tag_tmp = trim(substr($tag_tmp,1));            // Removes = chars.
01789                         } else {
01790                                         // There are '' around the value. We look for the next ' ' or '>'
01791                                 $reg = split('[[:space:]=]',$tag_tmp,2);
01792                                 $value[] = trim($reg[0]);
01793                                 $tag_tmp = trim(substr($tag_tmp,strlen($reg[0]),1).$reg[1]);
01794                         }
01795                 }
01796                 if (is_array($value))   reset($value);
01797                 return $value;
01798         }
01799 
01809         function implodeAttributes($arr,$xhtmlSafe=FALSE,$dontOmitBlankAttribs=FALSE)   {
01810                 if (is_array($arr))     {
01811                         if ($xhtmlSafe) {
01812                                 $newArr=array();
01813                                 foreach($arr as $p => $v)       {
01814                                         if (!isset($newArr[strtolower($p)])) $newArr[strtolower($p)] = htmlspecialchars($v);
01815                                 }
01816                                 $arr = $newArr;
01817                         }
01818                         $list = array();
01819                         foreach($arr as $p => $v)       {
01820                                 if (strcmp($v,'') || $dontOmitBlankAttribs)     {$list[]=$p.'="'.$v.'"';}
01821                         }
01822                         return implode(' ',$list);
01823                 }
01824         }
01825 
01836         function implodeParams($arr,$xhtmlSafe=FALSE,$dontOmitBlankAttribs=FALSE)       {
01837                 return t3lib_div::implodeAttributes($arr,$xhtmlSafe,$dontOmitBlankAttribs);
01838         }
01839 
01851         function wrapJS($string, $linebreak=TRUE) {
01852                 if(trim($string)) {
01853                                 // <script wrapped in nl?
01854                         $cr = $linebreak? "\n" : '';
01855 
01856                                 // remove nl from the beginning
01857                         $string = preg_replace ('/^\n+/', '', $string);
01858                                 // re-ident to one tab using the first line as reference
01859                         $match = array();
01860                         if(preg_match('/^(\t+)/',$string,$match)) {
01861                                 $string = str_replace($match[1],"\t", $string);
01862                         }
01863                         $string = $cr.'<script type="text/javascript">
01864 /*<![CDATA[*/
01865 '.$string.'
01866 /*]]>*/
01867 </script>'.$cr;
01868                 }
01869                 return trim($string);
01870         }
01871 
01872 
01882         function xml2tree($string,$depth=999) {
01883                 $parser = xml_parser_create();
01884                 $vals = array();
01885                 $index = array();
01886 
01887                 xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);
01888                 xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 0);
01889                 xml_parse_into_struct($parser, $string, $vals, $index);
01890 
01891                 if (xml_get_error_code($parser))        return 'Line '.xml_get_current_line_number($parser).': '.xml_error_string(xml_get_error_code($parser));
01892                 xml_parser_free($parser);
01893 
01894                 $stack = array( array() );
01895                 $stacktop = 0;
01896                 $startPoint=0;
01897 
01898 // FIXME don't use unset() - what does that mean? Use NULL or similar.
01899                 unset($tagi);
01900                 foreach($vals as $key => $val) {
01901                         $type = $val['type'];
01902 
01903                                 // open tag:
01904                         if ($type=='open' || $type=='complete') {
01905                                 $stack[$stacktop++] = $tagi;
01906 
01907                                 if ($depth==$stacktop)  {
01908                                         $startPoint=$key;
01909                                 }
01910 
01911                                 $tagi = array('tag' => $val['tag']);
01912 
01913                                 if(isset($val['attributes']))  $tagi['attrs'] = $val['attributes'];
01914                                 if(isset($val['value']))        $tagi['values'][] = $val['value'];
01915                         }
01916                                 // finish tag:
01917                         if ($type=='complete' || $type=='close')        {
01918                                 $oldtagi = $tagi;
01919                                 $tagi = $stack[--$stacktop];
01920                                 $oldtag = $oldtagi['tag'];
01921                                 unset($oldtagi['tag']);
01922 
01923                                 if ($depth==($stacktop+1))      {
01924                                         if ($key-$startPoint > 0)       {
01925                                                 $partArray = array_slice(
01926                                                         $vals,
01927                                                         $startPoint+1,
01928                                                         $key-$startPoint-1
01929                                                 );
01930                                                 #$oldtagi=array('XMLvalue'=>t3lib_div::xmlRecompileFromStructValArray($partArray));
01931                                                 $oldtagi['XMLvalue']=t3lib_div::xmlRecompileFromStructValArray($partArray);
01932                                         } else {
01933                                                 $oldtagi['XMLvalue']=$oldtagi['values'][0];
01934                                         }
01935                                 }
01936 
01937                                 $tagi['ch'][$oldtag][] = $oldtagi;
01938                                 unset($oldtagi);
01939                         }
01940                                 // cdata
01941                         if($type=='cdata') {
01942                                 $tagi['values'][] = $val['value'];
01943                         }
01944                 }
01945                 return $tagi['ch'];
01946         }
01947         
01958         function array2xml_cs($array,$docTag='phparray',$options=array(),$charset='')   {
01959                 
01960                         // Figure out charset if not given explicitly:
01961                 if (!$charset)  {
01962                         if ($GLOBALS['TYPO3_CONF_VARS']['BE']['forceCharset'])  {       // First priority: forceCharset! If set, this will be authoritative!
01963                                 $charset = $GLOBALS['TYPO3_CONF_VARS']['BE']['forceCharset'];
01964                         } elseif (is_object($GLOBALS['LANG']))  {
01965                                 $charset = $GLOBALS['LANG']->charSet;   // If "LANG" is around, that will hold the current charset 
01966                         } else {
01967                                 $charset = 'iso-8859-1';        // THIS is just a hopeful guess! 
01968                         }               
01969                 }
01970                 
01971                         // Return XML:
01972                 return '<?xml version="1.0" encoding="'.htmlspecialchars($charset).'" standalone="yes" ?>'.chr(10).
01973                                 t3lib_div::array2xml($array,'',0,$docTag,0, $options);
01974         }
01975 
01999         function array2xml($array,$NSprefix='',$level=0,$docTag='phparray',$spaceInd=0, $options=array(),$stackData=array())    {
02000                         // The list of byte values which will trigger binary-safe storage. If any value has one of these char values in it, it will be encoded in base64
02001                 $binaryChars = chr(0).chr(1).chr(2).chr(3).chr(4).chr(5).chr(6).chr(7).chr(8).
02002                                                 chr(11).chr(12).chr(14).chr(15).chr(16).chr(17).chr(18).chr(19).
02003                                                 chr(20).chr(21).chr(22).chr(23).chr(24).chr(25).chr(26).chr(27).chr(28).chr(29).
02004                                                 chr(30).chr(31);
02005                         // Set indenting mode:
02006                 $indentChar = $spaceInd ? ' ' : chr(9);
02007                 $indentN = $spaceInd>0 ? $spaceInd : 1;
02008 
02009                         // Init output variable:
02010                 $output='';
02011 
02012                         // Traverse the input array
02013                 if (is_array($array))   {
02014                         foreach($array as $k=>$v)       {
02015                                 $attr = '';
02016                                 $tagName = $k;
02017 
02018                                         // Construct the tag name.
02019                                 if(isset($options['grandParentTagMap'][$stackData['grandParentTagName'].'/'.$stackData['parentTagName']])) {            // Use tag based on grand-parent + parent tag name
02020                                         $attr.=' index="'.htmlspecialchars($tagName).'"';
02021                                         $tagName = (string)$options['grandParentTagMap'][$stackData['grandParentTagName'].'/'.$stackData['parentTagName']];
02022                                 }elseif(isset($options['parentTagMap'][$stackData['parentTagName'].':_IS_NUM']) && t3lib_div::testInt($tagName)) {              // Use tag based on parent tag name + if current tag is numeric
02023                                         $attr.=' index="'.htmlspecialchars($tagName).'"';
02024                                         $tagName = (string)$options['parentTagMap'][$stackData['parentTagName'].':_IS_NUM'];
02025                                 }elseif(isset($options['parentTagMap'][$stackData['parentTagName'].':'.$tagName])) {            // Use tag based on parent tag name + current tag
02026                                         $attr.=' index="'.htmlspecialchars($tagName).'"';
02027                                         $tagName = (string)$options['parentTagMap'][$stackData['parentTagName'].':'.$tagName];
02028                                 } elseif(isset($options['parentTagMap'][$stackData['parentTagName']])) {                // Use tag based on parent tag name:
02029                                         $attr.=' index="'.htmlspecialchars($tagName).'"';
02030                                         $tagName = (string)$options['parentTagMap'][$stackData['parentTagName']];
02031                                 } elseif (!strcmp(intval($tagName),$tagName))   {       // If integer...;
02032                                         if ($options['useNindex']) {    // If numeric key, prefix "n"
02033                                                 $tagName = 'n'.$tagName;
02034                                         } else {        // Use special tag for num. keys:
02035                                                 $attr.=' index="'.$tagName.'"';
02036                                                 $tagName = $options['useIndexTagForNum'] ? $options['useIndexTagForNum'] : 'numIndex';
02037                                         }
02038                                 } elseif($options['useIndexTagForAssoc']) {             // Use tag for all associative keys:
02039                                         $attr.=' index="'.htmlspecialchars($tagName).'"';
02040                                         $tagName = $options['useIndexTagForAssoc'];
02041                                 }
02042 
02043                                         // The tag name is cleaned up so only alphanumeric chars (plus - and _) are in there and not longer than 100 chars either.
02044                                 $tagName = substr(ereg_replace('[^[:alnum:]_-]','',$tagName),0,100);
02045 
02046                                         // If the value is an array then we will call this function recursively:
02047                                 if (is_array($v))       {
02048 
02049                                                 // Sub elements:
02050                                         if ($options['alt_options'][$stackData['path'].'/'.$tagName])   {
02051                                                 $subOptions = $options['alt_options'][$stackData['path'].'/'.$tagName];
02052                                                 $clearStackPath = $subOptions['clearStackPath'];
02053                                         } else {
02054                                                 $subOptions = $options;
02055                                                 $clearStackPath = FALSE;
02056                                         }
02057 
02058                                         $content = chr(10).
02059                                                                 t3lib_div::array2xml(
02060                                                                         $v,
02061                                                                         $NSprefix,
02062                                                                         $level+1,
02063                                                                         '',
02064                                                                         $spaceInd,
02065                                                                         $subOptions,
02066                                                                         array(
02067                                                                                 'parentTagName' => $tagName,
02068                                                                                 'grandParentTagName' => $stackData['parentTagName'],
02069                                                                                 'path' => $clearStackPath ? '' : $stackData['path'].'/'.$tagName,
02070                                                                         )
02071                                                                 ).
02072                                                                 str_pad('',($level+1)*$indentN,$indentChar);
02073                                         if ((int)$options['disableTypeAttrib']!=2)      {       // Do not set "type = array". Makes prettier XML but means that empty arrays are not restored with xml2array
02074                                                 $attr.=' type="array"';
02075                                         }
02076                                 } else {        // Just a value:
02077 
02078                                                 // Look for binary chars:
02079                                         if (strcspn($v,$binaryChars) != strlen($v))     {       // Go for base64 encoding if the initial segment NOT matching any binary char has the same length as the whole string!
02080                                                         // If the value contained binary chars then we base64-encode it an set an attribute to notify this situation:
02081                                                 $content = chr(10).chunk_split(base64_encode($v));
02082                                                 $attr.=' base64="1"';
02083                                         } else {
02084                                                         // Otherwise, just htmlspecialchar the stuff:
02085                                                 $content = htmlspecialchars($v);
02086                                                 $dType = gettype($v);
02087                                                 if ($dType!='string' && !$options['disableTypeAttrib']) { $attr.=' type="'.$dType.'"'; }
02088                                         }
02089                                 }
02090 
02091                                         // Add the element to the output string:
02092                                 $output.=str_pad('',($level+1)*$indentN,$indentChar).'<'.$NSprefix.$tagName.$attr.'>'.$content.'</'.$NSprefix.$tagName.'>'.chr(10);
02093                         }
02094                 }
02095 
02096                         // If we are at the outer-most level, then we finally wrap it all in the document tags and return that as the value:
02097                 if (!$level)    {
02098                         $output =
02099                                 '<'.$docTag.'>'.chr(10).
02100                                 $output.
02101                                 '</'.$docTag.'>';
02102                 }
02103 
02104                 return $output;
02105         }
02106 
02118         function xml2array($string,$NSprefix='',$reportDocTag=FALSE) {
02119                 global $TYPO3_CONF_VARS;
02120 
02121                         // Create parser:
02122                 $parser = xml_parser_create();
02123                 $vals = array();
02124                 $index = array();
02125 
02126                 xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);
02127                 xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 0);
02128 
02129                         // PHP5 fix of charset awareness:
02130                         // Problem is: PHP5 apparently detects the charset of the XML file (or defaults to utf-8) and will AUTOMATICALLY convert the content to either utf-8, iso-8859-1 or us-ascii. PHP4 just passed the content through without taking action regarding the charset.
02131                         // In TYPO3 we expect that the charset of XML content is NOT handled in the parser but internally in TYPO3 instead. Therefore it would be very nice if PHP5 could be configured to NOT process the charset of the files. But this is not possible for now.
02132                         // What we do here fixes the problem but ONLY if the charset is utf-8, iso-8859-1 or us-ascii. That should work for most TYPO3 installations, in particular if people use utf-8 which we highly recommend.
02133                 if ((double)phpversion()>=5)    {
02134                         $ereg_result = array();
02135                         ereg('^[[:space:]]*<\?xml[^>]*encoding[[:space:]]*=[[:space:]]*"([^"]*)"',substr($string,0,200),$ereg_result);
02136                         $theCharset = $ereg_result[1] ? $ereg_result[1] : ($TYPO3_CONF_VARS['BE']['forceCharset'] ? $TYPO3_CONF_VARS['BE']['forceCharset'] : 'iso-8859-1');
02137                         xml_parser_set_option($parser, XML_OPTION_TARGET_ENCODING, $theCharset);  // us-ascii / utf-8 / iso-8859-1
02138                 }
02139 
02140                         // Parse content:
02141                 xml_parse_into_struct($parser, $string, $vals, $index);
02142 
02143                         // If error, return error message:
02144                 if (xml_get_error_code($parser))        {
02145                         return 'Line '.xml_get_current_line_number($parser).': '.xml_error_string(xml_get_error_code($parser));
02146                 }
02147                 xml_parser_free($parser);
02148 
02149                         // Init vars:
02150                 $stack = array(array());
02151                 $stacktop = 0;
02152                 $current=array();
02153                 $tagName = '';
02154                 $documentTag = '';
02155 
02156                         // Traverse the parsed XML structure:
02157                 foreach($vals as $key => $val) {
02158 
02159                                 // First, process the tag-name (which is used in both cases, whether "complete" or "close")
02160                         $tagName = $val['tag'];
02161                         if (!$documentTag)      $documentTag = $tagName;
02162 
02163                                 // Test for name space:
02164                         $tagName = ($NSprefix && substr($tagName,0,strlen($NSprefix))==$NSprefix) ? substr($tagName,strlen($NSprefix)) : $tagName;
02165 
02166                                 // Test for numeric tag, encoded on the form "nXXX":
02167                         $testNtag = substr($tagName,1); // Closing tag.
02168                         $tagName = (substr($tagName,0,1)=='n' && !strcmp(intval($testNtag),$testNtag)) ? intval($testNtag) : $tagName;
02169 
02170                                 // Test for alternative index value:
02171                         if (strlen($val['attributes']['index']))        { $tagName = $val['attributes']['index']; }
02172 
02173                                 // Setting tag-values, manage stack:
02174                         switch($val['type'])    {
02175                                 case 'open':            // If open tag it means there is an array stored in sub-elements. Therefore increase the stackpointer and reset the accumulation array:
02176                                         $current[$tagName] = array();   // Setting blank place holder
02177                                         $stack[$stacktop++] = $current;
02178                                         $current = array();
02179                                 break;
02180                                 case 'close':   // If the tag is "close" then it is an array which is closing and we decrease the stack pointer.
02181                                         $oldCurrent = $current;
02182                                         $current = $stack[--$stacktop];
02183                                         end($current);  // Going to the end of array to get placeholder key, key($current), and fill in array next:
02184                                         $current[key($current)] = $oldCurrent;
02185                                         unset($oldCurrent);
02186                                 break;
02187                                 case 'complete':        // If "complete", then it's a value. If the attribute "base64" is set, then decode the value, otherwise just set it.
02188                                         if ($val['attributes']['base64'])       {
02189                                                 $current[$tagName] = base64_decode($val['value']);
02190                                         } else {
02191                                                 $current[$tagName] = (string)$val['value']; // Had to cast it as a string - otherwise it would be evaluate false if tested with isset()!!
02192 
02193                                                         // Cast type:
02194                                                 switch((string)$val['attributes']['type'])      {
02195                                                         case 'integer':
02196                                                                 $current[$tagName] = (integer)$current[$tagName];
02197                                                         break;
02198                                                         case 'double':
02199                                                                 $current[$tagName] = (double)$current[$tagName];
02200                                                         break;
02201                                                         case 'boolean':
02202                                                                 $current[$tagName] = (bool)$current[$tagName];
02203                                                         break;
02204                                                         case 'array':
02205                                                                 $current[$tagName] = array();   // MUST be an empty array since it is processed as a value; Empty arrays would end up here because they would have no tags inside...
02206                                                         break;
02207                                                 }
02208                                         }
02209                                 break;
02210                         }
02211                 }
02212 
02213                 if ($reportDocTag)      {
02214                         $current[$tagName]['_DOCUMENT_TAG'] = $documentTag;
02215                 }
02216 
02217                         // Finally return the content of the document tag.
02218                 return $current[$tagName];
02219         }
02220 
02228         function xmlRecompileFromStructValArray($vals)  {
02229                 $XMLcontent='';
02230 
02231                 foreach($vals as $val) {
02232                         $type = $val['type'];
02233 
02234                                 // open tag:
02235                         if ($type=='open' || $type=='complete') {
02236                                 $XMLcontent.='<'.$val['tag'];
02237                                 if(isset($val['attributes']))  {
02238                                         foreach($val['attributes'] as $k => $v) {
02239                                                 $XMLcontent.=' '.$k.'="'.htmlspecialchars($v).'"';
02240                                         }
02241                                 }
02242                                 if ($type=='complete')  {
02243                                         if(isset($val['value']))        {
02244                                                 $XMLcontent.='>'.htmlspecialchars($val['value']).'</'.$val['tag'].'>';
02245                                         } else $XMLcontent.='/>';
02246                                 } else $XMLcontent.='>';
02247 
02248                                 if ($type=='open' && isset($val['value']))      {
02249                                         $XMLcontent.=htmlspecialchars($val['value']);
02250                                 }
02251                         }
02252                                 // finish tag:
02253                         if ($type=='close')     {
02254                                 $XMLcontent.='</'.$val['tag'].'>';
02255                         }
02256                                 // cdata
02257                         if($type=='cdata') {
02258                                 $XMLcontent.=htmlspecialchars($val['value']);
02259                         }
02260                 }
02261 
02262                 return $XMLcontent;
02263         }
02264 
02272         function xmlGetHeaderAttribs($xmlData)  {
02273                 $xmlHeader = substr(trim($xmlData),0,200);
02274                 $reg=array();
02275                 if (eregi('^<\?xml([^>]*)\?\>',$xmlHeader,$reg))        {
02276                         return t3lib_div::get_tag_attributes($reg[1]);
02277                 }
02278         }
02279 
02280 
02281 
02282 
02283 
02284 
02285 
02286 
02287 
02288 
02289 
02290         /*************************
02291          *
02292          * FILES FUNCTIONS
02293          *
02294          *************************/
02295 
02305         function getURL($url, $includeHeader=0) {
02306                 $content = '';
02307 
02308                         // (Proxy support implemented by Arco <arco@appeltaart.mine.nu>)
02309                 if ((substr($url,0,7)=='http://') && ($GLOBALS['TYPO3_CONF_VARS']['SYS']['curlUse']=='1'))      {
02310                         // External URL without error checking.
02311                         $ch = curl_init();
02312                         if (!$ch)       { return false; }
02313 
02314                         curl_setopt ($ch,CURLOPT_URL, $url);
02315                         curl_setopt ($ch,CURLOPT_HEADER, $includeHeader?1:0);
02316                         curl_setopt ($ch,CURLOPT_RETURNTRANSFER, 1);
02317 
02318                         if ($GLOBALS['TYPO3_CONF_VARS']['SYS']['curlProxyServer']) {
02319                                 curl_setopt ($ch, CURLOPT_PROXY, $GLOBALS['TYPO3_CONF_VARS']['SYS']['curlProxyServer']);
02320 
02321                                 // I don't know if it will be needed
02322                                 if ($GLOBALS['TYPO3_CONF_VARS']['SYS']['curlProxyTunnel']) {
02323                                         curl_setopt ($ch, CURLOPT_HTTPPROXYTUNNEL, $GLOBALS['TYPO3_CONF_VARS']['SYS']['curlProxyTunnel'] );
02324                                 }
02325                                 if ($GLOBALS['TYPO3_CONF_VARS']['SYS']['curlProxyUserPass']) {
02326                                         curl_setopt ($ch, CURLOPT_PROXYUSERPWD, $GLOBALS['TYPO3_CONF_VARS']['SYS']['curlProxyUserPass'] );
02327                                 }
02328                         }
02329                         $content=curl_exec ($ch);
02330                         curl_close ($ch);
02331 
02332                 } elseif ($includeHeader)       {
02333                         $parsedURL = parse_url($url);
02334                         if (!t3lib_div::inList('ftp,ftps,http,https,gopher,telnet', $parsedURL['scheme']))      { return false; }
02335 
02336                         $fp = @fsockopen($parsedURL['host'], ($parsedURL['port']>0 ? $parsedURL['port'] : 80), $errno, $errstr, $timeout=2);
02337                         if (!$fp)       { return false; }
02338 
02339                         $msg = 'GET '.$parsedURL['path'].($parsedURL['query'] ? '?'.$parsedURL['query'] : '')." HTTP/1.0\r\nHost: ".$parsedURL['host']."\r\n\r\n";
02340                         fputs ($fp, $msg);
02341                         while (!feof($fp))      {
02342                                 $line = fgets ($fp,2048);
02343                                 $content.=$line;
02344                                 if ($includeHeader==2 && !strlen(trim($line)))  { break; }      // Stop at the first empty line (= end of header)
02345                         }
02346                         fclose ($fp);
02347 
02348                 } elseif (function_exists('file_get_contents')) {
02349                         $content = @file_get_contents($url);
02350 
02351                 } elseif ($fd = @fopen($url,'rb'))    {
02352                         while (!feof($fd))      {
02353                                 $content.=fread($fd, 4096);
02354                         }
02355                         fclose($fd);
02356 
02357                 } else {
02358                         return false;
02359                 }
02360 
02361                 return $content;
02362         }
02363 
02372         function writeFile($file,$content)      {
02373                 if (!@is_file($file))   $changePermissions = true;
02374 
02375                 if ($fd = fopen($file,'wb'))    {
02376                         $res = fwrite($fd,$content);
02377                         fclose($fd);
02378 
02379                         if ($res===false)       return false;
02380 
02381                         if ($changePermissions) {       // Change the permissions only if the file has just been created
02382                                 t3lib_div::fixPermissions($file);
02383                         }
02384 
02385                         return true;
02386                 }
02387 
02388                 return false;
02389         }
02390 
02397         function fixPermissions($file)  {
02398                 if (@is_file($file) && TYPO3_OS!='WIN') {
02399                         @chmod($file, octdec($GLOBALS['TYPO3_CONF_VARS']['BE']['fileCreateMask']));             // "@" is there because file is not necessarily OWNED by the user
02400                         if($GLOBALS['TYPO3_CONF_VARS']['BE']['createGroup'])    {       // skip this if createGroup is empty
02401                                 @chgrp($file, $GLOBALS['TYPO3_CONF_VARS']['BE']['createGroup']);                // "@" is there because file is not necessarily OWNED by the user
02402                         }
02403                 }
02404         }
02405 
02414         function writeFileToTypo3tempDir($filepath,$content)    {
02415 
02416                         // Parse filepath into directory and basename:
02417                 $fI = pathinfo($filepath);
02418                 $fI['dirname'].= '/';
02419 
02420                         // Check parts:
02421                 if (t3lib_div::validPathStr($filepath) && $fI['basename'] && strlen($fI['basename'])<60)        {
02422                         if (defined('PATH_site'))       {
02423                                 $dirName = PATH_site.'typo3temp/';      // Setting main temporary directory name (standard)
02424                                 if (@is_dir($dirName))  {
02425                                         if (t3lib_div::isFirstPartOfStr($fI['dirname'],$dirName))       {
02426 
02427                                                         // Checking if the "subdir" is found:
02428                                                 $subdir = substr($fI['dirname'],strlen($dirName));
02429                                                 if ($subdir)    {
02430                                                         if (ereg('^[[:alnum:]_]+\/$',$subdir) || ereg('^[[:alnum:]_]+\/[[:alnum:]_]+\/$',$subdir))      {
02431                                                                 $dirName.= $subdir;
02432                                                                 if (!@is_dir($dirName)) {
02433                                                                         t3lib_div::mkdir_deep(PATH_site.'typo3temp/', $subdir);
02434                                                                 }
02435                                                         } else return 'Subdir, "'.$subdir.'", was NOT on the form "[[:alnum:]_]/" or  "[[:alnum:]_]/[[:alnum:]_]/"';
02436                                                 }
02437                                                         // Checking dir-name again (sub-dir might have been created):
02438                                                 if (@is_dir($dirName))  {
02439                                                         if ($filepath == $dirName.$fI['basename'])      {
02440                                                                 t3lib_div::writeFile($filepath, $content);
02441                                                                 if (!@is_file($filepath))       return 'File not written to disk! Write permission error in filesystem?';
02442                                                         } else return 'Calculated filelocation didn\'t match input $filepath!';
02443                                                 } else return '"'.$dirName.'" is not a directory!';
02444                                         } else return '"'.$fI['dirname'].'" was not within directory PATH_site + "typo3temp/"';
02445                                 } else return 'PATH_site + "typo3temp/" was not a directory!';
02446                         } else return 'PATH_site constant was NOT defined!';
02447                 } else return 'Input filepath "'.$filepath.'" was generally invalid!';
02448         }
02449 
02457         function mkdir($theNewFolder)   {
02458                 $theNewFolder = ereg_replace('\/$','',$theNewFolder);
02459                 if (mkdir($theNewFolder, octdec($GLOBALS['TYPO3_CONF_VARS']['BE']['folderCreateMask']))){
02460                         chmod($theNewFolder, octdec($GLOBALS['TYPO3_CONF_VARS']['BE']['folderCreateMask'])); //added this line, because the mode at 'mkdir' has a strange behaviour sometimes
02461 
02462                         if($GLOBALS['TYPO3_CONF_VARS']['BE']['createGroup'])    {       // skip this if createGroup is empty
02463                                 chgrp($theNewFolder, $GLOBALS['TYPO3_CONF_VARS']['BE']['createGroup']);
02464                         }
02465                         return TRUE;
02466                 }
02467         }
02468 
02476         function mkdir_deep($destination,$deepDir)      {
02477                 $allParts = t3lib_div::trimExplode('/',$deepDir,1);
02478                 $root = '';
02479                 foreach($allParts as $part)     {
02480                         $root.= $part.'/';
02481                         if (!is_dir($destination.$root))        {
02482                                 t3lib_div::mkdir($destination.$root);
02483                                 if (!@is_dir($destination.$root))       {
02484                                         return 'Error: The directory "'.$destination.$root.'" could not be created...';
02485                                 }
02486                         }
02487                 }
02488         }
02489 
02498         function get_dirs($path)        {
02499                 if ($path)      {
02500                         $d = @dir($path);
02501                         if (is_object($d))      {
02502                                 while($entry=$d->read()) {
02503                                         if (@is_dir($path.'/'.$entry) && $entry!= '..' && $entry!= '.') {
02504                                             $filearray[]=$entry;
02505                                         }
02506                                 }
02507                                 $d->close();
02508                         } else return 'error';
02509                         return $filearray;
02510                 }
02511         }
02512 
02523         function getFilesInDir($path,$extensionList='',$prependPath=0,$order='')        {
02524 
02525                         // Initialize variabels:
02526                 $filearray = array();
02527                 $sortarray = array();
02528                 $path = ereg_replace('\/$','',$path);
02529 
02530                         // Find files+directories:
02531                 if (@is_dir($path))     {
02532                         $extensionList = strtolower($extensionList);
02533                         $d = dir($path);
02534                         if (is_object($d))      {
02535                                 while($entry=$d->read()) {
02536                                         if (@is_file($path.'/'.$entry)) {
02537                                                 $fI = pathinfo($entry);
02538                                                 $key = md5($path.'/'.$entry);   // Don't change this ever - extensions may depend on the fact that the hash is an md5 of the path! (import/export extension)
02539                                                 if (!$extensionList || t3lib_div::inList($extensionList,strtolower($fI['extension'])))  {
02540                                                     $filearray[$key]=($prependPath?$path.'/':'').$entry;
02541                                                         if ($order=='mtime') {$sortarray[$key]=filemtime($path.'/'.$entry);}
02542                                                                 elseif ($order) {$sortarray[$key]=$entry;}
02543                                                 }
02544                                         }
02545                                 }
02546                                 $d->close();
02547                         } else return 'error opening path: "'.$path.'"';
02548                 }
02549 
02550                         // Sort them:
02551                 if ($order) {
02552                         asort($sortarray);
02553                         reset($sortarray);
02554                         $newArr=array();
02555                         while(list($k,$v)=each($sortarray))     {
02556                                 $newArr[$k]=$filearray[$k];
02557                         }
02558                         $filearray=$newArr;
02559                 }
02560 
02561                         // Return result
02562                 reset($filearray);
02563                 return $filearray;
02564         }
02565 
02577         function getAllFilesAndFoldersInPath($fileArr,$path,$extList='',$regDirs=0,$recursivityLevels=99)       {
02578                 if ($regDirs)   $fileArr[] = $path;
02579                 $fileArr = array_merge($fileArr, t3lib_div::getFilesInDir($path,$extList,1,1));
02580 
02581                 $dirs = t3lib_div::get_dirs($path);
02582                 if (is_array($dirs) && $recursivityLevels>0)    {
02583                         foreach ($dirs as $subdirs)     {
02584                                 if ((string)$subdirs!='')       {
02585                                         $fileArr = t3lib_div::getAllFilesAndFoldersInPath($fileArr,$path.$subdirs.'/',$extList,$regDirs,$recursivityLevels-1);
02586                                 }
02587                         }
02588                 }
02589                 return $fileArr;
02590         }
02591 
02600         function removePrefixPathFromList($fileArr,$prefixToRemove)     {
02601                 foreach($fileArr as $k => $absFileRef)  {
02602                         if(t3lib_div::isFirstPartOfStr($absFileRef,$prefixToRemove))    {
02603                                 $fileArr[$k] = substr($absFileRef,strlen($prefixToRemove));
02604                         } else return 'ERROR: One or more of the files was NOT prefixed with the prefix-path!';
02605                 }
02606                 return $fileArr;
02607         }
02608 
02616         function fixWindowsFilePath($theFile)   {
02617                 return str_replace('//','/', str_replace('\\','/', $theFile));
02618         }
02619 
02628         function resolveBackPath($pathStr)      {
02629                 $parts = explode('/',$pathStr);
02630                 $output=array();
02631                 $c = 0;
02632                 foreach($parts as $pV)  {
02633                         if ($pV=='..')  {
02634                                 if ($c) {
02635                                         array_pop($output);
02636                                         $c--;
02637                                 } else $output[]=$pV;
02638                         } else {
02639                                 $c++;
02640                                 $output[]=$pV;
02641                         }
02642                 }
02643                 return implode('/',$output);
02644         }
02645 
02656         function locationHeaderUrl($path)       {
02657                 $uI = parse_url($path);
02658                 if (substr($path,0,1)=='/')     { // relative to HOST
02659                         $path = t3lib_div::getIndpEnv('TYPO3_REQUEST_HOST').$path;
02660                 } elseif (!$uI['scheme'])       { // No scheme either
02661                         $path = t3lib_div::getIndpEnv('TYPO3_REQUEST_DIR').$path;
02662                 }
02663                 return $path;
02664         }
02665 
02666 
02667 
02668 
02669 
02670 
02671 
02672 
02673 
02674 
02675 
02676 
02677 
02678 
02679 
02680 
02681         /*************************
02682          *
02683          * DEBUG helper FUNCTIONS
02684          *
02685          *************************/
02686 
02696         function debug_ordvalue($string,$characters=100)        {
02697                 if(strlen($string) < $characters)       $characters = strlen($string);
02698                 for ($i=0; $i<$characters; $i++)        {
02699                         $valuestring.=' '.ord(substr($string,$i,1));
02700                 }
02701                 return trim($valuestring);
02702         }
02703 
02713         function view_array($array_in)  {
02714                 if (is_array($array_in))        {
02715                         $result='<table border="1" cellpadding="1" cellspacing="0" bgcolor="white">';
02716                         if (!count($array_in))  {$result.= '<tr><td><font face="Verdana,Arial" size="1"><b>'.htmlspecialchars("EMPTY!").'</b></font></td></tr>';}
02717                         while (list($key,$val)=each($array_in)) {
02718                                 $result.= '<tr><td valign="top"><font face="Verdana,Arial" size="1">'.htmlspecialchars((string)$key).'</font></td><td>';
02719                                 if (is_array($array_in[$key]))  {
02720                                         $result.=t3lib_div::view_array($array_in[$key]);
02721                                 } else
02722                                         $result.= '<font face="Verdana,Arial" size="1" color="red">'.nl2br(htmlspecialchars((string)$val)).'<br /></font>';
02723                                 $result.= '</td></tr>';
02724                         }
02725                         $result.= '</table>';
02726                 } else  {
02727                         $result  = false;
02728                 }
02729                 return $result;
02730         }
02731 
02741         function print_array($array_in) {
02742                 echo t3lib_div::view_array($array_in);
02743         }
02744 
02756         function debug($var="",$brOrHeader=0)   {
02757                 if ($brOrHeader && !t3lib_div::testInt($brOrHeader))    {
02758                         echo '<table class="typo3-debug" border="0" cellpadding="0" cellspacing="0" bgcolor="white" style="border:0px; margin-top:3px; margin-bottom:3px;"><tr><td style="background-color:#bbbbbb; font-family: verdana,arial; font-weight: bold; font-size: 10px;">'.htmlspecialchars((string)$brOrHeader).'</td></tr><tr><td>';
02759                 } elseif ($brOrHeader<0)        {
02760                         for($a=0;$a<abs(intval($brOrHeader));$a++){echo '<br />';}
02761                 }
02762 
02763                 if (is_array($var))     {
02764                         t3lib_div::print_array($var);
02765                 } elseif (is_object($var))      {
02766                         echo '<b>|Object:<pre>';
02767                         print_r($var);
02768                         echo '</pre>|</b>';
02769                 } elseif ((string)$var!='')     {
02770                         echo '<b>|'.htmlspecialchars((string)$var).'|</b>';
02771                 } else {
02772                         echo '<b>| debug |</b>';
02773                 }
02774 
02775                 if ($brOrHeader && !t3lib_div::testInt($brOrHeader))    {
02776                         echo '</td></tr></table>';
02777                 } elseif ($brOrHeader>0)        {
02778                         for($a=0;$a<intval($brOrHeader);$a++){echo '<br />';}
02779                 }
02780         }
02781 
02787         function debug_trail()  {
02788                 if (function_exists('debug_backtrace')) {
02789                         $trail = debug_backtrace();
02790                         $trail = array_reverse($trail);
02791                         array_pop($trail);
02792 
02793                         $path = array();
02794                         foreach($trail as $dat) {
02795                                 $path[] = $dat['class'].$dat['type'].$dat['function'];
02796                         }
02797 
02798                         return implode(' // ',$path);
02799                 } else return 'N/A';
02800         }
02801 
02809         function debugRows($rows,$header='')    {
02810                 if (is_array($rows))    {
02811                         reset($rows);
02812                         $firstEl = current($rows);
02813                         if (is_array($firstEl)) {
02814                                 $headerColumns = array_keys($firstEl);
02815                                 $tRows = array();
02816 
02817                                         // Header:
02818                                 $tRows[] = '<tr><td colspan="'.count($headerColumns).'" style="background-color:#bbbbbb; font-family: verdana,arial; font-weight: bold; font-size: 10px;"><strong>'.htmlspecialchars($header).'</strong></td></tr>';
02819                                 $tCells = array();
02820                                 foreach($headerColumns as $key) {
02821                                         $tCells[] = '
02822                                                         <td><font face="Verdana,Arial" size="1"><strong>'.htmlspecialchars($key).'</strong></font></td>';
02823                                 }
02824                                 $tRows[] = '
02825                                                 <tr>'.implode('',$tCells).'
02826                                                 </tr>';
02827 
02828                                         // Rows:
02829                                 foreach($rows as $singleRow)    {
02830                                         $tCells = array();
02831                                         foreach($headerColumns as $key) {
02832                                                 $tCells[] = '
02833                                                         <td><font face="Verdana,Arial" size="1">'.htmlspecialchars($singleRow[$key]).'</font></td>';
02834                                         }
02835                                         $tRows[] = '
02836                                                 <tr>'.implode('',$tCells).'
02837                                                 </tr>';
02838                                 }
02839 
02840                                 $table = '
02841                                         <table border="1" cellpadding="1" cellspacing="0" bgcolor="white">'.implode('',$tRows).'
02842                                         </table>';
02843                                 echo $table;
02844                         } else debug('Empty array of rows',$header);
02845                 } else debug('No array of rows',$header);
02846         }
02847 
02848 
02849 
02850 
02851 
02852 
02853 
02854 
02855 
02856 
02857 
02858 
02859 
02860 
02861 
02862 
02863 
02864 
02865 
02866 
02867 
02868 
02869 
02870 
02871 
02872 
02873 
02874 
02875         /*************************
02876          *
02877          * SYSTEM INFORMATION
02878          *
02879          *************************/
02880 
02887         function getThisUrl()   {
02888                 $p=parse_url(t3lib_div::getIndpEnv('TYPO3_REQUEST_SCRIPT'));            // Url of this script
02889                 $dir=t3lib_div::dirname($p['path']).'/';        // Strip file
02890                 $url = str_replace('//','/',$p['host'].($p['port']?':'.$p['port']:'').$dir);
02891                 return $url;
02892         }
02893 
02903         function linkThisScript($getParams=array())     {
02904                 $parts = t3lib_div::getIndpEnv('SCRIPT_NAME');
02905                 $params = t3lib_div::_GET();
02906 
02907                 foreach($getParams as $k => $v) {
02908                         if (strcmp($v,''))      {
02909                                 $params[$k]=$v;
02910                         } else unset($params[$k]);
02911                 }
02912 
02913                 $pString = t3lib_div::implodeArrayForUrl('',$params);
02914 
02915                 return $pString ? $parts.'?'.ereg_replace('^&','',$pString) : $parts;
02916         }
02917 
02927         function linkThisUrl($url,$getParams=array())   {
02928                 $parts = parse_url($url);
02929                 $getP = array();
02930                 if ($parts['query'])    {
02931                         parse_str($parts['query'],$getP);
02932                 }
02933                 $getP = t3lib_div::array_merge_recursive_overrule($getP,$getParams);
02934                 $uP = explode('?',$url);
02935 
02936                 $params = t3lib_div::implodeArrayForUrl('',$getP);
02937                 $outurl = $uP[0].($params ? '?'.substr($params, 1) : '');
02938 
02939                 return $outurl;
02940         }
02941 
02950         function getIndpEnv($getEnvName)        {
02951                 /*
02952                         Conventions:
02953                         output from parse_url():
02954                         URL:    http://username:password@192.168.1.4:8080/typo3/32/temp/phpcheck/index.php/arg1/arg2/arg3/?arg1,arg2,arg3&p1=parameter1&p2[key]=value#link1
02955                             [scheme] => 'http'
02956                             [user] => 'username'
02957                             [pass] => 'password'
02958                             [host] => '192.168.1.4'
02959                                 [port] => '8080'
02960                             [path] => '/typo3/32/temp/phpcheck/index.php/arg1/arg2/arg3/'
02961                             [query] => 'arg1,arg2,arg3&p1=parameter1&p2[key]=value'
02962                             [fragment] => 'link1'
02963 
02964                                 Further definition: [path_script] = '/typo3/32/temp/phpcheck/index.php'
02965                                                                         [path_dir] = '/typo3/32/temp/phpcheck/'
02966                                                                         [path_info] = '/arg1/arg2/arg3/'
02967                                                                         [path] = [path_script/path_dir][path_info]
02968 
02969 
02970                         Keys supported:
02971 
02972                         URI______:
02973                                 REQUEST_URI             =       [path]?[query]          = /typo3/32/temp/phpcheck/index.php/arg1/arg2/arg3/?arg1,arg2,arg3&p1=parameter1&p2[key]=value
02974                                 HTTP_HOST               =       [host][:[port]]         = 192.168.1.4:8080
02975                                 SCRIPT_NAME             =       [path_script]++         = /typo3/32/temp/phpcheck/index.php             // NOTICE THAT SCRIPT_NAME will return the php-script name ALSO. [path_script] may not do that (eg. '/somedir/' may result in SCRIPT_NAME '/somedir/index.php')!
02976                                 PATH_INFO               =       [path_info]                     = /arg1/arg2/arg3/
02977                                 QUERY_STRING    =       [query]                         = arg1,arg2,arg3&p1=parameter1&p2[key]=value
02978                                 HTTP_REFERER    =       [scheme]://[host][:[port]][path]        = http://192.168.1.4:8080/typo3/32/temp/phpcheck/index.php/arg1/arg2/arg3/?arg1,arg2,arg3&p1=parameter1&p2[key]=value
02979                                                                                 (Notice: NO username/password + NO fragment)
02980 
02981                         CLIENT____:
02982                                 REMOTE_ADDR             =       (client IP)
02983                                 REMOTE_HOST             =       (client host)
02984                                 HTTP_USER_AGENT =       (client user agent)
02985                                 HTTP_ACCEPT_LANGUAGE    = (client accept language)
02986 
02987                         SERVER____:
02988                                 SCRIPT_FILENAME =       Absolute filename of script             (Differs between windows/unix). On windows 'C:\\blabla\\blabl\\' will be converted to 'C:/blabla/blabl/'
02989 
02990                         Special extras:
02991                                 TYPO3_HOST_ONLY =               [host]                  = 192.168.1.4
02992                                 TYPO3_PORT              =               [port]                  = 8080 (blank if 80, taken from host value)
02993                                 TYPO3_REQUEST_HOST =    [scheme]://[host][:[port]]
02994                                 TYPO3_REQUEST_URL =             [scheme]://[host][:[port]][path]?[query]        (sheme will by default be 'http' until we can detect if it's https -
02995                                 TYPO3_REQUEST_SCRIPT =  [scheme]://[host][:[port]][path_script]
02996                                 TYPO3_REQUEST_DIR =             [scheme]://[host][:[port]][path_dir]
02997                                 TYPO3_SITE_URL =                [scheme]://[host][:[port]][path_dir] of the TYPO3 website frontend
02998                                 TYPO3_SITE_SCRIPT =     [script / Speaking URL] of the TYPO3 website
02999                                 TYPO3_DOCUMENT_ROOT     =       Absolute path of root of documents:     TYPO3_DOCUMENT_ROOT.SCRIPT_NAME = SCRIPT_FILENAME (typically)
03000 
03001                         Notice: [fragment] is apparently NEVER available to the script!
03002 
03003 
03004                         Testing suggestions:
03005                         - Output all the values.
03006                         - In the script, make a link to the script it self, maybe add some parameters and click the link a few times so HTTP_REFERER is seen
03007                         - ALSO TRY the script from the ROOT of a site (like 'http://www.mytest.com/' and not 'http://www.mytest.com/test/' !!)
03008 
03009                 */
03010 
03011 #               if ($getEnvName=='HTTP_REFERER')        return '';
03012 
03013                 $retVal = '';
03014 
03015                 switch((string)$getEnvName)     {
03016                         case 'SCRIPT_NAME':
03017                                 $retVal = (php_sapi_name()=='cgi'||php_sapi_name()=='cgi-fcgi')&&($_SERVER['ORIG_PATH_INFO']?$_SERVER['ORIG_PATH_INFO']:$_SERVER['PATH_INFO']) ? ($_SERVER['ORIG_PATH_INFO']?$_SERVER['ORIG_PATH_INFO']:$_SERVER['PATH_INFO']) : ($_SERVER['ORIG_SCRIPT_NAME']?$_SERVER['ORIG_SCRIPT_NAME']:$_SERVER['SCRIPT_NAME']);
03018                         break;
03019                         case 'SCRIPT_FILENAME':
03020                                 $retVal = str_replace('//','/', str_replace('\\','/', (php_sapi_name()=='cgi'||php_sapi_name()=='isapi' ||php_sapi_name()=='cgi-fcgi')&&($_SERVER['ORIG_PATH_TRANSLATED']?$_SERVER['ORIG_PATH_TRANSLATED']:$_SERVER['PATH_TRANSLATED'])? ($_SERVER['ORIG_PATH_TRANSLATED']?$_SERVER['ORIG_PATH_TRANSLATED']:$_SERVER['PATH_TRANSLATED']):($_SERVER['ORIG_SCRIPT_FILENAME']?$_SERVER['ORIG_SCRIPT_FILENAME']:$_SERVER['SCRIPT_FILENAME'])));
03021                         break;
03022                         case 'REQUEST_URI':
03023                                         // Typical application of REQUEST_URI is return urls, forms submitting to itself etc. Example: returnUrl='.rawurlencode(t3lib_div::getIndpEnv('REQUEST_URI'))
03024                                 if (!$_SERVER['REQUEST_URI'])   {       // This is for ISS/CGI which does not have the REQUEST_URI available.
03025                                         $retVal = '/'.ereg_replace('^/','',t3lib_div::getIndpEnv('SCRIPT_NAME')).
03026                                                 ($_SERVER['QUERY_STRING']?'?'.$_SERVER['QUERY_STRING']:'');
03027                                 } else $retVal = $_SERVER['REQUEST_URI'];
03028                         break;
03029                         case 'PATH_INFO':
03030                                         // $_SERVER['PATH_INFO']!=$_SERVER['SCRIPT_NAME'] is necessary because some servers (Windows/CGI) are seen to set PATH_INFO equal to script_name
03031                                         // Further, there must be at least one '/' in the path - else the PATH_INFO value does not make sense.
03032                                         // IF 'PATH_INFO' never works for our purpose in TYPO3 with CGI-servers, then 'php_sapi_name()=='cgi'' might be a better check. Right now strcmp($_SERVER['PATH_INFO'],t3lib_div::getIndpEnv('SCRIPT_NAME')) will always return false for CGI-versions, but that is only as long as SCRIPT_NAME is set equal to PATH_INFO because of php_sapi_name()=='cgi' (see above)
03033 //                              if (strcmp($_SERVER['PATH_INFO'],t3lib_div::getIndpEnv('SCRIPT_NAME')) && count(explode('/',$_SERVER['PATH_INFO']))>1)  {
03034                                 if (php_sapi_name()!='cgi'&&php_sapi_name()!='cgi-fcgi')        {
03035                                         $retVal = $_SERVER['PATH_INFO'];
03036                                 }
03037                         break;
03038                                 // These are let through without modification
03039                         case 'REMOTE_ADDR':
03040                         case 'REMOTE_HOST':
03041                         case 'HTTP_REFERER':
03042                         case 'HTTP_HOST':
03043                         case 'HTTP_USER_AGENT':
03044                         case 'HTTP_ACCEPT_LANGUAGE':
03045                         case 'QUERY_STRING':
03046                                 $retVal = $_SERVER[$getEnvName];
03047                         break;
03048                         case 'TYPO3_DOCUMENT_ROOT':
03049                                 // Some CGI-versions (LA13CGI) and mod-rewrite rules on MODULE versions will deliver a 'wrong' DOCUMENT_ROOT (according to our description). Further various aliases/mod_rewrite rules can disturb this as well.
03050                                 // Therefore the DOCUMENT_ROOT is now always calculated as the SCRIPT_FILENAME minus the end part shared with SCRIPT_NAME.
03051                                 $SFN = t3lib_div::getIndpEnv('SCRIPT_FILENAME');
03052                                 $SN_A = explode('/',strrev(t3lib_div::getIndpEnv('SCRIPT_NAME')));
03053                                 $SFN_A = explode('/',strrev($SFN));
03054                                 $acc = array();
03055                                 while(list($kk,$vv)=each($SN_A))        {
03056                                         if (!strcmp($SFN_A[$kk],$vv))   {
03057                                                 $acc[] = $vv;
03058                                         } else break;
03059                                 }
03060                                 $commonEnd=strrev(implode('/',$acc));
03061                                 if (strcmp($commonEnd,''))      { $DR = substr($SFN,0,-(strlen($commonEnd)+1)); }
03062                                 $retVal = $DR;
03063                         break;
03064                         case 'TYPO3_HOST_ONLY':
03065                                 $p = explode(':',$_SERVER['HTTP_HOST']);
03066                                 $retVal = $p[0];
03067                         break;
03068                         case 'TYPO3_PORT':
03069                                 $p = explode(':',$_SERVER['HTTP_HOST']);
03070                                 $retVal = $p[1];
03071                         break;
03072                         case 'TYPO3_REQUEST_HOST':
03073                                 $retVal = (t3lib_div::getIndpEnv('TYPO3_SSL') ? 'https://' : 'http://').
03074                                         $_SERVER['HTTP_HOST'];
03075                         break;
03076                         case 'TYPO3_REQUEST_URL':
03077                                 $retVal = t3lib_div::getIndpEnv('TYPO3_REQUEST_HOST').t3lib_div::getIndpEnv('REQUEST_URI');
03078                         break;
03079                         case 'TYPO3_REQUEST_SCRIPT':
03080                                 $retVal = t3lib_div::getIndpEnv('TYPO3_REQUEST_HOST').t3lib_div::getIndpEnv('SCRIPT_NAME');
03081                         break;
03082                         case 'TYPO3_REQUEST_DIR':
03083                                 $retVal = t3lib_div::getIndpEnv('TYPO3_REQUEST_HOST').t3lib_div::dirname(t3lib_div::getIndpEnv('SCRIPT_NAME')).'/';
03084                         break;
03085                         case 'TYPO3_SITE_URL':
03086                                 if (defined('PATH_thisScript') && defined('PATH_site')) {
03087                                         $lPath = substr(dirname(PATH_thisScript),strlen(PATH_site)).'/';
03088                                         $url = t3lib_div::getIndpEnv('TYPO3_REQUEST_DIR');
03089                                         $siteUrl = substr($url,0,-strlen($lPath));
03090                                         if (substr($siteUrl,-1)!='/')   $siteUrl.='/';
03091                                         $retVal = $siteUrl;
03092                                 }
03093                         break;
03094                         case 'TYPO3_SITE_SCRIPT':
03095                                 $retVal = substr(t3lib_div::getIndpEnv('TYPO3_REQUEST_URL'),strlen(t3lib_div::getIndpEnv('TYPO3_SITE_URL')));
03096                         break;
03097                         case 'TYPO3_SSL':
03098                                 $retVal = $_SERVER['SSL_SESSION_ID'] || !strcmp($_SERVER['HTTPS'],'on') ? TRUE : FALSE;
03099                         break;
03100                         case '_ARRAY':
03101                                 $out = array();
03102                                         // Here, list ALL possible keys to this function for debug display.
03103                                 $envTestVars = t3lib_div::trimExplode(',','
03104                                         HTTP_HOST,
03105                                         TYPO3_HOST_ONLY,
03106                                         TYPO3_PORT,
03107                                         PATH_INFO,
03108                                         QUERY_STRING,
03109                                         REQUEST_URI,
03110                                         HTTP_REFERER,
03111                                         TYPO3_REQUEST_HOST,
03112                                         TYPO3_REQUEST_URL,
03113                                         TYPO3_REQUEST_SCRIPT,
03114                                         TYPO3_REQUEST_DIR,
03115                                         TYPO3_SITE_URL,
03116                                         TYPO3_SITE_SCRIPT,
03117                                         TYPO3_SSL,
03118                                         SCRIPT_NAME,
03119                                         TYPO3_DOCUMENT_ROOT,
03120                                         SCRIPT_FILENAME,
03121                                         REMOTE_ADDR,
03122                                         REMOTE_HOST,
03123                                         HTTP_USER_AGENT,
03124                                         HTTP_ACCEPT_LANGUAGE',1);
03125                                 reset($envTestVars);
03126                                 while(list(,$v)=each($envTestVars))     {
03127                                         $out[$v]=t3lib_div::getIndpEnv($v);
03128                                 }
03129                                 reset($out);
03130                                 $retVal = $out;
03131                         break;
03132                 }
03133                 return $retVal;
03134         }
03135 
03143         function milliseconds() {
03144                 $p=explode(' ',microtime());
03145                 return round(($p[0]+$p[1])*1000);
03146         }
03147 
03155         function clientInfo($useragent='')      {
03156                 if (!$useragent) $useragent=t3lib_div::getIndpEnv('HTTP_USER_AGENT');
03157 
03158                 $bInfo=array();
03159                         // Which browser?
03160                 if (strstr($useragent,'Konqueror'))     {
03161                         $bInfo['BROWSER']= 'konqu';
03162                 } elseif (strstr($useragent,'Opera'))   {
03163                         $bInfo['BROWSER']= 'opera';
03164                 } elseif (strstr($useragent,'MSIE 4') || strstr($useragent,'MSIE 5') || strstr($useragent,'MSIE 6'))    {
03165                         $bInfo['BROWSER']= 'msie';
03166                 } elseif (strstr($useragent,'Mozilla/4') || strstr($useragent,'Mozilla/5'))     {
03167                         $bInfo['BROWSER']='net';
03168                 }
03169                 if ($bInfo['BROWSER'])  {
03170                                 // Browser version
03171                         switch($bInfo['BROWSER'])       {
03172                                 case 'net':
03173                                         $bInfo['VERSION']= doubleval(substr($useragent,8));
03174                                         if (strstr($useragent,'Netscape6/')) {$bInfo['VERSION']=doubleval(substr(strstr($useragent,'Netscape6/'),10));}
03175                                         if (strstr($useragent,'Netscape/7')) {$bInfo['VERSION']=doubleval(substr(strstr($useragent,'Netscape/7'),9));}
03176                                 break;
03177                                 case 'msie':
03178                                         $tmp = strstr($useragent,'MSIE');
03179                                         $bInfo['VERSION'] = doubleval(ereg_replace('^[^0-9]*','',substr($tmp,4)));
03180                                 break;
03181                                 case 'opera':
03182                                         $tmp = strstr($useragent,'Opera');
03183                                         $bInfo['VERSION'] = doubleval(ereg_replace('^[^0-9]*','',substr($tmp,5)));
03184                                 break;
03185                                 case 'konqu':
03186                                         $tmp = strstr($useragent,'Konqueror/');
03187                                         $bInfo['VERSION'] = doubleval(substr($tmp,10));
03188                                 break;
03189                         }
03190                                 // Client system
03191                         if (strstr($useragent,'Win'))   {
03192                                 $bInfo['SYSTEM'] = 'win';
03193                         } elseif (strstr($useragent,'Mac'))     {
03194                                 $bInfo['SYSTEM'] = 'mac';
03195                         } elseif (strstr($useragent,'Linux') || strstr($useragent,'X11') || strstr($useragent,'SGI') || strstr($useragent,' SunOS ') || strstr($useragent,' HP-UX '))   {
03196                                 $bInfo['SYSTEM'] = 'unix';
03197                         }
03198                 }
03199                         // Is true if the browser supports css to format forms, especially the width
03200                 $bInfo['FORMSTYLE']=($bInfo['BROWSER']=='msie' || ($bInfo['BROWSER']=='net'&&$bInfo['VERSION']>=5) || $bInfo['BROWSER']=='opera' || $bInfo['BROWSER']=='konqu');
03201 
03202                 return $bInfo;
03203         }
03204 
03205 
03206 
03207 
03208 
03209 
03210 
03211 
03212 
03213 
03214 
03215 
03216 
03217 
03218 
03219 
03220 
03221 
03222 
03223 
03224 
03225 
03226 
03227         /*************************
03228          *
03229          * TYPO3 SPECIFIC FUNCTIONS
03230          *
03231          *************************/
03232 
03242         function getFileAbsFileName($filename,$onlyRelative=1,$relToTYPO3_mainDir=0)    {
03243                 if (!strcmp($filename,''))              return '';
03244 
03245                 if ($relToTYPO3_mainDir)        {
03246                         if (!defined('PATH_typo3'))     return '';
03247                         $relPathPrefix = PATH_typo3;
03248                 } else {
03249                         $relPathPrefix = PATH_site;
03250                 }
03251                 if (substr($filename,0,4)=='EXT:')      {       // extension
03252                         list($extKey,$local) = explode('/',substr($filename,4),2);
03253                         $filename='';
03254                         if (strcmp($extKey,'') && t3lib_extMgm::isLoaded($extKey) && strcmp($local,'')) {
03255                                 $filename = t3lib_extMgm::extPath($extKey).$local;
03256                         }
03257                 } elseif (!t3lib_div::isAbsPath($filename))     {       // relative. Prepended with $relPathPrefix
03258                         $filename=$relPathPrefix.$filename;
03259                 } elseif ($onlyRelative && !t3lib_div::isFirstPartOfStr($filename,$relPathPrefix)) {    // absolute, but set to blank if not allowed
03260                         $filename='';
03261                 }
03262                 if (strcmp($filename,'') && t3lib_div::validPathStr($filename)) {       // checks backpath.
03263                         return $filename;
03264                 }
03265         }
03266 
03278         function validPathStr($theFile) {
03279                 if (!strstr($theFile,'//') && !strstr($theFile,'..') && !strstr($theFile,'\\')) return true;
03280         }
03281 
03289         function isAbsPath($path)       {
03290                 return TYPO3_OS=='WIN' ? substr($path,1,2)==':/' :  substr($path,0,1)=='/';
03291         }
03292 
03300         function isAllowedAbsPath($path)        {
03301                 if (t3lib_div::isAbsPath($path) &&
03302                         t3lib_div::validPathStr($path) &&
03303                                 (       t3lib_div::isFirstPartOfStr($path,PATH_site)
03304                                         ||
03305                                         ($GLOBALS['TYPO3_CONF_VARS']['BE']['lockRootPath'] && t3lib_div::isFirstPartOfStr($path,$GLOBALS['TYPO3_CONF_VARS']['BE']['lockRootPath']))
03306                                 )
03307                         )       return true;
03308         }
03309 
03317         function verifyFilenameAgainstDenyPattern($filename)    {
03318                 if (strcmp($filename,'') && strcmp($GLOBALS['TYPO3_CONF_VARS']['BE']['fileDenyPattern'],''))    {
03319                         $result = eregi($GLOBALS['TYPO3_CONF_VARS']['BE']['fileDenyPattern'],$filename);
03320                         if ($result)    return false;   // so if a matching filename is found, return false;
03321                 }
03322                 return true;
03323         }
03324 
03335         function upload_copy_move($source,$destination) {
03336                 if (is_uploaded_file($source))  {
03337                         $uploaded = TRUE;
03338                         // Return the value of move_uploaded_file, and if false the temporary $source is still around so the user can use unlink to delete it:
03339                         $uploadedResult = move_uploaded_file($source, $destination);
03340                 } else {
03341                         $uploaded = FALSE;
03342                         @copy($source,$destination);
03343                 }
03344 
03345                 t3lib_div::fixPermissions($destination);        // Change the permissions of the file
03346 
03347                         // If here the file is copied and the temporary $source is still around, so when returning false the user can try unlink to delete the $source
03348                 return $uploaded ? $uploadedResult : FALSE;
03349         }
03350 
03361         function upload_to_tempfile($uploadedFileName)  {
03362                 if (is_uploaded_file($uploadedFileName))        {
03363                         $tempFile = t3lib_div::tempnam('upload_temp_');
03364                         move_uploaded_file($uploadedFileName, $tempFile);
03365                         return @is_file($tempFile) ? $tempFile : '';
03366                 }
03367         }
03368 
03379         function unlink_tempfile($uploadedTempFileName) {
03380                 if ($uploadedTempFileName && t3lib_div::validPathStr($uploadedTempFileName) && t3lib_div::isFirstPartOfStr($uploadedTempFileName,PATH_site.'typo3temp/') && @is_file($uploadedTempFileName))    {
03381                         if (unlink($uploadedTempFileName))      return TRUE;
03382                 }
03383         }
03384 
03395         function tempnam($filePrefix)   {
03396                 return tempnam(PATH_site.'typo3temp/',$filePrefix);
03397         }
03398 
03409         function stdAuthCode($uid_or_record,$fields='',$codeLength=8)   {
03410 
03411                 if (is_array($uid_or_record))   {
03412                         $recCopy_temp=array();
03413                         if ($fields)    {
03414                                 $fieldArr = t3lib_div::trimExplode(',',$fields,1);
03415                                 reset($fieldArr);
03416                                 while(list($k,$v)=each($fieldArr))      {
03417                                         $recCopy_temp[$k]=$uid_or_record[$v];
03418                                 }
03419                         } else {
03420                                 $recCopy_temp=$uid_or_record;
03421                         }
03422                         $preKey = implode('|',$recCopy_temp);
03423                 } else {
03424                         $preKey = $uid_or_record;
03425                 }
03426 
03427                 $authCode = $preKey.'||'.$GLOBALS['TYPO3_CONF_VARS']['SYS']['encryptionKey'];
03428                 $authCode = substr(md5($authCode),0,$codeLength);
03429                 return $authCode;
03430         }
03431 
03440         function cHashParams($addQueryParams) {
03441                 $params = explode('&',substr($addQueryParams,1));       // Splitting parameters up
03442 
03443                         // Make array:
03444                 $pA = array();
03445                 foreach($params as $theP)       {
03446                         $pKV = explode('=', $theP);     // Splitting single param by '=' sign
03447                         if (!t3lib_div::inList('id,type,no_cache,cHash,MP,ftu',$pKV[0]))        {
03448                                 $pA[rawurldecode($pKV[0])] = (string)rawurldecode($pKV[1]);
03449                         }
03450                 }
03451                 $pA['encryptionKey'] = $GLOBALS['TYPO3_CONF_VARS']['SYS']['encryptionKey'];
03452                 ksort($pA);
03453 
03454                 return $pA;
03455         }
03456 
03463         function hideIfNotTranslated($l18n_cfg_fieldValue)      {
03464                 if ($GLOBALS['TYPO3_CONF_VARS']['FE']['hidePagesIfNotTranslatedByDefault'])     {
03465                         return $l18n_cfg_fieldValue&2 ? FALSE : TRUE;
03466                 } else {
03467                         return $l18n_cfg_fieldValue&2 ? TRUE : FALSE;
03468                 }
03469         }
03470 
03478         function readLLfile($fileRef,$langKey)  {
03479 
03480                 $file = t3lib_div::getFileAbsFileName($fileRef);
03481                 if ($file)      {
03482                         $baseFile = ereg_replace('\.(php|xml)$', '', $file);
03483 
03484                         if (@is_file($baseFile.'.xml')) {
03485                                 $LOCAL_LANG = t3lib_div::readLLXMLfile($baseFile.'.xml', $langKey);
03486                         } elseif (@is_file($baseFile.'.php'))   {
03487                                 include($baseFile.'.php');
03488                         } else die('Filereference, "'.$file.'", not found!');
03489                 }
03490 
03491                 return is_array($LOCAL_LANG)?$LOCAL_LANG:array();
03492         }
03493 
03502         function readLLXMLfile($fileRef,$langKey)       {
03503 
03504                 if (is_object($GLOBALS['LANG']))        {
03505                         $csConvObj = &$GLOBALS['LANG']->csConvObj;
03506                 } elseif (is_object($GLOBALS['TSFE']))  {
03507                         $csConvObj = &$GLOBALS['TSFE']->csConvObj;
03508                 } else $csConvObj = NULL;
03509 
03510                 if (@is_file($fileRef) && $langKey && is_object($csConvObj))    {
03511 
03512                                 // Set charset:
03513                         $origCharset = $csConvObj->parse_charset($csConvObj->charSetArray[$langKey] ? $csConvObj->charSetArray[$langKey] : 'iso-8859-1');
03514 
03515                                 // Cache file name:
03516                         $hashSource = substr($fileRef,strlen(PATH_site)).'|'.date('d-m-Y H:i:s',filemtime($fileRef)).'|version=2.2';
03517                         $cacheFileName = PATH_site.'typo3temp/llxml/'.
03518                                                         #str_replace('_','',ereg_replace('^.*\/','',dirname($fileRef))).
03519                                                         #'_'.basename($fileRef).
03520                                                         substr(basename($fileRef),10,15).
03521                                                         '_'.t3lib_div::shortMD5($hashSource).'.'.$langKey.'.'.$origCharset.'.cache';
03522 
03523                                 // Check if cache file exists...
03524                         if (!@is_file($cacheFileName))  {       // ... if it doesn't, create content and write it:
03525 
03526                                         // Read XML, parse it.
03527                                 $xmlString = t3lib_div::getUrl($fileRef);
03528                                 $xmlContent = t3lib_div::xml2array($xmlString);
03529                                 if (!is_array($xmlContent))     {
03530                                         die($fileRef.' was not XML!: '.$xmlContent);
03531                                 }
03532 
03533                                         // Set default LOCAL_LANG array content:
03534                                 $LOCAL_LANG = array();
03535                                 $LOCAL_LANG['default'] = $xmlContent['data']['default'];
03536 
03537                                         // Converting charset of default language from utf-8 to iso-8859-1 (since that is what the system would expect for default langauge in the core due to historical reasons)
03538                                         // This conversion is unneccessary for 99,99% of all default labels since they are in english, therefore ASCII.
03539                                         // However, an extension like TemplaVoila uses an extended character in its name, even in Default language. To accommodate that (special chars for default) this conversion must be made.
03540                                         // Since the output from this function is probably always cached it is considered insignificant to do this conversion.
03541                                         // - kasper
03542                                 if (is_array($LOCAL_LANG['default']))   {
03543                                         foreach($LOCAL_LANG['default'] as $labelKey => $labelValue)     {
03544                                                 $LOCAL_LANG['default'][$labelKey] = $csConvObj->utf8_decode($labelValue,'iso-8859-1');
03545                                         }
03546                                 }
03547 
03548                                         // Specific language, convert from utf-8 to backend language charset:
03549                                         // NOTICE: Converting from utf-8 back to "native" language may be a temporary solution until we can totally discard "locallang.php" files altogether (and use utf-8 for everything). But doing this conversion is the quickest way to migrate now and the source is in utf-8 anyway which is the main point.
03550                                 if ($langKey!='default')        {
03551 
03552                                                 // If no entry is found for the language key, then force a value depending on meta-data setting. By default an automated filename will be used:
03553                                         if (!isset($xmlContent['data'][$langKey]))      {
03554                                                 $LOCAL_LANG[$langKey] = t3lib_div::llXmlAutoFileName($fileRef, $langKey);
03555                                         } else {
03556                                                 $LOCAL_LANG[$langKey] = $xmlContent['data'][$langKey];
03557                                         }
03558 
03559                                                 // Checking if charset should be converted.
03560                                         if (is_array($LOCAL_LANG[$langKey]) && $origCharset!='utf-8')   {
03561                                                 foreach($LOCAL_LANG[$langKey] as $labelKey => $labelValue)      {
03562                                                         $LOCAL_LANG[$langKey][$labelKey] = $csConvObj->utf8_decode($labelValue,$origCharset);
03563                                                 }
03564                                         }
03565                                 }
03566 
03567                                         // Cache the content now:
03568                                 $serContent = array('origFile'=>$hashSource, 'LOCAL_LANG'=>$LOCAL_LANG);
03569                                 $res = t3lib_div::writeFileToTypo3tempDir($cacheFileName, serialize($serContent));
03570                                 if ($res)       die('ERROR: '.$res);
03571                         } else {
03572                                         // Get content from cache:
03573                                 $serContent = unserialize(t3lib_div::getUrl($cacheFileName));
03574                                 $LOCAL_LANG = $serContent['LOCAL_LANG'];
03575                         }
03576 
03577                                 // Checking for EXTERNAL file for non-default language:
03578                         if ($langKey!='default' && is_string($LOCAL_LANG[$langKey]) && strlen($LOCAL_LANG[$langKey]))   {
03579 
03580                                         // Look for localized file:
03581                                 $localized_file = t3lib_div::getFileAbsFileName($LOCAL_LANG[$langKey]);
03582                                 if ($localized_file && @is_file($localized_file))       {
03583 
03584                                                 // Cache file name:
03585                                         $hashSource = substr($localized_file,strlen(PATH_site)).'|'.date('d-m-Y H:i:s',filemtime($localized_file));
03586                                         $cacheFileName = PATH_site.'typo3temp/llxml/ext_'.
03587                                                                         substr(basename($localized_file),10,15).
03588                                                                         '_'.t3lib_div::shortMD5($hashSource).'.'.$langKey.'.'.$origCharset.'.cache';
03589 
03590                                                 // Check if cache file exists...
03591                                         if (!@is_file($cacheFileName))  {       // ... if it doesn't, create content and write it:
03592 
03593                                                         // Read and parse XML content:
03594                                                 $local_xmlString = t3lib_div::getUrl($localized_file);
03595                                                 $local_xmlContent = t3lib_div::xml2array($local_xmlString);
03596                                                 $LOCAL_LANG[$langKey] = is_array($local_xmlContent['data'][$langKey]) ? $local_xmlContent['data'][$langKey] : array();
03597 
03598                                                         // Checking if charset should be converted.
03599                                                 if (is_array($LOCAL_LANG[$langKey]) && $origCharset!='utf-8')   {
03600                                                         foreach($LOCAL_LANG[$langKey] as $labelKey => $labelValue)      {
03601                                                                 $LOCAL_LANG[$langKey][$labelKey] = $csConvObj->utf8_decode($labelValue,$origCharset);
03602                                                         }
03603                                                 }
03604 
03605                                                         // Cache the content now:
03606                                                 $serContent = array('extlang'=>$langKey, 'origFile'=>$LOCAL_LANG[$langKey], 'EXT_DATA'=>$LOCAL_LANG[$langKey]);
03607                                                 $res = t3lib_div::writeFileToTypo3tempDir($cacheFileName, serialize($serContent));
03608                                                 if ($res)       die('ERROR: '.$res);
03609                                         } else {
03610                                                         // Get content from cache:
03611                                                 $serContent = unserialize(t3lib_div::getUrl($cacheFileName));
03612                                                 $LOCAL_LANG[$langKey] = $serContent['EXT_DATA'];
03613                                         }
03614                                 } else {
03615                                         $LOCAL_LANG[$langKey] = array();
03616                                 }
03617                         }
03618 
03619                         return $LOCAL_LANG;
03620                 }
03621         }
03622 
03630         function llXmlAutoFileName($fileRef,$language)  {
03631 
03632                         // Analyse file reference:
03633                 $location = 'typo3conf/l10n/'.$language.'/';    // Default location of translations
03634                 if (t3lib_div::isFirstPartOfStr($fileRef,PATH_site.TYPO3_mainDir.'sysext/'))    {       // Is system:
03635                         $validatedPrefix = PATH_site.TYPO3_mainDir.'sysext/';
03636                         #$location = 'EXT:csh_'.$language.'/';  // For system extensions translations are found in "csh_*" extensions (language packs)
03637                 } elseif (t3lib_div::isFirstPartOfStr($fileRef,PATH_site.TYPO3_mainDir.'ext/')) {       // Is global:
03638                         $validatedPrefix = PATH_site.TYPO3_mainDir.'ext/';
03639                 } elseif (t3lib_div::isFirstPartOfStr($fileRef,PATH_site.'typo3conf/ext/'))     {       // Is local:
03640                         $validatedPrefix = PATH_site.'typo3conf/ext/';
03641                 } else {
03642                         $validatedPrefix = '';
03643                 }
03644 
03645                 if ($validatedPrefix)   {
03646 
03647                                 // Divide file reference into extension key, directory (if any) and base name:
03648                         list($file_extKey,$file_extPath) = explode('/',substr($fileRef,strlen($validatedPrefix)),2);
03649                         $temp = t3lib_div::revExplode('/',$file_extPath,2);
03650                         if (count($temp)==1)    array_unshift($temp,'');        // Add empty first-entry if not there.
03651                         list($file_extPath,$file_fileName) = $temp;
03652 
03653                                 // The filename is prefixed with "[language key]." because it prevents the llxmltranslate tool from detecting it.
03654                         return $location.
03655                                 $file_extKey.'/'.
03656                                 ($file_extPath?$file_extPath.'/':'').
03657                                 $language.'.'.$file_fileName;
03658                 } else return NULL;
03659         }
03660 
03661 
03674         function loadTCA($table)        {
03675                 global $TCA,$LANG_GENERAL_LABELS;
03676                 if (isset($TCA[$table]) && !is_array($TCA[$table]['columns']) && $TCA[$table]['ctrl']['dynamicConfigFile'])     {
03677                         if (!strcmp(substr($TCA[$table]['ctrl']['dynamicConfigFile'],0,6),'T3LIB:'))    {
03678                                 include(PATH_t3lib.'stddb/'.substr($TCA[$table]['ctrl']['dynamicConfigFile'],6));
03679                         } elseif (t3lib_div::isAbsPath($TCA[$table]['ctrl']['dynamicConfigFile']) && @is_file($TCA[$table]['ctrl']['dynamicConfigFile']))       {       // Absolute path...
03680                                 include($TCA[$table]['ctrl']['dynamicConfigFile']);
03681                         } else include(PATH_typo3conf.$TCA[$table]['ctrl']['dynamicConfigFile']);
03682                 }
03683         }
03684 
03694         function resolveSheetDefInDS($dataStructArray,$sheet='sDEF')    {
03695                 if (!is_array ($dataStructArray)) return 'Data structure must be an array';
03696 
03697                 if (is_array($dataStructArray['sheets']))       {
03698                         $singleSheet = FALSE;
03699                         if (!isset($dataStructArray['sheets'][$sheet])) {
03700                                 $sheet='sDEF';
03701                         }
03702                         $dataStruct =  $dataStructArray['sheets'][$sheet];
03703 
03704                                 // If not an array, but still set, then regard it as a relative reference to a file:
03705                         if ($dataStruct && !is_array($dataStruct))      {
03706                                 $file = t3lib_div::getFileAbsFileName($dataStruct);
03707                                 if ($file && @is_file($file))   {
03708                                         $dataStruct = t3lib_div::xml2array(t3lib_div::getUrl($file));
03709                                 }
03710                         }
03711                 } else {
03712                         $singleSheet = TRUE;
03713                         $dataStruct = $dataStructArray;
03714                         if (isset($dataStruct['meta'])) unset($dataStruct['meta']);     // Meta data should not appear there.
03715                         $sheet = 'sDEF';        // Default sheet
03716                 }
03717                 return array($dataStruct,$sheet,$singleSheet);
03718         }
03719 
03727         function resolveAllSheetsInDS($dataStructArray) {
03728                 if (is_array($dataStructArray['sheets']))       {
03729                         $out=array('sheets'=>array());
03730                         foreach($dataStructArray['sheets'] as $sheetId => $sDat)        {
03731                                 list($ds,$aS) = t3lib_div::resolveSheetDefInDS($dataStructArray,$sheetId);
03732                                 if ($sheetId==$aS)      {
03733                                         $out['sheets'][$aS]=$ds;
03734                                 }
03735                         }
03736                 } else {
03737                         list($ds) = t3lib_div::resolveSheetDefInDS($dataStructArray);
03738                         $out = array('sheets' => array('sDEF' => $ds));
03739                 }
03740                 return $out;
03741         }
03742 
03756         function callUserFunction($funcName,&$params,&$ref,$checkPrefix='user_',$silent=0)      {
03757                 global $TYPO3_CONF_VARS;
03758 
03759                         // Check persistent object and if found, call directly and exit.
03760                 if (is_array($GLOBALS['T3_VAR']['callUserFunction'][$funcName]))        {
03761                         return call_user_func(
03762                                                 array(&$GLOBALS['T3_VAR']['callUserFunction'][$funcName]['obj'],
03763                                                         $GLOBALS['T3_VAR']['callUserFunction'][$funcName]['method']),
03764                                                 $params,
03765                                                 $ref
03766                                         );
03767                 }
03768 
03769                         // Check file-reference prefix; if found, require_once() the file (should be library of code)
03770                 if (strstr($funcName,':'))      {
03771                         list($file,$funcRef) = t3lib_div::revExplode(':',$funcName,2);
03772                         $requireFile = t3lib_div::getFileAbsFileName($file);
03773                         if ($requireFile) require_once($requireFile);
03774                 } else {
03775                         $funcRef = $funcName;
03776                 }
03777 
03778                         // Check for persistent object token, "&"
03779                 if (substr($funcRef,0,1)=='&')  {
03780                         $funcRef = substr($funcRef,1);
03781                         $storePersistentObject = TRUE;
03782                 } else {
03783                         $storePersistentObject = FALSE;
03784                 }
03785 
03786                         // Check prefix is valid:
03787                 if ($checkPrefix &&
03788                         !t3lib_div::isFirstPartOfStr(trim($funcRef),$checkPrefix) &&
03789                         !t3lib_div::isFirstPartOfStr(trim($funcRef),'tx_')
03790                         )       {
03791                         if (!$silent)   debug("Function/Class '".$funcRef."' was not prepended with '".$checkPrefix."'",1);
03792                         return FALSE;
03793                 }
03794 
03795                         // Call function or method:
03796                 $parts = explode('->',$funcRef);
03797                 if (count($parts)==2)   {       // Class
03798 
03799                                 // Check if class/method exists:
03800                         if (class_exists($parts[0]))    {
03801 
03802                                         // Get/Create object of class:
03803                                 if ($storePersistentObject)     {       // Get reference to current instance of class:
03804                                         if (!is_object($GLOBALS['T3_VAR']['callUserFunction_classPool'][$parts[0]]))    {
03805                                                 $GLOBALS['T3_VAR']['callUserFunction_classPool'][$parts[0]] = &t3lib_div::makeInstance($parts[0]);
03806                                         }
03807                                         $classObj = &$GLOBALS['T3_VAR']['callUserFunction_classPool'][$parts[0]];
03808                                 } else {        // Create new object:
03809                                         $classObj = &t3lib_div::makeInstance($parts[0]);
03810                                 }
03811 
03812                                 if (method_exists($classObj, $parts[1]))        {
03813 
03814                                                 // If persistent object should be created, set reference:
03815                                         if ($storePersistentObject)     {
03816                                                 $GLOBALS['T3_VAR']['callUserFunction'][$funcName] = array (
03817                                                         'method' => $parts[1],
03818                                                         'obj' => &$classObj
03819                                                 );
03820                                         }
03821                                                 // Call method:
03822                                         $content = call_user_func(
03823                                                 array(&$classObj, $parts[1]),
03824                                                 $params,
03825                                                 $ref
03826                                         );
03827                                 } else {
03828                                         if (!$silent)   debug("<strong>ERROR:</strong> No method name '".$parts[1]."' in class ".$parts[0],1);
03829                                 }
03830                         } else {
03831                                 if (!$silent)   debug("<strong>ERROR:</strong> No class named: ".$parts[0],1);
03832                         }
03833                 } else {        // Function
03834                         if (function_exists($funcRef))  {
03835                                 $content = call_user_func($funcRef, $params, $ref);
03836                         } else {
03837                                 if (!$silent)   debug("<strong>ERROR:</strong> No function named: ".$funcRef,1);
03838                         }
03839                 }
03840                 return $content;
03841         }
03842 
03854         function &getUserObj($classRef,$checkPrefix='user_',$silent=0)  {
03855                 global $TYPO3_CONF_VARS;
03856                         // Check persistent object and if found, call directly and exit.
03857                 if (is_object($GLOBALS['T3_VAR']['getUserObj'][$classRef]))     {
03858                         return $GLOBALS['T3_VAR']['getUserObj'][$classRef];
03859                 } else {
03860 
03861                                 // Check file-reference prefix; if found, require_once() the file (should be library of code)
03862                         if (strstr($classRef,':'))      {
03863                                 list($file,$class) = t3lib_div::revExplode(':',$classRef,2);
03864                                 $requireFile = t3lib_div::getFileAbsFileName($file);
03865                                 if ($requireFile)       require_once($requireFile);
03866                         } else {
03867                                 $class = $classRef;
03868                         }
03869 
03870                                 // Check for persistent object token, "&"
03871                         if (substr($class,0,1)=='&')    {
03872                                 $class = substr($class,1);
03873                                 $storePersistentObject = TRUE;
03874                         } else {
03875                                 $storePersistentObject = FALSE;
03876                         }
03877 
03878                                 // Check prefix is valid:
03879                         if ($checkPrefix &&
03880                                 !t3lib_div::isFirstPartOfStr(trim($class),$checkPrefix) &&
03881                                 !t3lib_div::isFirstPartOfStr(trim($class),'tx_')
03882                                 )       {
03883                                 if (!$silent)   debug("Class '".$class."' was not prepended with '".$checkPrefix."'",1);
03884                                 return FALSE;
03885                         }
03886 
03887                                 // Check if class exists:
03888                         if (class_exists($class))       {
03889                                 $classObj = &t3lib_div::makeInstance($class);
03890 
03891                                         // If persistent object should be created, set reference:
03892                                 if ($storePersistentObject)     {
03893                                         $GLOBALS['T3_VAR']['getUserObj'][$classRef] = &$classObj;
03894                                 }
03895 
03896                                 return $classObj;
03897                         } else {
03898                                 if (!$silent)   debug("<strong>ERROR:</strong> No class named: ".$class,1);
03899                         }
03900                 }
03901         }
03902 
03912         function &makeInstance($className)      {
03913                 return class_exists('ux_'.$className) ? t3lib_div::makeInstance('ux_'.$className) : new $className;
03914         }
03915 
03924         function makeInstanceClassName($className)      {
03925                 return class_exists('ux_'.$className) ? t3lib_div::makeInstanceClassName('ux_'.$className) : $className;
03926         }
03927 
03938         function &makeInstanceService($serviceType, $serviceSubType='', $excludeServiceKeys=array())    {
03939                 global $T3_SERVICES, $T3_VAR, $TYPO3_CONF_VARS;
03940 
03941                 $error = FALSE;
03942 
03943                 if (!is_array($excludeServiceKeys) ) {
03944                         $excludeServiceKeys = t3lib_div::trimExplode(',', $excludeServiceKeys, 1);
03945                 }
03946                 while ($info = t3lib_extMgm::findService($serviceType, $serviceSubType, $excludeServiceKeys))   {
03947 
03948                                 // Check persistent object and if found, call directly and exit.
03949                         if (is_object($GLOBALS['T3_VAR']['makeInstanceService'][$info['className']]))   {
03950                                         // reset service and return object
03951                                 $T3_VAR['makeInstanceService'][$info['className']]->reset();
03952                                 return $GLOBALS['T3_VAR']['makeInstanceService'][$info['className']];
03953 
03954                                 // include file and create object
03955                         } else {
03956                                 $requireFile = t3lib_div::getFileAbsFileName($info['classFile']);
03957                                 if (@is_file($requireFile)) {
03958                                         require_once ($requireFile);
03959                                         $obj = t3lib_div::makeInstance($info['className']);
03960                                         if (is_object($obj)) {
03961                                                 if(!@is_callable(array($obj,'init')))   {
03962                                                                 // use silent logging??? I don't think so.
03963                                                         die ('Broken service:'.t3lib_div::view_array($info));
03964                                                 }
03965                                                 $obj->info = $info;
03966                                                 if ($obj->init()) { // service available?
03967 
03968                                                                 // create persistent object
03969                                                         $T3_VAR['makeInstanceService'][$info['className']] = &$obj;
03970 
03971                                                                 // needed to delete temp files
03972                                                         register_shutdown_function(array(&$obj, '__destruct'));
03973 
03974                                                         return $obj; // object is passed as reference by function definition
03975                                                 }
03976                                                 $error = $obj->getLastErrorArray();
03977                                                 unset($obj);
03978                                         }
03979                                 }
03980                         }
03981                                 // deactivate the service
03982                         t3lib_extMgm::deactivateService($info['serviceType'],$info['serviceKey']);
03983                 }
03984                 return $error;
03985         }
03986 
04002         function plainMailEncoded($email,$subject,$message,$headers='',$enc='',$charset='',$dontEncodeHeader=false)     {
04003                 if (!$charset)  {
04004                         $charset = $GLOBALS['TYPO3_CONF_VARS']['BE']['forceCharset'] ? $GLOBALS['TYPO3_CONF_VARS']['BE']['forceCharset'] : 'ISO-8859-1';
04005                 }
04006 
04007                 if (!$dontEncodeHeader) {
04008                                 // Mail headers must be ASCII, therefore we convert the whole header to either base64 or quoted_printable
04009                         $newHeaders=array();
04010                         foreach (explode(chr(10),$headers) as $line)    {       // Split the header in lines and convert each line separately
04011                                 $parts = explode(': ',$line,2); // Field tags must not be encoded
04012                                 if (count($parts)==2)   {
04013                                         $parts[1] = t3lib_div::encodeHeader($parts[1],$enc,$charset);
04014                                         $newHeaders[] = implode(': ',$parts);
04015                                 } else {
04016                                         $newHeaders[] = $line;  // Should never happen - is such a mail header valid? Anyway, just add the unchanged line...
04017                                 }
04018                         }
04019                         $headers = implode(chr(10),$newHeaders);
04020                         unset($newHeaders);
04021 
04022                         $email = t3lib_div::encodeHeader($email,$enc,$charset);         // Email address must not be encoded, but it could be appended by a name which should be so (e.g. "Kasper Skårhøj <kasperYYYY@typo3.com>")
04023                         $subject = t3lib_div::encodeHeader($subject,$enc,$charset);
04024                 }
04025 
04026                 switch ((string)$enc)   {
04027                         case 'base64':
04028                                 $headers=trim($headers).chr(10).
04029                                 'Mime-Version: 1.0'.chr(10).
04030                                 'Content-Type: text/plain; charset="'.$charset.'"'.chr(10).
04031                                 'Content-Transfer-Encoding: base64';
04032 
04033                                 $message=trim(chunk_split(base64_encode($message.chr(10)))).chr(10);    // Adding chr(10) because I think MS outlook 2002 wants it... may be removed later again.
04034                         break;
04035                         case '8bit':
04036                                 $headers=trim($headers).chr(10).
04037                                 'Mime-Version: 1.0'.chr(10).
04038                                 'Content-Type: text/plain; charset='.$charset.chr(10).
04039                                 'Content-Transfer-Encoding: 8bit';
04040                         break;
04041                         case 'quoted-printable':
04042                         default:
04043                                 $headers=trim($headers).chr(10).
04044                                 'Mime-Version: 1.0'.chr(10).
04045                                 'Content-Type: text/plain; charset='.$charset.chr(10).
04046                                 'Content-Transfer-Encoding: quoted-printable';
04047 
04048                                 $message=t3lib_div::quoted_printable($message);
04049                         break;
04050                 }
04051 
04052                 $linebreak = chr(10);                   // Default line break for Unix systems.
04053                 if (TYPO3_OS=='WIN')    {
04054                         $linebreak = chr(13).chr(10);   // Line break for Windows. This is needed because PHP on Windows systems send mails via SMTP instead of using sendmail, and thus the linebreak needs to be \r\n.
04055                 }
04056 
04057                 $headers=trim(implode($linebreak,t3lib_div::trimExplode(chr(10),$headers,1)));  // Make sure no empty lines are there.
04058 
04059                 mail($email,$subject,$message,$headers);
04060         }
04061 
04072         function quoted_printable($string,$maxlen=76)   {
04073                         // Make sure the string contains only Unix linebreaks
04074                 $string = str_replace(chr(13).chr(10), chr(10), $string);       // Replace Windows breaks (\r\n)
04075                 $string = str_replace(chr(13), chr(10), $string);               // Replace Mac breaks (\r)
04076 
04077                 $linebreak = chr(10);                   // Default line break for Unix systems.
04078                 if (TYPO3_OS=='WIN')    {
04079                         $linebreak = chr(13).chr(10);   // Line break for Windows. This is needed because PHP on Windows systems send mails via SMTP instead of using sendmail, and thus the linebreak needs to be \r\n.
04080                 }
04081 
04082                 $newString = '';
04083                 $theLines = explode(chr(10),$string);   // Split lines
04084                 foreach ($theLines as $val)     {
04085                         $newVal = '';
04086                         $theValLen = strlen($val);
04087                         $len = 0;
04088                         for ($index=0; $index < $theValLen; $index++)   {       // Walk through each character of this line
04089                                 $char = substr($val,$index,1);
04090                                 $ordVal = ord($char);
04091                                 if ($len>($maxlen-4) || ($len>(($maxlen-10)-4)&&$ordVal==32))   {
04092                                         $newVal.='='.$linebreak;        // Add a line break
04093                                         $len=0;                 // Reset the length counter
04094                                 }
04095                                 if (($ordVal>=33 && $ordVal<=60) || ($ordVal>=62 && $ordVal<=126) || $ordVal==9 || $ordVal==32) {
04096                                         $newVal.=$char;         // This character is ok, add it to the message
04097                                         $len++;
04098                                 } else {
04099                                         $newVal.=sprintf('=%02X',$ordVal);      // Special character, needs to be encoded
04100                                         $len+=3;
04101                                 }
04102                         }
04103                         $newVal = preg_replace('/'.chr(32).'$/','=20',$newVal);         // Replaces a possible SPACE-character at the end of a line
04104                         $newVal = preg_replace('/'.chr(9).'$/','=09',$newVal);          // Replaces a possible TAB-character at the end of a line
04105                         $newString.=$newVal.$linebreak;
04106                 }
04107                 return preg_replace('/'.$linebreak.'$/','',$newString);         // Remove last newline
04108         }
04109 
04119         function encodeHeader($line,$enc='',$charset='ISO-8859-1')      {
04120                         // Avoid problems if "###" is found in $line (would conflict with the placeholder which is used below)
04121                 if (strstr($line,'###'))        return $line;
04122 
04123                         // Check if any non-ASCII characters are found - otherwise encoding is not needed
04124                 if (!preg_match('/[^'.chr(32).'-'.chr(127).']/',$line)) return $line;
04125 
04126                         // Wrap email addresses in a special marker
04127                 $line = preg_replace('/([^ ]+@[^ ]+)/', '###$1###', $line);
04128 
04129                 $matches = preg_split('/(.?###.+###.?|\(|\))/', $line, -1, PREG_SPLIT_NO_EMPTY);
04130                 foreach ($matches as $part)     {
04131                         $oldPart = $part;
04132                         switch ((string)$enc)   {
04133                                 case 'base64':
04134                                         $part = '=?'.$charset.'?B?'.base64_encode($part).'?=';
04135                                 break;
04136                                 case 'quoted-printable':
04137                                 default:
04138                                         $qpValue = t3lib_div::quoted_printable($part,1000);
04139                                         if ($part!=$qpValue)    {
04140                                                 $qpValue = str_replace(' ','_',$qpValue);       // Encoded words in the header should not contain non-encoded spaces. "_" is a shortcut for "=20". See RFC 2047 for details.
04141                                                 $part = '=?'.$charset.'?Q?'.$qpValue.'?=';
04142                                         }
04143                         }
04144                         $line = str_replace($oldPart, $part, $line);
04145                 }
04146                 $line = preg_replace('/###(.+?)###/', '$1', $line);     // Remove the wrappers
04147 
04148                 return $line;
04149         }
04150 
04162         function substUrlsInPlainText($message,$urlmode='76',$index_script_url='')      {
04163                         // Substitute URLs with shorter links:
04164                 $urlSplit=explode('http://',$message);
04165                 reset($urlSplit);
04166                 while(list($c,$v)=each($urlSplit))      {
04167                         if ($c) {
04168                                 $newParts = preg_split('/\s|[<>"{}|\\\^`()\']/', $v, 2);
04169                                 $newURL='http://'.$newParts[0];
04170                                         switch((string)$urlmode)        {
04171                                                 case 'all':
04172                                                         $newURL=t3lib_div::makeRedirectUrl($newURL,0,$index_script_url);
04173                                                 break;
04174                                                 case '76':
04175                                                         $newURL=t3lib_div::makeRedirectUrl($newURL,76,$index_script_url);
04176                                                 break;
04177                                         }
04178                                 $urlSplit[$c]=$newURL.substr($v,strlen($newParts[0]));
04179                         }
04180                 }
04181 
04182                 $message=implode('',$urlSplit);
04183                 return $message;
04184         }
04185 
04196         function makeRedirectUrl($inUrl,$l=0,$index_script_url='')      {
04197                 if (strlen($inUrl)>$l)  {
04198                         $md5 = substr(md5($inUrl),0,20);
04199                         $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery('md5hash', 'cache_md5params', 'md5hash='.$GLOBALS['TYPO3_DB']->fullQuoteStr($md5, 'cache_md5params'));
04200                         if (!$GLOBALS['TYPO3_DB']->sql_num_rows($res))  {
04201                                 $insertFields = array(
04202                                         'md5hash' => $md5,
04203                                         'tstamp' => time(),
04204                                         'type' => 2,
04205                                         'params' => $inUrl
04206                                 );
04207 
04208                                 $GLOBALS['TYPO3_DB']->exec_INSERTquery('cache_md5params', $insertFields);
04209                         }
04210                         $inUrl=($index_script_url ? $index_script_url : t3lib_div::getIndpEnv('TYPO3_REQUEST_DIR').'index.php').
04211                                 '?RDCT='.$md5;
04212                 }
04213                 return $inUrl;
04214         }
04215 
04223         function freetypeDpiComp($font_size)    {
04224                 $dpi = intval($GLOBALS['TYPO3_CONF_VARS']['GFX']['TTFdpi']);
04225                 if ($dpi!=72)   $font_size = $font_size/$dpi*72;
04226                 return $font_size;
04227         }
04228 
04235         function initSysLog()   {
04236                 global $TYPO3_CONF_VARS;
04237 
04238                         // for CLI logging name is <fqdn-hostname>:<TYPO3-path>
04239                 if (defined('TYPO3_cliMode') && TYPO3_cliMode)  {
04240                                 // find FQDN
04241                         $host = php_uname('n');
04242                         if (strpos($host,'.') === FALSE)        {
04243                                 $ip = gethostbyname($host);
04244                                 $fqdn = gethostbyaddr($ip);
04245                                 if ($ip != $fqdn)       $host = $fqdn;
04246                         }
04247                         $TYPO3_CONF_VARS['SC_OPTIONS']['t3lib/class.t3lib_div.php']['systemLogHost'] = $TYPO3_CONF_VARS['SYS']['systemLogHost'] = $host.':'.PATH_site;
04248                 }
04249                         // for Web logging name is <protocol>://<request-hostame>
04250                 else {
04251                         $TYPO3_CONF_VARS['SC_OPTIONS']['t3lib/class.t3lib_div.php']['systemLogHost'] = t3lib_div::getIndpEnv('TYPO3_REQUEST_HOST');
04252                 }
04253 
04254                         // init custom logging
04255                 if (is_array($TYPO3_CONF_VARS['SC_OPTIONS']['t3lib/class.t3lib_div.php']['systemLog'])) {
04256                         $params = array('initLog'=>TRUE);
04257                         $fakeThis = FALSE;
04258                         foreach($TYPO3_CONF_VARS['SC_OPTIONS']['t3lib/class.t3lib_div.php']['systemLog'] as $hookMethod)        {
04259                                 t3lib_div::callUserFunction($hookMethod,$params,$fakeThis);
04260                         }
04261                 }
04262 
04263                         // init TYPO3 logging
04264                 foreach (explode(';',$TYPO3_CONF_VARS['SYS']['systemLog'],2) as $log)   {
04265                         list($type,$destination) = explode(',',$log,3);
04266 
04267                         if ($type == 'syslog')  {
04268                                 define_syslog_variables();
04269                                 if (TYPO3_OS == 'WIN')  {
04270                                         $facility = LOG_USER;
04271                                 } else {
04272                                         $facility = constant('LOG_'.strtoupper($destination));
04273                                 }
04274                                 openlog($TYPO3_CONF_VARS['SC_OPTIONS']['t3lib/class.t3lib_div.php']['systemLogHost'], LOG_ODELAY, $facility);
04275                         }
04276                 }
04277 
04278                 $TYPO3_CONF_VARS['SYS']['systemLogLevel'] = t3lib_div::intInRange($TYPO3_CONF_VARS['SYS']['systemLogLevel'],0,4);
04279                 $TYPO3_CONF_VARS['SC_OPTIONS']['t3lib/class.t3lib_div.php']['systemLogInit'] = TRUE;
04280         }
04281 
04292         function sysLog($msg, $extKey, $severity=0) {
04293                 global $TYPO3_CONF_VARS;
04294 
04295                 $severity = t3lib_div::intInRange($severity,0,4);
04296 
04297                         // is message worth logging?
04298                 if (intval($TYPO3_CONF_VARS['SYS']['systemLogLevel']) > $severity)      return;
04299 
04300                         // initialize logging
04301                 if (!$TYPO3_CONF_VARS['SC_OPTIONS']['t3lib/class.t3lib_div.php']['systemLogInit'])      {
04302                         t3lib_div::initSysLog();
04303                 }
04304 
04305                         // do custom logging
04306                 if (is_array($TYPO3_CONF_VARS['SC_OPTIONS']['t3lib/class.t3lib_div.php']['systemLog'])) {
04307                         $params = array('msg'=>$msg, 'extKey'=>$extKey);
04308                         if (function_exists('debug_backtrace')) {
04309                                 $params['backTrace'] = debug_backtrace();
04310                         }
04311                         $fakeThis = FALSE;
04312                         foreach($TYPO3_CONF_VARS['SC_OPTIONS']['t3lib/class.t3lib_div.php']['systemLog'] as $hookMethod)        {
04313                                 t3lib_div::callUserFunction($hookMethod,$params,$fakeThis);
04314                         }
04315                 }
04316 
04317                         // TYPO3 logging enabled?
04318                 if (!$TYPO3_CONF_VARS['SYS']['systemLog'])      return;
04319 
04320                         // use all configured logging options
04321                 foreach (explode(';',$TYPO3_CONF_VARS['SYS']['systemLog'],2) as $log)   {
04322                         list($type,$destination,$level) = explode(',',$log,4);
04323 
04324                                 // is message worth logging for this log type?
04325                         if (intval($level) > $severity) continue;
04326 
04327                         $msgLine = ' - '.$extKey.': '.$msg;
04328 
04329                                 // write message to a file
04330                         if ($type == 'file')    {
04331                                 $file = fopen($destination, 'a');
04332                                 if ($file)     {
04333                                         flock($file, LOCK_EX);  // try locking, but ignore if not available (eg. on NFS and FAT)
04334                                         fwrite($file, date('d/m/Y i:H').$msgLine.char(10));
04335                                         flock($file, LOCK_UN);    // release the lock
04336                                         fclose($file);
04337                                 }
04338                         }
04339                                 // send message per mail
04340                         elseif ($type == 'mail')        {
04341                                 list($to,$from) = explode('/',$destination);
04342                                 mail($to, 'Warning - error in TYPO3 installation',
04343                                         'Host: '.$TYPO3_CONF_VARS['SC_OPTIONS']['t3lib/class.t3lib_div.php']['systemLogHost']."\n".
04344                                         'Extension: '.$extKey."\n".
04345                                         'Severity: '.$severity."\n".
04346                                         "\n".$msg,
04347                                         ($from ? 'From: '.$from : '')
04348                                 );
04349                         }
04350                                 // use the PHP error log
04351                         elseif ($type == 'error_log')   {
04352                                 error_log($TYPO3_CONF_VARS['SC_OPTIONS']['t3lib/class.t3lib_div.php']['systemLogHost'].$msgLine, 0);
04353                         }
04354                                 // use the system log
04355                         elseif ($type == 'syslog')      {
04356                                 $priority = array(LOG_INFO,LOG_NOTICE,LOG_WARNING,LOG_ERR,LOG_CRIT);
04357                                 syslog($priority[(int)$severity], $msgLine);
04358                         }
04359                 }
04360         }
04361 
04375         function devLog($msg, $extKey, $severity=0, $dataVar=FALSE)     {
04376                 global $TYPO3_CONF_VARS;
04377 
04378                 if (is_array($TYPO3_CONF_VARS['SC_OPTIONS']['t3lib/class.t3lib_div.php']['devLog']))    {
04379                         $params = array('msg'=>$msg, 'extKey'=>$extKey, 'severity'=>$severity, 'dataVar'=>$dataVar);
04380                         $fakeThis = FALSE;
04381                         foreach($TYPO3_CONF_VARS['SC_OPTIONS']['t3lib/class.t3lib_div.php']['devLog'] as $hookMethod)   {
04382                                 t3lib_div::callUserFunction($hookMethod,$params,$fakeThis);
04383                         }
04384                 }
04385         }
04386 
04396         function arrayToLogString($arr, $valueList=array(), $valueLength=20) {
04397                 $str = '';
04398                 if(is_array($arr)) {
04399                         if (!is_array($valueList)) {
04400                                 $valueList = explode(',', $valueList);
04401                         }
04402                         foreach($arr as $key => $value) {
04403                                 if (!count($valueList) OR (count($valueList) AND in_array($key, $valueList))) {
04404                                         $str .= (string)$key.trim(': '.t3lib_div::fixed_lgd(str_replace("\n",'|',(string)$value), $valueLength)).'; ';
04405                                 }
04406                         }
04407                 }
04408                 return $str;
04409         }
04410 
04419         function imageMagickCommand($command, $parameters, $path='')    {
04420                 $gfxConf = $GLOBALS['TYPO3_CONF_VARS']['GFX'];
04421                 $isExt = (TYPO3_OS=='WIN' ? '.exe' : '');
04422                 $switchCompositeParameters=false;
04423 
04424                 if(!$path)      { $path = $gfxConf['im_path']; }
04425 
04426                 $im_version = strtolower($gfxConf['im_version_5']);
04427                 $combineScript = $gfxConf['im_combine_filename'] ? trim($gfxConf['im_combine_filename']) : 'combine';
04428 
04429                 if($command==='combine')        {       // This is only used internally, has no effect outside
04430                         $command = 'composite';
04431                 }
04432 
04433                         // Compile the path & command
04434                 if($im_version==='gm')  {
04435                         $switchCompositeParameters=true;
04436                         $path .= 'gm'.$isExt.' '.$command;
04437                 } else  {
04438                         if($im_version==='im6') { $switchCompositeParameters=true; }
04439                         $path .= (($command=='composite') ? $combineScript : $command).$isExt;
04440                 }
04441 
04442                 $cmdLine = $path.' '.$parameters;
04443 
04444                 if($command=='composite' && $switchCompositeParameters) {       // Because of some weird incompatibilities between ImageMagick 4 and 6 (plus GraphicsMagick), it is needed to change the parameters order under some preconditions
04445                         $paramsArr = t3lib_div::unQuoteFilenames($parameters);
04446 
04447                         if(count($paramsArr)>5) {       // The mask image has been specified => swap the parameters
04448                                 $tmp = $paramsArr[count($paramsArr)-3];
04449                                 $paramsArr[count($paramsArr)-3] = $paramsArr[count($paramsArr)-4];
04450                                 $paramsArr[count($paramsArr)-4] = $tmp;
04451                         }
04452 
04453                         $cmdLine = $path.' '.implode(' ', $paramsArr);
04454                 }
04455 
04456                 return $cmdLine;
04457         }
04458 
04466         function unQuoteFilenames($parameters,$unQuote=FALSE)   {
04467                 $paramsArr = explode(' ', trim($parameters));
04468 
04469                 $quoteActive = -1;      // Whenever a quote character (") is found, $quoteActive is set to the element number inside of $params. A value of -1 means that there are not open quotes at the current position.
04470                 foreach($paramsArr as $k=>$v)   {
04471                         if($quoteActive > -1)   {
04472                                 $paramsArr[$quoteActive] .= ' '.$v;
04473                                 unset($paramsArr[$k]);
04474                                 if(ereg('"$', $v))      { $quoteActive = -1; }
04475 
04476                         } elseif(!trim($v))     {
04477                                 unset($paramsArr[$k]);  // Remove empty elements
04478 
04479                         } elseif(ereg('^"', $v))        {
04480                                 $quoteActive = $k;
04481                         }
04482                 }
04483 
04484                 if($unQuote) {
04485                         foreach($paramsArr as $key=>$val) {
04486                                 $paramsArr[$key]=preg_replace('/(^"|"$)/','',$val);
04487                         }
04488                 }
04489                 return $paramsArr;
04490         }
04491 
04492 
04500         function quoteJSvalue($value, $inScriptTags = false)    {
04501                 $value = addcslashes($value, '\''.chr(10).chr(13));
04502                 if (!$inScriptTags)     {
04503                         $value = htmlspecialchars($value);
04504                 }
04505                 return '\''.$value.'\'';
04506         }
04507 
04508 
04509 }
04510 
04511 ?>


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