Fixed bug #15383: [Unit tests] Add tests for t3lib_div::validEmail
[Packages/TYPO3.CMS.git] / t3lib / class.t3lib_pagerenderer.php
index e879319..0e64759 100644 (file)
@@ -2,7 +2,7 @@
 /***************************************************************
  *  Copyright notice
  *
- *  (c) 2009 Steffen Kamper (info@sk-typo3.de)
+ *  (c) 2009-2010 Steffen Kamper (info@sk-typo3.de)
  *  All rights reserved
  *
  *  This script is part of the TYPO3 project. The TYPO3 project is
@@ -34,8 +34,8 @@
  * @subpackage t3lib
  * $Id$
  */
-abstract class t3lib_PageRenderer implements t3lib_Singleton {
-       
+class t3lib_PageRenderer implements t3lib_Singleton {
+
        protected $compressJavascript = FALSE;
        protected $compressCss = FALSE;
        protected $removeLineBreaksFromTemplate = FALSE;
@@ -47,6 +47,9 @@ abstract class t3lib_PageRenderer implements t3lib_Singleton {
        protected $csConvObj;
        protected $lang;
 
+       /* @var t3lib_Compressor Instance of t3lib_Compressor */
+       protected $compressor;
+
        // static array containing associative array for the included files
        protected static $jsFiles = array ();
        protected static $jsFooterFiles = array ();
@@ -59,6 +62,8 @@ abstract class t3lib_PageRenderer implements t3lib_Singleton {
        protected $favIcon;
        protected $baseUrl;
 
+       protected $renderXhtml = TRUE;
+
        // static header blocks
        protected $xmlPrologAndDocType = '';
        protected $metaTags = array ();
@@ -89,6 +94,13 @@ abstract class t3lib_PageRenderer implements t3lib_Singleton {
        const PART_HEADER = 1;
        const PART_FOOTER = 2;
 
+       // paths to contibuted libraries
+       protected $prototypePath = 'contrib/prototype/';
+       protected $scriptaculousPath = 'contrib/scriptaculous/';
+       protected $extCorePath = 'contrib/extjs/';
+       protected $extJsPath = 'contrib/extjs/';
+
+
        // internal flags for JS-libraries
        protected $addPrototype = FALSE;
        protected $addScriptaculous = FALSE;
@@ -105,6 +117,9 @@ abstract class t3lib_PageRenderer implements t3lib_Singleton {
        const EXTJS_ADAPTER_PROTOTYPE = 'prototype';
        const EXTJS_ADAPTER_YUI = 'yui';
 
+       protected $extJStheme = TRUE;
+       protected $extJScss = TRUE;
+
        protected $enableExtJSQuickTips = false;
 
        protected $inlineLanguageLabels = array ();
@@ -122,29 +137,30 @@ abstract class t3lib_PageRenderer implements t3lib_Singleton {
         * @param string $backPath      relative path to typo3-folder. It varies for BE modules, in FE it will be typo3/
         * @return void
         */
-       public function __construct($templateFile = '', $backPath = '') {
+       public function __construct($templateFile = '', $backPath = NULL) {
 
                $this->reset();
+               $this->csConvObj = t3lib_div::makeInstance('t3lib_cs');
 
                if (strlen($templateFile)) {
                        $this->templateFile = $templateFile;
                }
-               $this->backPath = $backPath;
-               
+               $this->backPath = isset($backPath) ? $backPath : $GLOBALS['BACK_PATH'];
+
                $this->inlineJavascriptWrap = array(
-                       '<script type="text/javascript">' . chr(10) . '/*<![CDATA[*/' . chr(10) . '<!-- ' . chr(10),
-                       '// -->' . chr(10) . '/*]]>*/' . chr(10) . '</script>' . chr(10)
+                       '<script type="text/javascript">' . LF . '/*<![CDATA[*/' . LF . '<!-- ' . LF,
+                       '// -->' . LF . '/*]]>*/' . LF . '</script>' . LF
                );
                $this->inlineCssWrap = array(
-                       '<style type="text/css">' . chr(10) . '/*<![CDATA[*/' . chr(10) . '<!-- ' . chr(10),
-                       '-->' . chr(10) . '/*]]>*/' . chr(10) . '</style>' . chr(10)
+                       '<style type="text/css">' . LF . '/*<![CDATA[*/' . LF . '<!-- ' . LF,
+                       '-->' . LF . '/*]]>*/' . LF . '</style>' . LF
                );
 
        }
 
        /**
         * reset all vars to initial values
-        * 
+        *
         * @return void
         */
        protected function reset() {
@@ -179,6 +195,17 @@ abstract class t3lib_PageRenderer implements t3lib_Singleton {
                $this->title = $title;
        }
 
+
+       /**
+        * Enables/disables rendering of XHTML code
+        *
+        * @param boolean $enable       Enable XHTML
+        * @return void
+        */
+       public function setRenderXhtml($enable) {
+               $this->renderXhtml = $enable;
+       }
+
        /**
         * Sets xml prolog and docType
         *
@@ -191,15 +218,25 @@ abstract class t3lib_PageRenderer implements t3lib_Singleton {
 
        /**
         * Sets meta charset
-        * @return void
         *
         * @param string $charSet       used charset
+        * @return void
         */
        public function setCharSet($charSet) {
                $this->charSet = $charSet;
        }
 
        /**
+        * Sets language
+        *
+        * @param string $lang  used language
+        * @return void
+        */
+       public function setLanguage($lang) {
+               $this->lang = $lang;
+       }
+
+       /**
         * Sets html tag
         *
         * @param string $htmlTag       html tag
@@ -260,6 +297,16 @@ abstract class t3lib_PageRenderer implements t3lib_Singleton {
        }
 
        /**
+        * Sets back path
+        *
+        * @param string $backPath
+        * @return void
+        */
+       public function setBackPath($backPath) {
+               $this->backPath = $backPath;
+       }
+
+       /**
         * Sets Content for Body
         *
         * @param string $content
@@ -269,12 +316,53 @@ abstract class t3lib_PageRenderer implements t3lib_Singleton {
                $this->bodyContent = $content;
        }
 
+       /**
+        * Sets Path for prototype library (relative to typo3 directory)
+        *
+        * @param string path
+        * @return void
+        */
+       public function setPrototypePath($path) {
+               $this->prototypePath = $path;
+       }
+
+       /**
+        * Sets Path for scriptaculous library (relative to typo3 directory)
+        *
+        * @param string $path
+        * @return void
+        */
+       public function setScriptaculousPath($path) {
+               $this->scriptaculousPath = $path;
+       }
+
+       /**
+        * Sets Path for Ext Core library (relative to typo3 directory)
+        *
+        * @param string $path
+        * @return void
+        */
+       public function setExtCorePath($path) {
+               $this->extCorePath = $path;
+       }
+
+       /**
+        * Sets Path for ExtJs library (relative to typo3 directory)
+        *
+        * @param string $path
+        * @return void
+        */
+       public function setExtJsPath($path) {
+               $this->extJsPath = $path;
+       }
+
        /*****************************************************/
        /*                                                   */
-       /*  Public Enablers                                  */
+       /*  Public Enablers / Disablers                      */
        /*                                                   */
        /*                                                   */
        /*****************************************************/
+
        /**
         * Enables MoveJsFromHeaderToFooter
         *
@@ -286,6 +374,16 @@ abstract class t3lib_PageRenderer implements t3lib_Singleton {
        }
 
        /**
+        * Disables MoveJsFromHeaderToFooter
+        *
+        * @param void
+        * @return void
+        */
+       public function disableMoveJsFromHeaderToFooter() {
+               $this->moveJsFromHeaderToFooter = FALSE;
+       }
+
+       /**
         * Enables compression of javascript
         *
         * @param void
@@ -296,6 +394,16 @@ abstract class t3lib_PageRenderer implements t3lib_Singleton {
        }
 
        /**
+        * Disables compression of javascript
+        *
+        * @param void
+        * @return void
+        */
+       public function disableCompressJavascript() {
+               $this->compressJavascript = FALSE;
+       }
+
+       /**
         * Enables compression of css
         *
         * @param void
@@ -306,6 +414,15 @@ abstract class t3lib_PageRenderer implements t3lib_Singleton {
        }
 
        /**
+        * Disables compression of css
+        *
+        * @param void
+        * @return void
+        */
+       public function disableCompressCss() {
+               $this->compressCss = FALSE;
+       }
+
        /**
         * Enables concatenation of js/css files
         *
@@ -317,6 +434,16 @@ abstract class t3lib_PageRenderer implements t3lib_Singleton {
        }
 
        /**
+        * Disables concatenation of js/css files
+        *
+        * @param void
+        * @return void
+        */
+       public function disableConcatenateFiles() {
+               $this->concatenateFiles = FALSE;
+       }
+
+       /**
         * Sets removal of all line breaks in template
         *
         * @param void
@@ -326,6 +453,30 @@ abstract class t3lib_PageRenderer implements t3lib_Singleton {
                $this->removeLineBreaksFromTemplate = TRUE;
        }
 
+       /**
+        * Unsets removal of all line breaks in template
+        *
+        * @param void
+        * @return void
+        */
+       public function disableRemoveLineBreaksFromTemplate() {
+               $this->removeLineBreaksFromTemplate = FALSE;
+       }
+
+       /**
+        * Enables Debug Mode
+        * This is a shortcut to switch off all compress/concatenate features to enable easier debug
+        *
+        * @param void
+        * @return void
+        */
+       public function enableDebugMode() {
+               $this->compressJavascript = FALSE;
+               $this->compressCss = FALSE;
+               $this->concatenateFiles = FALSE;
+               $this->removeLineBreaksFromTemplate = FALSE;
+       }
+
        /*****************************************************/
        /*                                                   */
        /*  Public Getters                                   */
@@ -352,6 +503,24 @@ abstract class t3lib_PageRenderer implements t3lib_Singleton {
        }
 
        /**
+        * Gets the language
+        *
+        * @return string $lang
+        */
+       public function getLanguage() {
+               return $this->lang;
+       }
+
+       /**
+        * Returns rendering mode XHTML or HTML
+        *
+        * @return boolean              TRUE if XHTML, FALSE if HTML
+        */
+       public function getRenderXhtml() {
+               return $this->renderXhtml;
+       }
+
+       /**
         * Gets html tag
         *
         * @return string $htmlTag      html tag
@@ -408,7 +577,7 @@ abstract class t3lib_PageRenderer implements t3lib_Singleton {
        /**
         * Gets MoveJsFromHeaderToFooter
         *
-        * @return boolean 
+        * @return boolean
         */
        public function getMoveJsFromHeaderToFooter() {
                return $this->moveJsFromHeaderToFooter;
@@ -417,7 +586,7 @@ abstract class t3lib_PageRenderer implements t3lib_Singleton {
        /**
         * Gets compress of javascript
         *
-        * @return boolean 
+        * @return boolean
         */
        public function getCompressJavascript() {
                return $this->compressJavascript;
@@ -426,7 +595,7 @@ abstract class t3lib_PageRenderer implements t3lib_Singleton {
        /**
         * Gets compress of css
         *
-        * @return boolean 
+        * @return boolean
         */
        public function getCompressCss() {
                return $this->compressCss;
@@ -435,7 +604,7 @@ abstract class t3lib_PageRenderer implements t3lib_Singleton {
        /**
         * Gets concatenate of files
         *
-        * @return boolean 
+        * @return boolean
         */
        public function getConcatenateFiles() {
                return $this->concatenateFiles;
@@ -444,7 +613,7 @@ abstract class t3lib_PageRenderer implements t3lib_Singleton {
        /**
         * Gets remove of empty lines from template
         *
-        * @return boolean 
+        * @return boolean
         */
        public function getRemoveLineBreaksFromTemplate() {
                return $this->removeLineBreaksFromTemplate;
@@ -459,13 +628,49 @@ abstract class t3lib_PageRenderer implements t3lib_Singleton {
                return $this->bodyContent;
        }
 
+       /**
+        * Gets Path for prototype library (relative to typo3 directory)
+        *
+        * @return string
+        */
+       public function getPrototypePath() {
+               return $this->prototypePath;
+       }
+
+       /**
+        * Gets Path for scriptaculous library (relative to typo3 directory)
+        *
+        * @return string
+        */
+       public function getScriptaculousPath() {
+               return $this->scriptaculousPath;
+       }
+
+       /**
+        * Gets Path for Ext Core library (relative to typo3 directory)
+        *
+        * @return string
+        */
+       public function getExtCorePath() {
+               return $this->extCorePath;
+       }
+
+       /**
+        * Gets Path for ExtJs library (relative to typo3 directory)
+        *
+        * @return string
+        */
+       public function getExtJsPath() {
+               return $this->extJsPath;
+       }
+
        /*****************************************************/
        /*                                                   */
        /*  Public Function to add Data                      */
        /*                                                   */
        /*                                                   */
        /*****************************************************/
-       
+
        /**
         * Adds meta data
         *
@@ -515,30 +720,30 @@ abstract class t3lib_PageRenderer implements t3lib_Singleton {
        }
 
        /* Javascript Files */
-       
+
        /**
         * Adds JS Library. JS Library block is rendered on top of the JS files.
         *
         * @param string $name
         * @param string $file
         * @param string $type
-        * @param boolean $compressed   flag if library is compressed
+        * @param boolean $compress             flag if library should be compressed
         * @param boolean $forceOnTop   flag if added library should be inserted at begin of this block
         * @param string $allWrap
         * @return void
         */
-       public function addJsLibrary($name, $file, $type = 'text/javascript', $compressed = TRUE, $forceOnTop = FALSE, $allWrap = '') {
+       public function addJsLibrary($name, $file, $type = 'text/javascript', $compress = FALSE, $forceOnTop = FALSE, $allWrap = '') {
                if (!in_array(strtolower($name), $this->jsLibs)) {
                        $this->jsLibs[strtolower($name)] = array (
-                               'file'        => $file, 
-                               'type'        => $type, 
+                               'file'        => $file,
+                               'type'        => $type,
                                'section'     => self::PART_HEADER,
-                               'compressed'  => $compressed, 
+                               'compress'    => $compress,
                                'forceOnTop'  => $forceOnTop,
                                'allWrap'     => $allWrap
                        );
                }
-       
+
        }
 
        /**
@@ -547,23 +752,23 @@ abstract class t3lib_PageRenderer implements t3lib_Singleton {
         * @param string $name
         * @param string $file
         * @param string $type
-        * @param boolean $compressed   flag if library is compressed
+        * @param boolean $compress     flag if library should be compressed
         * @param boolean $forceOnTop   flag if added library should be inserted at begin of this block
         * @param string $allWrap
         * @return void
         */
-       public function addJsFooterLibrary($name, $file, $type = 'text/javascript', $compressed = TRUE, $forceOnTop = FALSE, $allWrap = '') {
+       public function addJsFooterLibrary($name, $file, $type = 'text/javascript', $compress = FALSE, $forceOnTop = FALSE, $allWrap = '') {
                if (!in_array(strtolower($name), $this->jsLibs)) {
                        $this->jsLibs[strtolower($name)] = array (
-                               'file'        => $file, 
-                               'type'        => $type, 
+                               'file'        => $file,
+                               'type'        => $type,
                                'section'     => self::PART_FOOTER,
-                               'compressed'  => $compressed, 
+                               'compress'    => $compress,
                                'forceOnTop'  => $forceOnTop,
                                'allWrap'     => $allWrap
                        );
                }
-       
+
        }
 
        /**
@@ -571,18 +776,18 @@ abstract class t3lib_PageRenderer implements t3lib_Singleton {
         *
         * @param string $file
         * @param string $type
-        * @param boolean $compressed
+        * @param boolean $compress
         * @param boolean $forceOnTop
         * @param string $allWrap
         * @return void
         */
-       public function addJsFile($file, $type = 'text/javascript', $compressed = FALSE, $forceOnTop = FALSE, $allWrap = '') {
+       public function addJsFile($file, $type = 'text/javascript', $compress = TRUE, $forceOnTop = FALSE, $allWrap = '') {
                if (!isset($this->jsFiles[$file])) {
                        $this->jsFiles[$file] = array (
-                               'type'        => $type, 
-                               'section'     => self::PART_HEADER, 
-                               'compressed'  => $compressed, 
-                               'forceOnTop'  => $forceOnTop, 
+                               'type'        => $type,
+                               'section'     => self::PART_HEADER,
+                               'compress'    => $compress,
+                               'forceOnTop'  => $forceOnTop,
                                'allWrap'     => $allWrap
                        );
                }
@@ -593,39 +798,39 @@ abstract class t3lib_PageRenderer implements t3lib_Singleton {
         *
         * @param string $file
         * @param string $type
-        * @param boolean $compressed
+        * @param boolean $compress
         * @param boolean $forceOnTop
         * @return void
         */
-       public function addJsFooterFile($file, $type = 'text/javascript', $compressed = FALSE, $forceOnTop = FALSE, $allWrap = '') {
+       public function addJsFooterFile($file, $type = 'text/javascript', $compress = TRUE, $forceOnTop = FALSE, $allWrap = '') {
                if (!isset($this->jsFiles[$file])) {
                        $this->jsFiles[$file] = array (
-                               'type'        => $type, 
-                               'section'     => self::PART_FOOTER, 
-                               'compressed'  => $compressed, 
-                               'forceOnTop'  => $forceOnTop, 
+                               'type'        => $type,
+                               'section'     => self::PART_FOOTER,
+                               'compress'    => $compress,
+                               'forceOnTop'  => $forceOnTop,
                                'allWrap'     => $allWrap
                        );
                }
        }
 
        /*Javascript Inline Blocks */
-       
+
        /**
         * Adds JS inline code
         *
         * @param string $name
         * @param string $block
-        * @param boolean $compressed
+        * @param boolean $compress
         * @param boolean $forceOnTop
         * @return void
         */
-       public function addJsInlineCode($name, $block, $compressed = FALSE, $forceOnTop = FALSE) {
-               if (!isset($this->jsInline[$name])) {
+       public function addJsInlineCode($name, $block, $compress = TRUE, $forceOnTop = FALSE) {
+               if (!isset($this->jsInline[$name]) && !empty($block)) {
                        $this->jsInline[$name] = array (
-                               'code'        => $block . chr(10),
-                               'section'     => self::PART_HEADER, 
-                               'compressed'  => $compressed,
+                               'code'        => $block . LF,
+                               'section'     => self::PART_HEADER,
+                               'compress'    => $compress,
                                'forceOnTop'  => $forceOnTop
                        );
                }
@@ -636,16 +841,16 @@ abstract class t3lib_PageRenderer implements t3lib_Singleton {
         *
         * @param string $name
         * @param string $block
-        * @param boolean $compressed
+        * @param boolean $compress
         * @param boolean $forceOnTop
         * @return void
         */
-       public function addJsFooterInlineCode($name, $block, $compressed = FALSE, $forceOnTop = FALSE) {
-               if (!isset($this->jsInline[$name])) {
+       public function addJsFooterInlineCode($name, $block, $compress = TRUE, $forceOnTop = FALSE) {
+               if (!isset($this->jsInline[$name]) && !empty($block)) {
                        $this->jsInline[$name] = array (
-                               'code'        => $block . chr(10),
+                               'code'        => $block . LF,
                                'section'     => self::PART_FOOTER,
-                               'compressed'  => $compressed,
+                               'compress'    => $compress,
                                'forceOnTop'  => $forceOnTop
                        );
                }
@@ -654,17 +859,22 @@ abstract class t3lib_PageRenderer implements t3lib_Singleton {
        /**
         * Adds Ext.onready code, which will be wrapped in Ext.onReady(function() {...});
         *
-        * @param string $block
+        * @param string $block javascript code
+        * @param boolean $forceOnTop position of the javascript code (TRUE for putting it on top, default is FALSE = bottom)
         * @return void
         */
-       public function addExtOnReadyCode($block) {
+       public function addExtOnReadyCode($block, $forceOnTop = FALSE) {
                if (!in_array($block, $this->extOnReadyCode)) {
-                       $this->extOnReadyCode[] = $block;
+                       if ($forceOnTop) {
+                               array_unshift($this->extOnReadyCode, $block);
+                       } else {
+                               $this->extOnReadyCode[] = $block;
+                       }
                }
        }
 
        /* CSS Files */
-       
+
        /**
         * Adds CSS file
         *
@@ -672,35 +882,46 @@ abstract class t3lib_PageRenderer implements t3lib_Singleton {
         * @param string $rel
         * @param string $media
         * @param string $title
-        * @param boolean $compressed
+        * @param boolean $compress
         * @param boolean $forceOnTop
         * @return void
         */
-       public function addCssFile($file, $rel = 'stylesheet', $media = 'screen', $title = '', $compressed = FALSE, $forceOnTop = FALSE, $allWrap = '') {
+       public function addCssFile($file, $rel = 'stylesheet', $media = 'all', $title = '', $compress = TRUE, $forceOnTop = FALSE, $allWrap = '') {
                if (!isset($this->cssFiles[$file])) {
-                       $this->cssFiles[$file] = array ('rel' => $rel, 'media' => $media, 'title' => $title, 'compressed' => $compressed, 'forceOnTop' => $forceOnTop, 'allWrap' => $allWrap);
+                       $this->cssFiles[$file] = array (
+                               'rel'        => $rel,
+                               'media'      => $media,
+                               'title'      => $title,
+                               'compress'   => $compress,
+                               'forceOnTop' => $forceOnTop,
+                               'allWrap'    => $allWrap
+                       );
                }
        }
 
        /*CSS Inline Blocks */
-       
+
        /**
         * Adds CSS inline code
         *
         * @param string $name
         * @param string $block
-        * @param boolean $compressed
+        * @param boolean $compress
         * @param boolean $forceOnTop
         * @return void
         */
        public function addCssInlineBlock($name, $block, $compressed = FALSE, $forceOnTop = FALSE) {
-               if (!isset($this->cssInline[$name])) {
-                       $this->cssInline[$name] = array ('code' => $block, 'compressed' => $compressed, 'forceOnTop' => $forceOnTop);
+               if (!isset($this->cssInline[$name]) && !empty($block)) {
+                       $this->cssInline[$name] = array (
+                               'code'       => $block,
+                               'compress'   => $compress,
+                               'forceOnTop' => $forceOnTop
+                       );
                }
        }
 
        /* JS Libraries */
-       
+
        /**
         *  call function if you need the prototype library
         *
@@ -716,7 +937,7 @@ abstract class t3lib_PageRenderer implements t3lib_Singleton {
         * @param string $modules   add modules you need. use "all" if you need complete modules
         * @return void
         */
-       public function loadScriptaculous($modules = '') {
+       public function loadScriptaculous($modules = 'all') {
                // Scriptaculous require prototype, so load prototype too.
                $this->addPrototype = TRUE;
                $this->addScriptaculous = TRUE;
@@ -759,32 +980,18 @@ abstract class t3lib_PageRenderer implements t3lib_Singleton {
                                        break;
                        }
                }
-               if (!$this->addExtJS) {
-                       $this->addExtJS = TRUE;
-                       if ($theme) {
-                               if (isset($GLOBALS['TBE_STYLES']['extJS']['theme'])) {
-                                       $this->addCssFile($this->backPath . $GLOBALS['TBE_STYLES']['extJS']['theme'], 'stylesheet', 'screen', '', FALSE, TRUE);
-                               } else {
-                                       $this->addCssFile($this->backPath . 'contrib/extjs/resources/css/xtheme-blue.css', 'stylesheet', 'screen', '', FALSE, TRUE);
-                               }
-                       }
-                       if ($css) {
-                               if (isset($GLOBALS['TBE_STYLES']['extJS']['all'])) {
-                                       $this->addCssFile($this->backPath . $GLOBALS['TBE_STYLES']['extJS']['all'], 'stylesheet', 'screen', '', FALSE, TRUE);
-                               } else {
-                                       $this->addCssFile($this->backPath . 'contrib/extjs/resources/css/ext-all-notheme.css', 'stylesheet', 'screen', '', FALSE, TRUE);
-                               }
-                       }
-               
-               }
+               $this->addExtJS = TRUE;
+               $this->extJStheme = $theme;
+               $this->extJScss = $css;
+
        }
 
        /**
         * Enables ExtJs QuickTips
         * Need extJs loaded
-        * 
+        *
         * @return void
-        * 
+        *
         */
        public function enableExtJSQuickTips() {
                $this->enableExtJSQuickTips = TRUE;
@@ -800,7 +1007,7 @@ abstract class t3lib_PageRenderer implements t3lib_Singleton {
                $this->addExtCore = TRUE;
        }
 
-       /**     
+       /**
         * call this function to load debug version of ExtJS. Use this for development only
         *
         */
@@ -821,7 +1028,7 @@ abstract class t3lib_PageRenderer implements t3lib_Singleton {
         * Adds Javascript Inline Label. This will occur in TYPO3.lang - object
         * The label can be used in scripts with TYPO3.lang.<key>
         * Need extJs loaded
-        * 
+        *
         * @param string $key
         * @param string $value
         * @return void
@@ -834,8 +1041,8 @@ abstract class t3lib_PageRenderer implements t3lib_Singleton {
         * Adds Javascript Inline Label Array. This will occur in TYPO3.lang - object
         * The label can be used in scripts with TYPO3.lang.<key>
         * Array will be merged with existing array.
-        * Need extJs loaded   
-        * 
+        * Need extJs loaded
+        *
         * @param array $array
         * @return void
         */
@@ -846,8 +1053,8 @@ abstract class t3lib_PageRenderer implements t3lib_Singleton {
        /**
         * Adds Javascript Inline Setting. This will occur in TYPO3.settings - object
         * The label can be used in scripts with TYPO3.setting.<key>
-        * Need extJs loaded   
-        * 
+        * Need extJs loaded
+        *
         * @param string $namespace
         * @param string $key
         * @param string $value
@@ -874,8 +1081,8 @@ abstract class t3lib_PageRenderer implements t3lib_Singleton {
         * Adds Javascript Inline Setting. This will occur in TYPO3.settings - object
         * The label can be used in scripts with TYPO3.setting.<key>
         * Array will be merged with existing array.
-        * Need extJs loaded   
-        * 
+        * Need extJs loaded
+        *
         * @param string $namespace
         * @param array $array
         * @return void
@@ -913,7 +1120,7 @@ abstract class t3lib_PageRenderer implements t3lib_Singleton {
        /*                                                   */
        /*                                                   */
        /*****************************************************/
-       
+
        /**
         * render the section (Header or Footer)
         *
@@ -931,88 +1138,123 @@ abstract class t3lib_PageRenderer implements t3lib_Singleton {
                $jsFooterFiles = '';
                $noJS = FALSE;
 
+               // preRenderHook for possible manuipulation
+               if (is_array($GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['t3lib/class.t3lib_pagerenderer.php']['render-preProcess'])) {
+                       $params = array (
+                               'jsLibs'         => &$this->jsLibs,
+                               'jsFiles'        => &$this->jsFiles,
+                               'jsFooterFiles'  => &$this->jsFooterFiles,
+                               'cssFiles'       => &$this->cssFiles,
+                               'headerData'     => &$this->headerData,
+                               'footerData'     => &$this->footerData,
+                               'jsInline'       => &$this->jsInline,
+                               'cssInline'      => &$this->cssInline,
+                       );
+                       foreach ($GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['t3lib/class.t3lib_pagerenderer.php']['render-preProcess'] as $hook) {
+                               t3lib_div::callUserFunction($hook, $params, $this);
+                       }
+               }
+
                $jsLibs = $this->renderJsLibraries();
 
-               if ($this->compressCss || $this->compressJavascript) {
-                               // do the file compression
-                       $this->doCompress();
-               }
                if ($this->concatenateFiles) {
                                // do the file concatenation
                        $this->doConcatenate();
                }
+               if ($this->compressCss || $this->compressJavascript) {
+                               // do the file compression
+                       $this->doCompress();
+               }
+
+               $metaTags = implode(LF, $this->metaTags);
 
-               $metaTags = implode(chr(10), $this->metaTags);
+                       // remove ending slashes from static header block
+                       // if the page is beeing rendered as html (not xhtml)
+                       // and define variable $endingSlash for further use
+               if ($this->getRenderXhtml()) {
+                       $endingSlash = ' /';
+               } else {
+                       $this->metaCharsetTag = str_replace(' />', '>', $this->metaCharsetTag);
+                       $this->baseUrlTag = str_replace(' />', '>', $this->baseUrlTag);
+                       $this->shortcutTag = str_replace(' />', '>', $this->shortcutTag);
+                       $endingSlash = '';
+               }
 
                if (count($this->cssFiles)) {
                        foreach ($this->cssFiles as $file => $properties) {
-                               $tag = '<link rel="' . $properties['rel'] . '" type="text/css" href="' . $file . '" media="' . $properties['media'] . '"' . ($properties['title'] ? ' title="' . $properties['title'] . '"' : '') . ' />';
+                               $file = t3lib_div::resolveBackPath($file);
+                               $file = t3lib_div::createVersionNumberedFilename($file);
+                               $tag = '<link rel="' . $properties['rel'] . '" type="text/css" href="' .
+                                       htmlspecialchars($file) . '" media="' . $properties['media'] . '"' .
+                                       ($properties['title'] ? ' title="' . $properties['title'] . '"' : '') .
+                                       $endingSlash . '>';
                                if ($properties['allWrap'] && strpos($properties['allWrap'], '|') !== FALSE) {
                                        $tag = str_replace('|', $tag, $properties['allWrap']);
                                }
                                if ($properties['forceOnTop']) {
-                                       $cssFiles = $tag . chr(10) . $cssFiles;
+                                       $cssFiles = $tag . LF . $cssFiles;
                                } else {
-                                       $cssFiles .= chr(10) . $tag;
+                                       $cssFiles .= LF . $tag;
                                }
                        }
                }
 
                if (count($this->cssInline)) {
-                       
                        foreach ($this->cssInline as $name => $properties) {
                                if ($properties['forceOnTop']) {
-                                       $cssInline = '/*' . htmlspecialchars($name) . '*/' . chr(10) . $properties['code'] . chr(10) . $cssInline;
+                                       $cssInline = '/*' . htmlspecialchars($name) . '*/' . LF . $properties['code'] . LF . $cssInline;
                                } else {
-                                       $cssInline .= '/*' . htmlspecialchars($name) . '*/' . chr(10) . $properties['code'] . chr(10);
+                                       $cssInline .= '/*' . htmlspecialchars($name) . '*/' . LF . $properties['code'] . LF;
                                }
                        }
                        $cssInline = $this->inlineCssWrap[0] . $cssInline . $this->inlineCssWrap[1];
-
                }
 
                if (count($this->jsLibs)) {
                        foreach ($this->jsLibs as $name => $properties) {
-                               $tag = '<script src="' . $properties['file'] . '" type="' . $properties['type'] . '"></script>';
+                               $properties['file'] = t3lib_div::resolveBackPath($properties['file']);
+                               $properties['file'] = t3lib_div::createVersionNumberedFilename($properties['file']);
+                               $tag = '<script src="' . htmlspecialchars($properties['file']) . '" type="' . $properties['type'] . '"></script>';
                                if ($properties['allWrap'] && strpos($properties['allWrap'], '|') !== FALSE) {
                                        $tag = str_replace('|', $tag, $properties['allWrap']);
                                }
                                if ($properties['forceOnTop']) {
                                        if ($properties['section'] === self::PART_HEADER) {
-                                               $jsLibs = $tag . chr(10) . $jsLibs;
+                                               $jsLibs = $tag . LF . $jsLibs;
                                        } else {
-                                               $jsFooterLibs = $tag . chr(10) . $jsFooterLibs;
+                                               $jsFooterLibs = $tag . LF . $jsFooterLibs;
                                        }
                                } else {
                                        if ($properties['section'] === self::PART_HEADER) {
-                                               $jsLibs .= chr(10) . $tag;
+                                               $jsLibs .= LF . $tag;
                                        } else {
-                                               $jsFooterLibs .= chr(10) . $tag;
+                                               $jsFooterLibs .= LF . $tag;
                                        }
                                }
-                               
                        }
                }
 
                if (count($this->jsFiles)) {
                        foreach ($this->jsFiles as $file => $properties) {
-                                       $tag = '<script src="' . $file . '" type="' . $properties['type'] . '"></script>';
-                                       if ($properties['allWrap'] && strpos($properties['allWrap'], '|') !== FALSE) {
-                                               $tag = str_replace('|', $tag, $properties['allWrap']);
+                               $file = t3lib_div::resolveBackPath($file);
+                               $file = t3lib_div::createVersionNumberedFilename($file);
+                               $tag = '<script src="' . htmlspecialchars($file) . '" type="' . $properties['type'] . '"></script>';
+                               if ($properties['allWrap'] && strpos($properties['allWrap'], '|') !== FALSE) {
+                                       $tag = str_replace('|', $tag, $properties['allWrap']);
+                               }
+                               if ($properties['forceOnTop']) {
+                                       if ($properties['section'] === self::PART_HEADER) {
+                                               $jsFiles = $tag . LF . $jsFiles;
+                                       } else {
+                                               $jsFooterFiles = $tag . LF . $jsFooterFiles;
                                        }
-                                       if ($properties['forceOnTop']) {
-                                               if ($properties['section'] === self::PART_HEADER) {
-                                                       $jsFiles = $tag . chr(10) . $jsFiles;
-                                               } else {
-                                                       $jsFooterFiles = $tag . chr(10) . $jsFooterFiles;
-                                               }
+                               } else {
+                                       if ($properties['section'] === self::PART_HEADER) {
+                                               $jsFiles .= LF . $tag;
                                        } else {
-                                               if ($properties['section'] === self::PART_HEADER) {
-                                                       $jsFiles .= chr(10) . $tag;
-                                               } else {
-                                                       $jsFooterFiles .= chr(10) . $tag;
-                                               }
+                                               $jsFooterFiles .= LF . $tag;
                                        }
+                               }
                        }
                }
 
@@ -1020,15 +1262,15 @@ abstract class t3lib_PageRenderer implements t3lib_Singleton {
                        foreach ($this->jsInline as $name => $properties) {
                                if ($properties['forceOnTop']) {
                                        if ($properties['section'] === self::PART_HEADER) {
-                                               $jsInline = '/*' . htmlspecialchars($name) . '*/' . chr(10) . $properties['code'] . chr(10) . $jsInline;        
+                                               $jsInline = '/*' . htmlspecialchars($name) . '*/' . LF . $properties['code'] . LF . $jsInline;
                                        } else {
-                                               $jsFooterInline = '/*' . htmlspecialchars($name) . '*/' . chr(10) . $properties['code'] . chr(10) . $jsFooterInline;
+                                               $jsFooterInline = '/*' . htmlspecialchars($name) . '*/' . LF . $properties['code'] . LF . $jsFooterInline;
                                        }
                                } else {
                                        if ($properties['section'] === self::PART_HEADER) {
-                                               $jsInline .= '/*' . htmlspecialchars($name) . '*/' . chr(10) . $properties['code'] . chr(10);
+                                               $jsInline .= '/*' . htmlspecialchars($name) . '*/' . LF . $properties['code'] . LF;
                                        } else {
-                                               $jsFooterInline .= '/*' . htmlspecialchars($name) . '*/' . chr(10) . $properties['code'] . chr(10);
+                                               $jsFooterInline .= '/*' . htmlspecialchars($name) . '*/' . LF . $properties['code'] . LF;
                                        }
                                }
                        }
@@ -1049,7 +1291,7 @@ abstract class t3lib_PageRenderer implements t3lib_Singleton {
                $template = t3lib_div::getURL($templateFile);
 
                if ($this->removeEmptyLinesFromTemplate) {
-                       $template = strtr($template, array(chr(10) => '', chr(13) => ''));
+                       $template = strtr($template, array(LF => '', CR => ''));
                }
                if ($part != self::PART_COMPLETE) {
                        $templatePart = explode('###BODY###', $template);
@@ -1057,35 +1299,35 @@ abstract class t3lib_PageRenderer implements t3lib_Singleton {
                }
 
                if ($this->moveJsFromHeaderToFooter) {
-                       $jsFooterLibs = $jsLibs . chr(10) . $jsFooterLibs;
+                       $jsFooterLibs = $jsLibs . LF . $jsFooterLibs;
                        $jsLibs = '';
-                       $jsFooterFiles = $jsFiles . chr(10) . $jsFooterFiles;
+                       $jsFooterFiles = $jsFiles . LF . $jsFooterFiles;
                        $jsFiles = '';
-                       $jsFooterInline = $jsInline . chr(10) . $jsFooterInline;
+                       $jsFooterInline = $jsInline . LF . $jsFooterInline;
                        $jsInline = '';
-               }       
+               }
 
                $markerArray = array(
-                       'XMLPROLOG_DOCTYPE' => $this->xmlPrologAndDocType, 
-                       'HTMLTAG'           => $this->htmlTag, 
-                       'HEADTAG'           => $this->headTag, 
-                       'METACHARSET'       => $this->charSet ? str_replace('|', htmlspecialchars($this->charSet), $this->metaCharsetTag) : '', 
-                       'INLINECOMMENT'     => $this->inlineComments ? chr(10) . chr(10) . '<!-- ' . chr(10) . implode(chr(10), $this->inlineComments) . '-->' . chr(10) . chr(10) : '', 
+                       'XMLPROLOG_DOCTYPE' => $this->xmlPrologAndDocType,
+                       'HTMLTAG'           => $this->htmlTag,
+                       'HEADTAG'           => $this->headTag,
+                       'METACHARSET'       => $this->charSet ? str_replace('|', htmlspecialchars($this->charSet), $this->metaCharsetTag) : '',
+                       'INLINECOMMENT'     => $this->inlineComments ? LF . LF . '<!-- ' . LF . implode(LF, $this->inlineComments) . '-->' . LF . LF : '',
                        'BASEURL'           => $this->baseUrl ? str_replace('|', $this->baseUrl, $this->baseUrlTag) : '',
-                       'SHORTCUT'          => $this->favIcon ? sprintf($this->shortcutTag, htmlspecialchars($this->favIcon), $this->iconMimeType) : '', 
-                       'CSS_INCLUDE'       => $cssFiles, 
-                       'CSS_INLINE'        => $cssInline, 
-                       'JS_INLINE'         => $jsInline, 
-                       'JS_INCLUDE'        => $jsFiles, 
-                       'JS_LIBS'               => $jsLibs, 
-                       'TITLE'             => $this->title ? str_replace('|', htmlspecialchars($this->title), $this->titleTag) : '', 
-                       'META'              => $metaTags, 
-                       'HEADERDATA'        => $this->headerData ? implode(chr(10), $this->headerData) : '', 
-                       'FOOTERDATA'        => $this->footerData ? implode(chr(10), $this->footerData) : '', 
-                       'JS_LIBS_FOOTER'        => $jsFooterLibs, 
-                       'JS_INCLUDE_FOOTER' => $jsFooterFiles, 
+                       'SHORTCUT'          => $this->favIcon ? sprintf($this->shortcutTag, htmlspecialchars($this->favIcon), $this->iconMimeType) : '',
+                       'CSS_INCLUDE'       => $cssFiles,
+                       'CSS_INLINE'        => $cssInline,
+                       'JS_INLINE'         => $jsInline,
+                       'JS_INCLUDE'        => $jsFiles,
+                       'JS_LIBS'               => $jsLibs,
+                       'TITLE'             => $this->title ? str_replace('|', htmlspecialchars($this->title), $this->titleTag) : '',
+                       'META'              => $metaTags,
+                       'HEADERDATA'        => $this->headerData ? implode(LF, $this->headerData) : '',
+                       'FOOTERDATA'        => $this->footerData ? implode(LF, $this->footerData) : '',
+                       'JS_LIBS_FOOTER'        => $jsFooterLibs,
+                       'JS_INCLUDE_FOOTER' => $jsFooterFiles,
                        'JS_INLINE_FOOTER'  => $jsFooterInline,
-                       'BODY'                          => $this->bodyContent, 
+                       'BODY'                          => $this->bodyContent,
                );
 
                $markerArray = array_map('trim', $markerArray);
@@ -1103,8 +1345,9 @@ abstract class t3lib_PageRenderer implements t3lib_Singleton {
                $out = '';
 
                if ($this->addPrototype) {
-                       $out .= '<script src="' . $this->backPath . 'contrib/prototype/prototype.js" type="text/javascript"></script>' . chr(10);
-                       unset($this->jsFiles[$this->backPath . 'contrib/prototype/prototype.js']);
+                       $out .= '<script src="' . $this->processJsFile($this->backPath  . $this->prototypePath . 'prototype.js') .
+                               '" type="text/javascript"></script>' . LF;
+                       unset($this->jsFiles[$this->backPath . $this->prototypePath .'prototype.js']);
                }
 
                if ($this->addScriptaculous) {
@@ -1120,24 +1363,35 @@ abstract class t3lib_PageRenderer implements t3lib_Singleton {
                        }
 
                        if (count($mods)) {
-                               $moduleLoadString = '?load=' . implode(',', $mods);
+                               foreach ($mods as $module) {
+                                       $out .= '<script src="' . $this->processJsFile($this->backPath .
+                                               $this->scriptaculousPath . $module . '.js') . '" type="text/javascript"></script>' . LF;
+                                       unset($this->jsFiles[$this->backPath . $this->scriptaculousPath . $module . '.js']);
+                               }
                        }
-
-                       $out .= '<script src="' . $this->backPath . 'contrib/scriptaculous/scriptaculous.js' . $moduleLoadString . '" type="text/javascript"></script>' . chr(10);
-                       unset($this->jsFiles[$this->backPath . 'contrib/scriptaculous/scriptaculous.js' . $moduleLoadString]);
+                       $out .= '<script src="' . $this->processJsFile($this->backPath . $this->scriptaculousPath .
+                               'scriptaculous.js') . '" type="text/javascript"></script>' . LF;
+                       unset($this->jsFiles[$this->backPath . $this->scriptaculousPath . 'scriptaculous.js']);
                }
 
                        // include extCore
                if ($this->addExtCore) {
-                       $out .= '<script src="' . $this->backPath . 'contrib/extjs/ext-core' . ($this->enableExtCoreDebug ? '-debug' : '') . '.js" type="text/javascript"></script>' . chr(10);
-                       unset($this->jsFiles[$this->backPath . 'contrib/extjs/ext-core' . ($this->enableExtCoreDebug ? '-debug' : '') . '.js']);
+                       $out .= '<script src="' . $this->processJsFile($this->backPath .
+                               $this->extCorePath . 'ext-core' . ($this->enableExtCoreDebug ? '-debug' : '') . '.js') .
+                               '" type="text/javascript"></script>' . LF;
+                       unset($this->jsFiles[$this->backPath . $this->extCorePath . 'ext-core' . ($this->enableExtCoreDebug ? '-debug' : '') . '.js']);
                }
 
                        // include extJS
                if ($this->addExtJS) {
                                // use the base adapter all the time
-                       $out .= '<script src="' . $this->backPath . 'contrib/extjs/adapter/' . $this->extJSadapter . '" type="text/javascript"></script>' . chr(10);
-                       $out .= '<script src="' . $this->backPath . 'contrib/extjs/ext-all' . ($this->enableExtJsDebug ? '-debug' : '') . '.js" type="text/javascript"></script>' . chr(10);
+                       $out .= '<script src="' . $this->processJsFile($this->backPath . $this->extJsPath .
+                               'adapter/' . ($this->enableExtJsDebug ?
+                                       str_replace('.js', '-debug.js', $this->extJSadapter) : $this->extJSadapter)) .
+                               '" type="text/javascript"></script>' . LF;
+                       $out .= '<script src="' . $this->processJsFile($this->backPath . $this->extJsPath .
+                               'ext-all' . ($this->enableExtJsDebug ? '-debug' : '') . '.js') .
+                               '" type="text/javascript"></script>' . LF;
 
                                // add extJS localization
                        $localeMap = $this->csConvObj->isoArray; // load standard ISO mapping and modify for use with ExtJS
@@ -1150,17 +1404,33 @@ abstract class t3lib_PageRenderer implements t3lib_Singleton {
 
                        $extJsLang = isset($localeMap[$this->lang]) ? $localeMap[$this->lang] : $this->lang;
                                // TODO autoconvert file from UTF8 to current BE charset if necessary!!!!
-                       $extJsLocaleFile = 'contrib/extjs/locale/ext-lang-' . $extJsLang . '-min.js';
+                       $extJsLocaleFile = $this->extJsPath . 'locale/ext-lang-' . $extJsLang . '.js';
                        if (file_exists(PATH_typo3 . $extJsLocaleFile)) {
-                               $out .= '<script src="' . $this->backPath . $extJsLocaleFile . '" type="text/javascript"></script>' . chr(10);
+                               $out .= '<script src="' . $this->processJsFile($this->backPath .
+                                       $extJsLocaleFile) . '" type="text/javascript" charset="utf-8"></script>' . LF;
                        }
 
 
                                // remove extjs from JScodeLibArray
                        unset(
-                               $this->jsFiles[$this->backPath . 'contrib/extjs/ext-all.js'], $this->jsFiles[$this->backPath . 'contrib/extjs/ext-all-debug.js']
+                               $this->jsFiles[$this->backPath . $this->extJsPath . 'ext-all.js'],
+                               $this->jsFiles[$this->backPath . $this->extJsPath . 'ext-all-debug.js']
                        );
                }
+
+                       // Convert labels/settings back to UTF-8 since json_encode() only works with UTF-8:
+               if ($this->getCharSet() !== 'utf-8') {
+                       if ($this->inlineLanguageLabels) {
+                               $this->csConvObj->convArray($this->inlineLanguageLabels, $this->getCharSet(), 'utf-8');
+                       }
+                       if ($this->inlineSettings) {
+                               $this->csConvObj->convArray($this->inlineSettings, $this->getCharSet(), 'utf-8');
+                       }
+               }
+
+               $inlineSettings = $this->inlineLanguageLabels ? 'TYPO3.lang = ' . json_encode($this->inlineLanguageLabels) . ';' : '';
+               $inlineSettings .= $this->inlineSettings ? 'TYPO3.settings = ' . json_encode($this->inlineSettings) . ';' : '';
+
                if ($this->addExtCore || $this->addExtJS) {
                                // set clear.gif, move it on top, add handler code
                        $code = '';
@@ -1172,12 +1442,31 @@ abstract class t3lib_PageRenderer implements t3lib_Singleton {
 
                        $out .= $this->inlineJavascriptWrap[0] . '
                                Ext.ns("TYPO3");
-                               Ext.BLANK_IMAGE_URL = "' . htmlspecialchars(t3lib_div::locationHeaderUrl($this->backPath . 'gfx/clear.gif')) . '";' . chr(10) . 
-                               'TYPO3.lang = ' . json_encode($this->inlineLanguageLabels) . ';' . 'TYPO3.settings = ' . json_encode($this->inlineSettings) . ';' .
+                               Ext.BLANK_IMAGE_URL = "' . htmlspecialchars(t3lib_div::locationHeaderUrl($this->backPath . 'gfx/clear.gif')) . '";' . LF .
+                               $inlineSettings .
                                'Ext.onReady(function() {' .
-                               ($this->enableExtJSQuickTips ? 'Ext.QuickTips.init();' . chr(10) : '') . $code .
+                               ($this->enableExtJSQuickTips ? 'Ext.QuickTips.init();' . LF : '') . $code .
                                ' });' . $this->inlineJavascriptWrap[1];
                        unset ($this->extOnReadyCode);
+
+                       if ($this->extJStheme) {
+                               if (isset($GLOBALS['TBE_STYLES']['extJS']['theme'])) {
+                                       $this->addCssFile($this->backPath . $GLOBALS['TBE_STYLES']['extJS']['theme'], 'stylesheet', 'all', '', TRUE, TRUE);
+                               } else {
+                                       $this->addCssFile($this->backPath . $this->extJsPath . 'resources/css/xtheme-blue.css', 'stylesheet', 'all', '', TRUE, TRUE);
+                               }
+                       }
+                       if ($this->extJScss) {
+                               if (isset($GLOBALS['TBE_STYLES']['extJS']['all'])) {
+                                       $this->addCssFile($this->backPath . $GLOBALS['TBE_STYLES']['extJS']['all'], 'stylesheet', 'all', '', TRUE, TRUE);
+                               } else {
+                                       $this->addCssFile($this->backPath . $this->extJsPath . 'resources/css/ext-all-notheme.css', 'stylesheet', 'all', '', TRUE, TRUE);
+                               }
+                       }
+               } else {
+                       if ($inlineSettings) {
+                               $out .= $this->inlineJavascriptWrap[0] . $inlineSettings . $this->inlineJavascriptWrap[1];
+                       }
                }
 
                return $out;
@@ -1189,11 +1478,10 @@ abstract class t3lib_PageRenderer implements t3lib_Singleton {
        /*                                                   */
        /*                                                   */
        /*****************************************************/
-       
+
        /**
         * concatenate files into one file
         * registered handler
-        * TODO: implement own method
         *
         * @return void
         */
@@ -1201,69 +1489,118 @@ abstract class t3lib_PageRenderer implements t3lib_Singleton {
                // traverse the arrays, concatenate in one file
                // then remove concatenated files from array and add the concatenated file
 
-
-                       // extern concatination
-               if ($this->concatenateFiles && $GLOBALS['TYPO3_CONF_VARS'][TYPO3_MODE]['concatenateHandler']) {
-                       // use extern concatenate routine
+               if ($this->concatenateFiles) {
                        $params = array (
-                               'jsLibs'         => &$this->jsLibs, 
-                               'jsFiles'        => &$this->jsFiles, 
-                               'jsFooterFiles'  => &$this->jsFiles, 
+                               'jsLibs'         => &$this->jsLibs,
+                               'jsFiles'        => &$this->jsFiles,
+                               'jsFooterFiles'  => &$this->jsFooterFiles,
                                'cssFiles'       => &$this->cssFiles,
+                               'headerData'     => &$this->headerData,
+                               'footerData'     => &$this->footerData,
                        );
-                       t3lib_div::callUserFunction($GLOBALS['TYPO3_CONF_VARS'][TYPO3_MODE]['concatenateHandler'], $params, $this);
-               } else {
-                       // own method, nothing implemented atm
-
 
+                       if ($GLOBALS['TYPO3_CONF_VARS'][TYPO3_MODE]['concatenateHandler']) {
+                               // use extern concatenate routine
+                               t3lib_div::callUserFunction($GLOBALS['TYPO3_CONF_VARS'][TYPO3_MODE]['concatenateHandler'], $params, $this);
+                       } elseif (TYPO3_MODE === 'BE') {
+                               $cssOptions = array('baseDirectories' => $GLOBALS['TBE_TEMPLATE']->getSkinStylesheetDirectories());
+                               $this->cssFiles = $this->getCompressor()->concatenateCssFiles($this->cssFiles, $cssOptions);
+                       }
                }
        }
 
        /**
         * compress inline code
         *
+        * @return void
         */
        protected function doCompress() {
 
                if ($this->compressJavascript && $GLOBALS['TYPO3_CONF_VARS'][TYPO3_MODE]['jsCompressHandler']) {
                        // use extern compress routine
                        $params = array (
-                               'jsInline'        => &$this->jsInline, 
-                               'jsFooterInline'  => &$this->jsFooterInline
+                               'jsInline'        => &$this->jsInline,
+                               'jsFooterInline'  => &$this->jsFooterInline,
+                               'jsLibs'          => &$this->jsLibs,
+                               'jsFiles'         => &$this->jsFiles,
+                               'jsFooterFiles'   => &$this->jsFooterFiles,
+                               'headerData'      => &$this->headerData,
+                               'footerData'      => &$this->footerData,
                        );
                        t3lib_div::callUserFunction($GLOBALS['TYPO3_CONF_VARS'][TYPO3_MODE]['jsCompressHandler'], $params, $this);
                } else {
                                // traverse the arrays, compress files
                        $this->compressError = '';
-                       
+
                        if ($this->compressJavascript) {
                                if (count($this->jsInline)) {
                                        foreach ($this->jsInline as $name => $properties) {
-                                               if (!$properties['compressed']) {
+                                               if ($properties['compress']) {
                                                        $error = '';
                                                        $this->jsInline[$name]['code'] = t3lib_div::minifyJavaScript($properties['code'], $error);
                                                        if ($error) {
-                                                               $this->compressError .= 'Error with minify JS Inline Block "' . $name . '": ' . $error . chr(10);
+                                                               $this->compressError .= 'Error with minify JS Inline Block "' . $name . '": ' . $error . LF;
                                                        }
                                                }
                                        }
                                }
+                               if (TYPO3_MODE === 'BE') {
+                                       $this->jsFiles = $this->getCompressor()->compressJsFiles($this->jsFiles);
+                                       $this->jsFooterFiles = $this->getCompressor()->compressJsFiles($this->jsFooterFiles);
+                               }
                        }
                }
-
-               if ($this->compressCss && $GLOBALS['TYPO3_CONF_VARS'][TYPO3_MODE]['cssCompressHandler']) {
+               if ($this->compressCss) {
                                // use extern compress routine
                        $params = array (
-                               'cssInline' => &$this->cssInline
+                               'cssInline'  => &$this->cssInline,
+                               'cssFiles'   => &$this->cssFiles,
+                               'headerData' => &$this->headerData,
+                               'footerData' => &$this->footerData,
                        );
-                       t3lib_div::callUserFunction($GLOBALS['TYPO3_CONF_VARS'][TYPO3_MODE]['cssCompressHandler'], $params, $this);
-               } else {
-                       if ($this->compressCss) {
-                               // own method, nothing implemented atm
+
+                       if ($GLOBALS['TYPO3_CONF_VARS'][TYPO3_MODE]['cssCompressHandler']) {
+                               // use extern concatenate routine
+                               t3lib_div::callUserFunction($GLOBALS['TYPO3_CONF_VARS'][TYPO3_MODE]['cssCompressHandler'], $params, $this);
+                       } elseif (TYPO3_MODE === 'BE') {
+                               $this->cssFiles = $this->getCompressor()->compressCssFiles($this->cssFiles);
                        }
                }
        }
 
+       /**
+        * Returns instance of t3lib_Compressor
+        *
+        * @return      t3lib_Compressor                Instance of t3lib_Compressor
+        */
+       protected function getCompressor() {
+               if ($this->compressor === NULL) {
+                       $this->compressor = t3lib_div::makeInstance('t3lib_Compressor');
+               }
+               return $this->compressor;
+       }
+
+       /**
+        * Processes a Javascript file dependent on the current context
+        *
+        * Adds the version number for Frontend, compresses the file for Backend
+        *
+        * @param       string  $filename               Filename
+        * @return      string          new filename
+        */
+       protected function processJsFile($filename) {
+               switch (TYPO3_MODE) {
+                       case 'FE':
+                               $filename = t3lib_div::createVersionNumberedFilename($filename);
+                               break;
+                       case 'BE':
+                               if ($this->compressJavascript) {
+                                       $filename = $this->getCompressor()->compressJsFile($filename);
+                               }
+                               break;
+               }
+               return $filename;
+       }
 }
 
 if (defined('TYPO3_MODE') && $TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['t3lib/class.t3lib_pagerenderer.php']) {