[BUGFIX] Some methods in t3lib_TSparser should be static
[Packages/TYPO3.CMS.git] / t3lib / class.t3lib_parsehtml_proc.php
old mode 100755 (executable)
new mode 100644 (file)
index a2bc274..25f7974
 <?php
 /***************************************************************
-*  Copyright notice
-*
-*  (c) 1999-2008 Kasper Skaarhoj (kasperYYYY@typo3.com)
-*  All rights reserved
-*
-*  This script is part of the TYPO3 project. The TYPO3 project is
-*  free software; you can redistribute it and/or modify
-*  it under the terms of the GNU General Public License as published by
-*  the Free Software Foundation; either version 2 of the License, or
-*  (at your option) any later version.
-*
-*  The GNU General Public License can be found at
-*  http://www.gnu.org/copyleft/gpl.html.
-*  A copy is found in the textfile GPL.txt and important notices to the license
-*  from the author is found in LICENSE.txt distributed with these scripts.
-*
-*
-*  This script is distributed in the hope that it will be useful,
-*  but WITHOUT ANY WARRANTY; without even the implied warranty of
-*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-*  GNU General Public License for more details.
-*
-*  This copyright notice MUST APPEAR in all copies of the script!
-***************************************************************/
-/**
- * Functions for parsing HTML, specially for TYPO3 processing in relation to TCEmain and Rich Text Editor (RTE)
- *
- * $Id$
- * Revised for TYPO3 3.6 December/2003 by Kasper Skaarhoj
- * XHTML compatible.
- *
- * @author     Kasper Skaarhoj <kasperYYYY@typo3.com>
- * @internal
- */
-/**
- * [CLASS/FUNCTION INDEX of SCRIPT]
+ *  Copyright notice
  *
+ *  (c) 1999-2011 Kasper Skårhøj (kasperYYYY@typo3.com)
+ *  All rights reserved
  *
+ *  This script is part of the TYPO3 project. The TYPO3 project is
+ *  free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
  *
- *  103: class t3lib_parsehtml_proc extends t3lib_parsehtml
- *  138:     function init($elRef='',$recPid=0)
- *  150:     function setRelPath($path)
- *  174:     function evalWriteFile($pArr,$currentRecord)
+ *  The GNU General Public License can be found at
+ *  http://www.gnu.org/copyleft/gpl.html.
+ *  A copy is found in the textfile GPL.txt and important notices to the license
+ *  from the author is found in LICENSE.txt distributed with these scripts.
  *
- *              SECTION: Main function
- *  232:     function RTE_transform($value,$specConf,$direction='rte',$thisConfig=array())
  *
- *              SECTION: Specific RTE TRANSFORMATION functions
- *  398:     function TS_images_db($value)
- *  550:     function TS_images_rte($value)
- *  589:     function TS_reglinks($value,$direction)
- *  626:     function TS_links_db($value)
- *  675:     function TS_links_rte($value)
- *  760:     function TS_preserve_db($value)
- *  784:     function TS_preserve_rte($value)
- *  805:     function TS_transform_db($value,$css=FALSE)
- *  922:     function transformStyledATags($value)
- *  948:     function TS_transform_rte($value,$css=0)
- * 1019:     function TS_strip_db($value)
+ *  This script is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
  *
- *              SECTION: Generic RTE transformation, analysis and helper functions
- * 1050:     function getURL($url)
- * 1064:     function HTMLcleaner_db($content,$tagList='')
- * 1091:     function getKeepTags($direction='rte',$tagList='')
- * 1200:     function divideIntoLines($value,$count=5,$returnArray=FALSE)
- * 1304:     function setDivTags($value,$dT='p')
- * 1349:     function internalizeFontTags($value)
- * 1385:     function siteUrl()
- * 1395:     function rteImageStorageDir()
- * 1407:     function removeTables($value,$breakChar='<br />')
- * 1439:     function defaultTStagMapping($code,$direction='rte')
- * 1462:     function getWHFromAttribs($attribArray)
- * 1489:     function urlInfoForLinkTags($url)
- * 1548:     function TS_AtagToAbs($value,$dontSetRTEKEEP=FALSE)
- *
- * TOTAL FUNCTIONS: 28
- * (This index is automatically created/updated by the extension "extdeveval")
+ *  This copyright notice MUST APPEAR in all copies of the script!
+ ***************************************************************/
+/**
+ * Functions for parsing HTML, specially for TYPO3 processing in relation to TCEmain and Rich Text Editor (RTE)
+ * Revised for TYPO3 3.6 December/2003 by Kasper Skårhøj
+ * XHTML compatible.
  *
+ * @author     Kasper Skårhøj <kasperYYYY@typo3.com>
+ * @internal
  */
 
