Debug comments rewritten
[mailer.git] / inc / functions.php
index b6b212fb72ba2764fe1d9da321d660103f5b5bf2..65d558956bf1951c789ea2d7e4ac48c36dd85c1d 100644 (file)
@@ -39,11 +39,20 @@ if (!defined('__SECURITY')) {
 
 // Check if our config file is writeable or not
 function is_INCWritable($inc) {
-       $fp = @fopen(PATH."inc/".$inc.".php", 'a');
+       // Generate FQFN
+       $fqfn = sprintf("%sinc/%s.php", PATH, $inc);
+
+       // Abort by simple test
+       if ((FILE_READABLE($fqfn)) && (!is_writeable($fqfn))) {
+               return false;
+       } // END - if
+
+       // Test if we can append data
+       $fp = @fopen($fqfn, 'a');
        if ($inc == "dummy") {
                // Remove dummy file
                @fclose($fp);
-               return @unlink(PATH."inc/dummy.php");
+               return @unlink($fqfn);
        } else {
                // Close all other files
                return @fclose($fp);
@@ -123,7 +132,8 @@ function OUTPUT_HTML($HTML, $NEW_LINE = true) {
 
                default:
                        // Huh, something goes wrong or maybe you have edited config.php ???
-                       die ("<STRONG>".FATAL_ERROR.":</STRONG> ".LANG_NO_RENDER_DIRECT);
+                       DEBUG_LOG(__FUNCTION__, __LINE__, sprintf("Invalid renderer %s detected.", OUTPUT_MODE));
+                       MXCHANGE_DIE("<STRONG>".FATAL_ERROR.":</STRONG> ".LANG_NO_RENDER_DIRECT);
                        break;
                }
        } elseif ((_OB_CACHING == "on") && ($footer == 1)) {
@@ -133,6 +143,19 @@ function OUTPUT_HTML($HTML, $NEW_LINE = true) {
                // Clear output buffer for later output
                ob_end_clean();
 
+               // Send HTTP header
+               header("HTTP/1.1 200");
+
+               // Used later
+               $now = gmdate('D, d M Y H:i:s') . ' GMT';
+
+               // General headers for no caching
+               header("Expired: " . $now); // RFC2616 - Section 14.21
+               header("Last-Modified: " . $now);
+               header("Cache-Control: no-store, no-cache, must-revalidate, pre-check=0, post-check=0, max-age=0"); // HTTP/1.1
+               header("Pragma: no-cache"); // HTTP/1.0
+               header("Connection: Close");
+
                // Extension "rewrite" installed?
                if ((EXT_IS_ACTIVE("rewrite")) && (function_exists('REWRITE_LINKS')) && ($CSS != "1") && ($CSS != "-1")) {
                        $OUTPUT = REWRITE_LINKS($OUTPUT);
@@ -187,13 +210,18 @@ function OUTPUT_RAW ($HTML) {
 // Add a fatal error message to the queue array
 function ADD_FATAL ($message, $extra="") {
        global $FATAL;
+
        if (empty($extra)) {
                // Regular text message to add to $FATAL
                $FATAL[] = $message;
        } else {
                // $message is text with a mask plus extras to insert into the text
-               $FATAL[] = sprintf($message, $extra);
+               $message = sprintf($message, $extra);
+               $FATAL[] = $message;
        }
+
+       // Log fatal messages away
+       DEBUG_LOG(__FUNCTION__, __LINE__, " message={$message}");
 }
 
 // Load a template file and return it's content (only it's name; do not use ' or ")
@@ -212,27 +240,27 @@ function LOAD_TEMPLATE($template, $return=false, $content=array()) {
        $ret = "";
        if (empty($GLOBALS['refid'])) $GLOBALS['refid'] = 0;
 
-       // @DEPRECATED Try to remove this if() block
+       // @DEPRECATED Try to rewrite the if() condition
        if ($template == "member_support_form") {
                // Support request of a member
-               $result = SQL_QUERY_ESC("SELECT gender, surname, family, email FROM "._MYSQL_PREFIX."_user_data WHERE userid=%s LIMIT 1",
-                array($GLOBALS['userid']), __FILE__, __LINE__);
+               $result = SQL_QUERY_ESC("SELECT userid, gender, surname, family, email FROM "._MYSQL_PREFIX."_user_data WHERE userid=%s LIMIT 1",
+                       array($GLOBALS['userid']), __FILE__, __LINE__);
 
-               // @TODO Merge this data into $content
-               list($gender, $surname, $family, $email) = SQL_FETCHROW($result);
+               // Is content an array?
+               if (is_array($content)) {
+                       // Merge data
+                       $content = array_merge($content, SQL_FETCHARRAY($result));
 
-               // Translate gender
-               $gender = TRANSLATE_GENDER($gender);
+                       // Translate gender
+                       $content['gender'] = TRANSLATE_GENDER($content['gender']);
+               } else {
+                       // DEPRECATED: Load data in direct variables
+                       list($gender, $surname, $family, $email) = SQL_FETCHROW($result);
 
-               // 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
+                       // Translate gender
+                       $gender = TRANSLATE_GENDER($gender);
+                       DEBUG_LOG(__FUNCTION__, __LINE__, sprintf("DEPRECATION-WARNING: content is not array (%s).", gettype($content)));
+               }
 
                // Free result
                SQL_FREERESULT($result);
@@ -333,6 +361,10 @@ function LOAD_TEMPLATE($template, $return=false, $content=array()) {
 <br /><br />";
        }
 
+       // Remove content and data
+       unset($content);
+       unset($DATA);
+
        // Do we have some content to output or return?
        if (!empty($ret)) {
                // Not empty so let's put it out! ;)
@@ -410,6 +442,10 @@ function SEND_EMAIL($TO, $SUBJECT, $MSG, $HTML = "N", $FROM = "") {
        $eval = "\$TO = \"".COMPILE_CODE(addslashes($TO))."\";";
        eval($eval);
 
+       // Compile "MSG"
+       $eval = "\$MSG = \"".COMPILE_CODE(addslashes($MSG))."\";";
+       eval($eval);
+
        // Fix HTML parameter (default is no!)
        if (empty($HTML)) $HTML = "N";
        if (isBooleanConstantAndTrue('DEBUG_MODE')) {
@@ -422,16 +458,16 @@ Message : ".$MSG."
 </pre>\n";
 
                // Log the mail away
-               if (defined('DEBUG_MAIL')) DEBUG_LOG(__FUNCTION__.":to={$TO},subject={$SUBJECT},msg={$MSG}");
+               if (defined('DEBUG_MAIL')) DEBUG_LOG(__FUNCTION__, __LINE__, "to={$TO},subject={$SUBJECT},msg={$MSG}");
        } elseif (($HTML == "Y") && (EXT_IS_ACTIVE("html_mail"))) {
                // Send mail as HTML away
                SEND_HTML_EMAIL($TO, $SUBJECT, $MSG, $FROM);
        } elseif (!empty($TO)) {
                // Send Mail away
-               SEND_RAW_EMAIL($TO, COMPILE_CODE($SUBJECT), COMPILE_CODE($MSG), $FROM);
+               SEND_RAW_EMAIL($TO, $SUBJECT, $MSG, $FROM);
        } elseif ($HTML == "N") {
                // Problem found!
-               SEND_RAW_EMAIL(WEBMASTER, COMPILE_CODE($SUBJECT), COMPILE_CODE($MSG), $FROM);
+               SEND_RAW_EMAIL(WEBMASTER, "[PROBLEM:]".$SUBJECT, $MSG, $FROM);
        }
 }
 
@@ -503,13 +539,13 @@ function GEN_PASS($LEN = 0) {
        $PASS = "";
        for ($i = 0; $i < $LEN; $i++) {
                $PASS .= $ABC[mt_rand(0, sizeof($ABC) -1)];
-       }
+       } // END - for
 
        // When the size is below 40 we can also add additional security by scrambling it
        if (strlen($PASS) <= 40) {
                // Also scramble the password
                $PASS = scrambleString($PASS);
-       }
+       } // END - if
 
        // Return the password
        return $PASS;
@@ -533,6 +569,9 @@ function MAKE_DATETIME ($time, $mode="0")
                        case "1": $ret = strtolower(date("d.m.Y - H:i", $time)); break;
                        case "2": $ret = date("d.m.Y|H:i", $time); break;
                        case "3": $ret = date("d.m.Y", $time); break;
+                       default:
+                               DEBUG_LOG(__FUNCTION__, __LINE__, sprintf("Invalid date mode %s detected.", $mode));
+                               break;
                }
                break;
 
@@ -542,37 +581,39 @@ function MAKE_DATETIME ($time, $mode="0")
                        case "1": $ret = date("Y-m-d - g:i A", $time); break;
                        case "2": $ret = date("y-m-d|H:i", $time); break;
                        case "3": $ret = date("y-m-d", $time); break;
+                       default:
+                               DEBUG_LOG(__FUNCTION__, __LINE__, sprintf("Invalid date mode %s detected.", $mode));
+                               break;
                }
        }
        return $ret;
 }
 
 // Translates the american decimal dot into a german comma
-function TRANSLATE_COMMA ($dotted, $cut=true) {
+function TRANSLATE_COMMA ($dotted, $cut=true, $max=0) {
        global $_CONFIG;
 
        // Default is 3 you can change this in admin area "Misc -> Misc Options"
        if (empty($_CONFIG['max_comma'])) $_CONFIG['max_comma'] = "3";
+
+       // Use from config is default
        $maxComma = $_CONFIG['max_comma'];
 
+       // Use from parameter?
+       if ($max > 0) $maxComma = $max;
+
        // Cut zeros off?
-       if ($cut) {
+       if (($cut) && ($max == 0)) {
                // Test for commata if in cut-mode
                $com = explode(".", $dotted);
-               if (count($com) > 1) {
-                       // Commata found, so only zeros?
-                       if ($com[1] == str_repeat("0", strlen($com[1]))) {
-                               // Only zeros, so display only one
-                               $maxComma = 1;
-                       } // END - if
-               } else {
+               if (count($com) < 2) {
                        // Don't display commatas even if there are none... ;-)
                        $maxComma = 0;
                }
        } // END - if
 
        // Debug log
-       //DEBUG_LOG(__FUNCTION__.":dotted={$dotted},maxComma={$maxComma}");
+       //* DEBUG: */ DEBUG_LOG(__FUNCTION__, __LINE__, "dotted={$dotted},maxComma={$maxComma}");
 
        // Translate it now
        switch (GET_LANGUAGE()) {
@@ -657,6 +698,7 @@ function TRANSLATE_STATUS($status) {
                break;
 
        default:
+               DEBUG_LOG(__FUNCTION__, __LINE__, sprintf("Unknown status %s detected.", $status));
                $ret = UNKNOWN_STATUS_1.$status.UNKNOWN_STATUS_2;
                break;
        }
@@ -723,8 +765,11 @@ function LOAD_EMAIL_TEMPLATE($template, $content=array(), $UID="0") {
 
        // Is the admin logged in?
        if (IS_ADMIN()) {
+               // Get admin id
+               $aid = GET_ADMIN_ID(get_session('admin_login'));
+
                // Load Admin data
-               $ADMIN = GET_ADMIN_EMAIL(get_session('admin_login'));
+               $ADMIN = GET_ADMIN_EMAIL($aid);
        } // END - if
 
        // Neutral email address is default
@@ -849,6 +894,10 @@ function LOAD_EMAIL_TEMPLATE($template, $content=array(), $UID="0") {
                if (function_exists('error_get_last')) $newContent .= "\n--------------------------------------\nDebug:\n".print_r(error_get_last(), true)."--------------------------------------\nPlease don't alter these informations!\nThanx.";
        } // END - if
 
+       // Remove content and data
+       unset($content);
+       unset($DATA);
+
        // Return compiled content
        return COMPILE_CODE($newContent);
 }
@@ -866,15 +915,15 @@ function MAKE_TIME($H, $M, $S, $stamp) {
 function LOAD_URL($URL, $addUrlData=true) {
        global $CSS, $_CONFIG, $footer;
 
+       // Compile out URI codes
+       $URL = COMPILE_CODE($URL);
+
        // Check if http(s):// is there
        if ((substr($URL, 0, 7) != "http://") && (substr($URL, 0, 8) != "https://")) {
                // Make all URLs full-qualified
                $URL = URL."/".$URL;
        }
 
-       // Compile out URI codes
-       $URL = COMPILE_CODE($URL);
-
        // Get output buffer
        $OUTPUT = ob_get_contents();
 
@@ -914,11 +963,8 @@ function COMPILE_CODE($code, $simple = false, $constants = true, $full = true) {
        global $SEC_CHARS, $URL_CHARS;
        // Is the code a string?
        if (!is_string($code)) {
-               // Abort here with backtrace
-               DEBUG_LOG(__FUNCTION__.": code is not string!");
-               print "<pre>";
-               debug_print_backtrace();
-               die("</pre>");
+               // Silently return it
+               return $code;
        } // END - if
 
        $ARRAY = $SEC_CHARS;
@@ -1232,7 +1278,10 @@ function bigintval($num, $castValue = true) {
        // Has the whole value changed?
        if ("".$ret."" != "".$num."") {
                // Log the values
-               DEBUG_LOG(__FUNCTION__.": num={$num},ret={$ret}");
+               print("<pre>");
+               debug_print_backtrace();
+               die("</pre>");
+               DEBUG_LOG(__FUNCTION__, __LINE__, " num={$num},ret={$ret}");
        } // END - if
 
        // Return result
@@ -1294,7 +1343,7 @@ function CREATE_TIME_SELECTIONS($timestamp, $prefix="", $display="", $align="cen
        global $_CONFIG;
 
        // Calculate 2-seconds timestamp
-       $stamp = round($timestamp / 2) * 2;
+       $stamp = round($timestamp);
 
        // Do we have a leap year?
        $SWITCH = 0;
@@ -1704,6 +1753,7 @@ function POST_URL ($script, $postData) {
        // Is postData an array?
        if (!is_array($postData)) {
                // Abort here
+               DEBUG_LOG(__FUNCTION__, __LINE__, sprintf("postData is not an array. Type: %s", gettype($postData)));
                return array("", "", "");
        } // END - if
 
@@ -1951,8 +2001,8 @@ function generateHash ($plainText, $salt = "") {
 
        // Is the required extension "sql_patches" there and a salt is not given?
        if (((EXT_VERSION_IS_OLDER("sql_patches", "0.3.6")) || (!EXT_IS_ACTIVE("sql_patches"))) && (empty($salt))) {
-               // Extension sql_patches is missing/outdated so we return the plain text
-               return $plainText;
+               // Extension sql_patches is missing/outdated so we hash the plain text with MD5
+               return md5($plainText);
        } // END - if
 
        // Do we miss an arry element here?
@@ -1972,7 +2022,7 @@ function generateHash ($plainText, $salt = "") {
                $keys   = SITE_KEY.":".DATE_KEY.":".$_CONFIG['secret_key'].":".$_CONFIG['file_hash'].":".date("d-m-Y (l-F-T)", bigintval($_CONFIG['patch_ctime'])).":".$_CONFIG['master_salt'];
 
                // Additional data
-               $data = $plainText.":".uniqid(rand(), true).":".time();
+               $data = $plainText.":".uniqid(mt_rand(), true).":".time();
 
                // Calculate number for generating the code
                $a = time() + _ADD - 1;
@@ -2078,7 +2128,7 @@ function genScrambleString($len) {
        $scrambleString = implode(":", $scrambleNumbers);
        return $scrambleString;
 }
-// Append data like session ID referral ID to the given URL which would
+// Append data like session ID or referal ID to the given URL which would
 // normally be stored in cookies
 function ADD_URL_DATA($URL) {
        global $_CONFIG;
@@ -2185,7 +2235,7 @@ function mxchange_die ($msg) {
 
 // Display parsing time and number of SQL queries in footer
 function DISPLAY_PARSING_TIME_FOOTER() {
-       global $startTime, $_CONFIG;
+       global $_CONFIG;
        $endTime = microtime(true);
 
        // Is the timer started?
@@ -2332,12 +2382,12 @@ function merge_array ($array1, $array2) {
        die("</pre>");
 }
 // Debug message logger
-function DEBUG_LOG ($message, $force=false) {
+function DEBUG_LOG ($file, $line, $message, $force=true) {
        // Is debug mode enabled?
        if ((isBooleanConstantAndTrue('DEBUG_MODE')) || ($force)) {
                // Log this message away
                $fp = fopen(PATH."inc/cache/debug.log", 'a') or mxchange_die("Cannot write logfile debug.log!");
-               fwrite($fp, date("d.m.Y|H:i:s", time())."|".strip_tags($message)."\n");
+               fwrite($fp, date("d.m.Y|H:i:s", time())."|".basename(__FILE__)."|".__LINE__."|".strip_tags($message)."\n");
                fclose($fp);
        } // END - if
 }
@@ -2377,6 +2427,9 @@ function GET_DIR_AS_ARRAY ($baseDir, $prefix) {
        // Close directory
        closedir($dirPointer);
 
+       // Sort array
+       asort($INCs);
+
        // Return array with include files
        return $INCs;
 }
@@ -2393,6 +2446,9 @@ function RESET_ADD_INCLUDES () {
        // Get more daily reset scripts
        $INC_POOL = GET_DIR_AS_ARRAY(PATH."inc/reset/", "reset_");
 
+       // Update database
+       if (!defined('DEBUG_RESET')) UPDATE_CONFIG("last_update", time());
+
        // Create current week mark
        $currWeek = date("W", time());
 
@@ -2402,7 +2458,7 @@ function RESET_ADD_INCLUDES () {
                $INC_POOL = array_merge($INC_POOL, GET_DIR_AS_ARRAY(PATH."inc/weekly/", "weekly_"));
 
                // Update config
-               UPDATE_CONFIG("last_week", $currWeek);
+               if (!defined('DEBUG_WEEKLY')) UPDATE_CONFIG("last_week", $currWeek);
        } // END - if
 
        // Create current month mark
@@ -2414,7 +2470,7 @@ function RESET_ADD_INCLUDES () {
                $INC_POOL = array_merge($INC_POOL, GET_DIR_AS_ARRAY(PATH."inc/monthly/", "monthly_"));
 
                // Update config
-               UPDATE_CONFIG("last_month", $currMonth);
+               if (!defined('DEBUG_MONTHLY')) UPDATE_CONFIG("last_month", $currMonth);
        } // END - if
 
        // Return array
@@ -2460,31 +2516,31 @@ function FILE_READABLE($fqfn) {
 // Converts timestamp selections into a timestamp
 function CONVERT_SELECTIONS_TO_TIMESTAMP(&$POST, &$DATA, &$id, &$skip) {
        // Init test variable
-       $TEST2 = "";
+       $test2 = "";
 
        // Get last three chars
-       $TEST = substr($id, -3);
+       $test = substr($id, -3);
 
        // Improved way of checking! :-)
-       if (in_array($TEST, array("_ye", "_mo", "_we", "_da", "_ho", "_mi", "_se"))) {
+       if (in_array($test, array("_ye", "_mo", "_we", "_da", "_ho", "_mi", "_se"))) {
                // Found a multi-selection for timings?
-               $TEST = substr($id, 0, -3);
-               if ((isset($POST[$TEST."_ye"])) && (isset($POST[$TEST."_mo"])) && (isset($POST[$TEST."_we"])) && (isset($POST[$TEST."_da"])) && (isset($POST[$TEST."_ho"])) && (isset($POST[$TEST."_mi"])) && (isset($POST[$TEST."_se"])) && ($TEST != $TEST2)) {
+               $test = substr($id, 0, -3);
+               if ((isset($POST[$test."_ye"])) && (isset($POST[$test."_mo"])) && (isset($POST[$test."_we"])) && (isset($POST[$test."_da"])) && (isset($POST[$test."_ho"])) && (isset($POST[$test."_mi"])) && (isset($POST[$test."_se"])) && ($test != $test2)) {
                        // Generate timestamp
-                       $POST[$TEST] = CREATE_TIMESTAMP_FROM_SELECTIONS($TEST, $POST);
-                       $DATA[] = "$TEST='".$POST[$TEST]."'";
+                       $POST[$test] = CREATE_TIMESTAMP_FROM_SELECTIONS($test, $POST);
+                       $DATA[] = sprintf("%s='%s'", $test, $POST[$test]);
 
                        // Remove data from array
                        foreach (array("ye", "mo", "we", "da", "ho", "mi", "se") as $rem) {
-                               unset($POST[$TEST."_".$rem]);
+                               unset($POST[$test."_".$rem]);
                        } // END - foreach
 
                        // Skip adding
-                       unset($id); $skip = true; $TEST2 = $TEST;
+                       unset($id); $skip = true; $test2 = $test;
                } // END - if
        } else {
                // Process this entry
-               $skip = false; $TEST2 = "";
+               $skip = false; $test2 = "";
        }
 }
 // Reverts the german decimal comma into Computer decimal dot
@@ -2562,7 +2618,7 @@ function REBUILD_CACHE ($cache, $inc="") {
                                require($fqfn);
                        } else {
                                // Include not found!
-                               DEBUG_LOG(__FUNCTION__.":Include {$inc} not found. cache={$cache}");
+                               DEBUG_LOG(__FUNCTION__, __LINE__, "Include {$inc} not found. cache={$cache}");
                        }
                } // END - if
        } // END - if
@@ -2577,7 +2633,7 @@ function CACHE_PURGE_ADMIN_MENU ($id=0, $action="", $what="", $str="") {
                return false;
        } elseif (!is_object($cacheInstance)) {
                // No cache instance!
-               DEBUG_LOG(__FUNCTION__.": No cache instance found.");
+               DEBUG_LOG(__FUNCTION__, __LINE__, " No cache instance found.");
                return false;
        } elseif ((!isset($_CONFIG['cache_admin_menu'])) || ($_CONFIG['cache_admin_menu'] == "N")) {
                // Caching disabled (currently experiemental!)
@@ -2660,7 +2716,97 @@ function GET_REFERER () {
        // Return it
        return $referer;
 }
-//
+
+// Adds a bonus mail to the queue
+// This is a high-level function!
+function ADD_NEW_BONUS_MAIL ($data, $mode="", $output=true) {
+       // Use mode from data if not set and availble ;-)
+       if ((empty($mode)) && (isset($data['mode']))) $mode = $data['mode'];
+
+       // Generate receiver list
+       $RECEIVER = GENERATE_RECEIVER_LIST($data['cat'], $data['receiver'], $mode);
+
+       // Receivers added?
+       if (!empty($RECEIVER)) {
+               // Add bonus mail to queue
+               ADD_BONUS_MAIL_TO_QUEUE(
+                       $data['subject'],
+                       $data['text'],
+                       $RECEIVER,
+                       $data['points'],
+                       $data['seconds'],
+                       $data['url'],
+                       $data['cat'],
+                       $mode,
+                       $data['receiver']
+               );
+
+               // Mail inserted into bonus pool
+               if ($output) LOAD_TEMPLATE("admin_settings_saved", false, ADMIN_BONUS_SEND);
+       } elseif ($output) {
+               // More entered than can be reached!
+               LOAD_TEMPLATE("admin_settings_saved", false, ADMIN_MORE_SELECTED);
+       } else {
+               // Debug log
+               DEBUG_LOG(__FUNCTION__, __LINE__, " cat={$data['cat']},receiver={$data['receiver']},data=".base64_encode(serialize($data))." More selected, than available!");
+       }
+}
+// Determines referal id and sets it
+function DETERMINE_REFID () {
+       global $_CONFIG, $CLICK, $_SERVER;
+
+       // Check if refid is set
+       if ((!empty($_GET['user'])) && ($CLICK == 1) && (basename($_SERVER['PHP_SELF']) == "click.php")) {
+               // The variable user comes from the click-counter script click.php and we only accept this here
+               $GLOBALS['refid'] = bigintval($_GET['user']);
+       } elseif (!empty($_POST['refid'])) {
+               // Get referal id from variable refid (so I hope this makes my script more compatible to other scripts)
+               $GLOBALS['refid'] = SQL_ESCAPE(strip_tags($_POST['refid']));
+       } elseif (!empty($_GET['refid'])) {
+               // Get referal id from variable refid (so I hope this makes my script more compatible to other scripts)
+               $GLOBALS['refid'] = SQL_ESCAPE(strip_tags($_GET['refid']));
+       } elseif (!empty($_GET['ref'])) {
+               // Set refid=ref (the referal link uses such variable)
+               $GLOBALS['refid'] = SQL_ESCAPE(strip_tags($_GET['ref']));
+       } elseif ((isSessionVariableSet('refid')) && (get_session('refid') != 0)) {
+               // Set session refid als global
+               $GLOBALS['refid'] = bigintval(get_session('refid'));
+       } elseif ((GET_EXT_VERSION("sql_patches") != "") && ($_CONFIG['def_refid'] > 0)) {
+               // Set default refid as refid in URL
+               $GLOBALS['refid'] = bigintval($_CONFIG['def_refid']);
+       } elseif ((GET_EXT_VERSION("user") >= "0.3.4") && ($_CONFIG['select_user_zero_refid']) == "Y") {
+               // Select a random user which has confirmed enougth mails
+               $GLOBALS['refid'] = SELECT_RANDOM_REFID();
+       } else {
+               // No default ID when sql_patches is not installed or none set
+               $GLOBALS['refid'] = 0;
+       }
+
+       // Set cookie when default refid > 0
+       if (!isSessionVariableSet('refid') || (!empty($GLOBALS['refid'])) || ((get_session('refid') == "0") && (isset($_CONFIG['def_refid'])) && ($_CONFIG['def_refid'] > 0))) {
+               // Set cookie
+               set_session('refid', $GLOBALS['refid']);
+       } // END - if
+}
+
+// Destroys the admin session
+function DESTROY_ADMIN_SESSION () {
+       // Kill maybe existing session variables including array elements
+       set_session('admin_login'       , "");
+       set_session('admin_md5'         , "");
+       set_session('admin_last'        , "");
+       set_session('admin_to'          , "");
+
+       // Destroy session and return status
+       return @session_destroy();
+}
+
+// Checks if a given apache module is loaded
+function IF_APACHE_MODULE_LOADED ($apacheModule) {
+       // Check it and return result
+       return (((function_exists('apache_get_modules')) && (in_array($apacheModule, apache_get_modules()))) || (!function_exists('apache_get_modules')));
+}
+
 //////////////////////////////////////////////////
 //                                              //
 // AUTOMATICALLY RE-GENERATED MISSING FUNCTIONS //