Renamed ifSqlHasZeroNums() to ifSqlHasZeroNumRows() and improved some queries.
[mailer.git] / inc / functions.php
index 1054326b7870dc11b961c847297fc0996220dba6..a240205c2816c7bfa2355f19448b205e4ff41496 100644 (file)
  * -------------------------------------------------------------------- *
  * Kurzbeschreibung  : Viele Nicht-Datenbank-Funktionen                 *
  * -------------------------------------------------------------------- *
- * $Revision::                                                        $ *
- * $Date::                                                            $ *
- * $Tag:: 0.2.1-FINAL                                                 $ *
- * $Author::                                                          $ *
- * -------------------------------------------------------------------- *
  * Copyright (c) 2003 - 2009 by Roland Haeder                           *
- * Copyright (c) 2009 - 2013 by Mailer Developer Team                   *
+ * Copyright (c) 2009 - 2015 by Mailer Developer Team                   *
  * For more information visit: http://mxchange.org                      *
  *                                                                      *
  * This program is free software; you can redistribute it and/or modify *
@@ -104,8 +99,9 @@ function generatePassword ($length = '0', $exclude = array()) {
        } // END - while
 
        /*
-        * When the size is below 40 we can also add additional security by
-        * scrambling it. Otherwise the hash may corrupted..
+        * When the length of the password is below 40 characters additional
+        * security can be added by scrambling it. Otherwise the hash may
+        * corrupted.
         */
        if (strlen($password) <= 40) {
                // Also scramble the password
@@ -146,7 +142,7 @@ function generateDateTime ($time, $mode = '0') {
                                case '6': $ret = date('Ymd', $timeSecured); break;
                                case '7': $ret = date('Y-m-d H:i:s', $timeSecured); break; // Compatible with MySQL TIMESTAMP
                                default:
-                                       logDebugMessage(__FUNCTION__, __LINE__, sprintf("Invalid date mode %s detected.", $mode));
+                                       logDebugMessage(__FUNCTION__, __LINE__, sprintf('Invalid date mode %s detected.', $mode));
                                        break;
                        } // END - switch
                        break;
@@ -162,7 +158,7 @@ function generateDateTime ($time, $mode = '0') {
                                case '6': $ret = date('Ymd', $timeSecured); break;
                                case '7': $ret = date('Y-m-d H:i:s', $timeSecured); break; // Compatible with MySQL TIMESTAMP
                                default:
-                                       logDebugMessage(__FUNCTION__, __LINE__, sprintf("Invalid date mode %s detected.", $mode));
+                                       logDebugMessage(__FUNCTION__, __LINE__, sprintf('Invalid date mode %s detected.', $mode));
                                        break;
                        } // END - switch
        } // END - switch
@@ -181,11 +177,16 @@ function translateYesNo ($yn) {
                // Default
                $GLOBALS[__FUNCTION__][$yn] = '??? (' . $yn . ')';
                switch ($yn) {
-                       case 'Y': $GLOBALS[__FUNCTION__][$yn] = '{--YES--}'; break;
-                       case 'N': $GLOBALS[__FUNCTION__][$yn] = '{--NO--}'; break;
-                       default:
-                               // Log unknown value
-                               logDebugMessage(__FUNCTION__, __LINE__, sprintf("Unknown value %s. Expected: Y/N", $yn));
+                       case 'Y': // Yes
+                               $GLOBALS[__FUNCTION__][$yn] = '{--YES--}';
+                               break;
+
+                       case 'N': // No
+                               $GLOBALS[__FUNCTION__][$yn] = '{--NO--}';
+                               break;
+
+                       default: // Log unknown value
+                               logDebugMessage(__FUNCTION__, __LINE__, sprintf('Unknown value %s. Expected: Y/N', $yn));
                                break;
                } // END - switch
        } // END - if
