generateHash() does now hash with md5() if sql_patches is missing or out-dated
[mailer.git] / inc / functions.php
index 318af2c2262240efe73ee8b02eeda1682c680d58..64d80b098bdd0685fb6e3f69cbea2cbb3f3dadb6 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);
@@ -134,7 +143,7 @@ function OUTPUT_HTML($HTML, $NEW_LINE = true) {
                ob_end_clean();
 
                // Extension "rewrite" installed?
-               if ((EXT_IS_ACTIVE("rewrite", true)) && (function_exists('REWRITE_LINKS')) && ($CSS != "1") && ($CSS != "-1")) {
+               if ((EXT_IS_ACTIVE("rewrite")) && (function_exists('REWRITE_LINKS')) && ($CSS != "1") && ($CSS != "-1")) {
                        $OUTPUT = REWRITE_LINKS($OUTPUT);
                } // END - if
 
@@ -157,7 +166,7 @@ function OUTPUT_HTML($HTML, $NEW_LINE = true) {
                OUTPUT_RAW($OUTPUT);
        } elseif ((OUTPUT_MODE == "render") && (!empty($OUTPUT))) {
                // Rewrite links when rewrite extension is active
-               if ((EXT_IS_ACTIVE("rewrite", true)) && (function_exists('REWRITE_LINKS')) && ($CSS != "1") && ($CSS != "-1")) {
+               if ((EXT_IS_ACTIVE("rewrite")) && (function_exists('REWRITE_LINKS')) && ($CSS != "1") && ($CSS != "-1")) {
                        $OUTPUT = REWRITE_LINKS($OUTPUT);
                } // END - if
 
@@ -187,17 +196,22 @@ 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 ")
-function LOAD_TEMPLATE($template, $return=false, $content="") {
+function LOAD_TEMPLATE($template, $return=false, $content=array()) {
        // Add more variables which you want to use in your template files
        global $DATA, $_CONFIG, $username;
 
@@ -218,25 +232,24 @@ function LOAD_TEMPLATE($template, $return=false, $content="") {
                $result = SQL_QUERY_ESC("SELECT 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);
+               }
 
                // Free result
                SQL_FREERESULT($result);
-       }
+       } // END - if
 
        // Generate date/time string
        $date_time = MAKE_DATETIME(time(), "1");
@@ -321,18 +334,22 @@ function LOAD_TEMPLATE($template, $return=false, $content="") {
 
                // Add surrounding HTML comments to help finding bugs faster
                $ret = "<!-- Template ".$template." - Start -->\n".$ret."<!-- Template ".$template." - End -->\n";
-       } elseif ((IS_ADMIN()) || ((isBooleanConstantAndTrue('mxchange_installing')) && (!defined('mxchange_installed')))) {
+       } elseif ((IS_ADMIN()) || ((isBooleanConstantAndTrue('mxchange_installing')) && (!isBooleanConstantAndTrue('mxchange_installed')))) {
                // Only admins shall see this warning or when installation mode is active
                $ret = "<br /><SPAN class=\"guest_failed\">".TEMPLATE_404."</SPAN><br />
 (".basename($file).")<br />
 <br />
 ".TEMPLATE_CONTENT."
-<PRE>".print_r($content, true)."</PRE>
+<pre>".print_r($content, true)."</pre>
 ".TEMPLATE_DATA."
-<PRE>".print_r($DATA, true)."</PRE>
+<pre>".print_r($DATA, true)."</pre>
 <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! ;)
@@ -350,20 +367,23 @@ function LOAD_TEMPLATE($template, $return=false, $content="") {
 }
 
 // Send mail out to an email address
-function SEND_EMAIL($TO, $SUBJECT, $MSG, $HTML = 'N', $FROM = "") {
+function SEND_EMAIL($TO, $SUBJECT, $MSG, $HTML = "N", $FROM = "") {
+       //* DEBUG: */ print __FUNCTION__."(<font color=\"#0000aa\">".__LINE__."</font>):TO={$TO},SUBJECT={$SUBJECT}<br />\n";
+
        // Compile subject line (for POINTS constant etc.)
        $eval = "\$SUBJECT = html_entity_decode(\"".COMPILE_CODE(addslashes($SUBJECT))."\");";
        eval($eval);
 
        // Set from header
        if ((!eregi("@", $TO)) && ($TO > 0)) {
-               // Value detected, load email from database
+               // Value detected, is the message extension installed?
                if (EXT_IS_ACTIVE("msg")) {
                        ADD_MESSAGE_TO_BOX($TO, $SUBJECT, $MSG, $HTML);
                        return;
                } else {
                        // Load email address
                        $result_email = SQL_QUERY_ESC("SELECT email FROM "._MYSQL_PREFIX."_user_data WHERE userid=%s LIMIT 1", array(bigintval($TO)), __FILE__, __LINE__);
+                       //* DEBUG: */ print __FUNCTION__."(<font color=\"#0000aa\">".__LINE__."</font>):numRows=".SQL_NUMROWS($result_email)."<br />\n";
 
                        // Does the user exist?
                        if (SQL_NUMROWS($result_email)) {
@@ -381,6 +401,7 @@ function SEND_EMAIL($TO, $SUBJECT, $MSG, $HTML = 'N', $FROM = "") {
                // Is the webmaster!
                $TO = WEBMASTER;
        }
+       //* DEBUG: */ print __FUNCTION__."(<font color=\"#0000aa\">".__LINE__."</font>):TO={$TO}<br />\n";
 
        // Check for PHPMailer or debug-mode
        if (!CHECK_PHPMAILER_USAGE()) {
@@ -406,25 +427,32 @@ 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')) {
                // In debug mode we want to display the mail instead of sending it away so we can debug this part
-               echo "<PRE>
+               echo "<pre>
 ".htmlentities(trim($FROM))."
 To      : ".$TO."
 Subject : ".$SUBJECT."
 Message : ".$MSG."
-</PRE>\n";
-       } elseif (($HTML == "Y") && (EXT_IS_ACTIVE("html_mail", true))) {
+</pre>\n";
+
+               // Log the mail away
+               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);
        }
 }
 
@@ -467,7 +495,7 @@ function SEND_RAW_EMAIL ($to, $subject, $msg, $from) {
                        $mail->WordWrap   = 70;
                        $mail->IsHTML(true);
                } else {
-                       $mail->Body       = $msg;
+                       $mail->Body       = html_entity_decode($msg);
                }
                $mail->AddAddress($to, "");
                $mail->AddReplyTo(WEBMASTER,MAIN_TITLE);
@@ -476,7 +504,7 @@ function SEND_RAW_EMAIL ($to, $subject, $msg, $from) {
                $mail->Send();
        } else {
                // Use legacy mail() command
-               @mail($to, $subject, $msg, $from);
+               @mail($to, $subject, html_entity_decode($msg), $from);
        }
 }
 //
@@ -541,13 +569,18 @@ function MAKE_DATETIME ($time, $mode="0")
 }
 
 // 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) {
                // Test for commata if in cut-mode
@@ -555,8 +588,8 @@ function TRANSLATE_COMMA ($dotted, $cut=true) {
                if (count($com) > 1) {
                        // Commata found, so only zeros?
                        if ($com[1] == str_repeat("0", strlen($com[1]))) {
-                               // Only zeros, so don't display them
-                               $maxComma = 0;
+                               // Only zeros, so display only one
+                               $maxComma = 1;
                        } // END - if
                } else {
                        // Don't display commatas even if there are none... ;-)
@@ -565,7 +598,7 @@ function TRANSLATE_COMMA ($dotted, $cut=true) {
        } // END - if
 
        // Debug log
-       //DEBUG_LOG(__FUNCTION__.":dotted={$dotted},maxComma={$maxComma}");
+       //DEBUG_LOG(__FUNCTION__, __LINE__, "dotted={$dotted},maxComma={$maxComma}");
 
        // Translate it now
        switch (GET_LANGUAGE()) {
@@ -584,7 +617,13 @@ function TRANSLATE_COMMA ($dotted, $cut=true) {
 
 //
 function DEREFERER ($URL) {
-       $URL = URL."/modules.php?module=loader&amp;url=".urlencode(base64_encode(gzcompress($URL)));
+       // Don't de-refer our own links!
+       if (substr($URL, 0, strlen(URL)) != URL) {
+               // De-refer this link
+               $URL = URL."/modules.php?module=loader&amp;url=".urlencode(base64_encode(gzcompress($URL)));
+       } // END - if
+
+       // Return link
        return $URL;
 }
 
@@ -600,24 +639,6 @@ function TRANSLATE_GENDER ($gender) {
        return $ret;
 }
 //
-function GET_POOL_TYPE($PT) {
-       // 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;
-}
-//
 function FRAMETESTER($URL) {
        // Prepare frametester URL
        $frametesterUrl = sprintf("%s/modules.php?module=frametester&amp;url=%s",
@@ -656,6 +677,11 @@ function TRANSLATE_STATUS($status) {
                $ret = ACCOUNT_LOCKED;
                break;
 
+       case "":
+       case null:
+               $ret = ACCOUNT_DELETED;
+               break;
+
        default:
                $ret = UNKNOWN_STATUS_1.$status.UNKNOWN_STATUS_2;
                break;
@@ -702,7 +728,7 @@ function SET_LANGUAGE($lang) {
        set_session("mx_lang", $lang);
 }
 //
-function LOAD_EMAIL_TEMPLATE($template, $content="", $UID="0") {
+function LOAD_EMAIL_TEMPLATE($template, $content=array(), $UID="0") {
        global $DATA, $_CONFIG, $REPLACER;
 
        // Make sure all template names are lowercase!
@@ -714,25 +740,25 @@ function LOAD_EMAIL_TEMPLATE($template, $content="", $UID="0") {
        // 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     = GET_REMOTE_ADDR();
+       $HTTP_USER_AGENT = GET_USER_AGENT();
 
+       // Default admin
        $ADMIN = MAIN_TITLE;
-       if (isSessionVariableSet('admin_login')) {
+
+       // Is the admin logged in?
+       if (IS_ADMIN()) {
+               // Get admin id
+               $aid = GET_ADMIN_ID(get_session('admin_login'));
+
                // Load Admin data
-               $result = SQL_QUERY_ESC("SELECT email FROM "._MYSQL_PREFIX."_admins WHERE login='%s' LIMIT 1",
-                       array(get_session('admin_login')), __FILE__, __LINE__);
-               list($ADMIN) = SQL_FETCHROW($result);
-               SQL_FREERESULT($result);
+               $ADMIN = GET_ADMIN_EMAIL($aid);
        } // END - if
 
+       // Neutral email address is default
+       $email = WEBMASTER;
+
        // Expiration in a nice output format
        if ($_CONFIG['auto_purge'] == 0) {
                // Will never expire!
@@ -752,40 +778,39 @@ function LOAD_EMAIL_TEMPLATE($template, $content="", $UID="0") {
        } // END - if
 
        // Load user's data
+       //* DEBUG: */ print __FUNCTION__."(<font color=\"#0000aa\">".__LINE__."</font>):UID={$UID},template={$template}<br />\n";
        if ($UID > 0) {
                if (EXT_IS_ACTIVE("nickname")) {
+                       //* DEBUG: */ print __FUNCTION__."(<font color=\"#0000aa\">".__LINE__."</font>):NICKNAME!<br />\n";
                        // Load nickname
                        $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
+                       //* DEBUG: */ print __FUNCTION__."(<font color=\"#0000aa\">".__LINE__."</font>):NO-NICK!<br />\n";
+                       /// Load normal data
                        $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);
                }
-       } else {
-               // Neutral gender and email address is default
-               $gender = "N";
-               $email = WEBMASTER;
-       }
 
-       // Translate M to male or F to female
-       $gender = TRANSLATE_GENDER($gender);
+               // Is content an array?
+               //* DEBUG: */ print __FUNCTION__."(<font color=\"#0000aa\">".__LINE__."</font>):content[]=".gettype($content)."<br />\n";
+               if (is_array($content)) {
+                       // Fetch and migrate data
+                       //* DEBUG: */ print __FUNCTION__."(<font color=\"#0000aa\">".__LINE__."</font>):content()=".count($content)." - PRE<br />\n";
+                       $content = array_merge($content, SQL_FETCHARRAY($result));
+                       //* DEBUG: */ print __FUNCTION__."(<font color=\"#0000aa\">".__LINE__."</font>):content()=".count($content)." - AFTER<br />\n";
+               } // END - if
 
-       // 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;
+               // Free result
+               SQL_FREERESULT($result);
        } // END - if
 
+       // Translate M to male or F to female if present
+       if (isset($content['gender'])) $content['gender'] = TRANSLATE_GENDER($content['gender']);
+
+       // Overwrite email from data if present
+       if (isset($content['email']))  $email = $content['email'];
+
        // Store email for some functions in global data array
        $DATA['email'] = $email;
 
@@ -824,22 +849,19 @@ function LOAD_EMAIL_TEMPLATE($template, $content="", $UID="0") {
        $newContent = "";
        if (FILE_READABLE($file)) {
                // The local file does exists so we load it. :)
-               $tmpl_file = @implode("", @file($file));
+               $tmpl_file = implode("", file($file));
                $tmpl_file = addslashes($tmpl_file);
 
                // Run code
-               $tmpl_file = "\$newContent=\"".COMPILE_CODE($tmpl_file)."\";";
-               eval($tmpl_file);
-
-               // Replace HTML conform chars
-               $newContent = html_entity_decode($newContent);
+               $tmpl_file = "\$newContent=html_entity_decode(\"".COMPILE_CODE($tmpl_file)."\");";
+               @eval($tmpl_file);
        } elseif (!empty($template)) {
                // Template file not found!
                $newContent = TEMPLATE_404.": ".$template."<br />
 ".TEMPLATE_CONTENT."
-<PRE>".print_r($newContent, true)."</PRE>
+<pre>".print_r($content, true)."</pre>
 ".TEMPLATE_DATA."
-<PRE>".print_r($DATA, true)."</PRE>
+<pre>".print_r($DATA, true)."</pre>
 <br /><br />";
 
                // Debug mode not active? Then remove the HTML tags
@@ -852,9 +874,14 @@ function LOAD_EMAIL_TEMPLATE($template, $content="", $UID="0") {
        // Is there some content?
        if (empty($newContent)) {
                // Compiling failed
-               $newContent = "Compiler error for template {$template}!";
+               $newContent = "Compiler error for template {$template}!\nUncompiled content:\n".$tmpl_file;
+               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);
 }
@@ -884,14 +911,16 @@ function LOAD_URL($URL, $addUrlData=true) {
        // Get output buffer
        $OUTPUT = ob_get_contents();
 
-       // Clear it
-       ob_end_clean();
+       // Clear it only if there is content
+       if (!empty($OUTPUT)) {
+               ob_end_clean();
+       } // END - if
 
        // Add some data to URL if cookies are not accepted
        if (((!defined('__COOKIES')) || (!__COOKIES)) && ($addUrlData)) $URL = ADD_URL_DATA($URL);
 
        // Probe for bot from search engine
-       if ((eregi("spider", getenv('HTTP_USER_AGENT'))) || (eregi("bot", getenv('HTTP_USER_AGENT'))) || (eregi("spider", getenv('HTTP_USER_AGENT')))) {
+       if ((eregi("spider", GET_USER_AGENT())) || (eregi("bot", GET_USER_AGENT())) || (eregi("spider", GET_USER_AGENT()))) {
                // Search engine bot detected so let's rewrite many chars for the link
                $URL = htmlentities(strip_tags($URL), ENT_QUOTES);
 
@@ -903,7 +932,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
@@ -916,6 +945,12 @@ function LOAD_URL($URL, $addUrlData=true) {
 //
 function COMPILE_CODE($code, $simple = false, $constants = true, $full = true) {
        global $SEC_CHARS, $URL_CHARS;
+       // Is the code a string?
+       if (!is_string($code)) {
+               // Silently return it
+               return $code;
+       } // END - if
+
        $ARRAY = $SEC_CHARS;
 
        // Select smaller set of chars to replace when we e.g. want to compile URLs
@@ -925,18 +960,18 @@ function COMPILE_CODE($code, $simple = false, $constants = true, $full = true) {
        if ($constants) {
                // BEFORE 0.2.1 : Language and data constants
                // WITH 0.2.1+  : Only language constants
-               $code = str_replace('{--', '".', str_replace('--}', '."', $code));
+               $code = str_replace('{--','".', str_replace('--}','."', $code));
 
                // BEFORE 0.2.1 : Not used
                // WITH 0.2.1+  : Data constants
-               $code = str_replace('{!', '".', str_replace("!}", '."', $code));
-       }
+               $code = str_replace('{!','".', str_replace("!}", '."', $code));
+       } // END - if
 
        // Compile QUOT and other non-HTML codes
        foreach ($ARRAY['to'] as $k => $to) {
                // Do the reversed thing as in inc/libs/security_functions.php
                $code = str_replace($to, $ARRAY['from'][$k], $code);
-       }
+       } // END - foreach
 
        // But shall I keep simple quotes for later use?
        if ($simple) $code = str_replace("\'", '{QUOT}', $code);
@@ -949,22 +984,43 @@ function COMPILE_CODE($code, $simple = false, $constants = true, $full = true) {
                // Replace all matches
                $matchesFound = array();
                foreach ($matches[0] as $key => $match) {
-                       // Avoid replacing matches multiple times
-                       if (!isset($matchesFound[$match])) {
-                               // Not yet replaced!
-                               $code = str_replace($match, "\".".$match.".\"", $code);
-                               $matchesFound[$match] = 1;
-                       } // END - if
+                       // Fuzzy look has failed by default
+                       $fuzzyFound = false;
+
+                       // Fuzzy look on match if already found
+                       foreach ($matchesFound as $found => $set) {
+                               // Get test part
+                               $test = substr($found, 0, strlen($match));
+
+                               // Does this entry exist?
+                               //* DEBUG: */ print __FUNCTION__."(<font color=\"#0000aa\">".__LINE__."</font>):found={$found},match={$match},set={$set}<br />\n";
+                               if ($test == $match) {
+                                       // Match found!
+                                       //* DEBUG: */ print __FUNCTION__."(<font color=\"#0000aa\">".__LINE__."</font>):fuzzyFound!<br />\n";
+                                       $fuzzyFound = true;
+                                       break;
+                               } // END - if
+                       } // END - foreach
+
+                       // Skip this entry?
+                       if ($fuzzyFound) continue;
 
                        // Take all string elements
-                       if ((is_string($matches[4][$key])) && (!isset($matchesFound[$key."_".$matches[4][$key]]))) {
+                       if ((is_string($matches[4][$key])) && (!isset($matchesFound[$match])) && (!isset($matchesFound[$key."_".$matches[4][$key]]))) {
                                // Replace it in the code
+                               //* DEBUG: */ print __FUNCTION__."(<font color=\"#0000aa\">".__LINE__."</font>):key={$key},match={$match}<br />\n";
                                $newMatch = str_replace("[".$matches[4][$key]."]", "['".$matches[4][$key]."']", $match);
-                               $code = str_replace($match, $newMatch, $code);
+                               $code = str_replace($match, "\".".$newMatch.".\"", $code);
                                $matchesFound[$key."_".$matches[4][$key]] = 1;
-                       } // END - if
-               }
-       }
+                               $matchesFound[$match] = 1;
+                       } elseif (!isset($matchesFound[$match])) {
+                               // Not yet replaced!
+                               //* DEBUG: */ print __FUNCTION__."(<font color=\"#0000aa\">".__LINE__."</font>):match={$match}<br />\n";
+                               $code = str_replace($match, "\".".$match.".\"", $code);
+                               $matchesFound[$match] = 1;
+                       }
+               } // END - foreach
+       } // END - if
 
        // Return compiled code
        return $code;
@@ -1147,7 +1203,7 @@ function GEN_RANDOM_CODE($length, $code, $uid, $DATA="") {
        if (!defined('_MAX')) define('_MAX', 15235);
 
        // Build server string
-       $server = $_SERVER['PHP_SELF'].":".getenv('HTTP_USER_AGENT').":".getenv('SERVER_SOFTWARE').":".getenv('REMOTE_ADDR').":".":".filemtime(PATH."inc/databases.php");
+       $server = $_SERVER['PHP_SELF'].":".GET_USER_AGENT().":".getenv('SERVER_SOFTWARE').":".GET_REMOTE_ADDR().":".":".filemtime(PATH."inc/databases.php");
 
        // Build key string
        $keys   = SITE_KEY.":".DATE_KEY;
@@ -1206,7 +1262,7 @@ function bigintval($num, $castValue = true) {
        // Has the whole value changed?
        if ("".$ret."" != "".$num."") {
                // Log the values
-               DEBUG_LOG(__FUNCTION__.": num={$num},ret={$ret}");
+               DEBUG_LOG(__FUNCTION__, __LINE__, " num={$num},ret={$ret}");
        } // END - if
 
        // Return result
@@ -1265,8 +1321,10 @@ 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) {
+       global $_CONFIG;
+
        // Calculate 2-seconds timestamp
-       $stamp = round($timestamp / 2) * 2;
+       $stamp = round($timestamp);
 
        // Do we have a leap year?
        $SWITCH = 0;
@@ -1275,22 +1333,22 @@ function CREATE_TIME_SELECTIONS($timestamp, $prefix="", $display="", $align="cen
        $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;
+       if ((floor($TEST) == $TEST) && ($M1 == "02") && ($M2 > "02"))  $SWITCH = $_CONFIG['one_day'];
 
        // First of all years...
        $Y = abs(floor($stamp / (31536000 + $SWITCH)));
        // Next months...
        $M = abs(floor($stamp / 2628000 - $Y * 12));
        // Next weeks
-       $W = abs(floor($stamp / 604800 - $Y * ((365 + $SWITCH / ONE_DAY) / 7) - ($M / 12 * (365 + $SWITCH / ONE_DAY) / 7)));
+       $W = abs(floor($stamp / 604800 - $Y * ((365 + $SWITCH / $_CONFIG['one_day']) / 7) - ($M / 12 * (365 + $SWITCH / $_CONFIG['one_day']) / 7)));
        // Next days...
-       $D = abs(floor($stamp / 86400 - $Y * (365 + $SWITCH / ONE_DAY) - ($M / 12 * (365 + $SWITCH / ONE_DAY)) - $W * 7));
+       $D = abs(floor($stamp / 86400 - $Y * (365 + $SWITCH / $_CONFIG['one_day']) - ($M / 12 * (365 + $SWITCH / $_CONFIG['one_day'])) - $W * 7));
        // Next hours...
-       $h = abs(floor($stamp / 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 / $_CONFIG['one_day']) * 24 - ($M / 12 * (365 + $SWITCH / $_CONFIG['one_day']) * 24) - $W * 7 * 24 - $D * 24));
        // Next minutes..
-       $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));
+       $m = abs(floor($stamp / 60 - $Y * (365 + $SWITCH / $_CONFIG['one_day']) * 24 * 60 - ($M / 12 * (365 + $SWITCH / $_CONFIG['one_day']) * 24 * 60) - $W * 7 * 24 * 60 - $D * 24 * 60 - $h * 60));
        // And at last seconds...
-       $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));
+       $s = abs(floor($stamp - $Y * (365 + $SWITCH / $_CONFIG['one_day']) * 24 * 3600 - ($M / 12 * (365 + $SWITCH / $_CONFIG['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)) {
@@ -1449,6 +1507,7 @@ function CREATE_TIME_SELECTIONS($timestamp, $prefix="", $display="", $align="cen
 }
 //
 function CREATE_TIMESTAMP_FROM_SELECTIONS($prefix, $POST) {
+       global $_CONFIG;
        $ret = 0;
 
        // Do we have a leap year?
@@ -1456,7 +1515,7 @@ function CREATE_TIMESTAMP_FROM_SELECTIONS($prefix, $POST) {
        $TEST = date('Y', time()) / 4;
        $M1   = date("m", time());
        // 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") && ($POST[$prefix."_mo"] > "02"))  $SWITCH = ONE_DAY;
+       if ((floor($TEST) == $TEST) && ($M1 == "02") && ($POST[$prefix."_mo"] > "02"))  $SWITCH = $_CONFIG['one_day'];
        // First add years...
        $ret += $POST[$prefix."_ye"] * (31536000 + $SWITCH);
        // Next months...
@@ -1630,7 +1689,7 @@ function EXTRACT_HOST (&$script) {
        if (ereg("/", $host)) $host = substr($host, 0, strpos($host, "/"));
 
        // Generate relative URL
-       //* DEBUG */ print("SCRIPT=".$script."<br />\n");
+       //* DEBUG: */ print("SCRIPT=".$script."<br />\n");
        if (substr(strtolower($script), 0, 7) == "http://") {
                // But only if http:// is in front!
                $script = substr($script, (strlen($url) + 7));
@@ -1639,7 +1698,7 @@ function EXTRACT_HOST (&$script) {
                $script = substr($script, (strlen($url) + 8));
        }
 
-       //* DEBUG */ print("SCRIPT=".$script."<br />\n");
+       //* DEBUG: */ print("SCRIPT=".$script."<br />\n");
        if (substr($script, 0, 1) == "/") $script = substr($script, 1);
 
        // Return host name
@@ -1685,7 +1744,7 @@ function POST_URL ($script, $postData) {
        $host = EXTRACT_HOST($script);
 
        // Construct request
-       $data = http_build_query($postData, '', '&');
+       $data = http_build_query($postData, '','&');
 
        // Generate POST request header
        $request  = "POST /" . trim($script) . " HTTP/1.1\r\n";
@@ -1722,7 +1781,7 @@ function SEND_RAW_REQUEST ($host, $request) {
        } // END - if
 
        // Open connection
-       //* DEBUG */ die("SCRIPT=".$script."<br />\n");
+       //* DEBUG: */ die("SCRIPT=".$script."<br />\n");
        if ($useProxy) {
                $fp = @fsockopen(COMPILE_CODE($_CONFIG['proxy_host']), $_CONFIG['proxy_port'], $errno, $errdesc, 30);
        } else {
@@ -1902,7 +1961,7 @@ function CREATE_EMAIL_LINK($email, $table="admins") {
        if ((EXT_IS_ACTIVE("admins")) && ($table == "admins")) {
                // Create email link for contacting admin in guest area
                $EMAIL = ADMINS_CREATE_EMAIL_LINK($email);
-       } elseif ((EXT_IS_ACTIVE("user", true)) && (GET_EXT_VERSION("user") >= "0.3.3") && ($table == "user_data")) {
+       } elseif ((EXT_IS_ACTIVE("user")) && (GET_EXT_VERSION("user") >= "0.3.3") && ($table == "user_data")) {
                // Create email link for contacting a member within admin area (or later in other areas, too?)
                $EMAIL = USER_CREATE_EMAIL_LINK($email);
        } elseif ((EXT_IS_ACTIVE("sponsor")) && ($table == "sponsor_data")) {
@@ -1921,9 +1980,9 @@ function generateHash ($plainText, $salt = "") {
        global $_CONFIG, $_SERVER;
 
        // Is the required extension "sql_patches" there and a salt is not given?
-       if (((EXT_VERSION_IS_OLDER("sql_patches", "0.3.6")) || (GET_EXT_VERSION("sql_patches") == "")) && (empty($salt))) {
-               // Extension sql_patches is missing/outdated so we return the plain text
-               return $plainText;
+       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 hash the plain text with MD5
+               return md5($plainText);
        } // END - if
 
        // Do we miss an arry element here?
@@ -1935,15 +1994,15 @@ function generateHash ($plainText, $salt = "") {
        } // END - if
 
        // When the salt is empty build a new one, else use the first x configured characters as the salt
-       if ($salt == "") {
+       if (empty($salt)) {
                // Build server string
-               $server = $_SERVER['PHP_SELF'].":".getenv('HTTP_USER_AGENT').":".getenv('SERVER_SOFTWARE').":".getenv('REMOTE_ADDR').":".":".filemtime(PATH."inc/databases.php");
+               $server = $_SERVER['PHP_SELF'].":".GET_USER_AGENT().":".getenv('SERVER_SOFTWARE').":".GET_REMOTE_ADDR().":".":".filemtime(PATH."inc/databases.php");
 
                // Build key string
                $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;
@@ -2049,7 +2108,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;
@@ -2227,14 +2286,17 @@ function isBooleanConstantAndTrue($constName) { // : Boolean
        // In cache?
        if (isset($constCache[$constName])) {
                // Use cache
+               //* DEBUG: */ print __FUNCTION__."(<font color=\"#0000aa\">".__LINE__."</font>): ".$constName."-CACHE!<br />\n";
                $res = $constCache[$constName];
        } else {
                // Check constant
+               //* DEBUG: */ print __FUNCTION__."(<font color=\"#0000aa\">".__LINE__."</font>): ".$constName."-RESOLVE!<br />\n";
                if (defined($constName)) $res = (constant($constName) === true);
 
                // Set cache
                $constCache[$constName] = $res;
        }
+       //* DEBUG: */ var_dump($res);
 
        // Return value
        return $res;
@@ -2242,7 +2304,7 @@ function isBooleanConstantAndTrue($constName) { // : Boolean
 
 // Check wether a session variable is set
 function isSessionVariableSet($var) {
-       //* DEBUG: */ echo __FUNCTION__.":var={$var}<br />\n";
+       //* DEBUG: */ print __FUNCTION__."(<font color=\"#0000aa\">".__LINE__."</font>):var={$var}<br />\n";
        return (isset($_SESSION[$var]));
 }
 // Returns wether the value of the session variable or NULL if not set
@@ -2268,7 +2330,7 @@ function get_session($var) {
        return $value;
 }
 // Send notification to admin
-function SEND_ADMIN_NOTIFICATION($subject, $templateName, $content="", $uid="0") {
+function SEND_ADMIN_NOTIFICATION($subject, $templateName, $content=array(), $uid="0") {
        if (GET_EXT_VERSION("admins") >= "0.4.1") {
                // Send new way
                SEND_ADMIN_EMAILS_PRO($subject, $templateName, $content, $uid);
@@ -2300,12 +2362,12 @@ function merge_array ($array1, $array2) {
        die("</pre>");
 }
 // Debug message logger
-function DEBUG_LOG ($message) {
+function DEBUG_LOG ($file, $line, $message, $force=false) {
        // Is debug mode enabled?
-       if (isBooleanConstantAndTrue('DEBUG_MODE')) {
+       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())."|{$message}\n");
+               fwrite($fp, date("d.m.Y|H:i:s", time())."|".basename(__FILE__)."|".__LINE__."|".strip_tags($message)."\n");
                fclose($fp);
        } // END - if
 }
@@ -2323,8 +2385,8 @@ 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")) {
+               //* DEBUG: */ print __FUNCTION__."(<font color=\"#0000aa\">".__LINE__."</font>):baseDir={$baseDir},prefix={$prefix},baseFile={$baseFile}<br />\n";
+               if ((FILE_READABLE($file)) && (substr($baseFile, 0, strlen($prefix)) == $prefix) && (substr($baseFile, -4, 4) == ".php")) {
                        // Remove both for extension name
                        $extName = substr($baseFile, strlen($prefix), -4);
 
@@ -2345,6 +2407,9 @@ function GET_DIR_AS_ARRAY ($baseDir, $prefix) {
        // Close directory
        closedir($dirPointer);
 
+       // Sort array
+       asort($INCs);
+
        // Return array with include files
        return $INCs;
 }
@@ -2361,6 +2426,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());
 
@@ -2370,7 +2438,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
@@ -2382,7 +2450,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
@@ -2489,7 +2557,7 @@ function HANDLE_LOGIN_FAILTURES ($accessLevel) {
                // 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";
+                       //* DEBUG: */ print __FUNCTION__."(<font color=\"#0000aa\">".__LINE__."</font>):accessLevel={$accessLevel}<br />\n";
                        $content = array(
                                'login_failtures' => get_session('mxchange_'.$accessLevel.'_failtures'),
                                'last_failture'   => MAKE_DATETIME(get_session('mxchange_'.$accessLevel.'_last_fail'), "2")
@@ -2509,7 +2577,7 @@ function HANDLE_LOGIN_FAILTURES ($accessLevel) {
 }
 // Rebuild cache
 function REBUILD_CACHE ($cache, $inc="") {
-       global $cacheInstance;
+       global $cacheInstance, $_CONFIG, $CSS;
 
        // Shall I remove the cache file?
        if ((EXT_IS_ACTIVE("cache")) && (is_object($cacheInstance))) {
@@ -2517,12 +2585,21 @@ function REBUILD_CACHE ($cache, $inc="") {
                if ($cacheInstance->cache_file($cache, true)) {
                        // Destroy it
                        $cacheInstance->cache_destroy();
+               } // END - if
+
+               // Include file given?
+               if (!empty($inc)) {
+                       // Construct FQFN
+                       $fqfn = sprintf("%sinc/loader/load_cache-%s.php", PATH, $inc);
 
-                       // Include file given?
-                       if (!empty($inc)) {
+                       // Is the include there?
+                       if (FILE_READABLE($fqfn)) {
                                // And rebuild it from scratch
-                               require_once(PATH."inc/loader/load_cache-".$inc.".php");
-                       } // END - if
+                               require($fqfn);
+                       } else {
+                               // Include not found!
+                               DEBUG_LOG(__FUNCTION__, __LINE__, "Include {$inc} not found. cache={$cache}");
+                       }
                } // END - if
        } // END - if
 }
@@ -2536,7 +2613,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!)
@@ -2546,7 +2623,152 @@ function CACHE_PURGE_ADMIN_MENU ($id=0, $action="", $what="", $str="") {
        // Experiemental feature!
        trigger_error("You have to delete the admin_*.cache files by yourself at this point.");
 }
-//
+// Translates the "pool type" into human-readable
+function TRANSLATE_POOL_TYPE ($type) {
+       // Default type is unknown
+       $translated = sprintf(POOL_TYPE_UNKNOWN, $type);
+
+       // Generate constant
+       $constName = sprintf("POOL_TYPE_%s", $type);
+
+       // Does it exist?
+       if (defined($constName)) {
+               // Then use it
+               $translated = constant($constName);
+       } // END - if
+
+       // Return "translation"
+       return $translated;
+}
+// "Getter" for remote IP number
+function GET_REMOTE_ADDR () {
+       // Get remote ip from environment
+       $remoteAddr = getenv('REMOTE_ADDR');
+
+       // Is removeip installed?
+       if (EXT_IS_ACTIVE("removeip")) {
+               // Then anonymize it
+               $remoteAddr = GET_ANONYMOUS_REMOTE_ADDR($remoteAddr);
+       } // END - if
+
+       // Return it
+       return $remoteAddr;
+}
+// "Getter" for remote hostname
+function GET_REMOTE_HOST () {
+       // Get remote ip from environment
+       $remoteHost = getenv('REMOTE_HOST');
+
+       // Is removeip installed?
+       if (EXT_IS_ACTIVE("removeip")) {
+               // Then anonymize it
+               $remoteHost = GET_ANONYMOUS_REMOTE_HOST($remoteHost);
+       } // END - if
+
+       // Return it
+       return $remoteHost;
+}
+// "Getter" for user agent
+function GET_USER_AGENT () {
+       // Get remote ip from environment
+       $userAgent = getenv('HTTP_USER_AGENT');
+
+       // Is removeip installed?
+       if (EXT_IS_ACTIVE("removeip")) {
+               // Then anonymize it
+               $userAgent = GET_ANONYMOUS_USER_AGENT($userAgent);
+       } // END - if
+
+       // Return it
+       return $userAgent;
+}
+// "Getter" for referer
+function GET_REFERER () {
+       // Get remote ip from environment
+       $referer = getenv('HTTP_REFERER');
+
+       // Is removeip installed?
+       if (EXT_IS_ACTIVE("removeip")) {
+               // Then anonymize it
+               $referer = GET_ANONYMOUS_REFERER($referer);
+       } // END - if
+
+       // 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
+}
+
 //////////////////////////////////////////////////
 //                                              //
 // AUTOMATICALLY RE-GENERATED MISSING FUNCTIONS //