[FEATURE] Allow .ts file extension for static typoscript templates
[Packages/TYPO3.CMS.git] / t3lib / class.t3lib_div.php
index f8525fe..c42ccf2 100644 (file)
@@ -41,7 +41,7 @@
  * @package TYPO3
  * @subpackage t3lib
  */
-final class t3lib_div {
+class t3lib_div {
 
                // Severity constants used by t3lib_div::sysLog()
        const SYSLOG_SEVERITY_INFO = 0;
@@ -65,13 +65,6 @@ final class t3lib_div {
         */
        protected static $nonSingletonInstances = array();
 
-       /**
-        * Register for makeInstance with given class name and final class names to reduce number of class_exists() calls
-        *
-        * @var array Given class name => final class name
-        */
-       protected static $finalClassNameRegister = array();
-
        /*************************
         *
         * GET/POST Variables
@@ -135,7 +128,8 @@ final class t3lib_div {
         */
        public static function _GET($var = NULL) {
                $value = ($var === NULL) ? $_GET : (empty($var) ? NULL : $_GET[$var]);
-               if (isset($value)) { // Removes slashes since TYPO3 has added them regardless of magic_quotes setting.
+                       // Removes slashes since TYPO3 has added them regardless of magic_quotes setting.
+               if (isset($value)) {
                        if (is_array($value)) {
                                self::stripSlashesOnArray($value);
                        } else {
@@ -155,7 +149,8 @@ final class t3lib_div {
         */
        public static function _POST($var = NULL) {
                $value = ($var === NULL) ? $_POST : (empty($var) ? NULL : $_POST[$var]);
-               if (isset($value)) { // Removes slashes since TYPO3 has added them regardless of magic_quotes setting.
+                       // Removes slashes since TYPO3 has added them regardless of magic_quotes setting.
+               if (isset($value)) {
                        if (is_array($value)) {
                                self::stripSlashesOnArray($value);
                        } else {
@@ -169,11 +164,11 @@ final class t3lib_div {
         * Writes input value to $_GET.
         *
         * @param mixed $inputGet
-        *              array or single value to write to $_GET. Values should NOT be
+        *              Array or single value to write to $_GET. Values should NOT be
         *              escaped at input time (but will be escaped before writing
         *              according to TYPO3 standards).
         * @param string $key
-        *              alternative key; If set, this will not set the WHOLE GET array,
+        *              Alternative key; If set, this will not set the WHOLE GET array,
         *              but only the key in it specified by this value!
         *              You can specify to replace keys on deeper array levels by
         *              separating the keys with a pipe.
@@ -183,7 +178,7 @@ final class t3lib_div {
         * @return void
         */
        public static function _GETset($inputGet, $key = '') {
-                       // adds slashes since TYPO3 standard currently is that slashes
+                       // Adds slashes since TYPO3 standard currently is that slashes
                        // must be applied (regardless of magic_quotes setting)
                if (is_array($inputGet)) {
                        self::addSlashesOnArray($inputGet);
@@ -231,14 +226,12 @@ final class t3lib_div {
                return $string;
        }
 
-
        /*************************
         *
         * IMAGE FUNCTIONS
         *
         *************************/
 
-
        /**
         * Compressing a GIF file if not already LZW compressed.
         * This function is a workaround for the fact that ImageMagick and/or GD does not compress GIF-files to their minimun size (that is RLE or no compression used)
@@ -260,11 +253,13 @@ final class t3lib_div {
        public static function gif_compress($theFile, $type) {
                $gfxConf = $GLOBALS['TYPO3_CONF_VARS']['GFX'];
                $returnCode = '';
-               if ($gfxConf['gif_compress'] && strtolower(substr($theFile, -4, 4)) == '.gif') { // GIF...
-                       if (($type == 'IM' || !$type) && $gfxConf['im'] && $gfxConf['im_path_lzw']) { // IM
-                                       // use temporary file to prevent problems with read and write lock on same file on network file systems
+                       // GIF...
+               if ($gfxConf['gif_compress'] && strtolower(substr($theFile, -4, 4)) == '.gif') {
+                               // IM
+                       if (($type == 'IM' || !$type) && $gfxConf['im'] && $gfxConf['im_path_lzw']) {
+                                       // Use temporary file to prevent problems with read and write lock on same file on network file systems
                                $temporaryName  =  dirname($theFile) . '/' . md5(uniqid()) . '.gif';
-                                       // rename could fail, if a simultaneous thread is currently working on the same thing
+                                       // Rename could fail, if a simultaneous thread is currently working on the same thing
                                if (@rename($theFile, $temporaryName)) {
                                        $cmd = self::imageMagickCommand('convert', '"' . $temporaryName . '" "' . $theFile . '"', $gfxConf['im_path_lzw']);
                                        t3lib_utility_Command::exec($cmd);
@@ -292,8 +287,8 @@ final class t3lib_div {
         * Converts a png file to gif.
         * This converts a png file to gif IF the FLAG $GLOBALS['TYPO3_CONF_VARS']['FE']['png_to_gif'] is set TRUE.
         *
-        * @param string $theFile the filename with path
-        * @return string new filename
+        * @param string $theFile The filename with path
+        * @return string New filename
         */
        public static function png_to_gif_by_imagemagick($theFile) {
                if ($GLOBALS['TYPO3_CONF_VARS']['FE']['png_to_gif']
@@ -342,7 +337,6 @@ final class t3lib_div {
                }
        }
 
-
        /*************************
         *
         * STRING FUNCTIONS
@@ -352,10 +346,10 @@ final class t3lib_div {
        /**
         * Truncates a string with appended/prepended "..." and takes current character set into consideration.
         *
-        * @param string $string string to truncate
-        * @param integer $chars must be an integer with an absolute value of at least 4. if negative the string is cropped from the right end.
-        * @param string $appendString appendix to the truncated string
-        * @return string cropped string
+        * @param string $string String to truncate
+        * @param integer $chars Must be an integer with an absolute value of at least 4. if negative the string is cropped from the right end.
+        * @param string $appendString Appendix to the truncated string
+        * @return string Cropped string
         */
        public static function fixed_lgd_cs($string, $chars, $appendString = '...') {
                if (is_object($GLOBALS['LANG'])) {
@@ -364,7 +358,7 @@ final class t3lib_div {
                        $charSet = ($GLOBALS['TSFE']->renderCharset != '' ? $GLOBALS['TSFE']->renderCharset : $GLOBALS['TSFE']->defaultCharSet);
                        return $GLOBALS['TSFE']->csConvObj->crop($charSet, $string, $chars, $appendString);
                } else {
-                               // this case should not happen
+                               // This case should not happen
                        $csConvObj = self::makeInstance('t3lib_cs');
                        return $csConvObj->crop('utf-8', $string, $chars, $appendString);
                }
@@ -374,8 +368,8 @@ final class t3lib_div {
         * Match IP number with list of numbers with wildcard
         * Dispatcher method for switching into specialised IPv4 and IPv6 methods.
         *
-        * @param string $baseIP is the current remote IP address for instance, typ. REMOTE_ADDR
-        * @param string $list is a comma-list of IP-addresses to match with. *-wildcard allowed instead of number, plus leaving out parts in the IP number is accepted as wildcard (eg. 192.168.*.* equals 192.168). If list is "*" no check is done and the function returns TRUE immediately. An empty list always returns FALSE.
+        * @param string $baseIP Is the current remote IP address for instance, typ. REMOTE_ADDR
+        * @param string $list Is a comma-list of IP-addresses to match with. *-wildcard allowed instead of number, plus leaving out parts in the IP number is accepted as wildcard (eg. 192.168.*.* equals 192.168). If list is "*" no check is done and the function returns TRUE immediately. An empty list always returns FALSE.
         * @return boolean TRUE if an IP-mask from $list matches $baseIP
         */
        public static function cmpIP($baseIP, $list) {
@@ -395,9 +389,9 @@ final class t3lib_div {
        /**
         * Match IPv4 number with list of numbers with wildcard
         *
-        * @param       string          $baseIP is the current remote IP address for instance, typ. REMOTE_ADDR
-        * @param       string          $list is a comma-list of IP-addresses to match with. *-wildcard allowed instead of number, plus leaving out parts in the IP number is accepted as wildcard (eg. 192.168.*.* equals 192.168), could also contain IPv6 addresses
-        * @return      boolean         TRUE if an IP-mask from $list matches $baseIP
+        * @param string $baseIP Is the current remote IP address for instance, typ. REMOTE_ADDR
+        * @param string $list Is a comma-list of IP-addresses to match with. *-wildcard allowed instead of number, plus leaving out parts in the IP number is accepted as wildcard (eg. 192.168.*.* equals 192.168), could also contain IPv6 addresses
+        * @return boolean TRUE if an IP-mask from $list matches $baseIP
         */
        public static function cmpIPv4($baseIP, $list) {
                $IPpartsReq = explode('.', $baseIP);
@@ -443,12 +437,13 @@ final class t3lib_div {
        /**
         * Match IPv6 address with a list of IPv6 prefixes
         *
-        * @param string $baseIP is the current remote IP address for instance
-        * @param string $list is a comma-list of IPv6 prefixes, could also contain IPv4 addresses
-        * @return boolean TRUE if an baseIP matches any prefix
+        * @param string $baseIP Is the current remote IP address for instance
+        * @param string $list Is a comma-list of IPv6 prefixes, could also contain IPv4 addresses
+        * @return boolean TRUE If an baseIP matches any prefix
         */
        public static function cmpIPv6($baseIP, $list) {
-               $success = FALSE; // Policy default: Deny connection
+                       // Policy default: Deny connection
+               $success = FALSE;
                $baseIP = self::normalizeIPv6($baseIP);
 
                $values = self::trimExplode(',', $list, 1);
@@ -463,7 +458,8 @@ final class t3lib_div {
                        if (self::validIPv6($test)) {
                                $test = self::normalizeIPv6($test);
                                $maskInt = intval($mask) ? intval($mask) : 128;
-                               if ($mask === '0') { // special case; /0 is an allowed mask - equals a wildcard
+                                       // Special case; /0 is an allowed mask - equals a wildcard
+                               if ($mask === '0') {
                                        $success = TRUE;
                                } elseif ($maskInt == 128) {
                                        $success = ($test === $baseIP);
@@ -472,14 +468,14 @@ final class t3lib_div {
                                        $baseIPBin = self::IPv6Hex2Bin($baseIP);
                                        $success = TRUE;
 
-                                       // modulo is 0 if this is a 8-bit-boundary
+                                               // Modulo is 0 if this is a 8-bit-boundary
                                        $maskIntModulo = $maskInt % 8;
                                        $numFullCharactersUntilBoundary = intval($maskInt / 8);
 
                                        if (substr($testBin, 0, $numFullCharactersUntilBoundary) !== substr($baseIPBin, 0, $numFullCharactersUntilBoundary)) {
                                                $success = FALSE;
                                        } elseif ($maskIntModulo > 0) {
-                                               // if not an 8-bit-boundary, check bits of last character
+                                                       // If not an 8-bit-boundary, check bits of last character
                                                $testLastBits = str_pad(decbin(ord(substr($testBin, $numFullCharactersUntilBoundary, 1))), 8, '0', STR_PAD_LEFT);
                                                $baseIPLastBits = str_pad(decbin(ord(substr($baseIPBin, $numFullCharactersUntilBoundary, 1))), 8, '0', STR_PAD_LEFT);
                                                if (strncmp($testLastBits, $baseIPLastBits, $maskIntModulo) != 0) {
@@ -503,15 +499,7 @@ final class t3lib_div {
         * @see IPv6Bin2Hex()
         */
        public static function IPv6Hex2Bin($hex) {
-                       // use PHP-function if PHP was compiled with IPv6-support
-               if (defined('AF_INET6')) {
-                       $bin = inet_pton($hex);
-               } else {
-                       $hex = self::normalizeIPv6($hex);
-                       $hex = str_replace(':', '', $hex); // Replace colon to nothing
-                       $bin = pack("H*" , $hex);
-               }
-               return $bin;
+               return inet_pton($hex);
        }
 
        /**
@@ -522,20 +510,7 @@ final class t3lib_div {
         * @see IPv6Hex2Bin()
         */
        public static function IPv6Bin2Hex($bin) {
-                       // use PHP-function if PHP was compiled with IPv6-support
-               if (defined('AF_INET6')) {
-                       $hex = inet_ntop($bin);
-               } else {
-                       $hex = unpack("H*" , $bin);
-                       $hex = chunk_split($hex[1], 4, ':');
-                               // strip last colon (from chunk_split)
-                       $hex = substr($hex, 0, -1);
-                               // IPv6 is now in normalized form
-                               // compress it for easier handling and to match result from inet_ntop()
-                       $hex = self::compressIPv6($hex);
-               }
-               return $hex;
-
+               return inet_ntop($bin);
        }
 
        /**
@@ -549,16 +524,17 @@ final class t3lib_div {
                $normalizedAddress = '';
                $stageOneAddress = '';
 
-                       // according to RFC lowercase-representation is recommended
+                       // According to RFC lowercase-representation is recommended
                $address = strtolower($address);
 
-                       // normalized representation has 39 characters (0000:0000:0000:0000:0000:0000:0000:0000)
+                       // Normalized representation has 39 characters (0000:0000:0000:0000:0000:0000:0000:0000)
                if (strlen($address) == 39) {
-                               // already in full expanded form
+                               // Already in full expanded form
                        return $address;
                }
 
-               $chunks = explode('::', $address); // Count 2 if if address has hidden zero blocks
+                       // Count 2 if if address has hidden zero blocks
+               $chunks = explode('::', $address);
                if (count($chunks) == 2) {
                        $chunksLeft = explode(':', $chunks[0]);
                        $chunksRight = explode(':', $chunks[1]);
@@ -587,7 +563,7 @@ final class t3lib_div {
                        $stageOneAddress = $address;
                }
 
-                       // normalize the blocks:
+                       // Normalize the blocks:
                $blocks = explode(':', $stageOneAddress);
                $divCounter = 0;
                foreach ($blocks as $block) {
@@ -616,37 +592,7 @@ final class t3lib_div {
         * @see normalizeIPv6()
         */
        public static function compressIPv6($address) {
-                       // use PHP-function if PHP was compiled with IPv6-support
-               if (defined('AF_INET6')) {
-                       $bin = inet_pton($address);
-                       $address = inet_ntop($bin);
-               } else {
-                       $address = self::normalizeIPv6($address);
-
-                               // append one colon for easier handling
-                               // will be removed later
-                       $address .= ':';
-
-                               // according to IPv6-notation the longest match
-                               // of a package of '0000:' may be replaced with ':'
-                               // (resulting in something like '1234::abcd')
-                       for ($counter = 8; $counter > 1; $counter--) {
-                               $search = str_repeat('0000:', $counter);
-                               if (($pos = strpos($address, $search)) !== FALSE) {
-                                       $address = substr($address, 0, $pos) . ':' . substr($address, $pos + ($counter*5));
-                                       break;
-                               }
-                       }
-
-                               // up to 3 zeros in the first part may be removed
-                       $address = preg_replace('/^0{1,3}/', '', $address);
-                               // up to 3 zeros at the beginning of other parts may be removed
-                       $address = preg_replace('/:0{1,3}/', ':', $address);
-
-                               // strip last colon (from chunk_split)
-                       $address = substr($address, 0, -1);
-               }
-               return $address;
+               return inet_ntop(inet_pton($address));
        }
 
        /**
@@ -698,12 +644,12 @@ final class t3lib_div {
                        return FALSE;
                }
                if (self::validIPv4($baseHost) || self::validIPv6($baseHost)) {
-                               // resolve hostname
-                               // note: this is reverse-lookup and can be randomly set as soon as somebody is able to set
+                               // Resolve hostname
+                               // Note: this is reverse-lookup and can be randomly set as soon as somebody is able to set
                                // the reverse-DNS for his IP (security when for example used with REMOTE_ADDR)
                        $baseHostName = gethostbyaddr($baseHost);
                        if ($baseHostName === $baseHost) {
-                                       // unable to resolve hostname
+                                       // Unable to resolve hostname
                                return FALSE;
                        }
                } else {
@@ -716,7 +662,7 @@ final class t3lib_div {
                foreach ($values as $test) {
                        $hostNameParts = explode('.', $test);
 
-                               // to match hostNameParts can only be shorter (in case of wildcards) or equal
+                               // To match hostNameParts can only be shorter (in case of wildcards) or equal
                        if (count($hostNameParts) > count($baseHostNameParts)) {
                                continue;
                        }
@@ -725,10 +671,10 @@ final class t3lib_div {
                        foreach ($hostNameParts as $index => $val) {
                                $val = trim($val);
                                if ($val === '*') {
-                                               // wildcard valid for one or more hostname-parts
+                                               // Wildcard valid for one or more hostname-parts
 
                                        $wildcardStart = $index + 1;
-                                               // wildcard as last/only part always matches, otherwise perform recursive checks
+                                               // Wildcard as last/only part always matches, otherwise perform recursive checks
                                        if ($wildcardStart < count($hostNameParts)) {
                                                $wildcardMatched = FALSE;
                                                $tempHostName = implode('.', array_slice($hostNameParts, $index + 1));
@@ -738,14 +684,14 @@ final class t3lib_div {
                                                        $wildcardStart++;
                                                }
                                                if ($wildcardMatched) {
-                                                               // match found by recursive compare
+                                                               // Match found by recursive compare
                                                        return TRUE;
                                                } else {
                                                        $yes = FALSE;
                                                }
                                        }
                                } elseif ($baseHostNameParts[$index] !== $val) {
-                                               // in case of no match
+                                               // In case of no match
                                        $yes = FALSE;
                                }
                        }
@@ -760,7 +706,7 @@ final class t3lib_div {
         * Checks if a given URL matches the host that currently handles this HTTP request.
         * Scheme, hostname and (optional) port of the given URL are compared.
         *
-        * @param string $url: URL to compare with the TYPO3 request host
+        * @param string $url URL to compare with the TYPO3 request host
         * @return boolean Whether the URL matches the TYPO3 request host
         */
        public static function isOnCurrentHost($url) {
@@ -771,8 +717,8 @@ final class t3lib_div {
         * Check for item in list
         * Check if an item exists in a comma-separated list of items.
         *
-        * @param string $list comma-separated list of items (string)
-        * @param string $item item to check for
+        * @param string $list Comma-separated list of items (string)
+        * @param string $item Item to check for
         * @return boolean TRUE if $item is in $list
         */
        public static function inList($list, $item) {
@@ -782,9 +728,9 @@ final class t3lib_div {
        /**
         * Removes an item from a comma-separated list of items.
         *
-        * @param string $element element to remove
-        * @param string $list comma-separated list of items (string)
-        * @return string new comma-separated list of items
+        * @param string $element Element to remove
+        * @param string $list Comma-separated list of items (string)
+        * @return string New comma-separated list of items
         */
        public static function rmFromList($element, $list) {
                $items = explode(',', $list);
@@ -800,8 +746,8 @@ final class t3lib_div {
         * Expand a comma-separated list of integers with ranges (eg 1,3-5,7 becomes 1,3,4,5,7).
         * Ranges are limited to 1000 values per range.
         *
-        * @param string $list comma-separated list of integers with ranges (string)
-        * @return string new comma-separated list of items
+        * @param string $list Comma-separated list of integers with ranges (string)
+        * @return string New comma-separated list of items
         */
        public static function expandList($list) {
                $items = explode(',', $list);
@@ -830,7 +776,7 @@ final class t3lib_div {
         *
         * @param string $verNumberStr Version number on format x.x.x
         * @return integer Integer version of version number (where each part can count to 999)
-        * @deprecated since TYPO3 4.6, will be removed in TYPO3 4.9 - Use t3lib_utility_VersionNumber::convertVersionNumberToInteger() instead
+        * @deprecated since TYPO3 4.6, will be removed in TYPO3 6.1 - Use t3lib_utility_VersionNumber::convertVersionNumberToInteger() instead
         */
        public static function int_from_ver($verNumberStr) {
                        // Deprecation log is activated only for TYPO3 4.7 and above
@@ -844,7 +790,7 @@ final class t3lib_div {
         * Returns TRUE if the current TYPO3 version (or compatibility version) is compatible to the input version
         * Notice that this function compares branches, not versions (4.0.1 would be > 4.0.0 although they use the same compat_version)
         *
-        * @param string $verNumberStr  Minimum branch number required (format x.y / e.g. "4.0" NOT "4.0.0"!)
+        * @param string $verNumberStr Minimum branch number required (format x.y / e.g. "4.0" NOT "4.0.0"!)
         * @return boolean Returns TRUE if this setup is compatible with the provided version number
         * @todo Still needs a function to convert versions to branches
         */
@@ -893,15 +839,15 @@ final class t3lib_div {
                if (extension_loaded('hash') && function_exists('hash_hmac') && function_exists('hash_algos') && in_array($hashAlgorithm, hash_algos())) {
                        $hmac = hash_hmac($hashAlgorithm, $input, $GLOBALS['TYPO3_CONF_VARS']['SYS']['encryptionKey']);
                } else {
-                               // outer padding
+                               // Outer padding
                        $opad = str_repeat(chr(0x5C), $hashBlocksize);
-                               // inner padding
+                               // Inner padding
                        $ipad = str_repeat(chr(0x36), $hashBlocksize);
                        if (strlen($GLOBALS['TYPO3_CONF_VARS']['SYS']['encryptionKey']) > $hashBlocksize) {
-                                       // keys longer than block size are shorten
+                                       // Keys longer than block size are shorten
                                $key = str_pad(pack('H*', call_user_func($hashAlgorithm, $GLOBALS['TYPO3_CONF_VARS']['SYS']['encryptionKey'])), $hashBlocksize, chr(0x00));
                        } else {
-                                       // keys shorter than block size are zero-padded
+                                       // Keys shorter than block size are zero-padded
                                $key = str_pad($GLOBALS['TYPO3_CONF_VARS']['SYS']['encryptionKey'], $hashBlocksize, chr(0x00));
                        }
                        $hmac = call_user_func($hashAlgorithm, ($key ^ $opad) . pack('H*', call_user_func($hashAlgorithm, ($key ^ $ipad) . $input)));
@@ -914,7 +860,7 @@ final class t3lib_div {
         * If a value in the list is trim(empty), the value is ignored.
         *
         * @param string $in_list Accept multiple parameters which can be comma-separated lists of values and arrays.
-        * @param mixed $secondParameter: Dummy field, which if set will show a warning!
+        * @param mixed $secondParameter Dummy field, which if set will show a warning!
         * @return string Returns the list without any duplicates of values, space around values are trimmed
         */
        public static function uniqueList($in_list, $secondParameter = NULL) {
@@ -1046,11 +992,11 @@ final class t3lib_div {
 
                        // Find size:
                if ($sizeInBytes > 900) {
-                       if ($sizeInBytes > 900000000) { // GB
+                               // GB
+                       if ($sizeInBytes > 900000000) {
                                $val = $sizeInBytes / (1024 * 1024 * 1024);
                                return number_format($val, (($val < 20) ? 1 : 0), '.', '') . $labelArr[3];
-                       }
-                       elseif ($sizeInBytes > 900000) { // MB
+                       } elseif ($sizeInBytes > 900000) { // MB
                                $val = $sizeInBytes / (1024 * 1024);
                                return number_format($val, (($val < 20) ? 1 : 0), '.', '') . $labelArr[2];
                        } else { // KB
@@ -1129,9 +1075,9 @@ final class t3lib_div {
         */
        public static function slashJS($string, $extended = FALSE, $char = "'") {
                if ($extended) {
-                       $string = str_replace("\\", "\\\\", $string);
+                       $string = str_replace('\\', '\\\\', $string);
                }
-               return str_replace($char, "\\" . $char, $string);
+               return str_replace($char, '\\' . $char, $string);
        }
 
        /**
@@ -1163,7 +1109,7 @@ final class t3lib_div {
         * @return boolean Returns TRUE if the $email address (input string) is valid
         */
        public static function validEmail($email) {
-                       // enforce maximum length to prevent libpcre recursion crash bug #52929 in PHP
+                       // Enforce maximum length to prevent libpcre recursion crash bug #52929 in PHP
                        // fixed in PHP 5.3.4; length restriction per SMTP RFC 2821
                if (strlen($email) > 320) {
                        return FALSE;
@@ -1371,7 +1317,7 @@ final class t3lib_div {
         * Returns a given string with underscores as UpperCamelCase.
         * Example: Converts blog_example to BlogExample
         *
-        * @param string $string: String to be converted to camel case
+        * @param string $string String to be converted to camel case
         * @return string UpperCamelCasedWord
         */
        public static function underscoredToUpperCamelCase($string) {
@@ -1383,7 +1329,7 @@ final class t3lib_div {
         * Returns a given string with underscores as lowerCamelCase.
         * Example: Converts minimal_value to minimalValue
         *
-        * @param string $string: String to be converted to camel case
+        * @param string $string String to be converted to camel case
         * @return string lowerCamelCasedWord
         */
        public static function underscoredToLowerCamelCase($string) {
@@ -1427,7 +1373,6 @@ final class t3lib_div {
                return (filter_var($IDN->encode($url), FILTER_VALIDATE_URL, FILTER_FLAG_SCHEME_REQUIRED) !== FALSE);
        }
 
-
        /*************************
         *
         * ARRAY FUNCTIONS
@@ -1452,8 +1397,8 @@ final class t3lib_div {
         * | 0     | TRUE         | TRUE          | TRUE          |
         * +---------+-----------+-----------+-----------+
         *
-        * @param array $in_array one-dimensional array of items
-        * @param string $item item to check for
+        * @param array $in_array One-dimensional array of items
+        * @param string $item Item to check for
         * @return boolean TRUE if $item is in the one-dimensional array $in_array
         */
        public static function inArray(array $in_array, $item) {
@@ -1576,9 +1521,9 @@ final class t3lib_div {
         *               array('bb' => array('third', 'fourth'),
         * )
         *
-        * @param array $array: The initial array to be filtered/reduced
-        * @param mixed $keepItems: The items which are allowed/kept in the array - accepts array or csv string
-        * @param string $getValueFunc: (optional) Unique function name set by create_function() used to get the value to keep
+        * @param array $array The initial array to be filtered/reduced
+        * @param mixed $keepItems The items which are allowed/kept in the array - accepts array or csv string
+        * @param string $getValueFunc (optional) Unique function name set by create_function() used to get the value to keep
         * @return array The filtered/reduced array with the kept items
         */
        public static function keepItemsInArray(array $array, $keepItems, $getValueFunc = NULL) {
@@ -1847,7 +1792,7 @@ final class t3lib_div {
         * Removes dots "." from end of a key identifier of TypoScript styled array.
         * array('key.' => array('property.' => 'value')) --> array('key' => array('property' => 'value'))
         *
-        * @param array $ts: TypoScript configuration array
+        * @param array $ts TypoScript configuration array
         * @return array TypoScript configuration array without dots at the end of all keys
         */
        public static function removeDotsFromTS(array $ts) {
@@ -1880,7 +1825,6 @@ final class t3lib_div {
                return TRUE;
        }
 
-
        /*************************
         *
         * HTML/XML PROCESSING
@@ -1897,11 +1841,13 @@ final class t3lib_div {
         */
        public static function get_tag_attributes($tag) {
                $components = self::split_tag_attributes($tag);
-               $name = ''; // attribute name is stored here
+                       // Attribute name is stored here
+               $name = '';
                $valuemode = FALSE;
                $attributes = array();
                foreach ($components as $key => $val) {
-                       if ($val != '=') { // Only if $name is set (if there is an attribute, that waits for a value), that valuemode is enabled. This ensures that the attribute is assigned it's value
+                               // Only if $name is set (if there is an attribute, that waits for a value), that valuemode is enabled. This ensures that the attribute is assigned it's value
+                       if ($val != '=') {
                                if ($valuemode) {
                                        if ($name) {
                                                $attributes[$name] = $val;
@@ -1934,7 +1880,8 @@ final class t3lib_div {
                $tag_tmp = trim(rtrim($tag_tmp, '>'));
 
                $value = array();
-               while (strcmp($tag_tmp, '')) { // Compared with empty string instead , 030102
+                       // Compared with empty string instead , 030102
+               while (strcmp($tag_tmp, '')) {
                        $firstChar = substr($tag_tmp, 0, 1);
                        if (!strcmp($firstChar, '"') || !strcmp($firstChar, "'")) {
                                $reg = explode($firstChar, $tag_tmp, 3);
@@ -1942,7 +1889,8 @@ final class t3lib_div {
                                $tag_tmp = trim($reg[2]);
                        } elseif (!strcmp($firstChar, '=')) {
                                $value[] = '=';
-                               $tag_tmp = trim(substr($tag_tmp, 1)); // Removes = chars.
+                                       // Removes = chars.
+                               $tag_tmp = trim(substr($tag_tmp, 1));
                        } else {
                                        // There are '' around the value. We look for the next ' ' or '>'
                                $reg = preg_split('/[[:space:]=]/', $tag_tmp, 2);
@@ -2152,7 +2100,8 @@ final class t3lib_div {
                        $tagName = $k;
 
                                // Construct the tag name.
-                       if (isset($options['grandParentTagMap'][$stackData['grandParentTagName'] . '/' . $stackData['parentTagName']])) { // Use tag based on grand-parent + parent tag name
+                               // Use tag based on grand-parent + parent tag name
+                       if (isset($options['grandParentTagMap'][$stackData['grandParentTagName'] . '/' . $stackData['parentTagName']])) {
                                $attr .= ' index="' . htmlspecialchars($tagName) . '"';
                                $tagName = (string) $options['grandParentTagMap'][$stackData['grandParentTagName'] . '/' . $stackData['parentTagName']];
                        } elseif (isset($options['parentTagMap'][$stackData['parentTagName'] . ':_IS_NUM']) && t3lib_utility_Math::canBeInterpretedAsInteger($tagName)) { // Use tag based on parent tag name + if current tag is numeric
@@ -2206,14 +2155,17 @@ final class t3lib_div {
                                                        )
                                                ) .
                                                ($spaceInd >= 0 ? str_pad('', ($level + 1) * $indentN, $indentChar) : '');
-                               if ((int) $options['disableTypeAttrib'] != 2) { // Do not set "type = array". Makes prettier XML but means that empty arrays are not restored with xml2array
+                                       // Do not set "type = array". Makes prettier XML but means that empty arrays are not restored with xml2array
+                               if ((int) $options['disableTypeAttrib'] != 2) {
                                        $attr .= ' type="array"';
                                }
                        } else { // Just a value:
 
                                        // Look for binary chars:
-                               $vLen = strlen($v); // check for length, because PHP 5.2.0 may crash when first argument of strcspn is empty
-                               if ($vLen && strcspn($v, $binaryChars) != $vLen) { // Go for base64 encoding if the initial segment NOT matching any binary char has the same length as the whole string!
+                                       // Check for length, because PHP 5.2.0 may crash when first argument of strcspn is empty
+                               $vLen = strlen($v);
+                                       // Go for base64 encoding if the initial segment NOT matching any binary char has the same length as the whole string!
+                               if ($vLen && strcspn($v, $binaryChars) != $vLen) {
                                                // If the value contained binary chars then we base64-encode it an set an attribute to notify this situation:
                                        $content = $nl . chunk_split(base64_encode($v));
                                        $attr .= ' base64="1"';
@@ -2262,11 +2214,11 @@ final class t3lib_div {
 
                $identifier = md5($string . $NSprefix . ($reportDocTag ? '1' : '0'));
 
-                       // look up in first level cache
+                       // Look up in first level cache
                if (!empty($firstLevelCache[$identifier])) {
                        $array = $firstLevelCache[$identifier];
                } else {
-                               // look up in second level cache
+                               // Look up in second level cache
                        $cacheContent = t3lib_pageSelect::getHash($identifier, 0);
                        $array = unserialize($cacheContent);
 
@@ -2274,7 +2226,7 @@ final class t3lib_div {
                                $array = self::xml2arrayProcess($string, $NSprefix, $reportDocTag);
                                t3lib_pageSelect::storeHash($identifier, serialize($array), 'ident_xml2array');
                        }
-                               // store content in first level cache
+                               // Store content in first level cache
                        $firstLevelCache[$identifier] = $array;
                }
                return $array;
@@ -2299,11 +2251,12 @@ final class t3lib_div {
                xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);
                xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 0);
 
-                       // default output charset is UTF-8, only ASCII, ISO-8859-1 and UTF-8 are supported!!!
+                       // Default output charset is UTF-8, only ASCII, ISO-8859-1 and UTF-8 are supported!!!
                $match = array();
                preg_match('/^[[:space:]]*<\?xml[^>]*encoding[[:space:]]*=[[:space:]]*"([^"]*)"/', substr($string, 0, 200), $match);
                $theCharset = $match[1] ? $match[1] : 'utf-8';
-               xml_parser_set_option($parser, XML_OPTION_TARGET_ENCODING, $theCharset); // us-ascii / utf-8 / iso-8859-1
+                       // us-ascii / utf-8 / iso-8859-1
+               xml_parser_set_option($parser, XML_OPTION_TARGET_ENCODING, $theCharset);
 
                        // Parse content:
                xml_parse_into_struct($parser, $string, $vals, $index);
@@ -2345,14 +2298,16 @@ final class t3lib_div {
                                // Setting tag-values, manage stack:
                        switch ($val['type']) {
                                case 'open': // If open tag it means there is an array stored in sub-elements. Therefore increase the stackpointer and reset the accumulation array:
-                                       $current[$tagName] = array(); // Setting blank place holder
+                                               // Setting blank place holder
+                                       $current[$tagName] = array();
                                        $stack[$stacktop++] = $current;
                                        $current = array();
                                        break;
                                case 'close': // If the tag is "close" then it is an array which is closing and we decrease the stack pointer.
                                        $oldCurrent = $current;
                                        $current = $stack[--$stacktop];
-                                       end($current); // Going to the end of array to get placeholder key, key($current), and fill in array next:
+                                               // Going to the end of array to get placeholder key, key($current), and fill in array next:
+                                       end($current);
                                        $current[key($current)] = $oldCurrent;
                                        unset($oldCurrent);
                                        break;
@@ -2360,7 +2315,8 @@ final class t3lib_div {
                                        if ($val['attributes']['base64']) {
                                                $current[$tagName] = base64_decode($val['value']);
                                        } else {
-                                               $current[$tagName] = (string) $val['value']; // Had to cast it as a string - otherwise it would be evaluate FALSE if tested with isset()!!
+                                                       // Had to cast it as a string - otherwise it would be evaluate FALSE if tested with isset()!!
+                                               $current[$tagName] = (string) $val['value'];
 
                                                        // Cast type:
                                                switch ((string) $val['attributes']['type']) {
@@ -2374,7 +2330,8 @@ final class t3lib_div {
                                                                $current[$tagName] = (bool) $current[$tagName];
                                                                break;
                                                        case 'array':
-                                                               $current[$tagName] = array(); // MUST be an empty array since it is processed as a value; Empty arrays would end up here because they would have no tags inside...
+                                                                       // MUST be an empty array since it is processed as a value; Empty arrays would end up here because they would have no tags inside...
+                                                               $current[$tagName] = array();
                                                                break;
                                                }
                                        }
@@ -2402,7 +2359,7 @@ final class t3lib_div {
                foreach ($vals as $val) {
                        $type = $val['type'];
 
-                               // open tag:
+                               // Open tag:
                        if ($type == 'open' || $type == 'complete') {
                                $XMLcontent .= '<' . $val['tag'];
                                if (isset($val['attributes'])) {
@@ -2424,11 +2381,11 @@ final class t3lib_div {
                                        $XMLcontent .= htmlspecialchars($val['value']);
                                }
                        }
-                               // finish tag:
+                               // Finish tag:
                        if ($type == 'close') {
                                $XMLcontent .= '</' . $val['tag'] . '>';
                        }
-                               // cdata
+                               // Cdata
                        if ($type == 'cdata') {
                                $XMLcontent .= htmlspecialchars($val['value']);
                        }
@@ -2458,20 +2415,31 @@ final class t3lib_div {
         * @return string Minified script or source string if error happened
         */
        public static function minifyJavaScript($script, &$error = '') {
-               require_once(PATH_typo3 . 'contrib/jsmin/jsmin.php');
-               try {
-                       $error = '';
-                       $script = trim(JSMin::minify(str_replace(CR, '', $script)));
-               }
-               catch (JSMinException $e) {
-                       $error = 'Error while minifying JavaScript: ' . $e->getMessage();
-                       self::devLog($error, 't3lib_div', 2,
-                               array('JavaScript' => $script, 'Stack trace' => $e->getTrace()));
+               if (is_array($GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['t3lib/class.t3lib_div.php']['minifyJavaScript'])) {
+                       $fakeThis = FALSE;
+                       foreach ($GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['t3lib/class.t3lib_div.php']['minifyJavaScript'] as $hookMethod) {
+                               try {
+                                       $parameters = array('script' => $script);
+                                       $script = static::callUserFunction($hookMethod, $parameters, $fakeThis);
+                               } catch (Exception $e) {
+                                       $errorMessage = 'Error minifying java script: ' . $e->getMessage();
+                                       $error .= $errorMessage;
+                                       static::devLog(
+                                               $errorMessage,
+                                               't3lib_div',
+                                               2,
+                                               array(
+                                                       'JavaScript' => $script,
+                                                       'Stack trace' => $e->getTrace(),
+                                                       'hook' => $hookMethod
+                                               )
+                                       );
+                               }
+                       }
                }
                return $script;
        }
 
-
        /*************************
         *
         * FILES FUNCTIONS
@@ -2496,7 +2464,7 @@ final class t3lib_div {
                        $report['message'] = '';
                }
 
-                       // use cURL for: http, https, ftp, ftps, sftp and scp
+                       // Use cURL for: http, https, ftp, ftps, sftp and scp
                if ($GLOBALS['TYPO3_CONF_VARS']['SYS']['curlUse'] == '1' && preg_match('/^(?:http|ftp)s?|s(?:ftp|cp):/', $url)) {
                        if (isset($report)) {
                                $report['lib'] = 'cURL';
@@ -2579,7 +2547,6 @@ final class t3lib_div {
                                }
                        }
                        $errno = 0;
-                               // $errstr = '';
                        $fp = @fsockopen($scheme . $parsedURL['host'], $port, $errno, $errstr, 2.0);
                        if (!$fp || $errno > 0) {
                                if (isset($report)) {
@@ -2611,7 +2578,8 @@ final class t3lib_div {
                                }
                                $content .= $line;
                                if (!strlen(trim($line))) {
-                                       break; // Stop at the first empty line (= end of header)
+                                               // Stop at the first empty line (= end of header)
+                                       break;
                                }
                        }
                        if ($includeHeader != 2) {
@@ -2638,10 +2606,10 @@ final class t3lib_div {
                        )
                        );
 
-                       $content = file_get_contents($url, FALSE, $ctx);
+                       $content = @file_get_contents($url, FALSE, $ctx);
 
                        if ($content === FALSE && isset($report)) {
-                               $report['error']   = -1;
+                               $report['error'] = -1;
                                $report['message'] = 'Couldn\'t get URL: ' . implode(LF, $http_response_header);
                        }
                } else {
@@ -2649,10 +2617,10 @@ final class t3lib_div {
                                $report['lib'] = 'file';
                        }
 
-                       $content = file_get_contents($url);
+                       $content = @file_get_contents($url);
 
                        if ($content === FALSE && isset($report)) {
-                               $report['error']   = -1;
+                               $report['error'] = -1;
                                $report['message'] = 'Couldn\'t get URL: ' . implode(LF, $http_response_header);
                        }
                }
@@ -2680,7 +2648,8 @@ final class t3lib_div {
                                return FALSE;
                        }
 
-                       if ($changePermissions) { // Change the permissions only if the file has just been created
+                               // Change the permissions only if the file has just been created
+                       if ($changePermissions) {
                                self::fixPermissions($file);
                        }
 
@@ -2764,7 +2733,8 @@ final class t3lib_div {
                        // Check parts:
                if (self::validPathStr($filepath) && $fI['basename'] && strlen($fI['basename']) < 60) {
                        if (defined('PATH_site')) {
-                               $dirName = PATH_site . 'typo3temp/'; // Setting main temporary directory name (standard)
+                                       // Setting main temporary directory name (standard)
+                               $dirName = PATH_site . 'typo3temp/';
                                if (@is_dir($dirName)) {
                                        if (self::isFirstPartOfStr($fI['dirname'], $dirName)) {
 
@@ -2885,7 +2855,7 @@ final class t3lib_div {
 
                        $result = @mkdir($fullDirectoryPath, $permissionMask, TRUE);
                        if (!$result) {
-                               throw new \RuntimeException('Could not create directory!', 1170251400);
+                               throw new \RuntimeException('Could not create directory "' . $fullDirectoryPath . '"!', 1170251400);
                        }
                }
                return $firstCreatedPath;
@@ -2900,7 +2870,8 @@ final class t3lib_div {
         */
        public static function rmdir($path, $removeNonEmpty = FALSE) {
                $OK = FALSE;
-               $path = preg_replace('|/$|', '', $path); // Remove trailing slash
+                       // Remove trailing slash
+               $path = preg_replace('|/$|', '', $path);
 
                if (file_exists($path)) {
                        $OK = TRUE;
@@ -2979,14 +2950,15 @@ final class t3lib_div {
                                while ($entry = $d->read()) {
                                        if (@is_file($path . '/' . $entry)) {
                                                $fI = pathinfo($entry);
-                                               $key = md5($path . '/' . $entry); // Don't change this ever - extensions may depend on the fact that the hash is an md5 of the path! (import/export extension)
+                                                       // Don't change this ever - extensions may depend on the fact that the hash is an md5 of the path! (import/export extension)
+                                               $key = md5($path . '/' . $entry);
                                                if ((!strlen($extensionList) || self::inList($extensionList, strtolower($fI['extension']))) && (!strlen($excludePattern) || !preg_match('/^' . $excludePattern . '$/', $entry))) {
                                                        $filearray[$key] = ($prependPath ? $path . '/' : '') . $entry;
                                                        if ($order == 'mtime') {
                                                                $sortarray[$key] = filemtime($path . '/' . $entry);
                                                        }
                                                        elseif ($order) {
-                                                               $sortarray[$key] = $entry;
+                                                               $sortarray[$key] = strtolower($entry);
                                                        }
                                                }
                                        }
@@ -3043,8 +3015,8 @@ final class t3lib_div {
        /**
         * Removes the absolute part of all files/folders in fileArr
         *
-        * @param array $fileArr: The file array to remove the prefix from
-        * @param string $prefixToRemove: The prefix path to remove (if found as first part of string!)
+        * @param array $fileArr The file array to remove the prefix from
+        * @param string $prefixToRemove The prefix path to remove (if found as first part of string!)
         * @return array The input $fileArr processed.
         */
        public static function removePrefixPathFromList(array $fileArr, $prefixToRemove) {
@@ -3107,7 +3079,8 @@ final class t3lib_div {
         */
        public static function locationHeaderUrl($path) {
                $uI = parse_url($path);
-               if (substr($path, 0, 1) == '/') { // relative to HOST
+                       // relative to HOST
+               if (substr($path, 0, 1) == '/') {
                        $path = self::getIndpEnv('TYPO3_REQUEST_HOST') . $path;
                } elseif (!$uI['scheme']) { // No scheme either
                        $path = self::getIndpEnv('TYPO3_REQUEST_DIR') . $path;
@@ -3121,32 +3094,32 @@ final class t3lib_div {
         * TYPO3 installation. The first parameter can be used to set something that overrides
         * the maxFileSize, usually for the TCA values.
         *
-        * @param integer $localLimit: the number of Kilobytes (!) that should be used as
+        * @param integer $localLimit the number of Kilobytes (!) that should be used as
         *                                              the initial Limit, otherwise $GLOBALS['TYPO3_CONF_VARS']['BE']['maxFileSize'] will be used
-        * @return integer the maximum size of uploads that are allowed (measured in kilobytes)
+        * @return integer The maximum size of uploads that are allowed (measured in kilobytes)
         */
        public static function getMaxUploadFileSize($localLimit = 0) {
-                       // don't allow more than the global max file size at all
+                       // Don't allow more than the global max file size at all
                $t3Limit = (intval($localLimit > 0 ? $localLimit : $GLOBALS['TYPO3_CONF_VARS']['BE']['maxFileSize']));
-                       // as TYPO3 is handling the file size in KB, multiply by 1024 to get bytes
+                       // As TYPO3 is handling the file size in KB, multiply by 1024 to get bytes
                $t3Limit = $t3Limit * 1024;
 
-                       // check for PHP restrictions of the maximum size of one of the $_FILES
+                       // Check for PHP restrictions of the maximum size of one of the $_FILES
                $phpUploadLimit = self::getBytesFromSizeMeasurement(ini_get('upload_max_filesize'));
-                       // check for PHP restrictions of the maximum $_POST size
+                       // Check for PHP restrictions of the maximum $_POST size
                $phpPostLimit = self::getBytesFromSizeMeasurement(ini_get('post_max_size'));
-                       // if the total amount of post data is smaller (!) than the upload_max_filesize directive,
+                       // If the total amount of post data is smaller (!) than the upload_max_filesize directive,
                        // then this is the real limit in PHP
                $phpUploadLimit = ($phpPostLimit < $phpUploadLimit ? $phpPostLimit : $phpUploadLimit);
 
-                       // is the allowed PHP limit (upload_max_filesize) lower than the TYPO3 limit?, also: revert back to KB
+                       // Is the allowed PHP limit (upload_max_filesize) lower than the TYPO3 limit?, also: revert back to KB
                return floor($phpUploadLimit < $t3Limit ? $phpUploadLimit : $t3Limit) / 1024;
        }
 
        /**
         * Gets the bytes value from a measurement string like "100k".
         *
-        * @param string $measurement: The measurement (e.g. "100k")
+        * @param string $measurement The measurement (e.g. "100k")
         * @return integer The bytes value (e.g. 102400)
         */
        public static function getBytesFromSizeMeasurement($measurement) {
@@ -3170,7 +3143,6 @@ final class t3lib_div {
                return PHP_MAXPATHLEN;
        }
 
-
        /**
         * Function for static version numbers on files, based on the filemtime
         *
@@ -3229,7 +3201,7 @@ final class t3lib_div {
 
                                array_push($name, filemtime($path), $extension);
                                $fullName = implode('.', $name);
-                                       // append potential query string
+                                       // Append potential query string
                                $fullName .= $lookupFile[1] ? '?' . $lookupFile[1] : '';
                        }
                }
@@ -3249,7 +3221,8 @@ final class t3lib_div {
         * @return string
         */
        public static function getThisUrl() {
-               $p = parse_url(self::getIndpEnv('TYPO3_REQUEST_SCRIPT')); // Url of this script
+                       // Url of this script
+               $p = parse_url(self::getIndpEnv('TYPO3_REQUEST_SCRIPT'));
                $dir = self::dirname($p['path']) . '/'; // Strip file
                $url = str_replace('//', '/', $p['host'] . ($p['port'] ? ':' . $p['port'] : '') . $dir);
                return $url;
@@ -3379,7 +3352,7 @@ final class t3lib_div {
                                                ($_SERVER['ORIG_PATH_INFO'] ? $_SERVER['ORIG_PATH_INFO'] : $_SERVER['PATH_INFO']) ?
                                                ($_SERVER['ORIG_PATH_INFO'] ? $_SERVER['ORIG_PATH_INFO'] : $_SERVER['PATH_INFO']) :
                                                ($_SERVER['ORIG_SCRIPT_NAME'] ? $_SERVER['ORIG_SCRIPT_NAME'] : $_SERVER['SCRIPT_NAME']);
-                                       // add a prefix if TYPO3 is behind a proxy: ext-domain.com => int-server.com/prefix
+                                       // Add a prefix if TYPO3 is behind a proxy: ext-domain.com => int-server.com/prefix
                                if (self::cmpIP($_SERVER['REMOTE_ADDR'], $GLOBALS['TYPO3_CONF_VARS']['SYS']['reverseProxyIP'])) {
                                        if (self::getIndpEnv('TYPO3_SSL') && $GLOBALS['TYPO3_CONF_VARS']['SYS']['reverseProxyPrefixSSL']) {
                                                $retVal = $GLOBALS['TYPO3_CONF_VARS']['SYS']['reverseProxyPrefixSSL'] . $retVal;
@@ -3402,7 +3375,7 @@ final class t3lib_div {
                                } else {
                                        $retVal = $_SERVER['REQUEST_URI'];
                                }
-                                       // add a prefix if TYPO3 is behind a proxy: ext-domain.com => int-server.com/prefix
+                                       // Add a prefix if TYPO3 is behind a proxy: ext-domain.com => int-server.com/prefix
                                if (self::cmpIP($_SERVER['REMOTE_ADDR'], $GLOBALS['TYPO3_CONF_VARS']['SYS']['reverseProxyIP'])) {
                                        if (self::getIndpEnv('TYPO3_SSL') && $GLOBALS['TYPO3_CONF_VARS']['SYS']['reverseProxyPrefixSSL']) {
                                                $retVal = $GLOBALS['TYPO3_CONF_VARS']['SYS']['reverseProxyPrefixSSL'] . $retVal;
@@ -3415,7 +3388,6 @@ final class t3lib_div {
                                        // $_SERVER['PATH_INFO']!=$_SERVER['SCRIPT_NAME'] is necessary because some servers (Windows/CGI) are seen to set PATH_INFO equal to script_name
                                        // Further, there must be at least one '/' in the path - else the PATH_INFO value does not make sense.
                                        // IF 'PATH_INFO' never works for our purpose in TYPO3 with CGI-servers, then 'PHP_SAPI=='cgi'' might be a better check. Right now strcmp($_SERVER['PATH_INFO'],t3lib_div::getIndpEnv('SCRIPT_NAME')) will always return FALSE for CGI-versions, but that is only as long as SCRIPT_NAME is set equal to PATH_INFO because of PHP_SAPI=='cgi' (see above)
-                                       //                              if (strcmp($_SERVER['PATH_INFO'],self::getIndpEnv('SCRIPT_NAME')) && count(explode('/',$_SERVER['PATH_INFO']))>1)       {
                                if (PHP_SAPI != 'cgi' && PHP_SAPI != 'cgi-fcgi' && PHP_SAPI != 'fpm-fcgi') {
                                        $retVal = $_SERVER['PATH_INFO'];
                                }
@@ -3427,7 +3399,7 @@ final class t3lib_div {
                                $retVal = $_SERVER['REMOTE_ADDR'];
                                if (self::cmpIP($_SERVER['REMOTE_ADDR'], $GLOBALS['TYPO3_CONF_VARS']['SYS']['reverseProxyIP'])) {
                                        $ip = self::trimExplode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
-                                               // choose which IP in list to use
+                                               // Choose which IP in list to use
                                        if (count($ip)) {
                                                switch ($GLOBALS['TYPO3_CONF_VARS']['SYS']['reverseProxyHeaderMultiValue']) {
                                                        case 'last':
@@ -3451,7 +3423,7 @@ final class t3lib_div {
                                $retVal = $_SERVER['HTTP_HOST'];
                                if (self::cmpIP($_SERVER['REMOTE_ADDR'], $GLOBALS['TYPO3_CONF_VARS']['SYS']['reverseProxyIP'])) {
                                        $host = self::trimExplode(',', $_SERVER['HTTP_X_FORWARDED_HOST']);
-                                               // choose which host in list to use
+                                               // Choose which host in list to use
                                        if (count($host)) {
                                                switch ($GLOBALS['TYPO3_CONF_VARS']['SYS']['reverseProxyHeaderMultiValue']) {
                                                        case 'last':
@@ -3478,7 +3450,10 @@ final class t3lib_div {
                        case 'HTTP_ACCEPT_LANGUAGE':
                        case 'REMOTE_HOST':
                        case 'QUERY_STRING':
-                               $retVal = $_SERVER[$getEnvName];
+                               $retVal = '';
+                               if (isset($_SERVER[$getEnvName])) {
+                                       $retVal = $_SERVER[$getEnvName];
+                               }
                                break;
                        case 'TYPO3_DOCUMENT_ROOT':
                                        // Get the web root (it is not the root of the TYPO3 installation)
@@ -3623,7 +3598,9 @@ final class t3lib_div {
                } elseif (strpos($useragent, 'Flash') !== FALSE) {
                        $bInfo['BROWSER'] = 'flash';
                }
-               if ($bInfo['BROWSER']) {
+
+               $bInfo['FORMSTYLE'] = FALSE;
+               if (isset($bInfo['BROWSER'])) {
                                // Browser version
                        switch ($bInfo['BROWSER']) {
                                case 'net':
@@ -3651,7 +3628,7 @@ final class t3lib_div {
                                        $bInfo['VERSION'] = doubleval(substr($tmp, 10));
                                        break;
                        }
-                       // Client system
+                               // Client system
                        if (strpos($useragent, 'Win') !== FALSE) {
                                $bInfo['SYSTEM'] = 'win';
                        } elseif (strpos($useragent, 'Mac') !== FALSE) {
@@ -3659,9 +3636,10 @@ final class t3lib_div {
                        } elseif (strpos($useragent, 'Linux') !== FALSE || strpos($useragent, 'X11') !== FALSE || strpos($useragent, 'SGI') !== FALSE || strpos($useragent, ' SunOS ') !== FALSE || strpos($useragent, ' HP-UX ') !== FALSE) {
                                $bInfo['SYSTEM'] = 'unix';
                        }
+
+                               // Is TRUE if the browser supports css to format forms, especially the width
+                       $bInfo['FORMSTYLE'] = ($bInfo['BROWSER'] == 'msie' || ($bInfo['BROWSER'] == 'net' && $bInfo['VERSION'] >= 5) || $bInfo['BROWSER'] == 'opera' || $bInfo['BROWSER'] == 'konqu');
                }
-               // Is TRUE if the browser supports css to format forms, especially the width
-               $bInfo['FORMSTYLE'] = ($bInfo['BROWSER'] == 'msie' || ($bInfo['BROWSER'] == 'net' && $bInfo['VERSION'] >= 5) || $bInfo['BROWSER'] == 'opera' || $bInfo['BROWSER'] == 'konqu');
 
                return $bInfo;
        }
@@ -3687,10 +3665,10 @@ final class t3lib_div {
                                $host = '';
                        }
                }
-                       // we have not found a FQDN yet
+                       // We have not found a FQDN yet
                if ($host && strpos($host, '.') === FALSE) {
                        $ip = gethostbyname($host);
-                               // we got an IP address
+                               // We got an IP address
                        if ($ip != $host) {
                                $fqdn = gethostbyaddr($ip);
                                if ($ip != $fqdn) {
@@ -3705,7 +3683,6 @@ final class t3lib_div {
                return $host;
        }
 
-
        /*************************
         *
         * TYPO3 SPECIFIC FUNCTIONS
@@ -3733,7 +3710,8 @@ final class t3lib_div {
                } else {
                        $relPathPrefix = PATH_site;
                }
-               if (substr($filename, 0, 4) == 'EXT:') { // extension
+                       // Extension
+               if (substr($filename, 0, 4) == 'EXT:') {
                        list($extKey, $local) = explode('/', substr($filename, 4), 2);
                        $filename = '';
                        if (strcmp($extKey, '') && t3lib_extMgm::isLoaded($extKey) && strcmp($local, '')) {
@@ -3757,7 +3735,7 @@ final class t3lib_div {
         * So it's compatible with the UNIX style path strings valid for TYPO3 internally.
         *
         * @param string $theFile File path to evaluate
-        * @return boolean TRUE, $theFile is allowed path string
+        * @return boolean TRUE, $theFile is allowed path string, FALSE otherwise
         * @see http://php.net/manual/en/security.filesystem.nullbytes.php
         * @todo Possible improvement: Should it rawurldecode the string first to check if any of these characters is encoded?
         */
@@ -3765,6 +3743,8 @@ final class t3lib_div {
                if (strpos($theFile, '//') === FALSE && strpos($theFile, '\\') === FALSE && !preg_match('#(?:^\.\.|/\.\./|[[:cntrl:]])#u', $theFile)) {
                        return TRUE;
                }
+
+               return FALSE;
        }
 
        /**
@@ -3774,12 +3754,12 @@ final class t3lib_div {
         * @return boolean
         */
        public static function isAbsPath($path) {
-                       // on Windows also a path starting with a drive letter is absolute: X:/
+                       // On Windows also a path starting with a drive letter is absolute: X:/
                if (TYPO3_OS === 'WIN' && substr($path, 1, 2) === ':/') {
                        return TRUE;
                }
 
-                       // path starting with a / is always absolute, on every system
+                       // Path starting with a / is always absolute, on every system
                return (substr($path, 0, 1) === '/');
        }
 
@@ -3883,7 +3863,8 @@ final class t3lib_div {
                        @copy($source, $destination);
                }
 
-               self::fixPermissions($destination); // Change the permissions of the file
+                       // Change the permissions of the file
+               self::fixPermissions($destination);
 
                        // If here the file is copied and the temporary $source is still around, so when returning FALSE the user can try unlink to delete the $source
                return $uploaded ? $uploadedResult : FALSE;
@@ -3973,13 +3954,14 @@ final class t3lib_div {
         * @param string $addQueryParams Query-parameters: "&xxx=yyy&zzz=uuu"
         * @return array Array with key/value pairs of query-parameters WITHOUT a certain list of variable names (like id, type, no_cache etc.) and WITH a variable, encryptionKey, specific for this server/installation
         * @see tslib_fe::makeCacheHash(), tslib_cObj::typoLink(), t3lib_div::calculateCHash()
-        * @deprecated since TYPO3 4.7 - will be removed in TYPO3 4.9 - use t3lib_cacheHash instead
+        * @deprecated since TYPO3 4.7 - will be removed in TYPO3 6.1 - use t3lib_cacheHash instead
         */
        public static function cHashParams($addQueryParams) {
-               t3lib_div::logDeprecatedFunction();
-               $params = explode('&', substr($addQueryParams, 1)); // Splitting parameters up
+               self::logDeprecatedFunction();
+                       // Splitting parameters up
+               $params = explode('&', substr($addQueryParams, 1));
                /* @var $cacheHash t3lib_cacheHash */
-               $cacheHash = t3lib_div::makeInstance('t3lib_cacheHash');
+               $cacheHash = self::makeInstance('t3lib_cacheHash');
                $pA = $cacheHash->getRelevantParameters($addQueryParams);
 
                        // Hook: Allows to manipulate the parameters which are taken to build the chash:
@@ -4007,12 +3989,12 @@ final class t3lib_div {
         * @param string $addQueryParams Query-parameters: "&xxx=yyy&zzz=uuu"
         * @return string Hash of all the values
         * @see t3lib_div::cHashParams(), t3lib_div::calculateCHash()
-        * @deprecated since TYPO3 4.7 - will be removed in TYPO3 4.9 - use t3lib_cacheHash instead
+        * @deprecated since TYPO3 4.7 - will be removed in TYPO3 6.1 - use t3lib_cacheHash instead
         */
        public static function generateCHash($addQueryParams) {
-               t3lib_div::logDeprecatedFunction();
+               self::logDeprecatedFunction();
                /* @var $cacheHash t3lib_cacheHash */
-               $cacheHash = t3lib_div::makeInstance('t3lib_cacheHash');
+               $cacheHash = self::makeInstance('t3lib_cacheHash');
                return $cacheHash->generateForParameters($addQueryParams);
        }
 
@@ -4021,12 +4003,12 @@ final class t3lib_div {
         *
         * @param array $params Array of key-value pairs
         * @return string Hash of all the values
-        * @deprecated since TYPO3 4.7 - will be removed in TYPO3 4.9 - use t3lib_cacheHash instead
+        * @deprecated since TYPO3 4.7 - will be removed in TYPO3 6.1 - use t3lib_cacheHash instead
         */
        public static function calculateCHash($params) {
-               t3lib_div::logDeprecatedFunction();
+               self::logDeprecatedFunction();
                /* @var $cacheHash t3lib_cacheHash */
-               $cacheHash = t3lib_div::makeInstance('t3lib_cacheHash');
+               $cacheHash = self::makeInstance('t3lib_cacheHash');
                return $cacheHash->calculateCacheHash($params);
        }
 
@@ -4048,7 +4030,7 @@ final class t3lib_div {
         * Returns true if the "l18n_cfg" field value is not set to hide
         * pages in the default language
         *
-        * @param int $localizationConfiguration
+        * @param integer $localizationConfiguration
         * @return boolean
         */
        public static function hideIfDefaultLanguage($localizationConfiguration) {
@@ -4067,7 +4049,7 @@ final class t3lib_div {
         */
        public static function readLLfile($fileRef, $langKey, $charset = '', $errorMode = 0) {
                /** @var $languageFactory t3lib_l10n_Factory */
-               $languageFactory = t3lib_div::makeInstance('t3lib_l10n_Factory');
+               $languageFactory = self::makeInstance('t3lib_l10n_Factory');
                return $languageFactory->getParsedData($fileRef, $langKey, $charset, $errorMode);
        }
 
@@ -4083,18 +4065,22 @@ final class t3lib_div {
                if ($sameLocation) {
                        $location = 'EXT:';
                } else {
-                       $location = 'typo3conf/l10n/' . $language . '/'; // Default location of translations
+                               // Default location of translations
+                       $location = 'typo3conf/l10n/' . $language . '/';
                }
 
                        // Analyse file reference:
-               if (self::isFirstPartOfStr($fileRef, PATH_typo3 . 'sysext/')) { // Is system:
+                       // Is system:
+               if (self::isFirstPartOfStr($fileRef, PATH_typo3 . 'sysext/')) {
                        $validatedPrefix = PATH_typo3 . 'sysext/';
-                       #$location = 'EXT:csh_'.$language.'/';  // For system extensions translations are found in "csh_*" extensions (language packs)
                } elseif (self::isFirstPartOfStr($fileRef, PATH_typo3 . 'ext/')) { // Is global:
                        $validatedPrefix = PATH_typo3 . 'ext/';
                } elseif (self::isFirstPartOfStr($fileRef, PATH_typo3conf . 'ext/')) { // Is local:
                        $validatedPrefix = PATH_typo3conf . 'ext/';
-               } elseif (self::isFirstPartOfStr($fileRef, PATH_site . 'typo3_src/tests/')) { // Is test:
+               } elseif (self::isFirstPartOfStr($fileRef, PATH_site . 'tests/')) { // Is test:
+                       $validatedPrefix = PATH_site . 'tests/';
+                       $location = $validatedPrefix;
+               } elseif (self::isFirstPartOfStr($fileRef, PATH_site . 'typo3_src/tests/')) { // Is test (typo3_src deprecated as ov TYPO3 6.0):
                        $validatedPrefix = PATH_site . 'typo3_src/tests/';
                        $location = $validatedPrefix;
                } else {
@@ -4126,7 +4112,6 @@ final class t3lib_div {
                }
        }
 
-
        /**
         * Loads the $GLOBALS['TCA'] (Table Configuration Array) for the $table
         *
@@ -4142,7 +4127,7 @@ final class t3lib_div {
         * @return void
         */
        public static function loadTCA($table) {
-                       //needed for inclusion of the dynamic config files.
+                       // Needed for inclusion of the dynamic config files.
                global $TCA;
                if (isset($TCA[$table])) {
                        $tca = &$TCA[$table];
@@ -4194,7 +4179,8 @@ final class t3lib_div {
                        if (isset($dataStruct['meta'])) {
                                unset($dataStruct['meta']);
                        } // Meta data should not appear there.
-                       $sheet = 'sDEF'; // Default sheet
+                               // Default sheet
+                       $sheet = 'sDEF';
                }
                return array($dataStruct, $sheet, $singleSheet);
        }
@@ -4224,19 +4210,24 @@ final class t3lib_div {
 
        /**
         * Calls a user-defined function/method in class
-        * Such a function/method should look like this: "function proc(&$params, &$ref)        {...}"
+        * Such a function/method should look like this: "function proc(&$params, &$ref) {...}"
         *
-        * @param string $funcName Function/Method reference, '[file-reference":"]["&"]class/function["->"method-name]'. You can prefix this reference with "[file-reference]:" and t3lib_div::getFileAbsFileName() will then be used to resolve the filename and subsequently include it by "require_once()" which means you don't have to worry about including the class file either! Example: "EXT:realurl/class.tx_realurl.php:&tx_realurl->encodeSpURL". Finally; you can prefix the class name with "&" if you want to reuse a former instance of the same object call ("singleton").
+        * @param string $funcName Function/Method reference or Closure, '[file-reference":"]["&"]class/function["->"method-name]'. You can prefix this reference with "[file-reference]:" and t3lib_div::getFileAbsFileName() will then be used to resolve the filename and subsequently include it by "require_once()" which means you don't have to worry about including the class file either! Example: "EXT:realurl/class.tx_realurl.php:&tx_realurl->encodeSpURL". Finally; you can prefix the class name with "&" if you want to reuse a former instance of the same object call ("singleton").
         * @param mixed $params Parameters to be pass along (typically an array) (REFERENCE!)
         * @param mixed $ref Reference to be passed along (typically "$this" - being a reference to the calling object) (REFERENCE!)
-        * @param string $checkPrefix Alternative allowed prefix of class or function name
+        * @param string $checkPrefix Not used anymore since 6.0
         * @param integer $errorMode Error mode (when class/function could not be found): 0 - call debug(), 1 - do nothing, 2 - raise an exception (allows to call a user function that may return FALSE)
         * @return mixed Content from method/function call or FALSE if the class/method/function was not found
         * @see getUserObj()
         */
-       public static function callUserFunction($funcName, &$params, &$ref, $checkPrefix = 'user_', $errorMode = 0) {
+       public static function callUserFunction($funcName, &$params, &$ref, $checkPrefix = '', $errorMode = 0) {
                $content = FALSE;
 
+                       // Check if we're using a closure and invoke it directly.
+               if (is_object($funcName) && is_a($funcName, 'Closure')) {
+                       return call_user_func_array($funcName, array(&$params, &$ref));
+               }
+
                        // Check persistent object and if found, call directly and exit.
                if (is_array($GLOBALS['T3_VAR']['callUserFunction'][$funcName])) {
                        return call_user_func_array(
@@ -4265,17 +4256,6 @@ final class t3lib_div {
                        $storePersistentObject = FALSE;
                }
 
-                       // Check prefix is valid:
-               if ($checkPrefix && !self::hasValidClassPrefix($funcRef, array($checkPrefix))) {
-                       $errorMsg = "Function/class '$funcRef' was not prepended with '$checkPrefix'";
-                       if ($errorMode == 2) {
-                               throw new InvalidArgumentException($errorMsg, 1294585864);
-                       } elseif (!$errorMode) {
-                               debug($errorMsg, 't3lib_div::callUserFunction');
-                       }
-                       return FALSE;
-               }
-
                        // Call function or method:
                $parts = explode('->', $funcRef);
                if (count($parts) == 2) { // Class
@@ -4340,15 +4320,19 @@ final class t3lib_div {
 
        /**
         * Creates and returns reference to a user defined object.
-        * This function can return an object reference if you like. Just prefix the function call with "&": "$objRef = &t3lib_div::getUserObj('EXT:myext/class.tx_myext_myclass.php:&tx_myext_myclass');". This will work ONLY if you prefix the class name with "&" as well. See description of function arguments.
+        * This function can return an object reference if you like.
+        * Just prefix the function call with "&": "$objRef = &t3lib_div::getUserObj('EXT:myext/class.tx_myext_myclass.php:&tx_myext_myclass');".
+        * This will work ONLY if you prefix the class name with "&" as well. See description of function arguments.
+        *
+        * @TODO: Deprecate the whole method in several steps: 1. Deprecated singleton pattern, 2. Deprecate file prefix/ require file, 3. Deprecate usage without valid class name. The last step should be to deprecate the method itslef.
         *
         * @param string $classRef Class reference, '[file-reference":"]["&"]class-name'. You can prefix the class name with "[file-reference]:" and t3lib_div::getFileAbsFileName() will then be used to resolve the filename and subsequently include it by "require_once()" which means you don't have to worry about including the class file either! Example: "EXT:realurl/class.tx_realurl.php:&tx_realurl". Finally; for the class name you can prefix it with "&" and you will reuse the previous instance of the object identified by the full reference string (meaning; if you ask for the same $classRef later in another place in the code you will get a reference to the first created one!).
-        * @param string $checkPrefix Required prefix of class name. By default "tx_" and "Tx_" are allowed.
-        * @param boolean $silent If set, no debug() error message is shown if class/function is not present.
+        * @param string $checkPrefix Not used anymore since 6.0
+        * @param boolean $silent Not used anymore since 6.0
         * @return object The instance of the class asked for. Instance is created with t3lib_div::makeInstance
         * @see callUserFunction()
         */
-       public static function getUserObj($classRef, $checkPrefix = 'user_', $silent = FALSE) {
+       public static function getUserObj($classRef, $checkPrefix = '', $silent = FALSE) {
                        // Check persistent object and if found, call directly and exit.
                if (is_object($GLOBALS['T3_VAR']['getUserObj'][$classRef])) {
                        return $GLOBALS['T3_VAR']['getUserObj'][$classRef];
@@ -4373,14 +4357,6 @@ final class t3lib_div {
                                $storePersistentObject = FALSE;
                        }
 
-                               // Check prefix is valid:
-                       if ($checkPrefix && !self::hasValidClassPrefix($class, array($checkPrefix))) {
-                               if (!$silent) {
-                                       debug("Class '" . $class . "' was not prepended with '" . $checkPrefix . "'", 't3lib_div::getUserObj');
-                               }
-                               return FALSE;
-                       }
-
                                // Check if class exists:
                        if (class_exists($class)) {
                                $classObj = self::makeInstance($class);
@@ -4391,10 +4367,6 @@ final class t3lib_div {
                                }
 
                                return $classObj;
-                       } else {
-                               if (!$silent) {
-                                       debug("<strong>ERROR:</strong> No class named: " . $class, 't3lib_div::getUserObj');
-                               }
                        }
                }
        }
@@ -4405,47 +4377,22 @@ final class t3lib_div {
         * @param string $classRef The class or function to check
         * @param array $additionalPrefixes Additional allowed prefixes, mostly this will be user_
         * @return bool TRUE if name is allowed
+        * @deprecated since 6.0, will be removed two versions later
         */
        public static function hasValidClassPrefix($classRef, array $additionalPrefixes = array()) {
-               if (empty($classRef)) {
-                       return FALSE;
-               }
-               if (!is_string($classRef)) {
-                       throw new InvalidArgumentException('$classRef has to be of type string', 1313917992);
-               }
-               $hasValidPrefix = FALSE;
-               $validPrefixes = self::getValidClassPrefixes();
-               $classRef = trim($classRef);
-
-               if (count($additionalPrefixes)) {
-                       $validPrefixes = array_merge($validPrefixes, $additionalPrefixes);
-               }
-               foreach ($validPrefixes as $prefixToCheck) {
-                       if (self::isFirstPartOfStr($classRef, $prefixToCheck) || $prefixToCheck === '') {
-                               $hasValidPrefix = TRUE;
-                               break;
-                       }
-               }
-
-               return $hasValidPrefix;
+               self::logDeprecatedFunction();
+               return TRUE;
        }
 
        /**
         * Returns all valid class prefixes.
         *
         * @return array Array of valid prefixed of class names
+        * @deprecated since 6.0, will be removed two versions later
         */
        public static function getValidClassPrefixes() {
-               $validPrefixes = array('tx_', 'Tx_', 'user_', 'User_', 't3lib_');
-               if (
-                       isset($GLOBALS['TYPO3_CONF_VARS']['SYS']['additionalAllowedClassPrefixes'])
-                       && is_string($GLOBALS['TYPO3_CONF_VARS']['SYS']['additionalAllowedClassPrefixes'])
-               ) {
-                       $validPrefixes = array_merge(
-                               $validPrefixes,
-                               t3lib_div::trimExplode(',', $GLOBALS['TYPO3_CONF_VARS']['SYS']['additionalAllowedClassPrefixes'])
-                       );
-               }
+               self::logDeprecatedFunction();
+               $validPrefixes = array('tx_', 'Tx_', 'user_', 'User_', 't3lib_', '');
                return $validPrefixes;
        }
 
@@ -4466,12 +4413,7 @@ final class t3lib_div {
                        throw new InvalidArgumentException('$className must be a non empty string.', 1288965219);
                }
 
-                       // Determine final class name which must be instantiated, this takes XCLASS handling
-                       // into account. Cache in a local array to save some cycles for consecutive calls.
-               if (!isset(self::$finalClassNameRegister[$className])) {
-                       self::addClassNameToMakeInstanceCache($className, self::getClassName($className));
-               }
-               $finalClassName = self::$finalClassNameRegister[$className];
+               $finalClassName = self::getClassName($className);
 
                        // Return singleton instance if it is already registered
                if (isset(self::$singletonInstances[$finalClassName])) {
@@ -4543,22 +4485,6 @@ final class t3lib_div {
        }
 
        /**
-        * Adds a $className / $finalClassName to the cache register.
-        * This register is used to determine the final class name only once instead of multiple times.
-        *
-        * Warning: This is _not_ a public API method and must not be used in own extensions!
-        *
-        * @see makeInstance
-        * @param string $className the name of the class to set, must not be empty
-        * @param string $finalClassName the name of the final class which will be loaded in case of $className
-        * @return void
-        * @internal
-        */
-       public static function addClassNameToMakeInstanceCache($className, $finalClassName) {
-               self::$finalClassNameRegister[$className] = $finalClassName;
-       }
-
-       /**
         * Sets the instance of a non-singleton class to be returned by makeInstance.
         *
         * If this function is called multiple times for the same $className,
@@ -4678,7 +4604,8 @@ final class t3lib_div {
                                                        die ('Broken service:' . t3lib_utility_Debug::viewArray($info));
                                                }
                                                $obj->info = $info;
-                                               if ($obj->init()) { // service available?
+                                                       // service available?
+                                               if ($obj->init()) {
 
                                                                // create persistent object
                                                        $GLOBALS['T3_VAR']['makeInstanceService'][$info['className']] = $obj;
@@ -4750,8 +4677,10 @@ final class t3lib_div {
                if (!$dontEncodeHeader) {
                                // Mail headers must be ASCII, therefore we convert the whole header to either base64 or quoted_printable
                        $newHeaders = array();
-                       foreach (explode(LF, $headers) as $line) { // Split the header in lines and convert each line separately
-                               $parts = explode(': ', $line, 2); // Field tags must not be encoded
+                               // Split the header in lines and convert each line separately
+                       foreach (explode(LF, $headers) as $line) {
+                                       // Field tags must not be encoded
+                               $parts = explode(': ', $line, 2);
                                if (count($parts) == 2) {
                                        if (0 == strcasecmp($parts[0], 'from')) {
                                                $parts[1] = self::normalizeMailAddress($parts[1]);
@@ -4759,13 +4688,15 @@ final class t3lib_div {
                                        $parts[1] = self::encodeHeader($parts[1], $encoding, $charset);
                                        $newHeaders[] = implode(': ', $parts);
                                } else {
-                                       $newHeaders[] = $line; // Should never happen - is such a mail header valid? Anyway, just add the unchanged line...
+                                               // Should never happen - is such a mail header valid? Anyway, just add the unchanged line...
+                                       $newHeaders[] = $line;
                                }
                        }
                        $headers = implode(LF, $newHeaders);
                        unset($newHeaders);
 
-                       $email = self::encodeHeader($email, $encoding, $charset); // Email address must not be encoded, but it could be appended by a name which should be so (e.g. "Kasper Skårhøj <kasperYYYY@typo3.com>")
+                               // Email address must not be encoded, but it could be appended by a name which should be so (e.g. "Kasper Skårhøj <kasperYYYY@typo3.com>")
+                       $email = self::encodeHeader($email, $encoding, $charset);
                        $subject = self::encodeHeader($subject, $encoding, $charset);
                }
 
@@ -4776,7 +4707,8 @@ final class t3lib_div {
                                                'Content-Type: text/plain; charset="' . $charset . '"' . LF .
                                                'Content-Transfer-Encoding: base64';
 
-                               $message = trim(chunk_split(base64_encode($message . LF))) . LF; // Adding LF because I think MS outlook 2002 wants it... may be removed later again.
+                                       // Adding LF because I think MS outlook 2002 wants it... may be removed later again.
+                               $message = trim(chunk_split(base64_encode($message . LF))) . LF;
                                break;
                        case '8bit':
                                $headers = trim($headers) . LF .
@@ -4798,7 +4730,8 @@ final class t3lib_div {
                        // Headers must be separated by CRLF according to RFC 2822, not just LF.
                        // But many servers (Gmail, for example) behave incorrectly and want only LF.
                        // So we stick to LF in all cases.
-               $headers = trim(implode(LF, self::trimExplode(LF, $headers, TRUE))); // Make sure no empty lines are there.
+                       // Make sure no empty lines are there.
+               $headers = trim(implode(LF, self::trimExplode(LF, $headers, TRUE)));
 
                return t3lib_utility_Mail::mail($email, $subject, $message, $headers);
        }
@@ -4813,40 +4746,53 @@ final class t3lib_div {
         */
        public static function quoted_printable($string, $maxlen = 76) {
                        // Make sure the string contains only Unix line breaks
-               $string = str_replace(CRLF, LF, $string); // Replace Windows breaks (\r\n)
-               $string = str_replace(CR, LF, $string); // Replace Mac breaks (\r)
+                       // Replace Windows breaks (\r\n)
+               $string = str_replace(CRLF, LF, $string);
+                       // Replace Mac breaks (\r)
+               $string = str_replace(CR, LF, $string);
 
-               $linebreak = LF; // Default line break for Unix systems.
+                       // Default line break for Unix systems.
+               $linebreak = LF;
                if (TYPO3_OS == 'WIN') {
-                       $linebreak = CRLF; // Line break for Windows. This is needed because PHP on Windows systems send mails via SMTP instead of using sendmail, and thus the line break needs to be \r\n.
+                               // Line break for Windows. This is needed because PHP on Windows systems send mails via SMTP instead of using sendmail, and thus the line break needs to be \r\n.
+                       $linebreak = CRLF;
                }
 
                $newString = '';
-               $theLines = explode(LF, $string); // Split lines
+                       // Split lines
+               $theLines = explode(LF, $string);
                foreach ($theLines as $val) {
                        $newVal = '';
                        $theValLen = strlen($val);
                        $len = 0;
-                       for ($index = 0; $index < $theValLen; $index++) { // Walk through each character of this line
+                               // Walk through each character of this line
+                       for ($index = 0; $index < $theValLen; $index++) {
                                $char = substr($val, $index, 1);
                                $ordVal = ord($char);
                                if ($len > ($maxlen - 4) || ($len > ($maxlen - 14) && $ordVal == 32)) {
-                                       $newVal .= '=' . $linebreak; // Add a line break
-                                       $len = 0; // Reset the length counter
+                                               // Add a line break
+                                       $newVal .= '=' . $linebreak;
+                                               // Reset the length counter
+                                       $len = 0;
                                }
                                if (($ordVal >= 33 && $ordVal <= 60) || ($ordVal >= 62 && $ordVal <= 126) || $ordVal == 9 || $ordVal == 32) {
-                                       $newVal .= $char; // This character is ok, add it to the message
+                                               // This character is ok, add it to the message
+                                       $newVal .= $char;
                                        $len++;
                                } else {
-                                       $newVal .= sprintf('=%02X', $ordVal); // Special character, needs to be encoded
+                                               // Special character, needs to be encoded
+                                       $newVal .= sprintf('=%02X', $ordVal);
                                        $len += 3;
                                }
                        }
-                       $newVal = preg_replace('/' . chr(32) . '$/', '=20', $newVal); // Replaces a possible SPACE-character at the end of a line
-                       $newVal = preg_replace('/' . TAB . '$/', '=09', $newVal); // Replaces a possible TAB-character at the end of a line
+                               // Replaces a possible SPACE-character at the end of a line
+                       $newVal = preg_replace('/' . chr(32) . '$/', '=20', $newVal);
+                               // Replaces a possible TAB-character at the end of a line
+                       $newVal = preg_replace('/' . TAB . '$/', '=09', $newVal);
                        $newString .= $newVal . $linebreak;
                }
-               return preg_replace('/' . $linebreak . '$/', '', $newString); // Remove last newline
+                       // Remove last newline
+               return preg_replace('/' . $linebreak . '$/', '', $newString);
        }
 
        /**
@@ -4898,7 +4844,8 @@ final class t3lib_div {
                        }
                        $line = str_replace($oldPart, $part, $line);
                }
-               $line = preg_replace('/###(.+?)###/', '$1', $line); // Remove the wrappers
+                       // Remove the wrappers
+               $line = preg_replace('/###(.+?)###/', '$1', $line);
 
                return $line;
        }
@@ -4929,7 +4876,7 @@ final class t3lib_div {
                }
 
                if ($lengthLimit === FALSE) {
-                               // no processing
+                               // No processing
                        $messageSubstituted = $message;
                } else {
                        $messageSubstituted = preg_replace(
@@ -4996,7 +4943,7 @@ final class t3lib_div {
         * @see sysLog()
         */
        public static function initSysLog() {
-                       // for CLI logging name is <fqdn-hostname>:<TYPO3-path>
+                       // For CLI logging name is <fqdn-hostname>:<TYPO3-path>
                        // Note that TYPO3_REQUESTTYPE is not used here as it may not yet be defined
                if (defined('TYPO3_cliMode') && TYPO3_cliMode) {
                        $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['t3lib/class.t3lib_div.php']['systemLogHost'] = self::getHostname($requestHost = FALSE) . ':' . PATH_site;
@@ -5006,7 +4953,7 @@ final class t3lib_div {
                        $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['t3lib/class.t3lib_div.php']['systemLogHost'] = self::getIndpEnv('TYPO3_SITE_URL');
                }
 
-                       // init custom logging
+                       // Init custom logging
                if (is_array($GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['t3lib/class.t3lib_div.php']['systemLog'])) {
                        $params = array('initLog' => TRUE);
                        $fakeThis = FALSE;
@@ -5015,7 +4962,7 @@ final class t3lib_div {
                        }
                }
 
-                       // init TYPO3 logging
+                       // Init TYPO3 logging
                foreach (explode(';', $GLOBALS['TYPO3_CONF_VARS']['SYS']['systemLog'], 2) as $log) {
                        list($type, $destination) = explode(',', $log, 3);
 
@@ -5041,23 +4988,23 @@ final class t3lib_div {
         *
         * @param string $msg Message (in English).
         * @param string $extKey Extension key (from which extension you are calling the log) or "Core"
-        * @param integer $severity Severity: 0 is info, 1 is notice, 2 is warning, 3 is error, 4 is fatal error
+        * @param integer $severity t3lib_div::SYSLOG_SEVERITY_* constant
         * @return void
         */
        public static function sysLog($msg, $extKey, $severity = 0) {
                $severity = t3lib_utility_Math::forceIntegerInRange($severity, 0, 4);
 
-                       // is message worth logging?
+                       // Is message worth logging?
                if (intval($GLOBALS['TYPO3_CONF_VARS']['SYS']['systemLogLevel']) > $severity) {
                        return;
                }
 
-                       // initialize logging
+                       // Initialize logging
                if (!$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['t3lib/class.t3lib_div.php']['systemLogInit']) {
                        self::initSysLog();
                }
 
-                       // do custom logging
+                       // Do custom logging
                if (isset($GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['t3lib/class.t3lib_div.php']['systemLog']) &&
                                is_array($GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['t3lib/class.t3lib_div.php']['systemLog'])) {
                        $params = array('msg' => $msg, 'extKey' => $extKey, 'backTrace' => debug_backtrace(), 'severity' => $severity);
@@ -5075,20 +5022,20 @@ final class t3lib_div {
                $dateFormat = $GLOBALS['TYPO3_CONF_VARS']['SYS']['ddmmyy'];
                $timeFormat = $GLOBALS['TYPO3_CONF_VARS']['SYS']['hhmm'];
 
-                       // use all configured logging options
+                       // Use all configured logging options
                foreach (explode(';', $GLOBALS['TYPO3_CONF_VARS']['SYS']['systemLog'], 2) as $log) {
                        list($type, $destination, $level) = explode(',', $log, 4);
 
-                               // is message worth logging for this log type?
+                               // Is message worth logging for this log type?
                        if (intval($level) > $severity) {
                                continue;
                        }
 
                        $msgLine = ' - ' . $extKey . ': ' . $msg;
 
-                               // write message to a file
+                               // Write message to a file
                        if ($type == 'file') {
-                               $lockObject = t3lib_div::makeInstance('t3lib_lock', $destination, $GLOBALS['TYPO3_CONF_VARS']['SYS']['lockingMode']);
+                               $lockObject = self::makeInstance('t3lib_lock', $destination, $GLOBALS['TYPO3_CONF_VARS']['SYS']['lockingMode']);
                                /** @var t3lib_lock $lockObject */
                                $lockObject->setEnableLogging(FALSE);
                                $lockObject->acquire();
@@ -5100,14 +5047,14 @@ final class t3lib_div {
                                }
                                $lockObject->release();
                        }
-                               // send message per mail
+                               // Send message per mail
                        elseif ($type == 'mail') {
                                list($to, $from) = explode('/', $destination);
-                               if (!t3lib_div::validEmail($from)) {
+                               if (!self::validEmail($from)) {
                                        $from = t3lib_utility_Mail::getSystemFrom();
                                }
                                /** @var $mail t3lib_mail_Message */
-                               $mail = t3lib_div::makeInstance('t3lib_mail_Message');
+                               $mail = self::makeInstance('t3lib_mail_Message');
                                $mail->setTo($to)
                                                ->setFrom($from)
                                                ->setSubject('Warning - error in TYPO3 installation')
@@ -5118,11 +5065,11 @@ final class t3lib_div {
                                );
                                $mail->send();
                        }
-                               // use the PHP error log
+                               // Use the PHP error log
                        elseif ($type == 'error_log') {
                                error_log($GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['t3lib/class.t3lib_div.php']['systemLogHost'] . $msgLine, 0);
                        }
-                               // use the system log
+                               // Use the system log
                        elseif ($type == 'syslog') {
                                $priority = array(LOG_INFO, LOG_NOTICE, LOG_WARNING, LOG_ERR, LOG_CRIT);
                                syslog($priority[(int) $severity], $msgLine);
@@ -5168,7 +5115,7 @@ final class t3lib_div {
                $log = $GLOBALS['TYPO3_CONF_VARS']['SYS']['enableDeprecationLog'];
                $date = date($GLOBALS['TYPO3_CONF_VARS']['SYS']['ddmmyy'] . ' ' . $GLOBALS['TYPO3_CONF_VARS']['SYS']['hhmm'] . ': ');
 
-                       // legacy values (no strict comparison, $log can be boolean, string or int)
+                       // Legacy values (no strict comparison, $log can be boolean, string or int)
                if ($log === TRUE || $log == '1') {
                        $log = 'file';
                }
@@ -5178,9 +5125,9 @@ final class t3lib_div {
                        if (class_exists('t3lib_lock') === FALSE) {
                                require_once PATH_t3lib . 'class.t3lib_lock.php';
                        }
-                               // write a longer message to the deprecation log
+                               // Write a longer message to the deprecation log
                        $destination = self::getDeprecationLogFileName();
-                       $lockObject = t3lib_div::makeInstance('t3lib_lock', $destination, $GLOBALS['TYPO3_CONF_VARS']['SYS']['lockingMode']);
+                       $lockObject = self::makeInstance('t3lib_lock', $destination, $GLOBALS['TYPO3_CONF_VARS']['SYS']['lockingMode']);
                        /** @var t3lib_lock $lockObject */
                        $lockObject->setEnableLogging(FALSE);
                        $lockObject->acquire();
@@ -5194,11 +5141,11 @@ final class t3lib_div {
                }
 
                if (stripos($log, 'devlog') !== FALSE) {
-                               // copy message also to the developer log
+                               // Copy message also to the developer log
                        self::devLog($msg, 'Core', self::SYSLOG_SEVERITY_WARNING);
                }
 
-                       // do not use console in login screen
+                       // Do not use console in login screen
                if (stripos($log, 'console') !== FALSE && isset($GLOBALS['BE_USER']->user['uid'])) {
                        t3lib_utility_Debug::debug($msg, $date, 'Deprecation Log');
                }
@@ -5207,7 +5154,7 @@ final class t3lib_div {
        /**
         * Gets the absolute path to the deprecation log file.
         *
-        * @return string absolute path to the deprecation log file
+        * @return string Absolute path to the deprecation log file
         */
        public static function getDeprecationLogFileName() {
                return PATH_typo3conf .
@@ -5241,14 +5188,14 @@ final class t3lib_div {
                        $msg = $match[1];
                }
 
-                       // trigger PHP error with a short message: <function> is deprecated (called from <source>, defined in <source>)
+                       // Trigger PHP error with a short message: <function> is deprecated (called from <source>, defined in <source>)
                $errorMsg = 'Function ' . $trail[1]['function'];
                if ($trail[1]['class']) {
                        $errorMsg .= ' of class ' . $trail[1]['class'];
                }
                $errorMsg .= ' is deprecated (called from ' . $trail[1]['file'] . '#' . $trail[1]['line'] . ', defined in ' . $function->getFileName() . '#' . $function->getStartLine() . ')';
 
-                       // write a longer message to the deprecation log: <function> <annotion> - <trace> (<source>)
+                       // Write a longer message to the deprecation log: <function> <annotion> - <trace> (<source>)
                $logMsg = $trail[1]['class'] . $trail[1]['type'] . $trail[1]['function'];
                $logMsg .= '() - ' . $msg.' - ' . t3lib_utility_Debug::debugTrail();
                $logMsg .= ' (' . substr($function->getFileName(), strlen(PATH_site)) . '#' . $function->getStartLine() . ')';
@@ -5300,7 +5247,8 @@ final class t3lib_div {
        public static function unQuoteFilenames($parameters, $unQuote = FALSE) {
                $paramsArr = explode(' ', trim($parameters));
 
-               $quoteActive = -1; // Whenever a quote character (") is found, $quoteActive is set to the element number inside of $params. A value of -1 means that there are not open quotes at the current position.
+                       // Whenever a quote character (") is found, $quoteActive is set to the element number inside of $params. A value of -1 means that there are not open quotes at the current position.
+               $quoteActive = -1;
                foreach ($paramsArr as $k => $v) {
                        if ($quoteActive > -1) {
                                $paramsArr[$quoteActive] .= ' ' . $v;
@@ -5309,8 +5257,8 @@ final class t3lib_div {
                                        $quoteActive = -1;
                                }
                        } elseif (!trim($v)) {
-                               unset($paramsArr[$k]); // Remove empty elements
-
+                                       // Remove empty elements
+                               unset($paramsArr[$k]);
                        } elseif (preg_match('/^(["\'])/', $v) && substr($v, -1) !== $v[0]) {
                                $quoteActive = $k;
                        }
@@ -5324,35 +5272,23 @@ final class t3lib_div {
                        }
                        unset($val);
                }
-                       // return reindexed array
+                       // Return reindexed array
                return array_values($paramsArr);
        }
 
-
        /**
-        * Quotes a string for usage as JS parameter. Depends whether the value is
-        * used in script tags (it doesn't need/must not get htmlspecialchar'ed in
-        * this case).
+        * Quotes a string for usage as JS parameter.
         *
         * @param string $value the string to encode, may be empty
-        * @param boolean $withinCData
-        *              whether the escaped data is expected to be used as CDATA and thus
-        *              does not need to be htmlspecialchared
         *
         * @return string the encoded value already quoted (with single quotes),
         *                              will not be empty
         */
-       static public function quoteJSvalue($value, $withinCData = FALSE) {
-               $escapedValue = addcslashes(
-                       $value, '\'' . '"' . '\\' . TAB . LF . CR
-               );
-               if (!$withinCData) {
-                       $escapedValue = htmlspecialchars($escapedValue);
-               }
+       public static function quoteJSvalue($value) {
+               $escapedValue = t3lib_div::makeInstance('t3lib_codec_JavaScriptEncoder')->encode($value);
                return '\'' . $escapedValue . '\'';
        }
 
-
        /**
         * Ends and cleans all output buffers
         *
@@ -5360,12 +5296,10 @@ final class t3lib_div {
         */
        public static function cleanOutputBuffers() {
                while (ob_end_clean()) {
-                       ;
                }
                header('Content-Encoding: None', TRUE);
        }
 
-
        /**
         * Ends and flushes all output buffers
         *
@@ -5375,16 +5309,15 @@ final class t3lib_div {
                $obContent = '';
 
                while ($obContent .= ob_get_clean()) {
-                       ;
                }
 
-                       // if previously a "Content-Encoding: whatever" has been set, we have to unset it
+                       // If previously a "Content-Encoding: whatever" has been set, we have to unset it
                if (!headers_sent()) {
                        $headersList = headers_list();
                        foreach ($headersList as $header) {
-                                       // split it up at the :
+                                       // Split it up at the :
                                list($key, $value) = self::trimExplode(':', $header, TRUE);
-                                       // check if we have a Content-Encoding other than 'None'
+                                       // Check if we have a Content-Encoding other than 'None'
                                if (strtolower($key) === 'content-encoding' && strtolower($value) !== 'none') {
                                        header('Content-Encoding: None');
                                        break;
@@ -5395,4 +5328,4 @@ final class t3lib_div {
        }
 }
 
-?>
+?>
\ No newline at end of file