@@ -201,11 +202,16 @@ function translateActivationStatus ($status) {
                // Default
                $GLOBALS[__FUNCTION__][$status] = '??? (' . $status . ')';
                switch ($status) {
-                       case 'Y': $GLOBALS[__FUNCTION__][$status] = '{--ACTIVATED--}'; break;
-                       case 'N': $GLOBALS[__FUNCTION__][$status] = '{--DEACTIVATED--}'; break;
-                       default:
-                               // Log unknown value
-                               logDebugMessage(__FUNCTION__, __LINE__, sprintf("Unknown value %s. Expected: Y/N", $status));
+                       case 'Y': // Activated
+                               $GLOBALS[__FUNCTION__][$status] = '{--ACTIVATED--}';
+                               break;
+
+                       case 'N': // Deactivated
+                               $GLOBALS[__FUNCTION__][$status] = '{--DEACTIVATED--}';
+                               break;
+
+                       default: // Log unknown value
+                               logDebugMessage(__FUNCTION__, __LINE__, sprintf('Unknown value %s. Expected: Y/N', $status));
                                break;
                } // END - switch
        } // END - if
@@ -278,7 +284,7 @@ function translateGender ($gender) {
 
                default:
                        // Please report bugs on unknown genders
-                       reportBug(__FUNCTION__, __LINE__, sprintf("Unknown gender %s detected.", $gender));
+                       reportBug(__FUNCTION__, __LINE__, sprintf('Unknown gender %s detected.', $gender));
                        break;
        } // END - switch
 
