Missing function CACHE_PURGE_ADMIN_MENU() added (stub)
[mailer.git] / inc / functions.php
index b5071b7d41e7ac2cd0aa384712fbeb09e7ab7477..533e824c60ed1327130ef6161141f9dcc89eaf06 100644 (file)
@@ -32,7 +32,7 @@
  ************************************************************************/
 
 // Some security stuff...
-if (ereg(basename(__FILE__), $_SERVER['PHP_SELF'])) {
+if (!defined('__SECURITY')) {
        $INC = substr(dirname(__FILE__), 0, strpos(dirname(__FILE__), "/inc") + 4)."/security.php";
        require($INC);
 }
@@ -207,20 +207,33 @@ function LOAD_TEMPLATE($template, $return=false, $content="") {
        $_CONFIG['num_templates']++;
 
        // Init some data
-       $ACTION = SQL_ESCAPE($GLOBALS['action']);
-       $WHAT = SQL_ESCAPE($GLOBALS['what']);
        $ret = "";
        if (empty($GLOBALS['refid'])) $GLOBALS['refid'] = 0;
-       $REFID = $GLOBALS['refid'];
 
-       // DEPRECATED!!!
+       // @DEPRECATED Try to remove this if() block
        if ($template == "member_support_form") {
                // Support request of a member
-               $result = SQL_QUERY_ESC("SELECT sex, surname, family FROM "._MYSQL_PREFIX."_user_data WHERE userid=%s LIMIT 1",
+               $result = SQL_QUERY_ESC("SELECT gender, surname, family, email FROM "._MYSQL_PREFIX."_user_data WHERE userid=%s LIMIT 1",
                 array($GLOBALS['userid']), __FILE__, __LINE__);
-               list($sex, $surname, $family) = SQL_FETCHROW($result);
+
+               // @TODO Merge this data into $content
+               list($gender, $surname, $family, $email) = SQL_FETCHROW($result);
+
+               // Translate gender
+               $gender = TRANSLATE_GENDER($gender);
+
+               // Insert data if content is an array
+               if (is_array($content)) {
+                       // Please switch to $content[bla] in all your templates! Direct
+                       // variables are deprecated as of 09/13/2008.
+                       $content['gender']  = $gender;
+                       $content['surname'] = $surname;
+                       $content['family']  = $family;
+                       $content['email']   = $email;
+               } // END - if
+
+               // Free result
                SQL_FREERESULT($result);
-               $salut = TRANSLATE_SEX($sex);
        }
 
        // Generate date/time string
@@ -562,28 +575,32 @@ function DEREFERER ($URL) {
 }
 
 //
-function TRANSLATE_SEX ($sex) {
-       switch ($sex)
+function TRANSLATE_GENDER ($gender) {
+       switch ($gender)
        {
-               case "M": $ret = SEX_M; break;
-               case "F": $ret = SEX_F; break;
-               case "C": $ret = SEX_C; break;
-               default : $ret = $sex; break;
+               case "M": $ret = GENDER_M; break;
+               case "F": $ret = GENDER_F; break;
+               case "C": $ret = GENDER_C; break;
+               default : $ret = $gender; break;
        }
        return $ret;
 }
 //
 function GET_POOL_TYPE($PT) {
-       switch ($PT)
-       {
-               case "TEMP"   : $ret = POOL_TEMP;    break;
-               case "SEND"   : $ret = POOL_SEND;    break;
-               case "NEW"    : $ret = POOL_NEW;     break;
-               case "ADMIN"  : $ret = POOL_ADMIN;   break;
-               case "ACTIVE" : $ret = POOL_ACTIVE;  break;
-               case "DELETED": $ret = POOL_DELETED; break;
-               default       : $ret = POOL_UNKNOWN." (".$PT.")"; break;
-       }
+       // Unknown pool type is default
+       $ret = POOL_UNKNOWN." (".$PT.")";
+
+       // Generate constant name
+       $constantName = sprintf("POOL_%s", $PT);
+
+       // Is the type known?
+       if (defined($constantName)) {
+               // Prepare eval command
+               $eval = sprintf("\$ret = %s;", $constantName);
+               eval($eval);
+       } // END - if
+
+       // Return result
        return $ret;
 }
 //
@@ -677,13 +694,21 @@ function LOAD_EMAIL_TEMPLATE($template, $content="", $UID="0") {
        // Make sure all template names are lowercase!
        $template = strtolower($template);
 
-       // Keept for backward-compatiblity (please replace these variables against our new {--CONST--} syntax!)
-       $MAIN_TITLE = MAIN_TITLE; $URL = URL; $WEBMASTER = WEBMASTER;
-       $surname = ""; $family = ""; $nick = ""; $sex = "N";
+       // Default "nickname" if extension is not installed
+       $nick = "---";
+
+       // Keept for backward-compatiblity (please replace these variables against our new {!CONST!} syntax!)
+       // No longer used: $MAIN_TITLE = MAIN_TITLE; $URL = URL; $WEBMASTER = WEBMASTER;
+
+       // Init variables (DEPRECATED! Use $content[bla] instead.
+       $surname = "";
+       $family  = "";
+       $nick    = "";
+       $gender     = "N";
 
        // Prepare IP number and User Agent
-       $REMOTE_ADDR = getenv('REMOTE_ADDR');
-       $HTTP_USER_AGENT  = getenv('HTTP_USER_AGENT');
+       $REMOTE_ADDR     = getenv('REMOTE_ADDR');
+       $HTTP_USER_AGENT = getenv('HTTP_USER_AGENT');
 
        $ADMIN = MAIN_TITLE;
        if (isSessionVariableSet('admin_login')) {
@@ -692,7 +717,7 @@ function LOAD_EMAIL_TEMPLATE($template, $content="", $UID="0") {
                        array(get_session('admin_login')), __FILE__, __LINE__);
                list($ADMIN) = SQL_FETCHROW($result);
                SQL_FREERESULT($result);
-       }
+       } // END - if
 
        // Expiration in a nice output format
        if ($_CONFIG['auto_purge'] == 0) {
@@ -706,124 +731,55 @@ function LOAD_EMAIL_TEMPLATE($template, $content="", $UID="0") {
                $EXPIRATION = round($_CONFIG['auto_purge']/60/60/24)." "._DAYS;
        }
 
-       // DEPRECATED switch!
-       switch ($template)
-       {
-       case "bonus-mail": // Load data for the bonus mail
-               $BONUSID    = $DATA[0];
-               $content    = $DATA[2];
-               $points     = TRANSLATE_COMMA($DATA[4]);
-               $TIME       = $DATA[5];
-               $TARGET_URL = $DATA[8];
-               $CATEGORY   = GET_CATEGORY($DATA[9]);
-               $DATA[10]   = $UID;
-
-               // Replace variables
-               foreach ($REPLACER as $key => $value)
-               {
-                       if (isset($DATA[$key])) $content = str_replace($value, $DATA[$key], $content);
-               }
-               break;
-
-       case "order-admin":
-       case "order-member":
-               $BLOCKS     = $_CONFIG['max_send'];
-               $SUBJECT    = $DATA[0];
-               $content    = $DATA[1];
-               $PAYMENT    = GET_PAYMENT($DATA[3]);
-               $TARGET_URL = $DATA[5];
-               $CATEGORY   = GET_CATEGORY($DATA[6]);
-               break;
-
-       case "order-reject":
-       case "order-deleted":
-       case "order-accept":
-               $TARGET_URL = $DATA[0];
-               $URL        = $DATA[0];
-               $SUBJECT    = $DATA[1];
-               break;
-
-       case "new-pass":
-               $PASS       = $DATA[0];
-               $REMOTE     = $DATA[1];
-               break;
-
-       case "confirm-member":
-               $points     = $_CONFIG['points_register'];
-               break;
-
-       case "confirm-referral":
-               $PERCENT    = $DATA[0];
-               $LEVEL      = $DATA[1];
-               $points     = $DATA[2];
-               $REFID      = $DATA[3];
-               break;
-
-       case "normal-mail":
-               $SEND_UID   = $DATA[1];
-               $CATEGORY   = GET_CATEGORY($DATA[9]);
-               $TIME       = GET_PAY_POINTS($DATA[5], "time");
-               $TARGET_URL = $DATA[7];
-               $points     = TRANSLATE_COMMA(GET_PAY_POINTS($DATA[5], "payment"));
-               // Warning! This ID has changed from 10 to 11!
-               $MAILID     = $DATA[11];
-
-               // Replace variables
-               foreach ($REPLACER as $key => $value)
-               {
-                       if (isset($DATA[$key])) $content = str_replace($value, $DATA[$key], $content);
-               }
-               break;
-
-       case "done-member":
-       case "done-admin":
-               $SEND_UID   = $DATA[1];
-               $CATEGORY   = GET_CATEGORY($DATA[9]);
-               $TARGET_URL = $DATA[7];
-               break;
-
-       case "back-admin":
-       case "back-member":
-               $points         = TRANSLATE_COMMA($DATA[10]);
-               break;
+       // Is content an array?
+       if (is_array($content)) {
+               // Add expiration to array, $EXPIRATION is now deprecated!
+               $content['expiration'] = $EXPIRATION;
+       } // END - if
 
-       case "add-points":
+       // @TODO Try to rewrite this part
+       if ($template == "add-points") {
                if (isset($_POST['points'])) {
-                       $points         = bigintval($_POST['points']);
+                       $points = bigintval($_POST['points']);
                } else {
                        $points = __POINTS_VALUE;
                }
-               break;
-
-       case "guest_request_confirm":
-               $HASH       = $DATA[2];
-               break;
-       }
+       } // END - if
 
        // Load user's data
        if ($UID > 0) {
                if (EXT_IS_ACTIVE("nickname")) {
                        // Load nickname
-                       $result = SQL_QUERY_ESC("SELECT surname, family, sex, email, nickname FROM "._MYSQL_PREFIX."_user_data WHERE userid=%s LIMIT 1",
-                        array(bigintval($UID)), __FILE__, __LINE__);
-                       list($surname, $family, $sex, $email, $nick) = SQL_FETCHROW($result);
+                       $result = SQL_QUERY_ESC("SELECT surname, family, gender, email, nickname FROM "._MYSQL_PREFIX."_user_data WHERE userid=%s LIMIT 1",
+                               array(bigintval($UID)), __FILE__, __LINE__);
+                       list($surname, $family, $gender, $email, $nick) = SQL_FETCHROW($result);
                        SQL_FREERESULT($result);
                } else {
                        // Load normal data
-                       $result = SQL_QUERY_ESC("SELECT surname, family, sex, email FROM "._MYSQL_PREFIX."_user_data WHERE userid=%s LIMIT 1",
-                        array(bigintval($UID)), __FILE__, __LINE__);
-                       list($surname, $family, $sex, $email) = SQL_FETCHROW($result);
+                       $result = SQL_QUERY_ESC("SELECT surname, family, gender, email FROM "._MYSQL_PREFIX."_user_data WHERE userid=%s LIMIT 1",
+                               array(bigintval($UID)), __FILE__, __LINE__);
+                       list($surname, $family, $gender, $email) = SQL_FETCHROW($result);
                        SQL_FREERESULT($result);
-                       $nick = "---";
                }
        } else {
-               // Neutral sex and email address is default
-               $sex = "N";
+               // Neutral gender and email address is default
+               $gender = "N";
                $email = WEBMASTER;
        }
 
        // Translate M to male or F to female
-       $salut = TRANSLATE_SEX($sex);
+       $gender = TRANSLATE_GENDER($gender);
+
+       // Insert data if content is an array
+       if (is_array($content)) {
+               // Please do no longer use direct variable names, use $content[bla]
+               // instead.
+               $content['gender']  = $gender;
+               $content['surname'] = $surname;
+               $content['family']  = $family;
+               $content['email']   = $email;
+               $content['nick']    = $nick;
+       } // END - if
 
        // Store email for some functions in global data array
        $DATA['email'] = $email;
@@ -942,7 +898,7 @@ function LOAD_URL($URL, $addUrlData=true) {
                print("<pre>");
                debug_print_backtrace();
                die("</pre>URL={$URL}");
-               */
+               /**/
                @header ("Location: ".str_replace("&amp;", "&", $URL));
        } else {
                // Output error message
@@ -996,7 +952,7 @@ function COMPILE_CODE($code, $simple = false, $constants = true, $full = true) {
                        } // END - if
 
                        // Take all string elements
-                       if (("".bigintval($matches[4][$key])."" != $matches[4][$key]) && (!isset($matchesFound[$key."_".$matches[4][$key]]))) {
+                       if ((is_string($matches[4][$key])) && (!isset($matchesFound[$key."_".$matches[4][$key]]))) {
                                // Replace it in the code
                                $newMatch = str_replace("[".$matches[4][$key]."]", "['".$matches[4][$key]."']", $match);
                                $code = str_replace($match, $newMatch, $code);
@@ -1028,41 +984,34 @@ function COMPILE_CODE($code, $simple = false, $constants = true, $full = true) {
 function array_pk_sort(&$array, $a_sort, $primary_key = 0, $order = -1, $nums = false)
 {
        $dummy = $array;
-       while ($primary_key < count($a_sort))
-       {
-               foreach ($dummy[$a_sort[$primary_key]] as $key => $value)
-               {
-                       foreach ($dummy[$a_sort[$primary_key]] as $key2 => $value2)
-                       {
+       while ($primary_key < count($a_sort)) {
+               foreach ($dummy[$a_sort[$primary_key]] as $key => $value) {
+                       foreach ($dummy[$a_sort[$primary_key]] as $key2 => $value2) {
                                $match = false;
-                               if (!$nums)
-                               {
+                               if (!$nums) {
                                        // Sort byte-by-byte (also numbers will be interpreted as chars! E.g.: "9" > "10")
                                        if (($key != $key2) && (strcmp(strtolower($dummy[$a_sort[$primary_key]][$key]), strtolower($dummy[$a_sort[$primary_key]][$key2])) == $order)) $match = true;
-                               }
-                                elseif ($key != $key2)
-                               {
+                               } elseif ($key != $key2) {
                                        // Sort numbers (E.g.: 9 < 10)
                                        if (($dummy[$a_sort[$primary_key]][$key] < $dummy[$a_sort[$primary_key]][$key2]) && ($order == -1)) $match = true;
                                        if (($dummy[$a_sort[$primary_key]][$key] > $dummy[$a_sort[$primary_key]][$key2]) && ($order == 1))  $match = true;
                                }
-                               if ($match)
-                               {
+
+                               if ($match) {
                                        // We have found two different values, so let's sort whole array
-                                       foreach ($dummy as $sort_key => $sort_val)
-                                       {
+                                       foreach ($dummy as $sort_key => $sort_val) {
                                                $t                       = $dummy[$sort_key][$key];
                                                $dummy[$sort_key][$key]  = $dummy[$sort_key][$key2];
                                                $dummy[$sort_key][$key2] = $t;
                                                unset($t);
-                                       }
-                               }
-                       }
-               }
+                                       } // END - foreach
+                               } // END - if
+                       } // END - foreach
+               } // END - foreach
 
                // Count one up
                $primary_key++;
-       }
+       } // END - while
 
        // Write back sorted array
        $array = $dummy;
@@ -1232,6 +1181,7 @@ function GEN_RANDOM_CODE($length, $code, $uid, $DATA="") {
 
        // At least 10 numbers shall be secure enought!
        $len = $_CONFIG['code_length'];
+       if ($len == 0) $len = $length;
        if ($len == 0) $len = 10;
 
        // Cut off requested counts of number
@@ -1245,6 +1195,15 @@ function bigintval($num, $castValue = true) {
        // Filter all numbers out
        $ret = preg_replace("/[^0123456789]/", "", $num);
 
+       // Shall we cast?
+       if ($castValue) $ret = (double)$ret;
+
+       // Has the whole value changed?
+       if ("".$ret."" != "".$num."") {
+               // Log the values
+               DEBUG_LOG(__FUNCTION__.": num={$num},ret={$ret}");
+       } // END - if
+
        // Return result
        return $ret;
 }
@@ -1302,31 +1261,37 @@ function GENERATE_IMAGE($img_code, $header=true) {
 // Create selection box or array of splitted timestamp
 function CREATE_TIME_SELECTIONS($timestamp, $prefix="", $display="", $align="center", $return_array=false) {
        // Calculate 15-seconds timestamp (15-seconds-steps shall be fine ;) )
-       $timestamp = round($timestamp / 15) * 15;
+       $stamp = round($timestamp / 15) * 15;
 
        // Do we have a leap year?
        $SWITCH = 0;
        $TEST = date('Y', time()) / 4;
        $M1 = date("m", time());
-       $M2 = date("m", (time() + $timestamp));
+       $M2 = date("m", (time() + $stamp));
 
        // If so and if current time is before 02/29 and estimated time is after 02/29 then add 86400 seconds (one day)
        if ((floor($TEST) == $TEST) && ($M1 == "02") && ($M2 > "02"))  $SWITCH = ONE_DAY;
 
        // First of all years...
-       $Y = abs(floor($timestamp / (31536000 + $SWITCH)));
+       $Y = abs(floor($stamp / (31536000 + $SWITCH)));
        // Next months...
-       $M = abs(floor($timestamp / 2628000 - $Y * 12));
+       $M = abs(floor($stamp / 2628000 - $Y * 12));
        // Next weeks
-       $W = abs(floor($timestamp / 604800 - $Y * ((365 + $SWITCH / ONE_DAY) / 7) - ($M / 12 * (365 + $SWITCH / ONE_DAY) / 7)));
+       $W = abs(floor($stamp / 604800 - $Y * ((365 + $SWITCH / ONE_DAY) / 7) - ($M / 12 * (365 + $SWITCH / ONE_DAY) / 7)));
        // Next days...
-       $D = abs(floor($timestamp / 86400 - $Y * (365 + $SWITCH / ONE_DAY) - ($M / 12 * (365 + $SWITCH / ONE_DAY)) - $W * 7));
+       $D = abs(floor($stamp / 86400 - $Y * (365 + $SWITCH / ONE_DAY) - ($M / 12 * (365 + $SWITCH / ONE_DAY)) - $W * 7));
        // Next hours...
-       $h = abs(floor($timestamp / 3600 - $Y * (365 + $SWITCH / ONE_DAY) * 24 - ($M / 12 * (365 + $SWITCH / ONE_DAY) * 24) - $W * 7 * 24 - $D * 24));
+       $h = abs(floor($stamp / 3600 - $Y * (365 + $SWITCH / ONE_DAY) * 24 - ($M / 12 * (365 + $SWITCH / ONE_DAY) * 24) - $W * 7 * 24 - $D * 24));
        // Next minutes..
-       $m = abs(floor($timestamp / 60 - $Y * (365 + $SWITCH / ONE_DAY) * 24 * 60 - ($M / 12 * (365 + $SWITCH / ONE_DAY) * 24 * 60) - $W * 7 * 24 * 60 - $D * 24 * 60 - $h * 60));
+       $m = abs(floor($stamp / 60 - $Y * (365 + $SWITCH / ONE_DAY) * 24 * 60 - ($M / 12 * (365 + $SWITCH / ONE_DAY) * 24 * 60) - $W * 7 * 24 * 60 - $D * 24 * 60 - $h * 60));
        // And at last seconds...
-       $s = abs(floor($timestamp - $Y * (365 + $SWITCH / ONE_DAY) * 24 * 3600 - ($M / 12 * (365 + $SWITCH / ONE_DAY) * 24 * 3600) - $W * 7 * 24 * 3600 - $D * 24 * 3600 - $h * 3600 - $m * 60));
+       $s = abs(floor($stamp - $Y * (365 + $SWITCH / ONE_DAY) * 24 * 3600 - ($M / 12 * (365 + $SWITCH / ONE_DAY) * 24 * 3600) - $W * 7 * 24 * 3600 - $D * 24 * 3600 - $h * 3600 - $m * 60));
+
+       // Is seconds zero and time is < 60 seconds?
+       if (($s == 0) && ($stamp < 60)) {
+               // Fix seconds
+               $s = $timestamp;
+       } // END - if
 
        //
        // Now we convert them in seconds...
@@ -1569,11 +1534,13 @@ function CREATE_FANCY_TIME($stamp) {
                        $eval = "\$ret .= \", \".\$v.\" \"._".strtoupper($k).";";
                        eval($eval);
                        break;
-               }
-       }
+               } // END - if
+       } // END - foreach
 
-       // Remove first "comma,null" string
+       // Remove leading commata and space
        $ret = substr($ret, 2);
+
+       // Return fancy time string
        return $ret;
 }
 //
@@ -1972,11 +1939,11 @@ function generateHash ($plainText, $salt = "") {
 
                // Generate SHA1 sum from modula of number and the prime number
                $sha1 = sha1(($a % _PRIME).$server.":".$keys.":".$data.":".date("d-m-Y (l-F-T)", time()).":".$a);
-               //* DEBUG: */ echo "SHA1=".$sha1." (".strlen($sha1).")<br>";
+               //* DEBUG: */ echo "SHA1=".$sha1." (".strlen($sha1).")<br />";
                $sha1 = scrambleString($sha1);
-               //* DEBUG: */ echo "Scrambled=".$sha1." (".strlen($sha1).")<br>";
+               //* DEBUG: */ echo "Scrambled=".$sha1." (".strlen($sha1).")<br />";
                //* DEBUG: */ $sha1b = descrambleString($sha1);
-               //* DEBUG: */ echo "Descrambled=".$sha1b." (".strlen($sha1b).")<br>";
+               //* DEBUG: */ echo "Descrambled=".$sha1b." (".strlen($sha1b).")<br />";
 
                // Generate the password salt string
                $salt = substr($sha1, 0, $_CONFIG['salt_length']);
@@ -2129,12 +2096,12 @@ function generatePassString($passHash) {
                        }
                        $mod = substr(round($mod), 0, 4);
                        $mod = str_repeat('0', 4-strlen($mod)).$mod;
-                       //* DEBUG: */ echo "*".$start."=".$mod."*<br>";
+                       //* DEBUG: */ echo "*".$start."=".$mod."*<br />";
                        $start += 4;
                        $newHash .= $mod;
                } // END - for
 
-               //* DEBUG: */ print($passHash."<br>".$newHash." (".strlen($newHash).")");
+               //* DEBUG: */ print($passHash."<br />".$newHash." (".strlen($newHash).")");
                $ret = generateHash($newHash, $_CONFIG['master_salt']);
                //* DEBUG: */ print($ret."<br />\n");
        } else {
@@ -2228,39 +2195,62 @@ function set_session ($var, $value) {
                return session_register($var);
        } elseif (!empty($value)) {
                // Update session
+               //* DEBUG: */ echo "UPDATE:".$var."=".$value."<br />\n";
                $_SESSION[$var] = $value;
-       } else {
-               // Something bad happens!
-               return false; // Hope this doesn't make so much trouble???
+               return true;
        }
 
-       // Return always true if the session variable is already set.
-       // Keept me busy for a longer while...
+       // Ignored (but valid)
        //* DEBUG: */ echo "IGNORED:".$var."=".$value."<br />\n";
        return true;
 }
 
 // Check wether a boolean constant is set
 // Taken from user comments in PHP documentation for function constant()
-function isBooleanConstantAndTrue($constname) { // : Boolean
+function isBooleanConstantAndTrue($constName) { // : Boolean
+       global $constCache;
+
+       // Failed by default
        $res = false;
-       if (defined($constname)) $res = (constant($constname) === true);
-       return($res);
+
+       // In cache?
+       if (isset($constCache[$constName])) {
+               // Use cache
+               $res = $constCache[$constName];
+       } else {
+               // Check constant
+               if (defined($constName)) $res = (constant($constName) === true);
+
+               // Set cache
+               $constCache[$constName] = $res;
+       }
+
+       // Return value
+       return $res;
 }
 
 // Check wether a session variable is set
 function isSessionVariableSet($var) {
+       //* DEBUG: */ echo __FUNCTION__.":var={$var}<br />\n";
        return (isset($_SESSION[$var]));
 }
 // Returns wether the value of the session variable or NULL if not set
 function get_session($var) {
+       global $cacheArray;
+
        // Default is not found! ;-)
        $value = null;
 
-       // Is the variable there?
-       if (isSessionVariableSet($var)) {
+       // Is the variable there or cached values?
+       if (isset($cacheArray['session'][$var])) {
+               // Get cached value (skips a lot SQL_ESCAPE() calles!
+               $value = $cacheArray['session'][$var];
+       } elseif (isSessionVariableSet($var)) {
                // Then  get it secured!
                $value = SQL_ESCAPE($_SESSION[$var]);
+
+               // Cache the value
+               $cacheArray['session'][$var] = $value;
        } // END - if
 
        // Return the value
@@ -2322,6 +2312,7 @@ function GET_DIR_AS_ARRAY ($baseDir, $prefix) {
                $file = $baseDir.$baseFile;
 
                // Is this a valid reset file?
+               //* DEBUG: */ echo __FUNCTION__.":baseDir={$baseDir},prefix={$prefix},baseFile={$baseFile}<br />\n";
                if ((is_file($file)) && (is_readable($file)) && (substr($baseFile, 0, strlen($prefix)) == $prefix) && (substr($baseFile, -4, 4) == ".php")) {
                        // Remove both for extension name
                        $extName = substr($baseFile, strlen($prefix), -4);
@@ -2333,6 +2324,9 @@ function GET_DIR_AS_ARRAY ($baseDir, $prefix) {
                        if (($extId > 0) && (EXT_IS_ACTIVE($extName))) {
                                // Then add this file
                                $INCs[] = $file;
+                       } elseif ($extId == 0) {
+                               // Add non-extension files as well
+                               $INCs[] = $file;
                        }
                } // END - if
        } // END - while
@@ -2452,9 +2446,95 @@ function CONVERT_SELECTIONS_TO_TIMESTAMP(&$POST, &$DATA, &$id, &$skip) {
 }
 // Reverts the german decimal comma into Computer decimal dot
 function REVERT_COMMA ($str) {
-       $float = (float)str_replace(",", ".", $str);
+       // Default float is not a float... ;-)
+       $float = false;
+
+       // Which language is selected?
+       switch (GET_LANGUAGE()) {
+               case "de": // German language
+                       // Remove german thousand dots first
+                       $str = str_replace(".", "", $str);
+
+                       // Replace german commata with decimal dot and cast it
+                       $float = (float)str_replace(",", ".", $str);
+                       break;
+
+               default: // US and so on
+                       // Remove thousand dots first and cast
+                       $float = (float)str_replace(",", "", $str);
+                       break;
+       }
+
+       // Return float
        return $float;
 }
+// Handle menu-depending failed logins and return the rendered content
+function HANDLE_LOGIN_FAILTURES ($accessLevel) {
+       // Default output is empty ;-)
+       $OUT = "";
+
+       // Is the session data set?
+       if ((isSessionVariableSet('mxchange_'.$accessLevel.'_failtures')) && (isSessionVariableSet('mxchange_'.$accessLevel.'_last_fail'))) {
+               // Ignore zero values
+               if (get_session('mxchange_'.$accessLevel.'_failtures') > 0) {
+                       // Non-guest has login failtures found, get both data and prepare it for template
+                       //* DEBUG: */ echo __FUNCTION__.":accessLevel={$accessLevel}<br />\n";
+                       $content = array(
+                               'login_failtures' => get_session('mxchange_'.$accessLevel.'_failtures'),
+                               'last_failture'   => MAKE_DATETIME(get_session('mxchange_'.$accessLevel.'_last_fail'), "2")
+                       );
+
+                       // Load template
+                       $OUT = LOAD_TEMPLATE("login_failtures", true, $content);
+               } // END - if
+
+               // Reset session data
+               set_session('mxchange_'.$accessLevel.'_failtures', "");
+               set_session('mxchange_'.$accessLevel.'_last_fail', "");
+       } // END - if
+
+       // Return rendered content
+       return $OUT;
+}
+// Rebuild cache
+function REBUILD_CACHE ($cache, $inc="") {
+       global $cacheInstance;
+
+       // Shall I remove the cache file?
+       if ((EXT_IS_ACTIVE("cache")) && (is_object($cacheInstance))) {
+               // Rebuild cache
+               if ($cacheInstance->cache_file($cache, true)) {
+                       // Destroy it
+                       $cacheInstance->cache_destroy();
+
+                       // Include file given?
+                       if (!empty($inc)) {
+                               // And rebuild it from scratch
+                               require_once(PATH."inc/loader/load_cache-".$inc.".php");
+                       } // END - if
+               } // END - if
+       } // END - if
+}
+// Purge admin menu cache
+function CACHE_PURGE_ADMIN_MENU ($id=0, $action="", $what="", $str="") {
+       global $_CONFIG, $cacheInstance;
+
+       // Is the cache extension enabled or no cache instance or admin menu cache disabled?
+       if (!EXT_IS_ACTIVE("cache")) {
+               // Cache extension not active
+               return false;
+       } elseif (!is_object($cacheInstance)) {
+               // No cache instance!
+               DEBUG_LOG(__FUNCTION__.": No cache instance found.");
+               return false;
+       } elseif ((!isset($_CONFIG['cache_admin_menu'])) || ($_CONFIG['cache_admin_menu'] == "N")) {
+               // Caching disabled (currently experiemental!)
+               return false;
+       }
+
+       // Experiemental feature!
+       trigger_error("You have to delete the admin_*.cache files by yourself at this point.");
+}
 //
 //////////////////////////////////////////////////
 //                                              //