-require_once (PATH_t3lib.'class.t3lib_parsehtml.php');
-
-
-
-
-
-
-
-
-
-
-
 
 /**
  * Class for parsing HTML for the Rich Text Editor. (also called transformations)
  *
- * @author     Kasper Skaarhoj <kasperYYYY@typo3.com>
+ * @author     Kasper Skårhøj <kasperYYYY@typo3.com>
  * @package TYPO3
  * @subpackage t3lib
  */
 class t3lib_parsehtml_proc extends t3lib_parsehtml {
 
                // Static:
-       var $headListTags = 'PRE,UL,OL,H1,H2,H3,H4,H5,H6,HR,ADDRESS,DL,DD';     // List of tags for these elements
+       var $blockElementList = 'PRE,UL,OL,H1,H2,H3,H4,H5,H6,ADDRESS,DL,DD'; // List of tags for these elements
 
                // Internal, static:
-       var $recPid = 0;                                // Set this to the pid of the record manipulated by the class.
-       var $elRef = '';                                // Element reference [table]:[field], eg. "tt_content:bodytext"
-       var $relPath='';                                // Relative path
-       var $relBackPath='';                    // Relative back-path
-       var $procOptions = '';                  // Set to the TSconfig options coming from Page TSconfig
+       var $recPid = 0; // Set this to the pid of the record manipulated by the class.
+       var $elRef = ''; // Element reference [table]:[field], eg. "tt_content:bodytext"
+       var $relPath = ''; // Relative path
+       var $relBackPath = ''; // Relative back-path
+       public $tsConfig = array(); // Current Page TSConfig
+       var $procOptions = ''; // Set to the TSconfig options coming from Page TSconfig
 
                // Internal, dynamic
-       var $TS_transform_db_safecounter=100;           // Run-away brake for recursive calls.
-       var $rte_p='';                                                          // Parameters from TCA types configuration related to the RTE
-       var $getKeepTags_cache=array();                         // Data caching for processing function
-       var $allowedClasses=array();                            // Storage of the allowed CSS class names in the RTE
-       var $preserveTags = '';                                         // Set to tags to preserve from Page TSconfig configuration
-
-
-
-
-
-
-
-
+       var $TS_transform_db_safecounter = 100; // Run-away brake for recursive calls.
+       var $rte_p = ''; // Parameters from TCA types configuration related to the RTE
+       var $getKeepTags_cache = array(); // Data caching for processing function
+       var $allowedClasses = array(); // Storage of the allowed CSS class names in the RTE
+       var $preserveTags = ''; // Set to tags to preserve from Page TSconfig configuration
 
 
        /**
@@ -135,7 +69,7 @@ class t3lib_parsehtml_proc extends t3lib_parsehtml {
         * @param       integer         PID of the record (page id)
         * @return      void
         */
-       function init($elRef='',$recPid=0)      {
+       function init($elRef = '', $recPid = 0) {
                $this->recPid = $recPid;
                $this->elRef = $elRef;
        }
@@ -147,18 +81,18 @@ class t3lib_parsehtml_proc extends t3lib_parsehtml {
         * @param       string          The relative path from PATH_site to the place where the file being edited is. Eg. "fileadmin/static".
         * @return      void            There is no output, it is set in internal variables. With the above example of "fileadmin/static" as input this will yield ->relPath to be "fileadmin/static/" and ->relBackPath to be "../../"
         */
-       function setRelPath($path)      {
+       function setRelPath($path) {
                $path = trim($path);
-               $path = ereg_replace('^/','',$path);
-               $path = ereg_replace('/$','',$path);
-               if ($path)      {
+               $path = preg_replace('/^\//', '', $path);
+               $path = preg_replace('/\/$/', '', $path);
+               if ($path) {
                        $this->relPath = $path;
                        $this->relBackPath = '';
-                       $partsC=count(explode('/',$this->relPath));
-                       for ($a=0;$a<$partsC;$a++)      {
-                               $this->relBackPath.='../';
+                       $partsC = count(explode('/', $this->relPath));
+                       for ($a = 0; $a < $partsC; $a++) {
+                               $this->relBackPath .= '../';
                        }
-                       $this->relPath.='/';
+                       $this->relPath .= '/';
                }
        }
 
@@ -171,21 +105,21 @@ class t3lib_parsehtml_proc extends t3lib_parsehtml {
         * @return      mixed           On success an array with various information is returned, otherwise a string with an error message
         * @see t3lib_TCEmain, t3lib_transferData
         */
-       function evalWriteFile($pArr,$currentRecord)    {
+       public static function evalWriteFile($pArr, $currentRecord) {
 
                        // Write file configuration:
-               if (is_array($pArr))    {
+               if (is_array($pArr)) {
                        if ($GLOBALS['TYPO3_CONF_VARS']['BE']['staticFileEditPath']
-                               && substr($GLOBALS['TYPO3_CONF_VARS']['BE']['staticFileEditPath'],-1)=='/'
-                               && @is_dir(PATH_site.$GLOBALS['TYPO3_CONF_VARS']['BE']['staticFileEditPath']))  {
+                               && substr($GLOBALS['TYPO3_CONF_VARS']['BE']['staticFileEditPath'], -1) == '/'
+                               && @is_dir(PATH_site . $GLOBALS['TYPO3_CONF_VARS']['BE']['staticFileEditPath'])) {
 
                                $SW_p = $pArr['parameters'];
                                $SW_editFileField = trim($SW_p[0]);
                                $SW_editFile = $currentRecord[$SW_editFileField];
-                               if ($SW_editFileField && $SW_editFile && t3lib_div::validPathStr($SW_editFile)) {
-                                       $SW_relpath = $GLOBALS['TYPO3_CONF_VARS']['BE']['staticFileEditPath'].$SW_editFile;
-                                       $SW_editFile = PATH_site.$SW_relpath;
-                                       if (@is_file($SW_editFile))     {
+                               if ($SW_editFileField && $SW_editFile && t3lib_div::validPathStr($SW_editFile)) {
+                                       $SW_relpath = $GLOBALS['TYPO3_CONF_VARS']['BE']['staticFileEditPath'] . $SW_editFile;
+                                       $SW_editFile = PATH_site . $SW_relpath;
+                                       if (@is_file($SW_editFile)) {
                                                return array(
                                                        'editFile' => $SW_editFile,
                                                        'relEditFile' => $SW_relpath,
@@ -194,24 +128,19 @@ class t3lib_parsehtml_proc extends t3lib_parsehtml {
                                                        'loadFromFileField' => trim($SW_p[3]),
                                                        'statusField' => trim($SW_p[4])
                                                );
-                                       } else return "ERROR: Editfile '".$SW_relpath."' did not exist";
-                               } else return "ERROR: Edit file name could not be found or was bad.";
-                       } else return "ERROR: staticFileEditPath was not set, not set correctly or did not exist!";
+                                       } else {
+                                               return "ERROR: Editfile '" . $SW_relpath . "' did not exist";
+                                       }
+                               } else {
+                                       return "ERROR: Edit file name could not be found or was bad.";
+                               }
+                       } else {
+                               return "ERROR: staticFileEditPath was not set, not set correctly or did not exist!";
+                       }
                }
        }
 
 
-
-
-
-
-
-
-
-
-
-
-
        /**********************************************
         *
         * Main function
@@ -229,71 +158,77 @@ class t3lib_parsehtml_proc extends t3lib_parsehtml {
         * @return      string          Output value
         * @see t3lib_TCEmain::fillInFieldArray(), t3lib_transferData::renderRecord_typesProc()
         */
-       function RTE_transform($value,$specConf,$direction='rte',$thisConfig=array())   {
+       function RTE_transform($value, $specConf, $direction = 'rte', $thisConfig = array()) {
 
                        // Init:
+               $this->tsConfig = $thisConfig;
                $this->procOptions = $thisConfig['proc.'];
-               $this->preserveTags = strtoupper(implode(',',t3lib_div::trimExplode(',',$this->procOptions['preserveTags'])));
+               $this->preserveTags = strtoupper(implode(',', t3lib_div::trimExplode(',', $this->procOptions['preserveTags'])));
+
+                       // dynamic configuration of blockElementList
+               if ($this->procOptions['blockElementList']) {
+                       $this->blockElementList = $this->procOptions['blockElementList'];
+               }
 
                        // Get parameters for rte_transformation:
                $p = $this->rte_p = t3lib_BEfunc::getSpecConfParametersFromArray($specConf['rte_transform']['parameters']);
 
                        // Setting modes:
-               if (strcmp($this->procOptions['overruleMode'],''))      {
-                       $modes = array_unique(t3lib_div::trimExplode(',',$this->procOptions['overruleMode']));
+               if (strcmp($this->procOptions['overruleMode'], '')) {
+                       $modes = array_unique(t3lib_div::trimExplode(',', $this->procOptions['overruleMode']));
                } else {
-                       $modes = array_unique(t3lib_div::trimExplode('-',$p['mode']));
+                       $modes = array_unique(t3lib_div::trimExplode('-', $p['mode']));
                }
                $revmodes = array_flip($modes);
 
                        // Find special modes and extract them:
-               if (isset($revmodes['ts']))     {
+               if (isset($revmodes['ts'])) {
                        $modes[$revmodes['ts']] = 'ts_transform,ts_preserve,ts_images,ts_links';
                }
                        // Find special modes and extract them:
-               if (isset($revmodes['ts_css'])) {
+               if (isset($revmodes['ts_css'])) {
                        $modes[$revmodes['ts_css']] = 'css_transform,ts_images,ts_links';
                }
 
                        // Make list unique
-               $modes = array_unique(t3lib_div::trimExplode(',',implode(',',$modes),1));
+               $modes = array_unique(t3lib_div::trimExplode(',', implode(',', $modes), 1));
 
                        // Reverse order if direction is "rte"
-               if ($direction=='rte')  {
+               if ($direction == 'rte') {
                        $modes = array_reverse($modes);
                }
 
                        // Getting additional HTML cleaner configuration. These are applied either before or after the main transformation is done and is thus totally independant processing options you can set up:
-               $entry_HTMLparser = $this->procOptions['entryHTMLparser_'.$direction] ? $this->HTMLparserConfig($this->procOptions['entryHTMLparser_'.$direction.'.']) : '';
-               $exit_HTMLparser = $this->procOptions['exitHTMLparser_'.$direction] ? $this->HTMLparserConfig($this->procOptions['exitHTMLparser_'.$direction.'.']) : '';
+               $entry_HTMLparser = $this->procOptions['entryHTMLparser_' . $direction] ? $this->HTMLparserConfig($this->procOptions['entryHTMLparser_' . $direction . '.']) : '';
+               $exit_HTMLparser = $this->procOptions['exitHTMLparser_' . $direction] ? $this->HTMLparserConfig($this->procOptions['exitHTMLparser_' . $direction . '.']) : '';
 
                        // Line breaks of content is unified into char-10 only (removing char 13)
-               if (!$this->procOptions['disableUnifyLineBreaks'])      {
-                       $value = str_replace(chr(13).chr(10),chr(10),$value);
+               if (!$this->procOptions['disableUnifyLineBreaks']) {
+                       $value = str_replace(CRLF, LF, $value);
                }
 
                        // In an entry-cleaner was configured, pass value through the HTMLcleaner with that:
-               if (is_array($entry_HTMLparser))        {
-                       $value = $this->HTMLcleaner($value,$entry_HTMLparser[0],$entry_HTMLparser[1],$entry_HTMLparser[2],$entry_HTMLparser[3]);
+               if (is_array($entry_HTMLparser)) {
+                       $value = $this->HTMLcleaner($value, $entry_HTMLparser[0], $entry_HTMLparser[1], $entry_HTMLparser[2], $entry_HTMLparser[3]);
                }
 
                        // Traverse modes:
-               foreach($modes as $cmd) {
+               foreach ($modes as $cmd) {
                                // ->DB
-                       if ($direction=='db')   {
+                       if ($direction == 'db') {
                                        // Checking for user defined transformation:
-                               if ($_classRef = $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['t3lib/class.t3lib_parsehtml_proc.php']['transformation'][$cmd])     {
-                                       $_procObj = &t3lib_div::getUserObj($_classRef);
-                                       $_procObj->pObj = &$this;
+                               if ($_classRef = $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['t3lib/class.t3lib_parsehtml_proc.php']['transformation'][$cmd]) {
+                                       $_procObj = t3lib_div::getUserObj($_classRef);
+                                       $_procObj->pObj = $this;
                                        $_procObj->transformationKey = $cmd;
-                                       $value = $_procObj->transform_db($value,$this);
-                               } else {        // ... else use defaults:
-                                       switch($cmd)    {
+                                       $value = $_procObj->transform_db($value, $this);
+                               } else { // ... else use defaults:
+                                       switch ($cmd) {
                                                case 'ts_images':
                                                        $value = $this->TS_images_db($value);
                                                break;
                                                case 'ts_reglinks':
-                                                       $value = $this->TS_reglinks($value,'db');
+                                                       $value = $this->TS_reglinks($value, 'db');
                                                break;
                                                case 'ts_links':
                                                        $value = $this->TS_links_db($value);
@@ -303,9 +238,9 @@ class t3lib_parsehtml_proc extends t3lib_parsehtml {
                                                break;
                                                case 'ts_transform':
                                                case 'css_transform':
-                                                       $value = str_replace(chr(13),'',$value);        // Has a very disturbing effect, so just remove all '13' - depend on '10'
-                                                       $this->allowedClasses = t3lib_div::trimExplode(',',strtoupper($this->procOptions['allowedClasses']),1);
-                                                       $value = $this->TS_transform_db($value,$cmd=='css_transform');
+                                                       $value = str_replace(CR, '', $value); // Has a very disturbing effect, so just remove all '13' - depend on '10'
+                                                       $this->allowedClasses = t3lib_div::trimExplode(',', $this->procOptions['allowedClasses'], 1);
+                                                       $value = $this->TS_transform_db($value, $cmd == 'css_transform');
                                                break;
                                                case 'ts_strip':
                                                        $value = $this->TS_strip_db($value);
@@ -316,19 +251,19 @@ class t3lib_parsehtml_proc extends t3lib_parsehtml {
                                }
                        }
                                // ->RTE
-                       if ($direction=='rte')  {
+                       if ($direction == 'rte') {
                                        // Checking for user defined transformation:
-                               if ($_classRef = $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['t3lib/class.t3lib_parsehtml_proc.php']['transformation'][$cmd])     {
-                                       $_procObj = &t3lib_div::getUserObj($_classRef);
-                                       $_procObj->pObj = &$this;
-                                       $value = $_procObj->transform_rte($value,$this);
-                               } else {        // ... else use defaults:
-                                       switch($cmd)    {
+                               if ($_classRef = $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['t3lib/class.t3lib_parsehtml_proc.php']['transformation'][$cmd]) {
+                                       $_procObj = t3lib_div::getUserObj($_classRef);
+                                       $_procObj->pObj = $this;
+                                       $value = $_procObj->transform_rte($value, $this);
+                               } else { // ... else use defaults:
+                                       switch ($cmd) {
                                                case 'ts_images':
                                                        $value = $this->TS_images_rte($value);
                                                break;
                                                case 'ts_reglinks':
-                                                       $value = $this->TS_reglinks($value,'rte');
+                                                       $value = $this->TS_reglinks($value, 'rte');
                                                break;
                                                case 'ts_links':
                                                        $value = $this->TS_links_rte($value);
@@ -338,8 +273,8 @@ class t3lib_parsehtml_proc extends t3lib_parsehtml {
                                                break;
                                                case 'ts_transform':
                                                case 'css_transform':
-                                                       $value = str_replace(chr(13),'',$value);        // Has a very disturbing effect, so just remove all '13' - depend on '10'
-                                                       $value = $this->TS_transform_rte($value,$cmd=='css_transform');
+                                                       $value = str_replace(CR, '', $value); // Has a very disturbing effect, so just remove all '13' - depend on '10'
+                                                       $value = $this->TS_transform_rte($value, $cmd == 'css_transform');
                                                break;
                                                default:
                                                break;
@@ -349,14 +284,14 @@ class t3lib_parsehtml_proc extends t3lib_parsehtml {
                }
 
                        // In an exit-cleaner was configured, pass value through the HTMLcleaner with that:
-               if (is_array($exit_HTMLparser)) {
-                       $value = $this->HTMLcleaner($value,$exit_HTMLparser[0],$exit_HTMLparser[1],$exit_HTMLparser[2],$exit_HTMLparser[3]);
+               if (is_array($exit_HTMLparser)) {
+                       $value = $this->HTMLcleaner($value, $exit_HTMLparser[0], $exit_HTMLparser[1], $exit_HTMLparser[2], $exit_HTMLparser[3]);
                }
 
                        // Final clean up of linebreaks:
-               if (!$this->procOptions['disableUnifyLineBreaks'])      {
-                       $value = str_replace(chr(13).chr(10),chr(10),$value);   // Make sure no \r\n sequences has entered in the meantime...
-                       $value = str_replace(chr(10),chr(13).chr(10),$value);   // ... and then change all \n into \r\n
+               if (!$this->procOptions['disableUnifyLineBreaks']) {
+                       $value = str_replace(CRLF, LF, $value); // Make sure no \r\n sequences has entered in the meantime...
+                       $value = str_replace(LF, CRLF, $value); // ... and then change all \n into \r\n
                }
 
                        // Return value:
@@ -364,20 +299,6 @@ class t3lib_parsehtml_proc extends t3lib_parsehtml {
        }
 
 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
        /************************************
         *
         * Specific RTE TRANSFORMATION functions
@@ -395,101 +316,105 @@ class t3lib_parsehtml_proc extends t3lib_parsehtml {
         * @param       string          The content from RTE going to Database
         * @return      string          Processed content
         */
-       function TS_images_db($value)   {
+       function TS_images_db($value) {
 
                        // Split content by <img> tags and traverse the resulting array for processing:
-               $imgSplit = $this->splitTags('img',$value);
-               foreach($imgSplit as $k => $v)  {
-                       if ($k%2)       {       // image found, do processing:
+               $imgSplit = $this->splitTags('img', $value);
+               foreach ($imgSplit as $k => $v) {
+                       if ($k % 2) { // image found, do processing:
 
                                        // Init
-                               $attribArray = $this->get_tag_attributes_classic($v,1);
+                               $attribArray = $this->get_tag_attributes_classic($v, 1);
                                $siteUrl = $this->siteUrl();
-                               $sitePath = str_replace (t3lib_div::getIndpEnv('TYPO3_REQUEST_HOST'), '', $siteUrl);
+                               $sitePath = str_replace(t3lib_div::getIndpEnv('TYPO3_REQUEST_HOST'), '', $siteUrl);
 
-                               $absRef = trim($attribArray['src']);            // It's always a absolute URL coming from the RTE into the Database.
+                               $absRef = trim($attribArray['src']); // It's always a absolute URL coming from the RTE into the Database.
 
                                        // make path absolute if it is relative and we have a site path wich is not '/'
-                               $pI=pathinfo($absRef);
-                               if($sitePath AND !$pI['scheme'] && t3lib_div::isFirstPartOfStr($absRef,$sitePath)) {
+                               $pI = pathinfo($absRef);
+                               if ($sitePath AND !$pI['scheme'] && t3lib_div::isFirstPartOfStr($absRef, $sitePath)) {
                                                // if site is in a subpath (eg. /~user_jim/) this path needs to be removed because it will be added with $siteUrl
-                                       $absRef = substr($absRef,strlen($sitePath));
-                                       $absRef = $siteUrl.$absRef;
+                                       $absRef = substr($absRef, strlen($sitePath));
+                                       $absRef = $siteUrl . $absRef;
                                }
 
                                        // External image from another URL? In that case, fetch image (unless disabled feature).
-                               if (!t3lib_div::isFirstPartOfStr($absRef,$siteUrl) && !$this->procOptions['dontFetchExtPictures'])      {
-                                       $externalFile = $this->getUrl($absRef); // Get it
-                                       if ($externalFile)      {
+                               if (!t3lib_div::isFirstPartOfStr($absRef, $siteUrl) && !$this->procOptions['dontFetchExtPictures']) {
+                                       $externalFile = $this->getUrl($absRef); // Get it
+                                       if ($externalFile) {
                                                $pU = parse_url($absRef);
-                                               $pI=pathinfo($pU['path']);
-
-                                               if (t3lib_div::inList('gif,png,jpeg,jpg',strtolower($pI['extension']))) {
-                                                       $filename = t3lib_div::shortMD5($absRef).'.'.$pI['extension'];
-                                                       $origFilePath = PATH_site.$this->rteImageStorageDir().'RTEmagicP_'.$filename;
-                                                       $C_origFilePath = PATH_site.$this->rteImageStorageDir().'RTEmagicC_'.$filename.'.'.$pI['extension'];
-                                                       if (!@is_file($origFilePath))   {
-                                                               t3lib_div::writeFile($origFilePath,$externalFile);
-                                                               t3lib_div::writeFile($C_origFilePath,$externalFile);
+                                               $pI = pathinfo($pU['path']);
+
+                                               if (t3lib_div::inList('gif,png,jpeg,jpg', strtolower($pI['extension']))) {
+                                                       $filename = t3lib_div::shortMD5($absRef) . '.' . $pI['extension'];
+                                                       $origFilePath = PATH_site . $this->rteImageStorageDir() . 'RTEmagicP_' . $filename;
+                                                       $C_origFilePath = PATH_site . $this->rteImageStorageDir() . 'RTEmagicC_' . $filename . '.' . $pI['extension'];
+                                                       if (!@is_file($origFilePath)) {
+                                                               t3lib_div::writeFile($origFilePath, $externalFile);
+                                                               t3lib_div::writeFile($C_origFilePath, $externalFile);
                                                        }
-                                                       $absRef = $siteUrl.$this->rteImageStorageDir().'RTEmagicC_'.$filename.'.'.$pI['extension'];
+                                                       $absRef = $siteUrl . $this->rteImageStorageDir() . 'RTEmagicC_' . $filename . '.' . $pI['extension'];
 
-                                                       $attribArray['src']=$absRef;
-                                                       $params = t3lib_div::implodeAttributes($attribArray,1);
-                                                       $imgSplit[$k] = '<img '.$params.' />';
+                                                       $attribArray['src'] = $absRef;
+                                                       $params = t3lib_div::implodeAttributes($attribArray, 1);
+                                                       $imgSplit[$k] = '<img ' . $params . ' />';
                                                }
                                        }
                                }
 
                                        // Check image as local file (siteURL equals the one of the image)
-                               if (t3lib_div::isFirstPartOfStr($absRef,$siteUrl))      {
-                                       $path = rawurldecode(substr($absRef,strlen($siteUrl))); // Rel-path, rawurldecoded for special characters.
-                                       $filepath = t3lib_div::getFileAbsFileName($path);               // Abs filepath, locked to relative path of this project.
+                               if (t3lib_div::isFirstPartOfStr($absRef, $siteUrl)) {
+                                       $path = rawurldecode(substr($absRef, strlen($siteUrl))); // Rel-path, rawurldecoded for special characters.
+                                       $filepath = t3lib_div::getFileAbsFileName($path); // Abs filepath, locked to relative path of this project.
 
                                                // Check file existence (in relative dir to this installation!)
-                                       if ($filepath && @is_file($filepath))   {
+                                       if ($filepath && @is_file($filepath)) {
 
                                                        // If "magic image":
-                                               $pathPre=$this->rteImageStorageDir().'RTEmagicC_';
-                                               if (t3lib_div::isFirstPartOfStr($path,$pathPre))        {
-                                                       // Find original file:
-                                                       $pI=pathinfo(substr($path,strlen($pathPre)));
-                                                       $filename = substr($pI['basename'],0,-strlen('.'.$pI['extension']));
-                                                       $origFilePath = PATH_site.$this->rteImageStorageDir().'RTEmagicP_'.$filename;
-                                                       if (@is_file($origFilePath))    {
+                                               $pathPre = $this->rteImageStorageDir() . 'RTEmagicC_';
+                                               if (t3lib_div::isFirstPartOfStr($path, $pathPre)) {
+                                                               // Find original file:
+                                                       $pI = pathinfo(substr($path, strlen($pathPre)));
+                                                       $filename = substr($pI['basename'], 0, -strlen('.' . $pI['extension']));
+                                                       $origFilePath = PATH_site . $this->rteImageStorageDir() . 'RTEmagicP_' . $filename;
+                                                       if (@is_file($origFilePath)) {
                                                                $imgObj = t3lib_div::makeInstance('t3lib_stdGraphic');
                                                                $imgObj->init();
-                                                               $imgObj->mayScaleUp=0;
-                                                               $imgObj->tempPath=PATH_site.$imgObj->tempPath;
+                                                               $imgObj->mayScaleUp = 0;
+                                                               $imgObj->tempPath = PATH_site . $imgObj->tempPath;
 
-                                                               $curInfo = $imgObj->getImageDimensions($filepath);      // Image dimensions of the current image
-                                                               $curWH = $this->getWHFromAttribs($attribArray); // Image dimensions as set in the image tag
+                                                               $curInfo = $imgObj->getImageDimensions($filepath); // Image dimensions of the current image
+                                                               $curWH = $this->getWHFromAttribs($attribArray); // Image dimensions as set in the image tag
                                                                        // Compare dimensions:
-                                                               if ($curWH[0]!=$curInfo[0] || $curWH[1]!=$curInfo[1])   {
-                                                                       $origImgInfo = $imgObj->getImageDimensions($origFilePath);      // Image dimensions of the current image
+                                                               if ($curWH[0] != $curInfo[0] || $curWH[1] != $curInfo[1]) {
+                                                                       $origImgInfo = $imgObj->getImageDimensions($origFilePath); // Image dimensions of the current image
                                                                        $cW = $curWH[0];
                                                                        $cH = $curWH[1];
-                                                                               $cH = 1000;     // Make the image based on the width solely...
-                                                                       $imgI = $imgObj->imageMagickConvert($origFilePath,$pI['extension'],$cW.'m',$cH.'m');
-                                                                       if ($imgI[3])   {
-                                                                               $fI=pathinfo($imgI[3]);
-                                                                               @copy($imgI[3],$filepath);      // Override the child file
+                                                                       $cH = 1000; // Make the image based on the width solely...
+                                                                       $imgI = $imgObj->imageMagickConvert($origFilePath, $pI['extension'], $cW . 'm', $cH . 'm');
+                                                                       if ($imgI[3]) {
+                                                                               $fI = pathinfo($imgI[3]);
+                                                                               @copy($imgI[3], $filepath); // Override the child file
                                                                                        // Removing width and heigth form style attribute
                                                                                $attribArray['style'] = preg_replace('/((?:^|)\s*(?:width|height)\s*:[^;]*(?:$|;))/si', '', $attribArray['style']);
-                                                                               $attribArray['width']=$imgI[0];
-                                                                               $attribArray['height']=$imgI[1];
-                                                                               $params = t3lib_div::implodeAttributes($attribArray,1);
-                                                                               $imgSplit[$k]='<img '.$params.' />';
+                                                                               $attribArray['width'] = $imgI[0];
+                                                                               $attribArray['height'] = $imgI[1];
+                                                                               $params = t3lib_div::implodeAttributes($attribArray, 1);
+                                                                               $imgSplit[$k] = '<img ' . $params . ' />';
                                                                        }
                                                                }
                                                        }
 
-                                               } elseif ($this->procOptions['plainImageMode']) {       // If "plain image" has been configured:
+                                               } elseif ($this->procOptions['plainImageMode']) { // If "plain image" has been configured:
 
                                                                // Image dimensions as set in the image tag, if any
                                                        $curWH = $this->getWHFromAttribs($attribArray);
-                                                       if ($curWH[0]) $attribArray['width'] = $curWH[0];
-                                                       if ($curWH[1]) $attribArray['height'] = $curWH[1];
+                                                       if ($curWH[0]) {
+                                                               $attribArray['width'] = $curWH[0];
+                                                       }
+                                                       if ($curWH[1]) {
+                                                               $attribArray['height'] = $curWH[1];
+                                                       }
 
                                                                // Removing width and heigth form style attribute
                                                        $attribArray['style'] = preg_replace('/((?:^|)\s*(?:width|height)\s*:[^;]*(?:$|;))/si', '', $attribArray['style']);
@@ -498,44 +423,48 @@ class t3lib_parsehtml_proc extends t3lib_parsehtml {
                                                        $fI = @getimagesize($filepath);
 
                                                                // Perform corrections to aspect ratio based on configuration:
-                                                       switch((string)$this->procOptions['plainImageMode'])    {
+                                                       switch ((string) $this->procOptions['plainImageMode']) {
                                                                case 'lockDimensions':
-                                                                       $attribArray['width']=$fI[0];
-                                                                       $attribArray['height']=$fI[1];
+                                                                       $attribArray['width'] = $fI[0];
+                                                                       $attribArray['height'] = $fI[1];
                                                                break;
-                                                               case 'lockRatioWhenSmaller':    // If the ratio has to be smaller, then first set the width...:
-                                                                       if ($attribArray['width']>$fI[0])       $attribArray['width'] = $fI[0];
+                                                               case 'lockRatioWhenSmaller': // If the ratio has to be smaller, then first set the width...:
+                                                                       if ($attribArray['width'] > $fI[0]) {
+                                                                               $attribArray['width'] = $fI[0];
+                                                                       }
                                                                case 'lockRatio':
-                                                                       if ($fI[0]>0)   {
-                                                                               $attribArray['height']=round($attribArray['width']*($fI[1]/$fI[0]));
+                                                                       if ($fI[0] > 0) {
+                                                                               $attribArray['height'] = round($attribArray['width'] * ($fI[1] / $fI[0]));
                                                                        }
                                                                break;
                                                        }
 
                                                                // Compile the image tag again:
-                                                       $params = t3lib_div::implodeAttributes($attribArray,1);
-                                                       $imgSplit[$k]='<img '.$params.' />';
+                                                       $params = t3lib_div::implodeAttributes($attribArray, 1);
+                                                       $imgSplit[$k] = '<img ' . $params . ' />';
                                                }
-                                       } else {        // Remove image if it was not found in a proper position on the server!
+                                       } else { // Remove image if it was not found in a proper position on the server!
 
-                                                       // Commented out; removing the image tag might not be that logical...
-                                               #$imgSplit[$k]='';
+                                               // Commented out; removing the image tag might not be that logical...
+                                               // $imgSplit[$k]='';
                                        }
                                }
 
                                        // Convert abs to rel url
-                               if ($imgSplit[$k])      {
-                                       $attribArray=$this->get_tag_attributes_classic($imgSplit[$k],1);
+                               if ($imgSplit[$k]) {
+                                       $attribArray = $this->get_tag_attributes_classic($imgSplit[$k], 1);
                                        $absRef = trim($attribArray['src']);
-                                       if (t3lib_div::isFirstPartOfStr($absRef,$siteUrl))      {
-                                               $attribArray['src'] = $this->relBackPath.substr($absRef,strlen($siteUrl));
-                                               if (!isset($attribArray['alt']))        $attribArray['alt']='';         // Must have alt-attribute for XHTML compliance.
-                                               $imgSplit[$k]='<img '.t3lib_div::implodeAttributes($attribArray,1,1).' />';
+                                       if (t3lib_div::isFirstPartOfStr($absRef, $siteUrl)) {
+                                               $attribArray['src'] = $this->relBackPath . substr($absRef, strlen($siteUrl));
+                                               if (!isset($attribArray['alt'])) {
+                                                       $attribArray['alt'] = '';
+                                               } // Must have alt-attribute for XHTML compliance.
+                                               $imgSplit[$k] = '<img ' . t3lib_div::implodeAttributes($attribArray, 1, 1) . ' />';
                                        }
                                }
                        }
                }
-               return implode('',$imgSplit);
+               return implode('', $imgSplit);
        }
 
        /**
@@ -546,35 +475,37 @@ class t3lib_parsehtml_proc extends t3lib_parsehtml {
         * @param       string          Content input
         * @return      string          Content output
         */
-       function TS_images_rte($value)  {
+       function TS_images_rte($value) {
 
                $siteUrl = $this->siteUrl();
-               $sitePath = str_replace (t3lib_div::getIndpEnv('TYPO3_REQUEST_HOST'), '', $siteUrl);
+               $sitePath = str_replace(t3lib_div::getIndpEnv('TYPO3_REQUEST_HOST'), '', $siteUrl);
 
                        // Split content by <img> tags and traverse the resulting array for processing:
-               $imgSplit = $this->splitTags('img',$value);
-               foreach($imgSplit as $k => $v)  {
-                       if ($k%2)       {       // image found:
+               $imgSplit = $this->splitTags('img', $value);
+               foreach ($imgSplit as $k => $v) {
+                       if ($k % 2) { // image found:
 
                                        // Init
-                               $attribArray=$this->get_tag_attributes_classic($v,1);
+                               $attribArray = $this->get_tag_attributes_classic($v, 1);
                                $absRef = trim($attribArray['src']);
 
                                        // Unless the src attribute is already pointing to an external URL:
-                               if (strtolower(substr($absRef,0,4))!='http')    {
-                                       $attribArray['src'] = substr($attribArray['src'],strlen($this->relBackPath));
+                               if (strtolower(substr($absRef, 0, 4)) != 'http') {
+                                       $attribArray['src'] = substr($attribArray['src'], strlen($this->relBackPath));
                                                // if site is in a subpath (eg. /~user_jim/) this path needs to be removed because it will be added with $siteUrl
-                                       $attribArray['src'] = preg_replace('#^'.preg_quote($sitePath,'#').'#','',$attribArray['src']);
-                                       $attribArray['src'] = $siteUrl.$attribArray['src'];
-                                       if (!isset($attribArray['alt']))        $attribArray['alt']='';
+                                       $attribArray['src'] = preg_replace('#^' . preg_quote($sitePath, '#') . '#', '', $attribArray['src']);
+                                       $attribArray['src'] = $siteUrl . $attribArray['src'];
+                                       if (!isset($attribArray['alt'])) {
+                                               $attribArray['alt'] = '';
+                                       }
                                        $params = t3lib_div::implodeAttributes($attribArray);
-                                       $imgSplit[$k]='<img '.$params.' />';
+                                       $imgSplit[$k] = '<img ' . $params . ' />';
                                }
                        }
                }
 
                        // return processed content:
-               return implode('',$imgSplit);
+               return implode('', $imgSplit);
        }
 
        /**
@@ -585,30 +516,29 @@ class t3lib_parsehtml_proc extends t3lib_parsehtml {
         * @param       string          Direction of conversion; "rte" (from database to RTE) or "db" (from RTE to database)
         * @return      string          Content output
         */
-       function TS_reglinks($value,$direction)         {
+       function TS_reglinks($value, $direction) {
                $retVal = '';
 
-               switch($direction)      {
+               switch ($direction) {
                        case 'rte':
-                               $retVal = $this->TS_AtagToAbs($value,1);
+                               $retVal = $this->TS_AtagToAbs($value, 1);
                        break;
                        case 'db':
                                $siteURL = $this->siteUrl();
-                               $blockSplit = $this->splitIntoBlock('A',$value);
-                               reset($blockSplit);
-                               while(list($k,$v)=each($blockSplit))    {
-                                       if ($k%2)       {       // block:
-                                               $attribArray=$this->get_tag_attributes_classic($this->getFirstTag($v),1);
+                               $blockSplit = $this->splitIntoBlock('A', $value);
+                               foreach ($blockSplit as $k => $v) {
+                                       if ($k % 2) { // block:
+                                               $attribArray = $this->get_tag_attributes_classic($this->getFirstTag($v), 1);
                                                        // If the url is local, remove url-prefix
-                                               if ($siteURL && substr($attribArray['href'],0,strlen($siteURL))==$siteURL)      {
-                                                       $attribArray['href']=$this->relBackPath.substr($attribArray['href'],strlen($siteURL));
+                                               if ($siteURL && substr($attribArray['href'], 0, strlen($siteURL)) == $siteURL) {
+                                                       $attribArray['href'] = $this->relBackPath . substr($attribArray['href'], strlen($siteURL));
                                                }
-                                               $bTag='<a '.t3lib_div::implodeAttributes($attribArray,1).'>';
-                                               $eTag='</a>';
-                                               $blockSplit[$k] = $bTag.$this->TS_reglinks($this->removeFirstAndLastTag($blockSplit[$k]),$direction).$eTag;
+                                               $bTag = '<a ' . t3lib_div::implodeAttributes($attribArray, 1) . '>';
+                                               $eTag = '</a>';
+                                               $blockSplit[$k] = $bTag . $this->TS_reglinks($this->removeFirstAndLastTag($blockSplit[$k]), $direction) . $eTag;
                                        }
                                }
-                               $retVal = implode('',$blockSplit);
+                               $retVal = implode('', $blockSplit);
                        break;
                }
                return $retVal;
@@ -622,13 +552,13 @@ class t3lib_parsehtml_proc extends t3lib_parsehtml {
         * @return      string          Content output
         * @see TS_links_rte()
         */
-       function TS_links_db($value)    {
+       function TS_links_db($value) {
 
                        // Split content into <a> tag blocks and process:
-               $blockSplit = $this->splitIntoBlock('A',$value);
-               foreach($blockSplit as $k => $v)        {
-                       if ($k%2)       {       // If an A-tag was found:
-                               $attribArray = $this->get_tag_attributes_classic($this->getFirstTag($v),1);
+               $blockSplit = $this->splitIntoBlock('A', $value);
+               foreach ($blockSplit as $k => $v) {
+                       if ($k % 2) { // If an A-tag was found:
+                               $attribArray = $this->get_tag_attributes_classic($this->getFirstTag($v), 1);
                                $info = $this->urlInfoForLinkTags($attribArray['href']);
 
                                        // Check options:
@@ -637,30 +567,39 @@ class t3lib_parsehtml_proc extends t3lib_parsehtml {
                                unset($attribArray_copy['target']);
                                unset($attribArray_copy['class']);
                                unset($attribArray_copy['title']);
-                               if ($attribArray_copy['rteerror'])      {       // Unset "rteerror" and "style" attributes if "rteerror" is set!
+                               unset($attribArray_copy['external']);
+                               if ($attribArray_copy['rteerror']) { // Unset "rteerror" and "style" attributes if "rteerror" is set!
                                        unset($attribArray_copy['style']);
                                        unset($attribArray_copy['rteerror']);
                                }
-                               if (!count($attribArray_copy))  {       // Only if href, target and class are the only attributes, we can alter the link!
+                               if (!count($attribArray_copy)) { // Only if href, target and class are the only attributes, we can alter the link!
+                                               // Quoting class and title attributes if they contain spaces
+                                       $attribArray['class'] = preg_match('/ /', $attribArray['class']) ? '"' . $attribArray['class'] . '"' : $attribArray['class'];
+                                       $attribArray['title'] = preg_match('/ /', $attribArray['title']) ? '"' . $attribArray['title'] . '"' : $attribArray['title'];
                                                // Creating the TYPO3 pseudo-tag "<LINK>" for the link (includes href/url, target and class attributes):
-                                       $bTag='<link '.$info['url'].($attribArray['target']?' '.$attribArray['target']:(($attribArray['class'] || $attribArray['title'])?' -':'')).($attribArray['class']?' '.$attribArray['class']:($attribArray['title']?' -':'')).($attribArray['title']?' "'.$attribArray['title'].'"':'').'>';
-                                       $eTag='</link>';
-                                       $blockSplit[$k] = $bTag.$this->TS_links_db($this->removeFirstAndLastTag($blockSplit[$k])).$eTag;
-                               } else {        // ... otherwise store the link as a-tag.
+                                               // If external attribute is set, keep the href unchanged
+                                       $href = $attribArray['external'] ? $attribArray['href'] : $info['url'] . ($info['query'] ? ',0,' . $info['query'] : '');
+                                       $bTag = '<link ' . $href . ($attribArray['target'] ? ' ' . $attribArray['target'] : (($attribArray['class'] || $attribArray['title']) ? ' -' : '')) . ($attribArray['class'] ? ' ' . $attribArray['class'] : ($attribArray['title'] ? ' -' : '')) . ($attribArray['title'] ? ' ' . $attribArray['title'] : '') . '>';
+                                       $eTag = '</link>';
+                                       $blockSplit[$k] = $bTag . $this->TS_links_db($this->removeFirstAndLastTag($blockSplit[$k])) . $eTag;
+                               } else { // ... otherwise store the link as a-tag.
                                                // Unsetting 'rtekeep' attribute if that had been set.
                                        unset($attribArray['rtekeep']);
-                                               // If the url is local, remove url-prefix
-                                       $siteURL = $this->siteUrl();
-                                       if ($siteURL && substr($attribArray['href'],0,strlen($siteURL))==$siteURL)      {
-                                               $attribArray['href']=$this->relBackPath.substr($attribArray['href'],strlen($siteURL));
+                                       if (!$attribArray['external']) {
+                                                       // If the url is local, remove url-prefix
+                                               $siteURL = $this->siteUrl();
+                                               if ($siteURL && substr($attribArray['href'], 0, strlen($siteURL)) == $siteURL) {
+                                                       $attribArray['href'] = $this->relBackPath . substr($attribArray['href'], strlen($siteURL));
+                                               }
                                        }
-                                       $bTag='<a '.t3lib_div::implodeAttributes($attribArray,1).'>';
-                                       $eTag='</a>';
-                                       $blockSplit[$k] = $bTag.$this->TS_links_db($this->removeFirstAndLastTag($blockSplit[$k])).$eTag;
+                                       unset($attribArray['external']);
+                                       $bTag = '<a ' . t3lib_div::implodeAttributes($attribArray, 1) . '>';
+                                       $eTag = '</a>';
+                                       $blockSplit[$k] = $bTag . $this->TS_links_db($this->removeFirstAndLastTag($blockSplit[$k])) . $eTag;
                                }
                        }
                }
-               return implode('',$blockSplit);
+               return implode('', $blockSplit);
        }
 
        /**
@@ -671,86 +610,87 @@ class t3lib_parsehtml_proc extends t3lib_parsehtml {
         * @return      string          Content output
         * @see TS_links_rte()
         */
-       function TS_links_rte($value)   {
+       function TS_links_rte($value) {
                $value = $this->TS_AtagToAbs($value);
 
                        // Split content by the TYPO3 pseudo tag "<link>":
-               $blockSplit = $this->splitIntoBlock('link',$value,1);
-               foreach($blockSplit as $k => $v)        {
+               $blockSplit = $this->splitIntoBlock('link', $value, 1);
+               $siteUrl = $this->siteUrl();
+               foreach ($blockSplit as $k => $v) {
                        $error = '';
-                       if ($k%2)       {       // block:
-                               $tagCode = t3lib_div::unQuoteFilenames(trim(substr($this->getFirstTag($v),0,-1)),true);
+                       if ($k % 2) { // block:
+                               $tagCode = t3lib_div::unQuoteFilenames(trim(substr($this->getFirstTag($v), 0, -1)), TRUE);
                                $link_param = $tagCode[1];
                                $href = '';
-                               $siteUrl = $this->siteUrl();
                                        // Parsing the typolink data. This parsing is roughly done like in tslib_content->typolink()
-                               if(strstr($link_param,'@'))     {               // mailadr
-                                       $href = 'mailto:'.eregi_replace('^mailto:','',$link_param);
-                               } elseif (substr($link_param,0,1)=='#') {       // check if anchor
-                                       $href = $siteUrl.$link_param;
+                               if (strstr($link_param, '@')) { // mailadr
+                                       $href = 'mailto:' . preg_replace('/^mailto:/i', '', $link_param);
+                               } elseif (substr($link_param, 0, 1) == '#') { // check if anchor
+                                       $href = $siteUrl . $link_param;
                                } else {
-                                       $fileChar=intval(strpos($link_param, '/'));
-                                       $urlChar=intval(strpos($link_param, '.'));
-
+                                       $fileChar = intval(strpos($link_param, '/'));
+                                       $urlChar = intval(strpos($link_param, '.'));
+                                       $external = FALSE;
+                                               // Parse URL:
+                                       $pU = parse_url($link_param);
                                                // Detects if a file is found in site-root OR is a simulateStaticDocument.
-                                       list($rootFileDat) = explode('?',$link_param);
+                                       list($rootFileDat) = explode('?', $link_param);
                                        $rFD_fI = pathinfo($rootFileDat);
-                                       if (trim($rootFileDat) && !strstr($link_param,'/') && (@is_file(PATH_site.$rootFileDat) || t3lib_div::inList('php,html,htm',strtolower($rFD_fI['extension'])))) {
-                                               $href = $siteUrl.$link_param;
-                                       } elseif($urlChar && (strstr($link_param,'//') || !$fileChar || $urlChar<$fileChar))    {       // url (external): If doubleSlash or if a '.' comes before a '/'.
-                                               if (!ereg('^[a-z]*://',trim(strtolower($link_param))))  {$scheme='http://';} else {$scheme='';}
-                                               $href = $scheme.$link_param;
-                                       } elseif($fileChar)     {       // file (internal)
-                                               $href = $siteUrl.$link_param;
-                                       } else {        // integer or alias (alias is without slashes or periods or commas, that is 'nospace,alphanum_x,lower,unique' according to tables.php!!)
-                                               $link_params_parts = explode('#',$link_param);
-                                               $idPart = trim($link_params_parts[0]);          // Link-data del
-                                               if (!strcmp($idPart,''))        { $idPart=$this->recPid; }      // If no id or alias is given, set it to class record pid
-
-// FIXME commented because useless - what is it for?
-//                                             if ($link_params_parts[1] && !$sectionMark)     {
-//                                                     $sectionMark = '#'.trim($link_params_parts[1]);
-//                                             }
-
-                                                       // Splitting the parameter by ',' and if the array counts more than 1 element it's a id/type/? pair
-                                               $pairParts = t3lib_div::trimExplode(',',$idPart);
-                                               if (count($pairParts)>1)        {
-                                                       $idPart = $pairParts[0];
-                                                       // Type ? future support for?
+                                       if (trim($rootFileDat) && !strstr($link_param, '/') && (@is_file(PATH_site . $rootFileDat) || t3lib_div::inList('php,html,htm', strtolower($rFD_fI['extension'])))) {
+                                               $href = $siteUrl . $link_param;
+                                       } elseif ($pU['scheme'] || ($urlChar && (!$fileChar || $urlChar < $fileChar))) {
+                                                       // url (external): if has scheme or if a '.' comes before a '/'.
+                                               $href = $link_param;
+                                               if (!$pU['scheme']) {
+                                                       $href = 'http://' . $href;
                                                }
+                                               $external = TRUE;
+                                       } elseif ($fileChar) { // file (internal)
+                                               $href = $siteUrl . $link_param;
+                                       } else { // integer or alias (alias is without slashes or periods or commas, that is 'nospace,alphanum_x,lower,unique' according to tables.php!!)
+                                                       // Splitting the parameter by ',' and if the array counts more than 1 element it's a id/type/parameters triplet
+                                               $pairParts = t3lib_div::trimExplode(',', $link_param, TRUE);
+                                               $idPart = $pairParts[0];
+                                               $link_params_parts = explode('#', $idPart);
+                                               $idPart = trim($link_params_parts[0]);
+                                               $sectionMark = trim($link_params_parts[1]);
+                                               if (!strcmp($idPart, '')) {
+                                                       $idPart = $this->recPid;
+                                               } // If no id or alias is given, set it to class record pid
                                                        // Checking if the id-parameter is an alias.
-                                               if (!t3lib_div::testInt($idPart))       {
-                                                       list($idPartR) = t3lib_BEfunc::getRecordsByField('pages','alias',$idPart);
+                                               if (!t3lib_utility_Math::canBeInterpretedAsInteger($idPart)) {
+                                                       list($idPartR) = t3lib_BEfunc::getRecordsByField('pages', 'alias', $idPart);
                                                        $idPart = intval($idPartR['uid']);
                                                }
                                                $page = t3lib_BEfunc::getRecord('pages', $idPart);
-                                               if (is_array($page))    {       // Page must exist...
-                                                       $href = $siteUrl.'?id='.$link_param;
-                                               } else if(strtolower(substr($link_param, 0, 7)) == 'record:') {
-                                                               // linkHandler - allowing links to start with "record:"
+                                               if (is_array($page)) { // Page must exist...
+                                                       $href = $siteUrl . '?id=' . $idPart . ($pairParts[2] ? $pairParts[2] : '') . ($sectionMark ? '#' . $sectionMark : '');
+                                                               // linkHandler - allowing links to start with registerd linkHandler e.g.. "record:"
+                                               } elseif (isset($GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['tslib/class.tslib_content.php']['typolinkLinkHandler'][array_shift(explode(':', $link_param))])) {
                                                        $href = $link_param;
                                                } else {
                                                        #$href = '';
-                                                       $href = $siteUrl.'?id='.$link_param;
-                                                       $error = 'No page found: '.$idPart;
+                                                       $href = $siteUrl . '?id=' . $link_param;
+                                                       $error = 'No page found: ' . $idPart;
                                                }
                                        }
                                }
 
-                               // Setting the A-tag:
-                               $bTag = '<a href="'.htmlspecialchars($href).'"'.
-                                                       ($tagCode[2]&&$tagCode[2]!='-' ? ' target="'.htmlspecialchars($tagCode[2]).'"' : '').
-                                                       ($tagCode[3]&&$tagCode[3]!='-' ? ' class="'.htmlspecialchars($tagCode[3]).'"' : '').
-                                                       ($tagCode[4] ? ' title="'.htmlspecialchars($tagCode[4]).'"' : '').
-                                                       ($error ? ' rteerror="'.htmlspecialchars($error).'" style="background-color: yellow; border:2px red solid; color: black;"' : '').       // Should be OK to add the style; the transformation back to databsae will remove it...
-                                                       '>';
+                                       // Setting the A-tag:
+                               $bTag = '<a href="' . htmlspecialchars($href) . '"' .
+                                               ($tagCode[2] && $tagCode[2] != '-' ? ' target="' . htmlspecialchars($tagCode[2]) . '"' : '') .
+                                               ($tagCode[3] && $tagCode[3] != '-' ? ' class="' . htmlspecialchars($tagCode[3]) . '"' : '') .
+                                               ($tagCode[4] ? ' title="' . htmlspecialchars($tagCode[4]) . '"' : '') .
+                                               ($external ? ' external="1"' : '') .
+                                               ($error ? ' rteerror="' . htmlspecialchars($error) . '" style="background-color: yellow; border:2px red solid; color: black;"' : '') . // Should be OK to add the style; the transformation back to databsae will remove it...
+                                               '>';
                                $eTag = '</a>';
-                               $blockSplit[$k] = $bTag.$this->TS_links_rte($this->removeFirstAndLastTag($blockSplit[$k])).$eTag;
+                               $blockSplit[$k] = $bTag . $this->TS_links_rte($this->removeFirstAndLastTag($blockSplit[$k])) . $eTag;
                        }
                }
 
                        // Return content:
-               return implode('',$blockSplit);
+               return implode('', $blockSplit);
        }
 
        /**
@@ -759,22 +699,24 @@ class t3lib_parsehtml_proc extends t3lib_parsehtml {
         * @param       string          Content input
         * @return      string          Content output
         */
-       function TS_preserve_db($value) {
-               if (!$this->preserveTags)       return $value;
+       function TS_preserve_db($value) {
+               if (!$this->preserveTags) {
+                       return $value;
+               }
 
                        // Splitting into blocks for processing (span-tags are used for special tags)
-               $blockSplit = $this->splitIntoBlock('span',$value);
-               foreach($blockSplit as $k => $v)        {
-                       if ($k%2)       {       // block:
-                               $attribArray=$this->get_tag_attributes_classic($this->getFirstTag($v));
-                               if ($attribArray['specialtag']) {
+               $blockSplit = $this->splitIntoBlock('span', $value);
+               foreach ($blockSplit as $k => $v) {
+                       if ($k % 2) { // block:
+                               $attribArray = $this->get_tag_attributes_classic($this->getFirstTag($v));
+                               if ($attribArray['specialtag']) {
                                        $theTag = rawurldecode($attribArray['specialtag']);
                                        $theTagName = $this->getFirstTagName($theTag);
-                                       $blockSplit[$k] = $theTag.$this->removeFirstAndLastTag($blockSplit[$k]).'</'.$theTagName.'>';
+                                       $blockSplit[$k] = $theTag . $this->removeFirstAndLastTag($blockSplit[$k]) . '</' . $theTagName . '>';
                                }
                        }
                }
-               return implode('',$blockSplit);
+               return implode('', $blockSplit);
        }
 
        /**
@@ -783,16 +725,18 @@ class t3lib_parsehtml_proc extends t3lib_parsehtml {
         * @param       string          Content input
         * @return      string          Content output
         */
-       function TS_preserve_rte($value)        {
-               if (!$this->preserveTags)       return $value;
+       function TS_preserve_rte($value) {
+               if (!$this->preserveTags) {
+                       return $value;
+               }
 
-               $blockSplit = $this->splitIntoBlock($this->preserveTags,$value);
-               foreach($blockSplit as $k => $v)        {
-                       if ($k%2)       {       // block:
-                               $blockSplit[$k] = '<span specialtag="'.rawurlencode($this->getFirstTag($v)).'">'.$this->removeFirstAndLastTag($blockSplit[$k]).'</span>';
+               $blockSplit = $this->splitIntoBlock($this->preserveTags, $value);
+               foreach ($blockSplit as $k => $v) {
+                       if ($k % 2) { // block:
+                               $blockSplit[$k] = '<span specialtag="' . rawurlencode($this->getFirstTag($v)) . '">' . $this->removeFirstAndLastTag($blockSplit[$k]) . '</span>';
                        }
                }
-               return implode('',$blockSplit);
+               return implode('', $blockSplit);
        }
 
        /**
@@ -800,69 +744,75 @@ class t3lib_parsehtml_proc extends t3lib_parsehtml {
         * Cleaning (->db) for standard content elements (ts)
         *
         * @param       string          Content input
-        * @param       boolean         If true, the transformation was "css_transform", otherwise "ts_transform"
+        * @param       boolean         If TRUE, the transformation was "css_transform", otherwise "ts_transform"
         * @return      string          Content output
         * @see TS_transform_rte()
         */
-       function TS_transform_db($value,$css=FALSE)     {
+       function TS_transform_db($value, $css = FALSE) {
 
                        // safety... so forever loops are avoided (they should not occur, but an error would potentially do this...)
                $this->TS_transform_db_safecounter--;
-               if ($this->TS_transform_db_safecounter<0)       return $value;
+               if ($this->TS_transform_db_safecounter < 0) {
+                       return $value;
+               }
 
                        // Split the content from RTE by the occurence of these blocks:
-               $blockSplit = $this->splitIntoBlock('TABLE,BLOCKQUOTE,'.($this->procOptions['preserveDIVSections']?'DIV,':'').$this->headListTags,$value);
+               $blockSplit = $this->splitIntoBlock('TABLE,BLOCKQUOTE,' . ($this->procOptions['preserveDIVSections'] ? 'DIV,' : '') . $this->blockElementList, $value);
 
-               $cc=0;
+               $cc = 0;
                $aC = count($blockSplit);
 
                        // Avoid superfluous linebreaks by transform_db after ending headListTag
-               while($aC && !strcmp(trim($blockSplit[$aC-1]),''))      {
-                       unset($blockSplit[$aC-1]);
+               while ($aC && !strcmp(trim($blockSplit[$aC - 1]), '')) {
+                       unset($blockSplit[$aC - 1]);
                        $aC = count($blockSplit);
                }
 
                        // Traverse the blocks
-               foreach($blockSplit as $k => $v)        {
+               foreach ($blockSplit as $k => $v) {
                        $cc++;
-                       $lastBR = $cc==$aC ? '' : chr(10);
+                       $lastBR = $cc == $aC ? '' : LF;
 
-                       if ($k%2)       {       // Inside block:
+                       if ($k % 2) { // Inside block:
 
                                        // Init:
-                               $tag=$this->getFirstTag($v);
-                               $tagName=strtolower($this->getFirstTagName($v));
+                               $tag = $this->getFirstTag($v);
+                               $tagName = strtolower($this->getFirstTagName($v));
 
                                        // Process based on the tag:
-                               switch($tagName)        {
-                                       case 'blockquote':      // Keep blockquotes, but clean the inside recursively in the same manner as the main code
-                                       case 'dd' :             // Do the same on dd elements
-                                       case 'div':             // Do the same on div sections, if they were splitted
-                                               $blockSplit[$k]=$tag.$this->TS_transform_db($this->removeFirstAndLastTag($blockSplit[$k]),$css).'</'.$tagName.'>'.$lastBR;
+                               switch ($tagName) {
+                                       case 'blockquote': // Keep blockquotes, but clean the inside recursively in the same manner as the main code
+                                       case 'dd' : // Do the same on dd elements
+                                       case 'div': // Do the same on div sections, if they were splitted
+                                               $blockSplit[$k] = $tag . $this->TS_transform_db($this->removeFirstAndLastTag($blockSplit[$k]), $css) . '</' . $tagName . '>' . $lastBR;
                                        break;
                                        case 'ol':
-                                       case 'ul':      // Transform lists into <typolist>-tags:
-                                               if (!$css)      {
-                                                       if (!isset($this->procOptions['typolist']) || $this->procOptions['typolist'])   {
-                                                               $parts = $this->getAllParts($this->splitIntoBlock('LI',$this->removeFirstAndLastTag($blockSplit[$k])),1,0);
-                                                               while(list($k2)=each($parts))   {
-                                                                       $parts[$k2]=preg_replace('/['.preg_quote(chr(10).chr(13)).']+/','',$parts[$k2]);        // remove all linesbreaks!
-                                                                       $parts[$k2]=$this->defaultTStagMapping($parts[$k2],'db');
-                                                                       $parts[$k2]=$this->cleanFontTags($parts[$k2],0,0,0);
-                                                                       $parts[$k2] = $this->HTMLcleaner_db($parts[$k2],strtolower($this->procOptions['allowTagsInTypolists']?$this->procOptions['allowTagsInTypolists']:'br,font,b,i,u,a,img,span,strong,em'));
+                                       case 'ul': // Transform lists into <typolist>-tags:
+                                               if (!$css) {
+                                                       if (!isset($this->procOptions['typolist']) || $this->procOptions['typolist']) {
+                                                               $parts = $this->getAllParts($this->splitIntoBlock('LI', $this->removeFirstAndLastTag($blockSplit[$k])), 1, 0);
+                                                               foreach ($parts as $k2 => $value) {
+                                                                       $parts[$k2] = preg_replace('/[' . preg_quote(LF . CR) . ']+/', '', $parts[$k2]); // remove all linesbreaks!
+                                                                       $parts[$k2] = $this->defaultTStagMapping($parts[$k2], 'db');
+                                                                       $parts[$k2] = $this->cleanFontTags($parts[$k2], 0, 0, 0);
+                                                                       $parts[$k2] = $this->HTMLcleaner_db($parts[$k2], strtolower($this->procOptions['allowTagsInTypolists'] ? $this->procOptions['allowTagsInTypolists'] : 'br,font,b,i,u,a,img,span,strong,em'));
+                                                               }
+                                                               if ($tagName == 'ol') {
+                                                                       $params = ' type="1"';
+                                                               } else {
+                                                                       $params = '';
                                                                }
-                                                               if ($tagName=='ol')     { $params=' type="1"'; } else { $params=''; }
-                                                               $blockSplit[$k]='<typolist'.$params.'>'.chr(10).implode(chr(10),$parts).chr(10).'</typolist>'.$lastBR;
+                                                               $blockSplit[$k] = '<typolist' . $params . '>' . LF . implode(LF, $parts) . LF . '</typolist>' . $lastBR;
                                                        }
                                                } else {
-                                                       $blockSplit[$k]=preg_replace('/['.preg_quote(chr(10).chr(13)).']+/',' ',$this->transformStyledATags($blockSplit[$k])).$lastBR;
+                                                       $blockSplit[$k] = preg_replace('/[' . preg_quote(LF . CR) . ']+/', ' ', $this->transformStyledATags($blockSplit[$k])) . $lastBR;
                                                }
                                        break;
-                                       case 'table':   // Tables are NOT allowed in any form (unless preserveTables is set or CSS is the mode)
-                                               if (!$this->procOptions['preserveTables'] && !$css)     {
-                                                       $blockSplit[$k]=$this->TS_transform_db($this->removeTables($blockSplit[$k]));
+                                       case 'table': // Tables are NOT allowed in any form (unless preserveTables is set or CSS is the mode)
+                                               if (!$this->procOptions['preserveTables'] && !$css) {
+                                                       $blockSplit[$k] = $this->TS_transform_db($this->removeTables($blockSplit[$k]));
                                                } else {
-                                                       $blockSplit[$k]=preg_replace('/['.preg_quote(chr(10).chr(13)).']+/',' ',$this->transformStyledATags($blockSplit[$k])).$lastBR;
+                                                       $blockSplit[$k] = preg_replace('/[' . preg_quote(LF . CR) . ']+/', ' ', $this->transformStyledATags($blockSplit[$k])) . $lastBR;
                                                }
                                        break;
                                        case 'h1':
@@ -871,50 +821,56 @@ class t3lib_parsehtml_proc extends t3lib_parsehtml {
                                        case 'h4':
                                        case 'h5':
                                        case 'h6':
-                                               if (!$css)      {
-                                                       $attribArray=$this->get_tag_attributes_classic($tag);
+                                               if (!$css) {
+                                                       $attribArray = $this->get_tag_attributes_classic($tag);
                                                                // Processing inner content here:
                                                        $innerContent = $this->HTMLcleaner_db($this->removeFirstAndLastTag($blockSplit[$k]));
 
-                                                       if (!isset($this->procOptions['typohead']) || $this->procOptions['typohead'])   {
-                                                               $type = intval(substr($tagName,1));
-                                                               $blockSplit[$k]='<typohead'.
-                                                                                               ($type!=6?' type="'.$type.'"':'').
-                                                                                               ($attribArray['align']?' align="'.$attribArray['align'].'"':'').
-                                                                                               ($attribArray['class']?' class="'.$attribArray['class'].'"':'').
-                                                                                               '>'.
-                                                                                               $innerContent.
-                                                                                               '</typohead>'.
-                                                                                               $lastBR;
+                                                       if (!isset($this->procOptions['typohead']) || $this->procOptions['typohead']) {
+                                                               $type = intval(substr($tagName, 1));
+                                                               $blockSplit[$k] = '<typohead' .
+                                                                                                 ($type != 6 ? ' type="' . $type . '"' : '') .
+                                                                                                 ($attribArray['align'] ? ' align="' . $attribArray['align'] . '"' : '') .
+                                                                                                 ($attribArray['class'] ? ' class="' . $attribArray['class'] . '"' : '') .
+                                                                                                 '>' .
+                                                                                                 $innerContent .
+                                                                                                 '</typohead>' .
+                                                                                                 $lastBR;
                                                        } else {
-                                                               $blockSplit[$k]='<'.$tagName.
-                                                                                               ($attribArray['align']?' align="'.htmlspecialchars($attribArray['align']).'"':'').
-                                                                                               ($attribArray['class']?' class="'.htmlspecialchars($attribArray['class']).'"':'').
-                                                                                               '>'.
-                                                                                               $innerContent.
-                                                                                               '</'.$tagName.'>'.
-                                                                                               $lastBR;
+                                                               $blockSplit[$k] = '<' . $tagName .
+                                                                                                 ($attribArray['align'] ? ' align="' . htmlspecialchars($attribArray['align']) . '"' : '') .
+                                                                                                 ($attribArray['class'] ? ' class="' . htmlspecialchars($attribArray['class']) . '"' : '') .
+                                                                                                 '>' .
+                                                                                                 $innerContent .
+                                                                                                 '</' . $tagName . '>' .
+                                                                                                 $lastBR;
                                                        }
                                                } else {
                                                                // Eliminate true linebreaks inside Hx tags
-                                                       $blockSplit[$k]=preg_replace('/['.preg_quote(chr(10).chr(13)).']+/',' ',$this->transformStyledATags($blockSplit[$k])).$lastBR;
+                                                       $blockSplit[$k] = preg_replace('/[' . preg_quote(LF . CR) . ']+/', ' ', $this->transformStyledATags($blockSplit[$k])) . $lastBR;
                                                }
                                        break;
                                        default:
-                                                       // Eliminate true linebreaks inside other headlist tags and after hr tag
-                                               $blockSplit[$k]=preg_replace('/['.preg_quote(chr(10).chr(13)).']+/',' ',$this->transformStyledATags($blockSplit[$k])).$lastBR;
+                                                       // Eliminate true linebreaks inside other headlist tags
+                                               $blockSplit[$k] = preg_replace('/[' . preg_quote(LF . CR) . ']+/', ' ', $this->transformStyledATags($blockSplit[$k])) . $lastBR;
                                        break;
                                }
-                       } else {        // NON-block:
-                               if (strcmp(trim($blockSplit[$k]),''))   {
-                                       $blockSplit[$k]=$this->divideIntoLines(preg_replace('/['.preg_quote(chr(10).chr(13)).']+/',' ',$blockSplit[$k])).$lastBR;
-                                       $blockSplit[$k]=$this->transformStyledATags($blockSplit[$k]);
-                               } else unset($blockSplit[$k]);
+                       } else { // NON-block:
+                               if (strcmp(trim($blockSplit[$k]), '')) {
+                                               // Remove linebreaks following hr tags
+                                       $blockSplit[$k] = preg_replace('/<(hr)(\s[^>\/]*)?[[:space:]]*\/?>[' . preg_quote(LF . CR) . ']+/', '<$1$2 />', $blockSplit[$k]);
+                                               // Replace other linebreaks with space
+                                       $blockSplit[$k] = preg_replace('/[' . preg_quote(LF . CR) . ']+/', ' ', $blockSplit[$k]);
+                                       $blockSplit[$k] = $this->divideIntoLines($blockSplit[$k]) . $lastBR;
+                                       $blockSplit[$k] = $this->transformStyledATags($blockSplit[$k]);
+                               } else {
+                                       unset($blockSplit[$k]);
+                               }
                        }
                }
                $this->TS_transform_db_safecounter++;
 
-               return implode('',$blockSplit);
+               return implode('', $blockSplit);
        }
 
        /**
@@ -923,21 +879,22 @@ class t3lib_parsehtml_proc extends t3lib_parsehtml {
         * @param       string          Content input
         * @return      string          Content output
         */
-       function transformStyledATags($value)   {
-               $blockSplit = $this->splitIntoBlock('A',$value);
-               foreach($blockSplit as $k => $v)        {
-                       if ($k%2)       {       // If an A-tag was found:
-                               $attribArray = $this->get_tag_attributes_classic($this->getFirstTag($v),1);
-                               if ($attribArray['style'])      {       // If "style" attribute is set!
+       function transformStyledATags($value) {
+               $blockSplit = $this->splitIntoBlock('A', $value);
+               foreach ($blockSplit as $k => $v) {
+                       if ($k % 2) { // If an A-tag was found:
+                               $attribArray = $this->get_tag_attributes_classic($this->getFirstTag($v), 1);
+                                       // If "style" attribute is set and rteerror is not set!
+                               if ($attribArray['style'] && !$attribArray['rteerror']) {
                                        $attribArray_copy['style'] = $attribArray['style'];
                                        unset($attribArray['style']);
-                                       $bTag='<span '.t3lib_div::implodeAttributes($attribArray_copy,1).'><a '.t3lib_div::implodeAttributes($attribArray,1).'>';
-                                       $eTag='</a></span>';
-                                       $blockSplit[$k] = $bTag.$this->removeFirstAndLastTag($blockSplit[$k]).$eTag;
+                                       $bTag = '<span ' . t3lib_div::implodeAttributes($attribArray_copy, 1) . '><a ' . t3lib_div::implodeAttributes($attribArray, 1) . '>';
+                                       $eTag = '</a></span>';
+                                       $blockSplit[$k] = $bTag . $this->removeFirstAndLastTag($blockSplit[$k]) . $eTag;
                                }
                        }
                }
-               return implode('',$blockSplit);
+               return implode('', $blockSplit);
        }
 
        /**
@@ -945,18 +902,18 @@ class t3lib_parsehtml_proc extends t3lib_parsehtml {
         * Set (->rte) for standard content elements (ts)
         *
         * @param       string          Content input
-        * @param       boolean         If true, the transformation was "css_transform", otherwise "ts_transform"
+        * @param       boolean         If TRUE, the transformation was "css_transform", otherwise "ts_transform"
         * @return      string          Content output
         * @see TS_transform_db()
         */
-       function TS_transform_rte($value,$css=0)        {
+       function TS_transform_rte($value, $css = 0) {
 
                        // Split the content from Database by the occurence of these blocks:
-               $blockSplit = $this->splitIntoBlock('TABLE,BLOCKQUOTE,TYPOLIST,TYPOHEAD,'.($this->procOptions['preserveDIVSections']?'DIV,':'').$this->headListTags,$value);
+               $blockSplit = $this->splitIntoBlock('TABLE,BLOCKQUOTE,TYPOLIST,TYPOHEAD,' . ($this->procOptions['preserveDIVSections'] ? 'DIV,' : '') . $this->blockElementList, $value);
 
                        // Traverse the blocks
-               foreach($blockSplit as $k => $v)        {
-                       if ($k%2)       {       // Inside one of the blocks:
+               foreach ($blockSplit as $k => $v) {
+                       if ($k % 2) { // Inside one of the blocks:
 
                                        // Init:
                                $tag = $this->getFirstTag($v);
@@ -964,55 +921,57 @@ class t3lib_parsehtml_proc extends t3lib_parsehtml {
                                $attribArray = $this->get_tag_attributes_classic($tag);
 
                                        // Based on tagname, we do transformations:
-                               switch($tagName)        {
-                                       case 'blockquote':      // Keep blockquotes
-                                       case 'dd':              // Keep definitions
-                                       case 'div':             // Keep div sections, if they were splitted
-                                               $blockSplit[$k] = $tag.
-                                                                       $this->TS_transform_rte($this->removeFirstAndLastTag($blockSplit[$k]),$css).
-                                                                       '</'.$tagName.'>';
+                               switch ($tagName) {
+                                       case 'blockquote': // Keep blockquotes
+                                       case 'dd': // Keep definitions
+                                       case 'div': // Keep div sections, if they were splitted
+                                               $blockSplit[$k] = $tag .
+                                                                                 $this->TS_transform_rte($this->removeFirstAndLastTag($blockSplit[$k]), $css) .
+                                                                                 '</' . $tagName . '>';
                                        break;
-                                       case 'typolist':        // Transform typolist blocks into OL/UL lists. Type 1 is expected to be numerical block
-                                               if (!isset($this->procOptions['typolist']) || $this->procOptions['typolist'])   {
+                                       case 'typolist': // Transform typolist blocks into OL/UL lists. Type 1 is expected to be numerical block
+                                               if (!isset($this->procOptions['typolist']) || $this->procOptions['typolist']) {
                                                        $tListContent = $this->removeFirstAndLastTag($blockSplit[$k]);
-                                                       $tListContent = ereg_replace('^[ ]*'.chr(10),'',$tListContent);
-                                                       $tListContent = ereg_replace(chr(10).'[ ]*$','',$tListContent);
-                                                       $lines = explode(chr(10),$tListContent);
-                                                       $typ = $attribArray['type']==1 ? 'ol' : 'ul';
-                                                       $blockSplit[$k] = '<'.$typ.'>'.chr(10).
-                                                                                               '<li>'.implode('</li>'.chr(10).'<li>',$lines).'</li>'.
-                                                                                               '</'.$typ.'>';
+                                                       $tListContent = preg_replace('/^[ ]*' . LF . '/', '', $tListContent);
+                                                       $tListContent = preg_replace('/' . LF . '[ ]*$/', '', $tListContent);
+                                                       $lines = explode(LF, $tListContent);
+                                                       $typ = $attribArray['type'] == 1 ? 'ol' : 'ul';
+                                                       $blockSplit[$k] = '<' . $typ . '>' . LF .
+                                                                                         '<li>' . implode('</li>' . LF . '<li>', $lines) . '</li>' .
+                                                                                         '</' . $typ . '>';
                                                }
                                        break;
-                                       case 'typohead':        // Transform typohead into Hx tags.
-                                               if (!isset($this->procOptions['typohead']) || $this->procOptions['typohead'])   {
+                                       case 'typohead': // Transform typohead into Hx tags.
+                                               if (!isset($this->procOptions['typohead']) || $this->procOptions['typohead']) {
                                                        $tC = $this->removeFirstAndLastTag($blockSplit[$k]);
-                                                       $typ = t3lib_div::intInRange($attribArray['type'],0,6);
-                                                       if (!$typ)      $typ=6;
-                                                       $align = $attribArray['align']?' align="'.$attribArray['align'].'"': '';
-                                                       $class = $attribArray['class']?' class="'.$attribArray['class'].'"': '';
-                                                       $blockSplit[$k] = '<h'.$typ.$align.$class.'>'.
-                                                                                               $tC.
-                                                                                               '</h'.$typ.'>';
+                                                       $typ = t3lib_utility_Math::forceIntegerInRange($attribArray['type'], 0, 6);
+                                                       if (!$typ) {
+                                                               $typ = 6;
+                                                       }
+                                                       $align = $attribArray['align'] ? ' align="' . $attribArray['align'] . '"' : '';
+                                                       $class = $attribArray['class'] ? ' class="' . $attribArray['class'] . '"' : '';
+                                                       $blockSplit[$k] = '<h' . $typ . $align . $class . '>' .
+                                                                                         $tC .
+                                                                                         '</h' . $typ . '>';
                                                }
                                        break;
                                }
-                               $blockSplit[$k+1] = ereg_replace('^[ ]*'.chr(10),'',$blockSplit[$k+1]); // Removing linebreak if typohead
-                       } else {        // NON-block:
-                               $nextFTN = $this->getFirstTagName($blockSplit[$k+1]);
-                               $singleLineBreak = $blockSplit[$k]==chr(10);
-                               if (t3lib_div::inList('TABLE,BLOCKQUOTE,TYPOLIST,TYPOHEAD,'.($this->procOptions['preserveDIVSections']?'DIV,':'').$this->headListTags,$nextFTN))        {       // Removing linebreak if typolist/typohead
-                                       $blockSplit[$k] = ereg_replace(chr(10).'[ ]*$','',$blockSplit[$k]);
+                               $blockSplit[$k + 1] = preg_replace('/^[ ]*' . LF . '/', '', $blockSplit[$k + 1]); // Removing linebreak if typohead
+                       } else { // NON-block:
+                               $nextFTN = $this->getFirstTagName($blockSplit[$k + 1]);
+                               $singleLineBreak = $blockSplit[$k] == LF;
+                               if (t3lib_div::inList('TABLE,BLOCKQUOTE,TYPOLIST,TYPOHEAD,' . ($this->procOptions['preserveDIVSections'] ? 'DIV,' : '') . $this->blockElementList, $nextFTN)) { // Removing linebreak if typolist/typohead
+                                       $blockSplit[$k] = preg_replace('/' . LF . '[ ]*$/', '', $blockSplit[$k]);
                                }
                                        // If $blockSplit[$k] is blank then unset the line. UNLESS the line happend to be a single line break.
-                               if (!strcmp($blockSplit[$k],'') && !$singleLineBreak)   {
+                               if (!strcmp($blockSplit[$k], '') && !$singleLineBreak) {
                                        unset($blockSplit[$k]);
                                } else {
-                                       $blockSplit[$k] = $this->setDivTags($blockSplit[$k],($this->procOptions['useDIVasParagraphTagForRTE']?'div':'p'));
+                                       $blockSplit[$k] = $this->setDivTags($blockSplit[$k], ($this->procOptions['useDIVasParagraphTagForRTE'] ? 'div' : 'p'));
                                }
                        }
                }
-               return implode(chr(10),$blockSplit);
+               return implode(LF, $blockSplit);
        }
 
        /**
@@ -1022,24 +981,12 @@ class t3lib_parsehtml_proc extends t3lib_parsehtml {
         * @param       string          Content input
         * @return      string          Content output
         */
-       function TS_strip_db($value)    {
-               $value = strip_tags($value,'<'.implode('><',explode(',','b,i,u,a,img,br,div,center,pre,font,hr,sub,sup,p,strong,em,li,ul,ol,blockquote')).'>');
+       function TS_strip_db($value) {
+               $value = strip_tags($value, '<' . implode('><', explode(',', 'b,i,u,a,img,br,div,center,pre,font,hr,sub,sup,p,strong,em,li,ul,ol,blockquote')) . '>');
                return $value;
        }
 
 
-
-
-
-
-
-
-
-
-
-
-
-
        /***************************************************************
         *
         * Generic RTE transformation, analysis and helper functions
@@ -1051,10 +998,10 @@ class t3lib_parsehtml_proc extends t3lib_parsehtml {
         *
         * @param       string          Filepath/URL to read
         * @return      string          The content from the resource given as input.
-        * @see t3lib_div::getURL()
+        * @see t3lib_div::getUrl()
         */
-       function getURL($url)   {
-               return t3lib_div::getURL($url);
+       function getUrl($url) {
+               return t3lib_div::getUrl($url);
        }
 
        /**
@@ -1067,23 +1014,23 @@ class t3lib_parsehtml_proc extends t3lib_parsehtml {
         * @return      string          Clean content
         * @see getKeepTags()
         */
-        function HTMLcleaner_db($content,$tagList='')  {
-               if (!$tagList)  {
+       function HTMLcleaner_db($content, $tagList = '') {
+               if (!$tagList) {
                        $keepTags = $this->getKeepTags('db');
                } else {
-                       $keepTags = $this->getKeepTags('db',$tagList);
+                       $keepTags = $this->getKeepTags('db', $tagList);
                }
-               $kUknown = $this->procOptions['dontRemoveUnknownTags_db'] ? 1 : 0;              // Default: remove unknown tags.
-               $hSC = $this->procOptions['dontUndoHSC_db'] ? 0 : -1;                                   // Default: re-convert literals to characters (that is &lt; to <)
+               $kUknown = $this->procOptions['dontRemoveUnknownTags_db'] ? 1 : 0; // Default: remove unknown tags.
+               $hSC = $this->procOptions['dontUndoHSC_db'] ? 0 : -1; // Default: re-convert literals to characters (that is &lt; to <)
 
                        // Create additional configuration in order to honor the setting RTE.default.proc.HTMLparser_db.xhtml_cleaning=1
-               $addConfig=array();
-               if ((is_array($this->procOptions['HTMLparser_db.']) && $this->procOptions['HTMLparser_db.']['xhtml_cleaning']) || (is_array($this->procOptions['entryHTMLparser_db.']) && $this->procOptions['entryHTMLparser_db.']['xhtml_cleaning']) || (is_array($this->procOptions['exitHTMLparser_db.']) && $this->procOptions['exitHTMLparser_db.']['xhtml_cleaning']))   {
-                       $addConfig['xhtml']=1;
+               $addConfig = array();
+               if ((is_array($this->procOptions['HTMLparser_db.']) && $this->procOptions['HTMLparser_db.']['xhtml_cleaning']) || (is_array($this->procOptions['entryHTMLparser_db.']) && $this->procOptions['entryHTMLparser_db.']['xhtml_cleaning']) || (is_array($this->procOptions['exitHTMLparser_db.']) && $this->procOptions['exitHTMLparser_db.']['xhtml_cleaning'])) {
+                       $addConfig['xhtml'] = 1;
                }
 
-               return $this->HTMLcleaner($content,$keepTags,$kUknown,$hSC,$addConfig);
-        }
+               return $this->HTMLcleaner($content, $keepTags, $kUknown, $hSC, $addConfig);
+       }
 
        /**
         * Creates an array of configuration for the HTMLcleaner function based on whether content go TO or FROM the Rich Text Editor ($direction)
@@ -1094,38 +1041,42 @@ class t3lib_parsehtml_proc extends t3lib_parsehtml {
         * @return      array           Configuration array
         * @see HTMLcleaner_db()
         */
-       function getKeepTags($direction='rte',$tagList='')      {
-               if (!is_array($this->getKeepTags_cache[$direction]) || $tagList)        {
+       function getKeepTags($direction = 'rte', $tagList = '') {
+               if (!is_array($this->getKeepTags_cache[$direction]) || $tagList) {
 
                                // Setting up allowed tags:
-                       if (strcmp($tagList,''))        {       // If the $tagList input var is set, this will take precedence
-                               $keepTags = array_flip(t3lib_div::trimExplode(',',$tagList,1));
-                       } else {        // Default is to get allowed/denied tags from internal array of processing options:
+                       if (strcmp($tagList, '')) { // If the $tagList input var is set, this will take precedence
+                               $keepTags = array_flip(t3lib_div::trimExplode(',', $tagList, 1));
+                       } else { // Default is to get allowed/denied tags from internal array of processing options:
                                        // Construct default list of tags to keep:
                                $typoScript_list = 'b,i,u,a,img,br,div,center,pre,font,hr,sub,sup,p,strong,em,li,ul,ol,blockquote,strike,span';
-                               $keepTags = array_flip(t3lib_div::trimExplode(',',$typoScript_list.','.strtolower($this->procOptions['allowTags']),1));
+                               $keepTags = array_flip(t3lib_div::trimExplode(',', $typoScript_list . ',' . strtolower($this->procOptions['allowTags']), 1));
 
                                        // For tags to deny, remove them from $keepTags array:
-                               $denyTags = t3lib_div::trimExplode(',',$this->procOptions['denyTags'],1);
-                               foreach($denyTags as $dKe)      {
+                               $denyTags = t3lib_div::trimExplode(',', $this->procOptions['denyTags'], 1);
+                               foreach ($denyTags as $dKe) {
                                        unset($keepTags[$dKe]);
                                }
                        }
 
                                // Based on the direction of content, set further options:
-                       switch ($direction)     {
+                       switch ($direction) {
 
                                        // GOING from database to Rich Text Editor:
                                case 'rte':
 
                                        if (!isset($this->procOptions['transformBoldAndItalicTags']) || $this->procOptions['transformBoldAndItalicTags']) {
                                                        // Transform bold/italics tags to strong/em
-                                               if (isset($keepTags['b']))      {$keepTags['b']=array('remap'=>'STRONG');}
-                                               if (isset($keepTags['i']))      {$keepTags['i']=array('remap'=>'EM');}
+                                               if (isset($keepTags['b'])) {
+                                                       $keepTags['b'] = array('remap' => 'STRONG');
+                                               }
+                                               if (isset($keepTags['i'])) {
+                                                       $keepTags['i'] = array('remap' => 'EM');
+                                               }
                                        }
 
                                                // Transforming keepTags array so it can be understood by the HTMLcleaner function. This basically converts the format of the array from TypoScript (having .'s) to plain multi-dimensional array.
-                                       list($keepTags) = $this->HTMLparserConfig($this->procOptions['HTMLparser_rte.'],$keepTags);
+                                       list($keepTags) = $this->HTMLparserConfig($this->procOptions['HTMLparser_rte.'], $keepTags);
                                break;
 
                                        // GOING from RTE to database:
@@ -1133,60 +1084,72 @@ class t3lib_parsehtml_proc extends t3lib_parsehtml {
 
                                        if (!isset($this->procOptions['transformBoldAndItalicTags']) || $this->procOptions['transformBoldAndItalicTags']) {
                                                        // Transform strong/em back to bold/italics:
-                                               if (isset($keepTags['strong'])) { $keepTags['strong']=array('remap'=>'b'); }
-                                               if (isset($keepTags['em']))     { $keepTags['em']=array('remap'=>'i'); }
+                                               if (isset($keepTags['strong'])) {
+                                                       $keepTags['strong'] = array('remap' => 'b');
+                                               }
+                                               if (isset($keepTags['em'])) {
+                                                       $keepTags['em'] = array('remap' => 'i');
+                                               }
                                        }
 
                                                // Setting up span tags if they are allowed:
-                                       if (isset($keepTags['span']))           {
-                                               $classes=array_merge(array(''),$this->allowedClasses);
-                                               $keepTags['span']=array(
-                                                       'allowedAttribs' => 'class,style,xml:lang',
+                                       if (isset($keepTags['span'])) {
+                                               $classes = array_merge(array(''), $this->allowedClasses);
+                                               $keepTags['span'] = array(
+                                                       'allowedAttribs' => 'id,class,style,title,lang,xml:lang,dir',
                                                        'fixAttrib' => Array(
-                                                               'class' => Array (
+                                                               'class' => Array(
                                                                        'list' => $classes,
                                                                        'removeIfFalse' => 1
-                                                               )
+                                                               ),
                                                        ),
                                                        'rmTagIfNoAttrib' => 1
                                                );
-                                               if (!$this->procOptions['allowedClasses'])      unset($keepTags['span']['fixAttrib']['class']['list']);
+                                               if (!$this->procOptions['allowedClasses']) {
+                                                       unset($keepTags['span']['fixAttrib']['class']['list']);
+                                               }
                                        }
 
                                                // Setting up font tags if they are allowed:
-                                       if (isset($keepTags['font']))           {
-                                               $colors=array_merge(array(''),t3lib_div::trimExplode(',',$this->procOptions['allowedFontColors'],1));
-                                               $keepTags['font']=array(
-                                                       'allowedAttribs'=>'face,color,size',
+                                       if (isset($keepTags['font'])) {
+                                               $colors = array_merge(array(''), t3lib_div::trimExplode(',', $this->procOptions['allowedFontColors'], 1));
+                                               $keepTags['font'] = array(
+                                                       'allowedAttribs' => 'face,color,size',
                                                        'fixAttrib' => Array(
-                                                               'face' => Array (
+                                                               'face' => Array(
                                                                        'removeIfFalse' => 1
                                                                ),
-                                                               'color' => Array (
+                                                               'color' => Array(
                                                                        'removeIfFalse' => 1,
-                                                                       'list'=>$colors
+                                                                       'list' => $colors
                                                                ),
-                                                               'size' => Array (
+                                                               'size' => Array(
                                                                        'removeIfFalse' => 1,
                                                                )
                                                        ),
                                                        'rmTagIfNoAttrib' => 1
                                                );
-                                               if (!$this->procOptions['allowedFontColors'])   unset($keepTags['font']['fixAttrib']['color']['list']);
+                                               if (!$this->procOptions['allowedFontColors']) {
+                                                       unset($keepTags['font']['fixAttrib']['color']['list']);
+                                               }
                                        }
 
                                                // Setting further options, getting them from the processiong options:
                                        $TSc = $this->procOptions['HTMLparser_db.'];
-                                       if (!$TSc['globalNesting'])     $TSc['globalNesting']='b,i,u,a,center,font,sub,sup,strong,em,strike,span';
-                                       if (!$TSc['noAttrib'])  $TSc['noAttrib']='b,i,u,br,center,hr,sub,sup,strong,em,li,ul,ol,blockquote,strike';
+                                       if (!$TSc['globalNesting']) {
+                                               $TSc['globalNesting'] = 'b,i,u,a,center,font,sub,sup,strong,em,strike,span';
+                                       }
+                                       if (!$TSc['noAttrib']) {
+                                               $TSc['noAttrib'] = 'b,i,u,br,center,hr,sub,sup,strong,em,li,ul,ol,blockquote,strike';
+                                       }
 
                                                // Transforming the array from TypoScript to regular array:
-                                       list($keepTags) = $this->HTMLparserConfig($TSc,$keepTags);
+                                       list($keepTags) = $this->HTMLparserConfig($TSc, $keepTags);
                                break;
                        }
 
                                // Caching (internally, in object memory) the result unless tagList is set:
-                       if (!$tagList)  {
+                       if (!$tagList) {
                                $this->getKeepTags_cache[$direction] = $keepTags;
                        } else {
                                return $keepTags;
@@ -1198,114 +1161,142 @@ class t3lib_parsehtml_proc extends t3lib_parsehtml {
        }
 
        /**
-        * This resolves the $value into parts based on <div></div>-sections and <p>-sections and <br />-tags. These are returned as lines separated by chr(10).
+        * This resolves the $value into parts based on <div></div>-sections and <p>-sections and <br />-tags. These are returned as lines separated by LF.
         * This point is to resolve the HTML-code returned from RTE into ordinary lines so it's 'human-readable'
         * The function ->setDivTags does the opposite.
         * This function processes content to go into the database.
         *
         * @param       string          Value to process.
         * @param       integer         Recursion brake. Decremented on each recursion down to zero. Default is 5 (which equals the allowed nesting levels of p/div tags).
-        * @param       boolean         If true, an array with the lines is returned, otherwise a string of the processed input value.
+        * @param       boolean         If TRUE, an array with the lines is returned, otherwise a string of the processed input value.
         * @return      string          Processed input value.
         * @see setDivTags()
         */
-       function divideIntoLines($value,$count=5,$returnArray=FALSE)    {
+       function divideIntoLines($value, $count = 5, $returnArray = FALSE) {
 
                        // Internalize font tags (move them from OUTSIDE p/div to inside it that is the case):
-               if ($this->procOptions['internalizeFontTags'])  {$value = $this->internalizeFontTags($value);}
+               if ($this->procOptions['internalizeFontTags']) {
+                       $value = $this->internalizeFontTags($value);
+               }
 
                        // Setting configuration for processing:
-               $allowTagsOutside = t3lib_div::trimExplode(',',strtolower($this->procOptions['allowTagsOutside']?$this->procOptions['allowTagsOutside']:'img'),1);
+               $allowTagsOutside = t3lib_div::trimExplode(',', strtolower($this->procOptions['allowTagsOutside'] ? 'hr,' . $this->procOptions['allowTagsOutside'] : 'hr,img'), 1);
                $remapParagraphTag = strtoupper($this->procOptions['remapParagraphTag']);
-               $divSplit = $this->splitIntoBlock('div,p',$value,1);    // Setting the third param to 1 will eliminate false end-tags. Maybe this is a good thing to do...?
+               $divSplit = $this->splitIntoBlock('div,p', $value, 1); // Setting the third param to 1 will eliminate false end-tags. Maybe this is a good thing to do...?
 
-               if ($this->procOptions['keepPDIVattribs'])      {
-                       $keepAttribListArr = t3lib_div::trimExplode(',',strtolower($this->procOptions['keepPDIVattribs']),1);
+               if ($this->procOptions['keepPDIVattribs']) {
+                       $keepAttribListArr = t3lib_div::trimExplode(',', strtolower($this->procOptions['keepPDIVattribs']), 1);
                } else {
                        $keepAttribListArr = array();
                }
 
                        // Returns plainly the value if there was no div/p sections in it
-               if (count($divSplit)<=1 || $count<=0)   {
-                       return $value;
+               if (count($divSplit) <= 1 || $count <= 0) {
+                               // Wrap hr tags with LF's
+                       $newValue = preg_replace('/<(hr)(\s[^>\/]*)?[[:space:]]*\/?>/i', LF . '<$1$2 />' . LF, $value);
+                       $newValue = preg_replace('/' . preg_quote(LF . LF) . '/i', LF, $newValue);
+                       $newValue = preg_replace('/(^' . preg_quote(LF) . ')|(' . preg_quote(LF) . '$)/i', '', $newValue);
+                       return $newValue;
                }
 
                        // Traverse the splitted sections:
-               foreach($divSplit as $k => $v)  {
-                       if ($k%2)       {       // Inside
-                               $v=$this->removeFirstAndLastTag($v);
+               foreach ($divSplit as $k => $v) {
+                       if ($k % 2) { // Inside
+                               $v = $this->removeFirstAndLastTag($v);
 
                                        // Fetching 'sub-lines' - which will explode any further p/div nesting...
-                               $subLines = $this->divideIntoLines($v,$count-1,1);
-                               if (is_array($subLines))        {       // So, if there happend to be sub-nesting of p/div, this is written directly as the new content of THIS section. (This would be considered 'an error')
+                               $subLines = $this->divideIntoLines($v, $count - 1, 1);
+                               if (is_array($subLines)) { // So, if there happend to be sub-nesting of p/div, this is written directly as the new content of THIS section. (This would be considered 'an error')
                                        // No noting.
-                               } else {        //... but if NO subsection was found, we process it as a TRUE line without erronous content:
+                               } else { //... but if NO subsection was found, we process it as a TRUE line without erronous content:
                                        $subLines = array($subLines);
-                                       if (!$this->procOptions['dontConvBRtoParagraph'])       {       // process break-tags, if configured for. Simply, the breaktags will here be treated like if each was a line of content...
-                                               $subLines = spliti('<br[[:space:]]*[\/]?>',$v);
+                                       if (!$this->procOptions['dontConvBRtoParagraph']) { // process break-tags, if configured for. Simply, the breaktags will here be treated like if each was a line of content...
+                                               $subLines = preg_split('/<br[[:space:]]*[\/]?>/i', $v);
                                        }
 
                                                // Traverse sublines (there is typically one, except if <br/> has been converted to lines as well!)
-                                       reset($subLines);
-                                       while(list($sk)=each($subLines))        {
+                                       foreach ($subLines as $sk => $value) {
 
                                                        // Clear up the subline for DB.
-                                               $subLines[$sk]=$this->HTMLcleaner_db($subLines[$sk]);
+                                               $subLines[$sk] = $this->HTMLcleaner_db($subLines[$sk]);
 
                                                        // Get first tag, attributes etc:
                                                $fTag = $this->getFirstTag($divSplit[$k]);
-                                               $tagName=strtolower($this->getFirstTagName($divSplit[$k]));
-                                               $attribs=$this->get_tag_attributes($fTag);
+                                               $tagName = strtolower($this->getFirstTagName($divSplit[$k]));
+                                               $attribs = $this->get_tag_attributes($fTag);
 
                                                        // Keep attributes (lowercase)
-                                               $newAttribs=array();
-                                               if (count($keepAttribListArr))  {
-                                                       foreach($keepAttribListArr as $keepA)   {
-                                                               if (isset($attribs[0][$keepA])) { $newAttribs[$keepA] = $attribs[0][$keepA]; }
+                                               $newAttribs = array();
+                                               if (count($keepAttribListArr)) {
+                                                       foreach ($keepAttribListArr as $keepA) {
+                                                               if (isset($attribs[0][$keepA])) {
+                                                                       $newAttribs[$keepA] = $attribs[0][$keepA];
+                                                               }
                                                        }
                                                }
 
                                                        // ALIGN attribute:
-                                               if (!$this->procOptions['skipAlign'] && strcmp(trim($attribs[0]['align']),'') && strtolower($attribs[0]['align'])!='left')      {       // Set to value, but not 'left'
-                                                       $newAttribs['align']=strtolower($attribs[0]['align']);
+                                               if (!$this->procOptions['skipAlign'] && strcmp(trim($attribs[0]['align']), '') && strtolower($attribs[0]['align']) != 'left') { // Set to value, but not 'left'
+                                                       $newAttribs['align'] = strtolower($attribs[0]['align']);
                                                }
 
                                                        // CLASS attribute:
-                                               if (!$this->procOptions['skipClass'] && strcmp(trim($attribs[0]['class']),''))  {       // Set to whatever value
-                                                       if (!count($this->allowedClasses) || in_array(strtoupper($attribs[0]['class']),$this->allowedClasses))  {
-                                                               $newAttribs['class']=$attribs[0]['class'];
+                                               if (!$this->procOptions['skipClass'] && strcmp(trim($attribs[0]['class']), '')) { // Set to whatever value
+                                                       if (!count($this->allowedClasses) || in_array($attribs[0]['class'], $this->allowedClasses)) {
+                                                               $newAttribs['class'] = $attribs[0]['class'];
+                                                       } else {
+                                                               $classes = t3lib_div::trimExplode(' ', $attribs[0]['class'], TRUE);
+                                                               $newClasses = array();
+                                                               foreach ($classes as $class) {
+                                                                       if (in_array($class, $this->allowedClasses)) {
+                                                                               $newClasses[] = $class;
+                                                                       }
+                                                               }
+                                                               if (count($newClasses)) {
+                                                                       $newAttribs['class'] = implode(' ', $newClasses);
+                                                               }
                                                        }
                                                }
 
                                                        // Remove any line break char (10 or 13)
-                                               $subLines[$sk]=ereg_replace(chr(10).'|'.chr(13),'',$subLines[$sk]);
+                                               $subLines[$sk] = preg_replace('/' . LF . '|' . CR . '/', '', $subLines[$sk]);
 
                                                        // If there are any attributes or if we are supposed to remap the tag, then do so:
-                                               if (count($newAttribs) && strcmp($remapParagraphTag,'1'))               {
-                                                       if ($remapParagraphTag=='P')    $tagName='p';
-                                                       if ($remapParagraphTag=='DIV')  $tagName='div';
-                                                       $subLines[$sk]='<'.trim($tagName.' '.$this->compileTagAttribs($newAttribs)).'>'.$subLines[$sk].'</'.$tagName.'>';
+                                               if (count($newAttribs) && strcmp($remapParagraphTag, '1')) {
+                                                       if ($remapParagraphTag == 'P') {
+                                                               $tagName = 'p';
+                                                       }
+                                                       if ($remapParagraphTag == 'DIV') {
+                                                               $tagName = 'div';
+                                                       }
+                                                       $subLines[$sk] = '<' . trim($tagName . ' ' . $this->compileTagAttribs($newAttribs)) . '>' . $subLines[$sk] . '</' . $tagName . '>';
                                                }
                                        }
                                }
                                        // Add the processed line(s)
-                               $divSplit[$k] = implode(chr(10),$subLines);
+                               $divSplit[$k] = implode(LF, $subLines);
 
                                        // If it turns out the line is just blank (containing a &nbsp; possibly) then just make it pure blank.
                                        // But, prevent filtering of lines that are blank in sense above, but whose tags contain attributes.
                                        // Those attributes should have been filtered before; if they are still there they must be considered as possible content.
-                               if (trim(strip_tags($divSplit[$k]))=='&nbsp;' && !preg_match('/\<(img)(\s[^>]*)?\/?>/si', $divSplit[$k]) && !preg_match('/\<([^>]*)?( align| class| style| id| title| dir| lang| xml:lang)([^>]*)?>/si', trim($divSplit[$k]))) {
-                                       $divSplit[$k]='';
+                               if (trim(strip_tags($divSplit[$k])) == '&nbsp;' && !preg_match('/\<(img)(\s[^>]*)?\/?>/si', $divSplit[$k]) && !preg_match('/\<([^>]*)?( align| class| style| id| title| dir| lang| xml:lang)([^>]*)?>/si', trim($divSplit[$k]))) {
+                                       $divSplit[$k] = '';
                                }
-                       } else {        // outside div:
+                       } else { // outside div:
                                        // Remove positions which are outside div/p tags and without content
-                               $divSplit[$k]=trim(strip_tags($divSplit[$k],'<'.implode('><',$allowTagsOutside).'>'));
-                               if (!strcmp($divSplit[$k],''))  unset($divSplit[$k]);   // Remove part if it's empty
+                               $divSplit[$k] = trim(strip_tags($divSplit[$k], '<' . implode('><', $allowTagsOutside) . '>'));
+                                       // Wrap hr tags with LF's
+                               $divSplit[$k] = preg_replace('/<(hr)(\s[^>\/]*)?[[:space:]]*\/?>/i', LF . '<$1$2 />' . LF, $divSplit[$k]);
+                               $divSplit[$k] = preg_replace('/' . preg_quote(LF . LF) . '/i', LF, $divSplit[$k]);
+                               $divSplit[$k] = preg_replace('/(^' . preg_quote(LF) . ')|(' . preg_quote(LF) . '$)/i', '', $divSplit[$k]);
+                               if (!strcmp($divSplit[$k], '')) {
+                                       unset($divSplit[$k]);
+                               } // Remove part if it's empty
                        }
                }
 
                        // Return value:
-               return $returnArray ? $divSplit : implode(chr(10),$divSplit);
+               return $returnArray ? $divSplit : implode(LF, $divSplit);
        }
 
        /**
@@ -1317,38 +1308,42 @@ class t3lib_parsehtml_proc extends t3lib_parsehtml {
         * @return      string          Processed value.
         * @see divideIntoLines()
         */
-       function setDivTags($value,$dT='p')     {
+       function setDivTags($value, $dT = 'p') {
 
                        // First, setting configuration for the HTMLcleaner function. This will process each line between the <div>/<p> section on their way to the RTE
                $keepTags = $this->getKeepTags('rte');
-               $kUknown = $this->procOptions['dontProtectUnknownTags_rte'] ? 0 : 'protect';    // Default: remove unknown tags.
-               $hSC = $this->procOptions['dontHSC_rte'] ? 0 : 1;       // Default: re-convert literals to characters (that is &lt; to <)
-               $convNBSP = !$this->procOptions['dontConvAmpInNBSP_rte']?1:0;
+               $kUknown = $this->procOptions['dontProtectUnknownTags_rte'] ? 0 : 'protect'; // Default: remove unknown tags.
+               $hSC = $this->procOptions['dontHSC_rte'] ? 0 : 1; // Default: re-convert literals to characters (that is &lt; to <)
+               $convNBSP = !$this->procOptions['dontConvAmpInNBSP_rte'] ? 1 : 0;
 
-                       // Divide the content into lines, based on chr(10):
-               $parts = explode(chr(10),$value);
-               foreach($parts as $k => $v)     {
+                       // Divide the content into lines, based on LF:
+               $parts = explode(LF, $value);
+               foreach ($parts as $k => $v) {
 
                                // Processing of line content:
-                       if (!strcmp(trim($parts[$k]),''))       {       // If the line is blank, set it to &nbsp;
-                               $parts[$k]='&nbsp;';
-                       } else {        // Clean the line content:
-                               $parts[$k]=$this->HTMLcleaner($parts[$k],$keepTags,$kUknown,$hSC);
-                               if ($convNBSP)  $parts[$k]=str_replace('&amp;nbsp;','&nbsp;',$parts[$k]);
+                       if (!strcmp(trim($parts[$k]), '')) { // If the line is blank, set it to &nbsp;
+                               $parts[$k] = '&nbsp;';
+                       } else { // Clean the line content:
+                               $parts[$k] = $this->HTMLcleaner($parts[$k], $keepTags, $kUknown, $hSC);
+                               if ($convNBSP) {
+                                       $parts[$k] = str_replace('&amp;nbsp;', '&nbsp;', $parts[$k]);
+                               }
                        }
 
-                               // Wrapping the line in <$dT> is not already wrapped:
-                       $testStr = strtolower(trim($parts[$k]));
-                       if (substr($testStr,0,4)!='<div' || substr($testStr,-6)!='</div>')      {
-                               if (substr($testStr,0,2)!='<p' || substr($testStr,-4)!='</p>')  {
+                               // Wrapping the line in <$dT> if not already wrapped and does not contain an hr tag
+                       if (!preg_match('/<(hr)(\s[^>\/]*)?[[:space:]]*\/?>/i', $parts[$k])) {
+                               $testStr = strtolower(trim($parts[$k]));
+                               if (substr($testStr, 0, 4) != '<div' || substr($testStr, -6) != '</div>') {
+                                       if (substr($testStr, 0, 2) != '<p' || substr($testStr, -4) != '</p>') {
                                                // Only set p-tags if there is not already div or p tags:
-                                       $parts[$k]='<'.$dT.'>'.$parts[$k].'</'.$dT.'>';
+                                               $parts[$k] = '<' . $dT . '>' . $parts[$k] . '</' . $dT . '>';
+                                       }
                                }
                        }
                }
 
                        // Implode result:
-               return implode(chr(10),$parts);
+               return implode(LF, $parts);
        }
 
        /**
@@ -1362,34 +1357,34 @@ class t3lib_parsehtml_proc extends t3lib_parsehtml {
         * @return      string          Output content
         * @see divideIntoLines()
         */
-       function internalizeFontTags($value)    {
+       function internalizeFontTags($value) {
 
                        // Splitting into font tag blocks:
-               $fontSplit = $this->splitIntoBlock('font',$value);
+               $fontSplit = $this->splitIntoBlock('font', $value);
 
-               foreach($fontSplit as $k => $v) {
-                       if ($k%2)       {       // Inside
-                               $fTag = $this->getFirstTag($v); // Fint font-tag
+               foreach ($fontSplit as $k => $v) {
+                       if ($k % 2) { // Inside
+                               $fTag = $this->getFirstTag($v); // Fint font-tag
 
-                               $divSplit_sub = $this->splitIntoBlock('div,p',$this->removeFirstAndLastTag($v),1);
-                               if (count($divSplit_sub)>1)     {       // If there were div/p sections inside the font-tag, do something about it...
+                               $divSplit_sub = $this->splitIntoBlock('div,p', $this->removeFirstAndLastTag($v), 1);
+                               if (count($divSplit_sub) > 1) { // If there were div/p sections inside the font-tag, do something about it...
                                                // traverse those sections:
-                                       foreach($divSplit_sub as $k2 => $v2)    {
-                                               if ($k2%2)      {       // Inside
-                                                       $div_p = $this->getFirstTag($v2);       // Fint font-tag
-                                                       $div_p_tagname = $this->getFirstTagName($v2);   // Fint font-tag
-                                                       $v2=$this->removeFirstAndLastTag($v2); // ... and remove it from original.
-                                                       $divSplit_sub[$k2]=$div_p.$fTag.$v2.'</font>'.'</'.$div_p_tagname.'>';
+                                       foreach ($divSplit_sub as $k2 => $v2) {
+                                               if ($k2 % 2) { // Inside
+                                                       $div_p = $this->getFirstTag($v2); // Fint font-tag
+                                                       $div_p_tagname = $this->getFirstTagName($v2); // Fint font-tag
+                                                       $v2 = $this->removeFirstAndLastTag($v2); // ... and remove it from original.
+                                                       $divSplit_sub[$k2] = $div_p . $fTag . $v2 . '</font>' . '</' . $div_p_tagname . '>';
                                                } elseif (trim(strip_tags($v2))) {
-                                                       $divSplit_sub[$k2]=$fTag.$v2.'</font>';
+                                                       $divSplit_sub[$k2] = $fTag . $v2 . '</font>';
                                                }
                                        }
-                                       $fontSplit[$k]=implode('',$divSplit_sub);
+                                       $fontSplit[$k] = implode('', $divSplit_sub);
                                }
                        }
                }
 
-               return implode('',$fontSplit);
+               return implode('', $fontSplit);
        }
 
        /**
@@ -1398,7 +1393,7 @@ class t3lib_parsehtml_proc extends t3lib_parsehtml {
         * @return      string          Value of t3lib_div::getIndpEnv('TYPO3_SITE_URL');
         * @see t3lib_div::getIndpEnv()
         */
-       function siteUrl()      {
+       function siteUrl() {
                return t3lib_div::getIndpEnv('TYPO3_SITE_URL');
        }
 
@@ -1408,7 +1403,7 @@ class t3lib_parsehtml_proc extends t3lib_parsehtml {
         *
         * @return      string
         */
-       function rteImageStorageDir()   {
+       function rteImageStorageDir() {
                return $this->rte_p['imgpath'] ? $this->rte_p['imgpath'] : $GLOBALS['TYPO3_CONF_VARS']['BE']['RTE_imageStorageDir'];
        }
 
@@ -1420,21 +1415,21 @@ class t3lib_parsehtml_proc extends t3lib_parsehtml {
         * @param       string          Break character to use for linebreaks.
         * @return      string          Output value
         */
-       function removeTables($value,$breakChar='<br />')       {
+       function removeTables($value, $breakChar = '<br />') {
 
                        // Splitting value into table blocks:
-               $tableSplit = $this->splitIntoBlock('table',$value);
+               $tableSplit = $this->splitIntoBlock('table', $value);
 
                        // Traverse blocks of tables:
-               foreach($tableSplit as $k => $v)        {
-                       if ($k%2)       {
-                               $tableSplit[$k]='';
-                               $rowSplit = $this->splitIntoBlock('tr',$v);
-                               foreach($rowSplit as $k2 => $v2)        {
-                                       if ($k2%2)      {
-                                               $cellSplit = $this->getAllParts($this->splitIntoBlock('td',$v2),1,0);
-                                               foreach($cellSplit as $k3 => $v3)       {
-                                                       $tableSplit[$k].=$v3.$breakChar;
+               foreach ($tableSplit as $k => $v) {
+                       if ($k % 2) {
+                               $tableSplit[$k] = '';
+                               $rowSplit = $this->splitIntoBlock('tr', $v);
+                               foreach ($rowSplit as $k2 => $v2) {
+                                       if ($k2 % 2) {
+                                               $cellSplit = $this->getAllParts($this->splitIntoBlock('td', $v2), 1, 0);
+                                               foreach ($cellSplit as $k3 => $v3) {
+                                                       $tableSplit[$k] .= $v3 . $breakChar;
                                                }
                                        }
                                }
@@ -1442,7 +1437,7 @@ class t3lib_parsehtml_proc extends t3lib_parsehtml {
                }
 
                        // Implode it all again:
-               return implode($breakChar,$tableSplit);
+               return implode($breakChar, $tableSplit);
        }
 
        /**
@@ -1452,18 +1447,18 @@ class t3lib_parsehtml_proc extends t3lib_parsehtml {
         * @param       string          Direction To databsae (db) or from database to RTE (rte)
         * @return      string          Processed value
         */
-       function defaultTStagMapping($code,$direction='rte')    {
-               if ($direction=='db')   {
-                       $code=$this->mapTags($code,array(       // Map tags
-                               'strong' => 'b',
-                               'em' => 'i'
-                       ));
+       function defaultTStagMapping($code, $direction = 'rte') {
+               if ($direction == 'db') {
+                       $code = $this->mapTags($code, array( // Map tags
+                                                                                          'strong' => 'b',
+                                                                                          'em' => 'i'
+                                                                                 ));
                }
-               if ($direction=='rte')  {
-                       $code=$this->mapTags($code,array(       // Map tags
-                               'b' => 'strong',
-                               'i' => 'em'
-                       ));
+               if ($direction == 'rte') {
+                       $code = $this->mapTags($code, array( // Map tags
+                                                                                          'b' => 'strong',
+                                                                                          'i' => 'em'
+                                                                                 ));
                }
                return $code;
        }
@@ -1475,25 +1470,25 @@ class t3lib_parsehtml_proc extends t3lib_parsehtml {
         * @param       array           Array of attributes from tag in which to search. More specifically the content of the key "style" is used to extract "width:xxx / height:xxx" information
         * @return      array           Integer w/h in key 0/1. Zero is returned if not found.
         */
-       function getWHFromAttribs($attribArray) {
-               $style =trim($attribArray['style']);
-               if ($style)     {
-                       $regex='[[:space:]]*:[[:space:]]*([0-9]*)[[:space:]]*px';
+       function getWHFromAttribs($attribArray) {
+               $style = trim($attribArray['style']);
+               if ($style) {
+                       $regex = '[[:space:]]*:[[:space:]]*([0-9]*)[[:space:]]*px';
                                // Width
                        $reg = array();
-                       eregi('width'.$regex,$style,$reg);
+                       preg_match('/width' . $regex . '/i', $style, $reg);
                        $w = intval($reg[1]);
                                // Height
-                       eregi('height'.$regex,$style,$reg);
+                       preg_match('/height' . $regex . '/i', $style, $reg);
                        $h = intval($reg[1]);
                }
-               if (!$w)        {
+               if (!$w) {
                        $w = $attribArray['width'];
                }
-               if (!$h)        {
+               if (!$h) {
                        $h = $attribArray['height'];
                }
-               return array(intval($w),intval($h));
+               return array(intval($w), intval($h));
        }
 
        /**
@@ -1502,49 +1497,53 @@ class t3lib_parsehtml_proc extends t3lib_parsehtml {
         * @param       string          URL to analyse.
         * @return      array           Information in an array about the URL
         */
-       function urlInfoForLinkTags($url)       {
+       function urlInfoForLinkTags($url) {
                $info = array();
                $url = trim($url);
-               if (substr(strtolower($url),0,7)=='mailto:')    {
-                       $info['url']=trim(substr($url,7));
-                       $info['type']='email';
+               if (substr(strtolower($url), 0, 7) == 'mailto:') {
+                       $info['url'] = trim(substr($url, 7));
+                       $info['type'] = 'email';
                } else {
-                       $curURL = $this->siteUrl();     // 100502, removed this: 'http://'.t3lib_div::getThisUrl(); Reason: The url returned had typo3/ in the end - should be only the site's url as far as I see...
-                       for($a=0;$a<strlen($url);$a++)  {
-                               if ($url{$a}!=$curURL{$a})      {
+                       $curURL = $this->siteUrl(); // 100502, removed this: 'http://'.t3lib_div::getThisUrl(); Reason: The url returned had typo3/ in the end - should be only the site's url as far as I see...
+                       for ($a = 0; $a < strlen($url); $a++) {
+                               if ($url{$a} != $curURL{$a}) {
                                        break;
                                }
                        }
 
-                       $info['relScriptPath']=substr($curURL,$a);
-                       $info['relUrl']=substr($url,$a);
-                       $info['url']=$url;
-                       $info['type']='ext';
+                       $info['relScriptPath'] = substr($curURL, $a);
+                       $info['relUrl'] = substr($url, $a);
+                       $info['url'] = $url;
+                       $info['type'] = 'ext';
 
                        $siteUrl_parts = parse_url($url);
                        $curUrl_parts = parse_url($curURL);
 
-                       if ($siteUrl_parts['host']==$curUrl_parts['host']       // Hosts should match
-                               && (!$info['relScriptPath']     || (defined('TYPO3_mainDir') && substr($info['relScriptPath'],0,strlen(TYPO3_mainDir))==TYPO3_mainDir)))        {       // If the script path seems to match or is empty (FE-EDIT)
+                       if ($siteUrl_parts['host'] == $curUrl_parts['host'] // Hosts should match
+                               && (!$info['relScriptPath'] || (defined('TYPO3_mainDir') && substr($info['relScriptPath'], 0, strlen(TYPO3_mainDir)) == TYPO3_mainDir))) { // If the script path seems to match or is empty (FE-EDIT)
 
                                        // New processing order 100502
-                               $uP=parse_url($info['relUrl']);
-
-                               if (!strcmp('#'.$siteUrl_parts['fragment'],$info['relUrl'])) {
-                                       $info['url']=$info['relUrl'];
-                                       $info['type']='anchor';
-                               } elseif (!trim($uP['path']) || !strcmp($uP['path'],'index.php'))       {
-                                       $pp = explode('id=',$uP['query']);
-                                       $id = trim($pp[1]);
-                                       if ($id)        {
-                                               $info['pageid']=$id;
-                                               $info['cElement']=$uP['fragment'];
-                                               $info['url']=$id.($info['cElement']?'#'.$info['cElement']:'');
-                                               $info['type']='page';
+                               $uP = parse_url($info['relUrl']);
+
+                               if (!strcmp('#' . $siteUrl_parts['fragment'], $info['relUrl'])) {
+                                       $info['url'] = $info['relUrl'];
+                                       $info['type'] = 'anchor';
+                               } elseif (!trim($uP['path']) || !strcmp($uP['path'], 'index.php')) {
+                                               // URL is a page (id parameter)
+                                       $pp = preg_split('/^id=/', $uP['query']);
+                                       $pp[1] = preg_replace('/&id=[^&]*/', '', $pp[1]);
+                                       $parameters = explode('&', $pp[1]);
+                                       $id = array_shift($parameters);
+                                       if ($id) {
+                                               $info['pageid'] = $id;
+                                               $info['cElement'] = $uP['fragment'];
+                                               $info['url'] = $id . ($info['cElement'] ? '#' . $info['cElement'] : '');
+                                               $info['type'] = 'page';
+                                               $info['query'] = $parameters[0] ? '&' . implode('&', $parameters) : '';
                                        }
                                } else {
-                                       $info['url']=$info['relUrl'];
-                                       $info['type']='file';
+                                       $info['url'] = $info['relUrl'];
+                                       $info['type'] = 'file';
                                }
                        } else {
                                unset($info['relScriptPath']);
@@ -1558,38 +1557,42 @@ class t3lib_parsehtml_proc extends t3lib_parsehtml {
         * Converting <A>-tags to absolute URLs (+ setting rtekeep attribute)
         *
         * @param       string          Content input
-        * @param       boolean         If true, then the "rtekeep" attribute will not be set.
+        * @param       boolean         If TRUE, then the "rtekeep" attribute will not be set.
         * @return      string          Content output
         */
-       function TS_AtagToAbs($value,$dontSetRTEKEEP=FALSE)     {
-               $blockSplit = $this->splitIntoBlock('A',$value);
-               reset($blockSplit);
-               while(list($k,$v)=each($blockSplit))    {
-                       if ($k%2)       {       // block:
-                               $attribArray = $this->get_tag_attributes_classic($this->getFirstTag($v),1);
+       function TS_AtagToAbs($value, $dontSetRTEKEEP = FALSE) {
+               $blockSplit = $this->splitIntoBlock('A', $value);
+               foreach ($blockSplit as $k => $v) {
+                       if ($k % 2) { // block:
+                               $attribArray = $this->get_tag_attributes_classic($this->getFirstTag($v), 1);
 
                                        // Checking if there is a scheme, and if not, prepend the current url.
-                               if (strlen($attribArray['href']))       {       // ONLY do this if href has content - the <a> tag COULD be an anchor and if so, it should be preserved...
+                               if (strlen($attribArray['href'])) { // ONLY do this if href has content - the <a> tag COULD be an anchor and if so, it should be preserved...
                                        $uP = parse_url(strtolower($attribArray['href']));
-                                       if (!$uP['scheme'])     {
-                                               $attribArray['href'] = $this->siteUrl().substr($attribArray['href'],strlen($this->relBackPath));
+                                       if (!$uP['scheme']) {
+                                               $attribArray['href'] = $this->siteUrl() . substr($attribArray['href'], strlen($this->relBackPath));
+                                       } elseif ($uP['scheme'] != 'mailto') {
+                                               $attribArray['external'] = 1;
                                        }
                                } else {
                                        $attribArray['rtekeep'] = 1;
                                }
-                               if (!$dontSetRTEKEEP)   $attribArray['rtekeep'] = 1;
+                               if (!$dontSetRTEKEEP) {
+                                       $attribArray['rtekeep'] = 1;
+                               }
 
-                               $bTag='<a '.t3lib_div::implodeAttributes($attribArray,1).'>';
-                               $eTag='</a>';
-                               $blockSplit[$k] = $bTag.$this->TS_AtagToAbs($this->removeFirstAndLastTag($blockSplit[$k])).$eTag;
+                               $bTag = '<a ' . t3lib_div::implodeAttributes($attribArray, 1) . '>';
+                               $eTag = '</a>';
+                               $blockSplit[$k] = $bTag . $this->TS_AtagToAbs($this->removeFirstAndLastTag($blockSplit[$k])) . $eTag;
                        }
                }
-               return implode('',$blockSplit);
+               return implode('', $blockSplit);
        }
 }
 
 
-if (defined('TYPO3_MODE') && $TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['t3lib/class.t3lib_parsehtml_proc.php'])   {
-       include_once($TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['t3lib/class.t3lib_parsehtml_proc.php']);
+if (defined('TYPO3_MODE') && isset($GLOBALS['TYPO3_CONF_VARS'][TYPO3_MODE]['XCLASS']['t3lib/class.t3lib_parsehtml_proc.php'])) {
+       include_once($GLOBALS['TYPO3_CONF_VARS'][TYPO3_MODE]['XCLASS']['t3lib/class.t3lib_parsehtml_proc.php']);
 }
-?>
+
+?>
\ No newline at end of file