@@ -296,7 +302,7 @@ function translateUserStatus ($status) {
                case 'UNCONFIRMED':
                case 'CONFIRMED':
                case 'LOCKED':
-                       // Use generic function for all "normal" cases"
+                       // Use generic function for all "normal" cases
                        $ret = translateGeneric('ACCOUNT_STATUS', $status);
                        break;
 
@@ -306,7 +312,7 @@ function translateUserStatus ($status) {
                        break;
 
                default: // Please report all unknown status
-                       reportBug(__FUNCTION__, __LINE__, sprintf("Unknown status %s(%s) detected.", $status, gettype($status)));
+                       reportBug(__FUNCTION__, __LINE__, sprintf('Unknown status %s(%s) detected.', $status, gettype($status)));
                        break;
        } // END - switch
 
@@ -377,7 +383,7 @@ function generateDereferrerUrl ($url) {
 // Generates an URL for the frametester
 function generateFrametesterUrl ($url) {
        // Prepare frametester URL
-       $frametesterUrl = sprintf("{%%url=modules.php?module=frametester&amp;url=%s%%}",
+       $frametesterUrl = sprintf('{%%url=modules.php?module=frametester&amp;url=%s%%}',
                encodeString(compileUriCode($url))
        );
 
@@ -428,7 +434,7 @@ function makeTime ($hours, $minutes, $seconds, $stamp) {
 }
 
 // Redirects to an URL and if neccessarry extends it with own base URL
-function redirectToUrl ($url, $allowSpider = TRUE) {
+function redirectToUrl ($url, $allowSpider = TRUE, $compileCode = TRUE) {
        // Is the output mode -2?
        if (isAjaxOutputMode()) {
                // This is always (!) an AJAX request and shall not be redirected
@@ -440,8 +446,11 @@ function redirectToUrl ($url, $allowSpider = TRUE) {
                $url = substr($url, 6, -2);
        } // END - if
 
-       // Compile out codes
-       eval('$url = "' . compileRawCode(encodeUrl($url)) . '";');
+       // Compile codes out?
+       if ($compileCode === TRUE) {
+               // Compile out codes
+               eval('$url = "' . compileRawCode(encodeUrl($url)) . '";');
+       } // END - if
 
        // Default 'rel' value is external, nofollow is evil from Google and hurts the Internet
        $rel = ' rel="external"';
@@ -455,17 +464,23 @@ function redirectToUrl ($url, $allowSpider = TRUE) {
        // Three different ways to debug...
        //* DEBUG: */ reportBug(__FUNCTION__, __LINE__, 'URL=' . $url);
        //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'URL=' . $url);
-       //* DEBUG: */ die($url);
+       //* DEBUG-DIE: */ die(__METHOD__ . ':url=' . $url . '<br />compileCode=' . intval($compileCode));
 
        // We should not sent a redirect if headers are already sent
        if (!headers_sent()) {
+               // Compile again?
+               if ($compileCode === TRUE) {
+                       // Do final compilation
+                       $url = doFinalCompilation(str_replace('&amp;', '&', $url), FALSE);
+               } // END - if
+
                // Load URL when headers are not sent
-               sendRawRedirect(doFinalCompilation(str_replace('&amp;', '&', $url), FALSE));
+               sendRawRedirect($url);
        } else {
                // Output error message
-               loadInclude('inc/header.php');
+               loadPageHeader();
                loadTemplate('redirect_url', FALSE, str_replace('&amp;', '&', $url));
-               loadInclude('inc/footer.php');
+               loadPageFooter();
        }
 
        // Shut the mailer down here
@@ -530,7 +545,7 @@ function array_pk_sort (&$array, $a_sort, $primary_key = '0', $order = -1, $nums
 //
 function generateRandomCode ($length, $code, $userid, $extraData = '') {
        // Build server string
-       $server = $_SERVER['PHP_SELF'] . getEncryptSeparator() . detectUserAgent() . getEncryptSeparator() . getenv('SERVER_SOFTWARE') . getEncryptSeparator() . detectRealIpAddress() . getEncryptSeparator() . detectRemoteAddr();
+       $server = $_SERVER['REQUEST_URI'] . getEncryptSeparator() . detectUserAgent() . getEncryptSeparator() . getenv('SERVER_SOFTWARE') . getEncryptSeparator() . detectRealIpAddress() . getEncryptSeparator() . detectRemoteAddr();
 
        // Build key string
        $keys = getSiteKey() . getEncryptSeparator() . getDateKey();
@@ -540,7 +555,7 @@ function generateRandomCode ($length, $code, $userid, $extraData = '') {
        if (isConfigEntrySet('file_hash')) {
                $keys .= getEncryptSeparator() . getFileHash();
        } // END - if
-       $keys .= getEncryptSeparator() . getDateFromRepository();
+
        if (isConfigEntrySet('master_salt')) {
                $keys .= getEncryptSeparator() . getMasterSalt();
        } // END - if
@@ -618,13 +633,16 @@ function bigintval ($num, $castValue = TRUE, $abortOnMismatch = TRUE) {
 
 // Creates a Uni* timestamp from given selection data and prefix
 function createEpocheTimeFromSelections ($prefix, $postData) {
+       // Assert on typical array element (maybe all?)
+       assert(isset($postData[$prefix . '_ye']));
+
        // Initial return value
        $ret = '0';
 
        // Is there a leap year?
        $SWITCH = '0';
-       $TEST = getYear() / 4;
-       $M1   = getMonth();
+       $TEST   = getYear() / 4;
+       $M1     = getMonth();
 
        // If so and if current time is before 02/29 and estimated time is after 02/29 then add 86400 seconds (one day)
        // 01     2     2         1    1           1    123     4                          43    3                                 32    233    4                          43    3                                 3210
@@ -708,7 +726,7 @@ function isEmailValid ($email) {
 
        // Return check result
        //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'email=' . $email . ',isValid=' . intval($GLOBALS[__FUNCTION__][$email]) . ' - EXIT!');
-       return $GLOBALS[__FUNCTION__][$email];;
+       return $GLOBALS[__FUNCTION__][$email];
 }
 
 // Function taken from user comments on www.php.net / function isInStringIgnoreCase()
@@ -763,10 +781,10 @@ function generateHash ($plainText, $salt = '', $hash = TRUE) {
        // When the salt is empty build a new one, else use the first x configured characters as the salt
        if (empty($salt)) {
                // Build server string for more entropy
-               $server = $_SERVER['PHP_SELF'] . getEncryptSeparator() . detectUserAgent() . getEncryptSeparator() . getenv('SERVER_SOFTWARE') . getEncryptSeparator() . detectRealIpAddress() . getEncryptSeparator() . detectRemoteAddr();
+               $server = $_SERVER['REQUEST_URI'] . getEncryptSeparator() . detectUserAgent() . getEncryptSeparator() . getenv('SERVER_SOFTWARE') . getEncryptSeparator() . detectRealIpAddress() . getEncryptSeparator() . detectRemoteAddr();
 
                // Build key string
-               $keys = getSiteKey() . getEncryptSeparator() . getDateKey() . getEncryptSeparator() . getFileHash() . getEncryptSeparator() . getDateFromRepository() . getEncryptSeparator() . getMasterSalt();
+               $keys = getSiteKey() . getEncryptSeparator() . getDateKey() . getEncryptSeparator() . getFileHash() . getEncryptSeparator() . getMasterSalt();
 
                // Is the secret_key config entry set?
                if (isConfigEntrySet('secret_key')) {
@@ -823,18 +841,19 @@ function scrambleString ($str) {
        if (strlen($str) > 40) {
                // The string is to long
                return $str;
-       } elseif (strlen($str) == 40) {
+       } elseif ((strlen($str) == 40) && (getPassScramble() != '')) {
                // From database
-               $scrambleNums = explode(':', getPassScramble());
+               $scramble = getPassScramble();
        } else {
                // Generate new numbers
-               $scrambleNums = explode(':', genScrambleString(strlen($str)));
+               $scramble = genScrambleString(strlen($str));
        }
 
-       // Compare both lengths and abort if different
-       if (strlen($str) != count($scrambleNums)) {
-               return $str;
-       } // END - if
+       // Convert it into an array
+       $scrambleNums = explode(':', $scramble);
+
+       // Assert on both lengths
+       assert(strlen($str) == count($scrambleNums));
 
        // Scramble string here
        //* DEBUG: */ debugOutput('***Original=' . $str.'***<br />');
@@ -900,6 +919,8 @@ function genScrambleString ($len) {
 
        // So let's create the string for storing it in database
        $scrambleString = implode(':', $scrambleNumbers);
+
+       // Return it
        return $scrambleString;
 }
 
@@ -928,6 +949,7 @@ function encodeHashForCookie ($passHash) {
 
                        // Default is hexadecimal of index if both are same
                        $mod = dechex($idx);
+
                        // Is part1 larger or part2 than its counter part?
                        if ($part1 > $part2) {
                                // part1 is larger
@@ -984,13 +1006,13 @@ function getCurrentTheme () {
        if (isExtensionActive('theme')) {
                // Call inner method
                $ret = getActualTheme();
-       } elseif ((isPostRequestElementSet('theme')) && (isIncludeReadable(sprintf("theme/%s/theme.php", postRequestElement('theme'))))) {
+       } elseif ((isPostRequestElementSet('theme')) && (isThemeReadable(postRequestElement('theme')))) {
                // Use value from POST data
                $ret = postRequestElement('theme');
-       } elseif ((isGetRequestElementSet('theme')) && (isIncludeReadable(sprintf("theme/%s/theme.php", getRequestElement('theme'))))) {
+       } elseif ((isGetRequestElementSet('theme')) && (isThemeReadable(getRequestElement('theme')))) {
                // Use value from GET data
                $ret = getRequestElement('theme');
-       } elseif ((isMailerThemeSet()) && (isIncludeReadable(sprintf("theme/%s/theme.php", getMailerTheme())))) {
+       } elseif ((isMailerThemeSet()) && (isThemeReadable(getMailerTheme()))) {
                // Use value from GET data
                $ret = getMailerTheme();
        }
@@ -1011,7 +1033,7 @@ function generateErrorCodeFromUserStatus ($status = '') {
        $errorCode = getCode('ACCOUNT_UNKNOWN');
 
        // Generate constant name
-       $codeName = sprintf("ACCOUNT_%s", strtoupper($status));
+       $codeName = sprintf('ACCOUNT_%s', strtoupper($status));
 
        // Is the constant there?
        if (isCodeSet($codeName)) {
@@ -1019,7 +1041,7 @@ function generateErrorCodeFromUserStatus ($status = '') {
                $errorCode = getCode($codeName);
        } else {
                // Unknown status
-               logDebugMessage(__FUNCTION__, __LINE__, sprintf("Unknown error status %s detected.", $status));
+               logDebugMessage(__FUNCTION__, __LINE__, sprintf('Unknown error status %s detected.', $status));
        }
 
        // Return error code
@@ -1786,12 +1808,12 @@ function isExtraTitleSet () {
  *
  * @param      $baseDir                        Relative base directory to PATH to scan from
  * @param      $prefix                         Prefix for all positive matches (which files should be found)
- * @param      $fileIncludeDirs        whether to include directories in the final output array
- * @param      $addBaseDir                     whether to add $baseDir to all array entries
+ * @param      $fileIncludeDirs        Whether to include directories in the final output array
+ * @param      $addBaseDir                     Whether to add $baseDir to all array entries
  * @param      $excludeArray           Excluded files and directories, these must be full files names, e.g. 'what-' will exclude all files named 'what-' but won't exclude 'what-foo.php'
  * @param      $extension                      File extension for all positive matches
  * @param      $excludePattern         Regular expression to exclude more files (preg_match())
- * @param      $recursive                      whether to scan recursively
+ * @param      $recursive                      Whether to scan recursively
  * @param      $suffix                         Suffix for positive matches ($extension will be appended, too)
  * @param      $withPrefixSuffix       Whether to include prefix/suffix in found entries
  * @return     $foundMatches           All found positive matches for above criteria
@@ -2061,7 +2083,7 @@ function encodeUrl ($url, $outputMode = '0') {
        } // END - if
 
        // Add {?URL?} ?
-       if ((substr($url, 0, strlen(getUrl())) != getUrl()) && (substr($url, 0, 7) != '{?URL?}') && (substr($url, 0, 7) != 'http://') && (substr($url, 0, 8) != 'https://')) {
+       if ((substr($url, 0, strlen(getUrl())) != getUrl()) && (substr($url, 0, 7) != '{?URL?}') && (!isFullQualifiedUrl($url))) {
                // Add it
                $url = '{?URL?}/' . $url;
        } // END - if
@@ -2099,43 +2121,6 @@ function isSpider () {
        return ((isInStringIgnoreCase('spider', $userAgent)) || (isInStringIgnoreCase('slurp', $userAgent)) || (isInStringIgnoreCase('bot', $userAgent)) || (isInStringIgnoreCase('archiver', $userAgent)));
 }
 
-// Function to search for the last modified file
-function searchDirsRecursive ($dir, &$last_changed, $lookFor = 'Date') {
-       // Get dir as array
-       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'dir=' . $dir);
-       // Does it match what we are looking for? (We skip a lot files already!)
-       // RegexPattern to exclude  ., .., .revision,  .svn, debug.log or .cache in the filenames
-       $excludePattern = '@(\.revision|\.svn|debug\.log|\.cache|config\.php)$@';
-
-       $ds = getArrayFromDirectory($dir, '', FALSE, TRUE, array(), '.php', $excludePattern);
-       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'count(ds)='.count($ds));
-
-       // Walk through all entries
-       foreach ($ds as $d) {
-               // Generate proper FQFN
-               $FQFN = str_replace('//', '/', getPath() . $dir . '/' . $d);
-
-               // Is it a file and readable?
-               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'dir=' . $dir . ',d=' . $d);
-               if (isFileReadable($FQFN)) {
-                       // $FQFN is a readable file so extract the requested data from it
-                       $check = extractRevisionInfoFromFile($FQFN, $lookFor);
-                       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'File: ' . $d . ' found. check=' . $check);
-
-                       // Is the file more recent?
-                       if ((!isset($last_changed[$lookFor])) || ($last_changed[$lookFor] < $check)) {
-                               // This file is newer as the file before
-                               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'NEWER!');
-                               $last_changed['path_name'] = $FQFN;
-                               $last_changed[$lookFor] = $check;
-                       } // END - if
-               } else {
-                       // Not readable
-                       /* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'File: ' . $d . ' not readable or directory.');
-               }
-       } // END - foreach
-}
-
 // Handles the braces [] of a field (e.g. value of 'name' attribute)
 function handleFieldWithBraces ($field) {
        // Are there braces [] at the end?
@@ -2177,6 +2162,18 @@ function convertZeroToNull ($number) {
        return $number;
 }
 
+// Converts an empty string to NULL, else leaves it untouched
+function convertEmptyToNull ($str) {
+       // Is the string empty?
+       if (strlen($str) == 0) {
+               // Is really empty
+               $str = NULL;
+       } // END - if
+
+       // Return it
+       return $str;
+}
+
 // Converts a NULL|empty string|< 1 to zero
 function convertNullToZero ($number) {
        // Is it a valid username?
@@ -2715,22 +2712,6 @@ function convertCharsetToUtf8 ($str, $charset) {
        return $str;
 }
 
-// Hash string with SHA256 and encode it to hex
-function hashSha256 ($str) {
-       /// Hash string
-       $hash = mhash(MHASH_SHA256, $str);
-
-       // Encode it to hexadecimal
-       $hex = '';
-       for ($i = 0; $i < strlen($hash); $i++) {
-               // Encode char to decimal, pad it with zero, add it
-               $hex .= padLeftZero(dechex(ord(substr($hash, $i, 1))), 2);
-       } // END - if
-
-       // Return it
-       return $hex;
-}
-
 // ----------------------------------------------------------------------------
 //              "Translatation" functions for points_data table
 // ----------------------------------------------------------------------------
@@ -2834,65 +2815,54 @@ if (!function_exists('html_entity_decode')) {
        }
 } // END - if
 
-// "Calculates" password strength
-function calculatePasswordStrength ($password, $configEntry = 'min_password_length') {
-       // Default score
-       $score = 1;
-
-       if ((strlen($password) < 1) || (strlen($password) < getConfig($configEntry))) {
-               // Is to weak
-               return 0;
-       } // END - if
-
-       // At least 8 chars long?
-       if (strlen($password) >= 8) {
-               // Add score
-               $score++;
-       } // END - if
-
-       // At least 10 chars long?
-       if (strlen($password) >= 10) {
-               // Add score
-               $score++;
-       } // END - if
+// "Getter" for base path from theme
+function getBasePathFromTheme ($theme) {
+       return sprintf('%stheme/%s/css/', getPath(), $theme);
+}
 
-       // Lower and upper cases?
-       if ((preg_match('/[a-z]/', $password)) && (preg_match('/[A-Z]/', $password))) {
-               // Add score
-               $score++;
+// Wrapper to check whether given theme is readable
+function isThemeReadable ($theme) {
+       // Is there cache?
+       if (!isset($GLOBALS[__FUNCTION__][$theme])) {
+               // Determine it
+               $GLOBALS[__FUNCTION__][$theme] = (isIncludeReadable(sprintf('theme/%s/theme.php', $theme)));
        } // END - if
 
-       // Also numbers?
-       if (preg_match('/[0-9]/', $password))  {
-               // Add score
-               $score++;
-       } // END - if
+       // Return cache
+       return $GLOBALS[__FUNCTION__][$theme];
+}
 
-       // Special characters?
-       if (preg_match('/.[!,@,#,$,%,^,&,*,?,\/,_,~,+,-,(,)]/', $password)) {
-               // Add score
-               $score++;
+// Checks whether a given PHP extension is loaded or can be loaded at runtime
+//
+// Supported OS: Windows, Linux, (Mac?)
+function isPhpExtensionLoaded ($extension) {
+       // Is the extension loaded?
+       if (extension_loaded($extension)) {
+               // All fine
+               return TRUE;
        } // END - if
 
-       // Return password score
-       return $score;
+       // Try to load the extension
+       return loadLibrary($extension);
 }
 
-// "Translates" password strength/score
-function translatePasswordStrength ($strength) {
-       // Return it translated
-       return '{--PASSWORD_SCORE_' . bigintval($strength) . '--}';
-}
+// Loads given library (aka. PHP extension)
+function loadLibrary ($n, $f = NULL) {
+       // Is the actual function dl() available? (Not on all SAPIs since 5.3)
+       if (!is_callable('dl')) {
+               // Not callable
+               /* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'dl() is not callable for n=' . $n . ',f[' . gettype($f) . ']=' . $f);
+               return FALSE;
+       } // END - if
 
-// Checks whether given password is strong enough
-function isStrongPassword ($password) {
-       // Determine it
-       return (calculatePasswordStrength($password) >= getConfig('min_password_score'));
+       // Try to load PHP library
+       return dl(((PHP_SHLIB_SUFFIX === 'dll') ? 'php_' : '') . ($f ? $f : $n) . '.' . PHP_SHLIB_SUFFIX);
 }
 
-// "Getter" for base path from theme
-function getBasePathFromTheme ($theme) {
-       return sprintf('%stheme/%s/css/', getPath(), $theme);
+// "Translates" given PHP extension name into a readable version
+function translatePhpExtension ($extension) {
+       // Return the language element
+       return '{--PHP_EXTENSION_' . strtoupper($extension) . '--}';
 }
 
 // [EOF]