]> git.mxchange.org Git - mailer.git/blobdiff - inc/functions.php
One more found
[mailer.git] / inc / functions.php
index 93c08ad2e5b4c1389dc79d130bc4ca2431b4cd21..90f2b6d378b37e83312dd7bfb9c70e7e7a4fe79f 100644 (file)
@@ -17,7 +17,7 @@
  * -------------------------------------------------------------------- *
  * Copyright (c) 2003 - 2009 by Roland Haeder                           *
  * Copyright (c) 2009 - 2011 by Mailer Developer Team                   *
- * For more information visit: http://www.mxchange.org                  *
+ * For more information visit: http://mxchange.org                      *
  *                                                                      *
  * This program is free software; you can redistribute it and/or modify *
  * it under the terms of the GNU General Public License as published by *
@@ -92,7 +92,7 @@ function sendEmail ($toEmail, $subject, $message, $isHtml = 'N', $mailHeader = '
        } // END - if
 
        // Set from header
-       if ((!isInStringIgnoreCase('@', $toEmail)) && ($toEmail > 0)) {
+       if ((!isInString('@', $toEmail)) && ($toEmail > 0)) {
                // Does the user exist?
                if ((isExtensionActive('user')) && (fetchUserData($toEmail))) {
                        // Get the email
@@ -202,18 +202,18 @@ function sendRawEmail ($toEmail, $subject, $message, $headers) {
                $mail->Subject    = $subject;
                if ((isExtensionActive('html_mail')) && (secureString($message) != $message)) {
                        $mail->Body       = $message;
-                       $mail->AltBody    = 'Your mail program required HTML support to read this mail!';
+                       $mail->AltBody    = decodeEntities($message);
                        $mail->WordWrap   = 70;
                        $mail->IsHTML(true);
                } else {
-                       $mail->Body       = decodeEntities($message);
+                       $mail->Body       = decodeEntities(strip_tags($message));
                }
 
                $mail->AddAddress($toEmail, '');
                $mail->AddReplyTo(getWebmaster(), getMainTitle());
-               $mail->AddCustomHeader('Errors-To:' . getWebmaster());
-               $mail->AddCustomHeader('X-Loop:' . getWebmaster());
-               $mail->AddCustomHeader('Bounces-To:' . getWebmaster());
+               $mail->AddCustomHeader('Errors-To: ' . getWebmaster());
+               $mail->AddCustomHeader('X-Loop: ' . getWebmaster());
+               $mail->AddCustomHeader('Bounces-To: ' . getWebmaster());
                $mail->Send();
 
                // Has an error occured?
@@ -295,7 +295,7 @@ function generateDateTime ($time, $mode = '0') {
                                default:
                                        logDebugMessage(__FUNCTION__, __LINE__, sprintf("Invalid date mode %s detected.", $mode));
                                        break;
-                       }
+                       } // END - switch
                        break;
 
                default: // Default is the US date / time format!
@@ -534,6 +534,12 @@ function makeTime ($hours, $minutes, $seconds, $stamp) {
 
 // Redirects to an URL and if neccessarry extends it with own base URL
 function redirectToUrl ($url, $allowSpider = true) {
+       // Is the output mode -2?
+       if (getScriptOutputMode() == -2) {
+               // This is always (!) an AJAX request and shall not be redirected
+               return;
+       } // END - if
+
        // Remove {%url=
        if (substr($url, 0, 6) == '{%url=') {
                $url = substr($url, 6, -2);
@@ -558,12 +564,6 @@ function redirectToUrl ($url, $allowSpider = true) {
 
        // We should not sent a redirect if headers are already sent
        if (!headers_sent()) {
-               // Clear output buffer
-               clearOutputBuffer();
-
-               // Clear own output buffer
-               $GLOBALS['output'] = '';
-
                // Load URL when headers are not sent
                sendRawRedirect(doFinalCompilation(str_replace('&', '&', $url), false));
        } else {
@@ -594,26 +594,26 @@ function redirectToUrl ($url, $allowSpider = true) {
  *                                                                      *
  ************************************************************************/
 function array_pk_sort (&$array, $a_sort, $primary_key = '0', $order = -1, $nums = false) {
-       $dummy = $array;
+       $temporaryArray = $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) {
+               foreach ($temporaryArray[$a_sort[$primary_key]] as $key => $value) {
+                       foreach ($temporaryArray[$a_sort[$primary_key]] as $key2 => $value2) {
                                $match = false;
                                if ($nums === false) {
                                        // 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;
+                                       if (($key != $key2) && (strcmp(strtolower($temporaryArray[$a_sort[$primary_key]][$key]), strtolower($temporaryArray[$a_sort[$primary_key]][$key2])) == $order)) $match = true;
                                } 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 (($temporaryArray[$a_sort[$primary_key]][$key] < $temporaryArray[$a_sort[$primary_key]][$key2]) && ($order == -1)) $match = true;
+                                       if (($temporaryArray[$a_sort[$primary_key]][$key] > $temporaryArray[$a_sort[$primary_key]][$key2]) && ($order == 1))  $match = true;
                                }
 
                                if ($match) {
                                        // We have found two different values, so let's sort whole array
-                                       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;
+                                       foreach ($temporaryArray as $sort_key => $sort_val) {
+                                               $t                       = $temporaryArray[$sort_key][$key];
+                                               $temporaryArray[$sort_key][$key]  = $temporaryArray[$sort_key][$key2];
+                                               $temporaryArray[$sort_key][$key2] = $t;
                                                unset($t);
                                        } // END - foreach
                                } // END - if
@@ -625,7 +625,7 @@ function array_pk_sort (&$array, $a_sort, $primary_key = '0', $order = -1, $nums
        } // END - while
 
        // Write back sorted array
-       $array = $dummy;
+       $array = $temporaryArray;
 }
 
 
@@ -635,48 +635,48 @@ function array_pk_sort (&$array, $a_sort, $primary_key = '0', $order = -1, $nums
 //
 function generateRandomCode ($length, $code, $userid, $extraData = '') {
        // Build server string
-       $server = $_SERVER['PHP_SELF'] . getEncryptSeperator() . detectUserAgent() . getEncryptSeperator() . getenv('SERVER_SOFTWARE') . getEncryptSeperator() . detectRealIpAddress() . getEncryptSeperator() . detectRemoteAddr();
+       $server = $_SERVER['PHP_SELF'] . getEncryptSeparator() . detectUserAgent() . getEncryptSeparator() . getenv('SERVER_SOFTWARE') . getEncryptSeparator() . detectRealIpAddress() . getEncryptSeparator() . detectRemoteAddr();
 
        // Build key string
-       $keys = getSiteKey() . getEncryptSeperator() . getDateKey();
+       $keys = getSiteKey() . getEncryptSeparator() . getDateKey();
        if (isConfigEntrySet('secret_key')) {
-               $keys .= getEncryptSeperator() . getSecretKey();
+               $keys .= getEncryptSeparator() . getSecretKey();
        } // END - if
        if (isConfigEntrySet('file_hash')) {
-               $keys .= getEncryptSeperator() . getFileHash();
+               $keys .= getEncryptSeparator() . getFileHash();
        } // END - if
-       $keys .= getEncryptSeperator() . getDateFromPatchTime();
+       $keys .= getEncryptSeparator() . getDateFromRepository();
        if (isConfigEntrySet('master_salt')) {
-               $keys .= getEncryptSeperator() . getMasterSalt();
+               $keys .= getEncryptSeparator() . getMasterSalt();
        } // END - if
 
        // Build string from misc data
-       $data  = $code . getEncryptSeperator() . $userid . getEncryptSeperator() . $extraData;
+       $data  = $code . getEncryptSeparator() . $userid . getEncryptSeparator() . $extraData;
 
        // Add more additional data
        if (isSessionVariableSet('u_hash')) {
-               $data .= getEncryptSeperator() . getSession('u_hash');
+               $data .= getEncryptSeparator() . getSession('u_hash');
        } // END - if
 
-       // Add referal id, language, theme and userid
-       $data .= getEncryptSeperator() . determineReferalId();
-       $data .= getEncryptSeperator() . getLanguage();
-       $data .= getEncryptSeperator() . getCurrentTheme();
-       $data .= getEncryptSeperator() . getMemberId();
+       // Add referral id, language, theme and userid
+       $data .= getEncryptSeparator() . determineReferralId();
+       $data .= getEncryptSeparator() . getLanguage();
+       $data .= getEncryptSeparator() . getCurrentTheme();
+       $data .= getEncryptSeparator() . getMemberId();
 
        // Calculate number for generating the code
        $a = $code + getConfig('_ADD') - 1;
 
        if (isConfigEntrySet('master_salt')) {
                // Generate hash with master salt from modula of number with the prime number and other data
-               $saltedHash = generateHash(($a % getPrime()) . getEncryptSeperator() . $server . getEncryptSeperator() . $keys . getEncryptSeperator() . $data . getEncryptSeperator() . getDateKey() . getEncryptSeperator() . $a, getMasterSalt());
+               $saltedHash = generateHash(($a % getPrime()) . getEncryptSeparator() . $server . getEncryptSeparator() . $keys . getEncryptSeparator() . $data . getEncryptSeparator() . getDateKey() . getEncryptSeparator() . $a, getMasterSalt());
        } else {
                // Generate hash with "hash of site key" from modula of number with the prime number and other data
-               $saltedHash = generateHash(($a % getPrime()) . getEncryptSeperator() . $server . getEncryptSeperator() . $keys . getEncryptSeperator() . $data . getEncryptSeperator() . getDateKey() . getEncryptSeperator() . $a, substr(sha1(getSiteKey()), 0, getSaltLength()));
+               $saltedHash = generateHash(($a % getPrime()) . getEncryptSeparator() . $server . getEncryptSeparator() . $keys . getEncryptSeparator() . $data . getEncryptSeparator() . getDateKey() . getEncryptSeparator() . $a, substr(sha1(getSiteKey()), 0, getSaltLength()));
        }
 
        // Create number from hash
-       $rcode = hexdec(substr($saltedHash, 8, 9)) / abs(getRandNo() - $a + sqrt(getConfig('_ADD'))) / pi();
+       $rcode = hexdec(substr($saltedHash, getSaltLength(), 9)) / abs(getRandNo() - $a + sqrt(getConfig('_ADD'))) / pi();
 
        // At least 10 numbers shall be secure enought!
        if (isExtensionActive('other')) {
@@ -689,8 +689,8 @@ function generateRandomCode ($length, $code, $userid, $extraData = '') {
                $len = 10;
        } // END - if
 
-       // Cut off requested counts of number
-       $return = substr(str_replace('.', '', $rcode), 0, $len);
+       // Cut off requested counts of number, but skip first digit (which is mostly a zero)
+       $return = substr($rcode, (strpos($rcode, '.') + 1), $len);
 
        // Done building code
        return $return;
@@ -698,6 +698,7 @@ function generateRandomCode ($length, $code, $userid, $extraData = '') {
 
 // Does only allow numbers
 function bigintval ($num, $castValue = true, $abortOnMismatch = true) {
+       //* DEBUG: */ debugOutput('[' . __FUNCTION__ . ':' . __LINE__ . '] ' . 'num=' . $num . ',castValue=' . intval($castValue) . ',abortOnMismatch=' . intval($abortOnMismatch) . ' - ENTERED!');
        // Filter all numbers out
        $ret = preg_replace('/[^0123456789]/', '', $num);
 
@@ -714,6 +715,7 @@ function bigintval ($num, $castValue = true, $abortOnMismatch = true) {
        } // END - if
 
        // Return result
+       //* DEBUG: */ debugOutput('[' . __FUNCTION__ . ':' . __LINE__ . '] ' . 'num=' . $num . ',castValue=' . intval($castValue) . ',abortOnMismatch=' . intval($abortOnMismatch) . ',ret=' . $ret . ' - EXIT!');
        return $ret;
 }
 
@@ -765,7 +767,7 @@ function createFancyTime ($stamp) {
        foreach ($data as $k => $v) {
                if ($v > 0) {
                        // Value is greater than 0 "eval" data to return string
-                       $ret .= ', ' . $v . ' {--_' . strtoupper($k) . '--}';
+                       $ret .= ', ' . $v . ' {%pipe,translateTimeUnit=' . $k . '%}';
                        break;
                } // END - if
        } // END - foreach
@@ -776,52 +778,13 @@ function createFancyTime ($stamp) {
                $ret = substr($ret, 2);
        } else {
                // Zero seconds
-               $ret = '0 {--_SECONDS--}';
+               $ret = '0 {--TIME_UNIT_SECOND--}';
        }
 
        // Return fancy time string
        return $ret;
 }
 
-// Extract host from script name
-function extractHostnameFromUrl (&$script) {
-       // Use default SERVER_URL by default... ;) So?
-       $url = getServerUrl();
-
-       // Is this URL valid?
-       if (substr($script, 0, 7) == 'http://') {
-               // Use the hostname from script URL as new hostname
-               $url = substr($script, 7);
-               $extract = explode('/', $url);
-               $url = $extract[0];
-               // Done extracting the URL :)
-       } // END - if
-
-       // Extract host name
-       $host = str_replace('http://', '', $url);
-       if (isInString('/', $host)) {
-               $host = substr($host, 0, strpos($host, '/'));
-       } // END - if
-
-       // Generate relative URL
-       //* DEBUG: */ debugOutput('SCRIPT=' . $script);
-       if (substr(strtolower($script), 0, 7) == 'http://') {
-               // But only if http:// is in front!
-               $script = substr($script, (strlen($url) + 7));
-       } elseif (substr(strtolower($script), 0, 8) == 'https://') {
-               // Does this work?!
-               $script = substr($script, (strlen($url) + 8));
-       }
-
-       //* DEBUG: */ debugOutput('SCRIPT=' . $script);
-       if (substr($script, 0, 1) == '/') {
-               $script = substr($script, 1);
-       } // END - if
-
-       // Return host name
-       return $host;
-}
-
 // Taken from www.php.net isInStringIgnoreCase() user comments
 function isEmailValid ($email) {
        // Check first part of email address
@@ -838,7 +801,7 @@ function isEmailValid ($email) {
 }
 
 // Function taken from user comments on www.php.net / function isInStringIgnoreCase()
-function isUrlValid ($url, $compile=true) {
+function isUrlValid ($url, $compile = true) {
        // Trim URL a little
        $url = trim(urldecode($url));
        //* DEBUG: */ debugOutput($url);
@@ -868,7 +831,7 @@ function generateHash ($plainText, $salt = '', $hash = true) {
        // Is the required extension 'sql_patches' there and a salt is not given?
        // 123                            4                      43    3     4     432    2                  3             32    2                             3                32    2      3     3      21
        if (((isExtensionInstalledAndOlder('sql_patches', '0.3.6')) && (empty($salt))) || (!isExtensionActive('sql_patches')) || (!isExtensionInstalledAndNewer('other', '0.2.5')) || (strlen($salt) == 32)) {
-               // Extension sql_patches is missing/outdated so we hash the plain text with MD5
+               // Extension ext-sql_patches is missing/outdated so we hash the plain text with MD5
                if ($hash === true) {
                        // Is plain password
                        return md5($plainText);
@@ -887,19 +850,19 @@ function generateHash ($plainText, $salt = '', $hash = true) {
        // When the salt is empty build a new one, else use the first x configured characters as the salt
        if (empty($salt)) {
                // Build server string for more entropy
-               $server = $_SERVER['PHP_SELF'] . getEncryptSeperator() . detectUserAgent() . getEncryptSeperator() . getenv('SERVER_SOFTWARE') . getEncryptSeperator() . detectRealIpAddress() . getEncryptSeperator() . detectRemoteAddr();
+               $server = $_SERVER['PHP_SELF'] . getEncryptSeparator() . detectUserAgent() . getEncryptSeparator() . getenv('SERVER_SOFTWARE') . getEncryptSeparator() . detectRealIpAddress() . getEncryptSeparator() . detectRemoteAddr();
 
                // Build key string
-               $keys   = getSiteKey() . getEncryptSeperator() . getDateKey() . getEncryptSeperator() . getSecretKey() . getEncryptSeperator() . getFileHash() . getEncryptSeperator() . getDateFromPatchTime() . getEncryptSeperator() . getMasterSalt();
+               $keys   = getSiteKey() . getEncryptSeparator() . getDateKey() . getEncryptSeparator() . getSecretKey() . getEncryptSeparator() . getFileHash() . getEncryptSeparator() . getDateFromRepository() . getEncryptSeparator() . getMasterSalt();
 
                // Additional data
-               $data = $plainText . getEncryptSeperator() . uniqid(mt_rand(), true) . getEncryptSeperator() . time();
+               $data = $plainText . getEncryptSeparator() . uniqid(mt_rand(), true) . getEncryptSeparator() . time();
 
                // Calculate number for generating the code
                $a = time() + getConfig('_ADD') - 1;
 
                // Generate SHA1 sum from modula of number and the prime number
-               $sha1 = sha1(($a % getPrime()) . $server . getEncryptSeperator() . $keys . getEncryptSeperator() . $data . getEncryptSeperator() . getDateKey() . getEncryptSeperator() . $a);
+               $sha1 = sha1(($a % getPrime()) . $server . getEncryptSeparator() . $keys . getEncryptSeparator() . $data . getEncryptSeparator() . getDateKey() . getEncryptSeparator() . $a);
                //* DEBUG: */ debugOutput('SHA1=' . $sha1.' ('.strlen($sha1).')<br />');
                $sha1 = scrambleString($sha1);
                //* DEBUG: */ debugOutput('Scrambled=' . $sha1.' ('.strlen($sha1).')<br />');
@@ -1085,11 +1048,17 @@ function getCurrentTheme () {
        // The default theme is 'default'... ;-)
        $ret = 'default';
 
-       // Do we have ext-theme installed and active?
-       if (isExtensionActive('theme')) {
+       // Do we have ext-theme installed and active or is 'theme' in URL or POST data?
+       if ((isPostRequestElementSet('theme')) && (isIncludeReadable(sprintf("theme/%s/theme.php", postRequestElement('theme'))))) {
+               // Use value from POST data
+               $ret = postRequestElement('theme');
+       } elseif ((isGetRequestElementSet('theme')) && (isIncludeReadable(sprintf("theme/%s/theme.php", getRequestElement('theme'))))) {
+               // Use value from GET data
+               $ret = getRequestElement('theme');
+       } elseif (isExtensionActive('theme')) {
                // Call inner method
                $ret = getActualTheme();
-       } // END - if
+       }
 
        // Return theme value
        return $ret;
@@ -1104,10 +1073,10 @@ function generateErrorCodeFromUserStatus ($status = '') {
        } // END - if
 
        // Default error code if unknown account status
-       $errorCode = getCode('ACCOUNT_STATUS_UNKNOWN');
+       $errorCode = getCode('ACCOUNT_UNKNOWN');
 
        // Generate constant name
-       $codeName = sprintf("ACCOUNT_STATUS_%s", strtoupper($status));
+       $codeName = sprintf("ACCOUNT_%s", strtoupper($status));
 
        // Is the constant there?
        if (isCodeSet($codeName)) {
@@ -1172,7 +1141,7 @@ function getMessageFromErrorCode ($code) {
        switch ($code) {
                case '': break;
                case getCode('LOGOUT_DONE')        : $message = '{--LOGOUT_DONE--}'; break;
-               case getCode('LOGOUT_FAILED')      : $message = '<span class="notice">{--LOGOUT_FAILED--}</span>'; break;
+               case getCode('LOGOUT_FAILED')      : $message = '<span class="bad">{--LOGOUT_FAILED--}</span>'; break;
                case getCode('DATA_INVALID')       : $message = '{--MAIL_DATA_INVALID--}'; break;
                case getCode('POSSIBLE_INVALID')   : $message = '{--MAIL_POSSIBLE_INVALID--}'; break;
                case getCode('USER_404')           : $message = '{--USER_404--}'; break;
@@ -1185,11 +1154,11 @@ function getMessageFromErrorCode ($code) {
                case getCode('COOKIES_DISABLED')   : $message = '{--LOGIN_COOKIES_DISABLED--}'; break;
                case getCode('BEG_SAME_AS_OWN')    : $message = '{--BEG_SAME_USERID_AS_OWN--}'; break;
                case getCode('LOGIN_FAILED')       : $message = '{--GUEST_LOGIN_FAILED_GENERAL--}'; break;
-               case getCode('MODULE_MEMBER_ONLY') : $message = '{%message,MODULE_MEMBER_ONLY=' . getRequestParameter('mod') . '%}'; break;
+               case getCode('MODULE_MEMBER_ONLY') : $message = '{%message,MODULE_MEMBER_ONLY=' . getRequestElement('mod') . '%}'; break;
                case getCode('OVERLENGTH')         : $message = '{--MEMBER_TEXT_OVERLENGTH--}'; break;
                case getCode('URL_FOUND')          : $message = '{--MEMBER_TEXT_CONTAINS_URL--}'; break;
                case getCode('SUBJECT_URL')        : $message = '{--MEMBER_SUBJECT_CONTAINS_URL--}'; break;
-               case getCode('BLIST_URL')          : $message = '{--MEMBER_URL_BLACK_LISTED--}<br />{--MEMBER_BLIST_TIME--}: ' . generateDateTime(getRequestParameter('blist'), 0); break;
+               case getCode('BLIST_URL')          : $message = '{--MEMBER_URL_BLACK_LISTED--}<br />{--MEMBER_BLIST_TIME--}: ' . generateDateTime(getRequestElement('blist'), 0); break;
                case getCode('NO_RECS_LEFT')       : $message = '{--MEMBER_SELECTED_MORE_RECS--}'; break;
                case getCode('INVALID_TAGS')       : $message = '{--MEMBER_HTML_INVALID_TAGS--}'; break;
                case getCode('MORE_POINTS')        : $message = '{--MEMBER_MORE_POINTS_NEEDED--}'; break;
@@ -1211,8 +1180,8 @@ function getMessageFromErrorCode ($code) {
                        break;
 
                case getCode('EXTENSION_PROBLEM'):
-                       if (isGetRequestParameterSet('ext')) {
-                               $message = '{%pipe,generateExtensionInactiveNotInstalledMessage=' . getRequestParameter('ext') . '%}';
+                       if (isGetRequestElementSet('ext')) {
+                               $message = '{%pipe,generateExtensionInactiveNotInstalledMessage=' . getRequestElement('ext') . '%}';
                        } else {
                                $message = '{--EXTENSION_PROBLEM_UNSET_EXT--}';
                        }
@@ -1221,7 +1190,7 @@ function getMessageFromErrorCode ($code) {
                case getCode('URL_TIME_LOCK'):
                        // @TODO Move this SQL code into a function, let's say 'getTimestampFromPoolId($id) ?
                        $result = SQL_QUERY_ESC("SELECT `timestamp` FROM `{?_MYSQL_PREFIX?}_pool` WHERE `id`=%s LIMIT 1",
-                               array(bigintval(getRequestParameter('id'))), __FUNCTION__, __LINE__);
+                               array(bigintval(getRequestElement('id'))), __FUNCTION__, __LINE__);
 
                        // Load timestamp from last order
                        $content = SQL_FETCHARRAY($result);
@@ -1328,7 +1297,7 @@ function isUrlValidSimple ($url) {
 
 // Wtites data to a config.php-style file
 // @TODO Rewrite this function to use readFromFile() and writeToFile()
-function changeDataInFile ($FQFN, $comment, $prefix, $suffix, $DATA, $seek=0) {
+function changeDataInFile ($FQFN, $comment, $prefix, $suffix, $inserted, $seek=0) {
        // Initialize some variables
        $done = false;
        $seek++;
@@ -1358,7 +1327,7 @@ function changeDataInFile ($FQFN, $comment, $prefix, $suffix, $DATA, $seek=0) {
                                        // Read from source file
                                        $line = fgets ($fp, 1024);
 
-                                       if (strpos($line, $search) > -1) { 
+                                       if (isInString($search, $line)) {
                                                $next = '0';
                                                $found = true;
                                        } // END - if
@@ -1366,7 +1335,7 @@ function changeDataInFile ($FQFN, $comment, $prefix, $suffix, $DATA, $seek=0) {
                                        if ($next > -1) {
                                                if ($next === $seek) {
                                                        $next = -1;
-                                                       $line = $prefix . $DATA . $suffix . "\n";
+                                                       $line = $prefix . $inserted . $suffix . "\n";
                                                } else {
                                                        $next++;
                                                }
@@ -1406,14 +1375,14 @@ function changeDataInFile ($FQFN, $comment, $prefix, $suffix, $DATA, $seek=0) {
 }
 
 // Send notification to admin
-function sendAdminNotification ($subject, $templateName, $content = array(), $userid = '0') {
+function sendAdminNotification ($subject, $templateName, $content = array(), $userid = NULL) {
        if ((isExtensionInstalledAndNewer('admins', '0.4.1')) && (function_exists('sendAdminsEmails'))) {
                // Send new way
-               /* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'admins=Y,subject=' . $subject . ',templateName=' . $templateName);
+               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'admins=Y,subject=' . $subject . ',templateName=' . $templateName . ' - OKAY!');
                sendAdminsEmails($subject, $templateName, $content, $userid);
        } else {
                // Send out-dated way
-               /* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'admins=N,subject=' . $subject . ',templateName=' . $templateName);
+               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'admins=N,subject=' . $subject . ',templateName=' . $templateName . ' - OUT-DATED!');
                $message = loadEmailTemplate($templateName, $content, $userid);
                sendAdminEmails($subject, $message);
        }
@@ -1465,7 +1434,7 @@ function handleExtraValues ($filterFunction, $value, $extraValue) {
 }
 
 // Converts timestamp selections into a timestamp
-function convertSelectionsToEpocheTime (array &$postData, array &$DATA, &$id, &$skip) {
+function convertSelectionsToEpocheTime (array &$postData, array &$content, &$id, &$skip) {
        // Init test variable
        $skip  = false;
        $test2 = '';
@@ -1477,10 +1446,10 @@ function convertSelectionsToEpocheTime (array &$postData, array &$DATA, &$id, &$
        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($postData[$test.'_ye'])) && (isset($postData[$test.'_mo'])) && (isset($postData[$test.'_we'])) && (isset($postData[$test.'_da'])) && (isset($postData[$test.'_ho'])) && (isset($postData[$test.'_mi'])) && (isset($postData[$test.'_se'])) && ($test != $test2)) {
+               if ((isset($postData[$test . '_ye'])) && (isset($postData[$test . '_mo'])) && (isset($postData[$test . '_we'])) && (isset($postData[$test . '_da'])) && (isset($postData[$test . '_ho'])) && (isset($postData[$test . '_mi'])) && (isset($postData[$test . '_se'])) && ($test != $test2)) {
                        // Generate timestamp
                        $postData[$test] = createEpocheTimeFromSelections($test, $postData);
-                       $DATA[] = sprintf("`%s`='%s'", $test, $postData[$test]);
+                       $content[] = sprintf("`%s`='%s'", $test, $postData[$test]);
                        $GLOBALS['skip_config'][$test] = true;
 
                        // Remove data from array
@@ -1553,7 +1522,7 @@ function handleLoginFailures ($accessLevel) {
 // Rebuild cache
 function rebuildCache ($cache, $inc = '', $force = false) {
        // Debug message
-       /* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, sprintf("cache=%s, inc=%s, force=%s", $cache, $inc, intval($force)));
+       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, sprintf("cache=%s, inc=%s, force=%s", $cache, $inc, intval($force)));
 
        // Shall I remove the cache file?
        if (isCacheInstanceValid()) {
@@ -1609,8 +1578,8 @@ function determineRealRemoteAddress ($remoteAddr = false) {
 // This is a high-level function!
 function addNewBonusMail ($data, $mode = '', $output = true) {
        // Use mode from data if not set and availble ;-)
-       if ((empty($mode)) && (isset($data['mode']))) {
-               $mode = $data['mode'];
+       if ((empty($mode)) && (isset($data['mail_mode']))) {
+               $mode = $data['mail_mode'];
        } // END - if
 
        // Generate receiver list
@@ -1644,77 +1613,96 @@ function addNewBonusMail ($data, $mode = '', $output = true) {
        }
 }
 
-// Determines referal id and sets it
-function determineReferalId () {
+// Determines referral id and sets it
+function determineReferralId () {
        // Skip this in non-html-mode and outside ref.php
        if ((!isHtmlOutputMode()) && (basename($_SERVER['PHP_SELF']) != 'ref.php')) {
                return false;
        } // END - if
 
        // Check if refid is set
-       if (isReferalIdValid()) {
+       if (isReferralIdValid()) {
                // This is fine...
-       } elseif (isPostRequestParameterSet('refid')) {
-               // Get referal id from POST element refid
-               setReferalId(secureString(postRequestParameter('refid')));
-       } elseif (isGetRequestParameterSet('refid')) {
-               // Get referal id from GET parameter refid
-               setReferalId(secureString(getRequestParameter('refid')));
-       } elseif (isGetRequestParameterSet('ref')) {
-               // Set refid=ref (the referal link uses such variable)
-               setReferalId(secureString(getRequestParameter('ref')));
-       } elseif ((isGetRequestParameterSet('user')) && (basename($_SERVER['PHP_SELF']) == 'click.php')) {
+               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'Using refid from GLOBALS (' . getReferralId() . ')');
+       } elseif (isPostRequestElementSet('refid')) {
+               // Get referral id from POST element refid
+               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'Using refid from POST data (' . postRequestElement('refid') . ')');
+               setReferralId(secureString(postRequestElement('refid')));
+       } elseif (isGetRequestElementSet('refid')) {
+               // Get referral id from GET parameter refid
+               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'Using refid from GET data (' . getRequestElement('refid') . ')');
+               setReferralId(secureString(getRequestElement('refid')));
+       } elseif (isGetRequestElementSet('ref')) {
+               // Set refid=ref (the referral link uses such variable)
+               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'Using ref from GET data (' . getRequestElement('refid') . ')');
+               setReferralId(secureString(getRequestElement('ref')));
+       } elseif ((isGetRequestElementSet('user')) && (basename($_SERVER['PHP_SELF']) == 'click.php')) {
                // The variable user comes from  click.php
-               setReferalId(bigintval(getRequestParameter('user')));
+               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'Using user from GET data (' . getRequestElement('user') . ')');
+               setReferralId(bigintval(getRequestElement('user')));
        } elseif ((isSessionVariableSet('refid')) && (isValidUserId(getSession('refid')))) {
-               // Set session refid als global
-               setReferalId(bigintval(getSession('refid')));
-       } elseif (isRandomReferalIdEnabled()) {
+               // Set session refid as global
+               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'Using refid from SESSION data (' . getSession('refid') . ')');
+               setReferralId(bigintval(getSession('refid')));
+       } elseif (isRandomReferralIdEnabled()) {
                // Select a random user which has confirmed enougth mails
-               setReferalId(determineRandomReferalId());
+               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'Checking random referral id');
+               setReferralId(determineRandomReferralId());
        } elseif ((isExtensionInstalledAndNewer('sql_patches', '0.1.2')) && (isValidUserId(getDefRefid()))) {
                // Set default refid as refid in URL
-               setReferalId(getDefRefid());
+               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'Using default refid (' . getDefRefid() . ')');
+               setReferralId(getDefRefid());
        } else {
                // No default id when sql_patches is not installed or none set
-               setReferalId(null);
+               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'Using NULL as refid');
+               setReferralId(NULL);
        }
 
        // Set cookie when default refid > 0
-       if (!isSessionVariableSet('refid') || (!isValidUserId(getReferalId())) || ((!isValidUserId(getSession('refid'))) && (isExtensionInstalledAndNewer('sql_patches', '0.1.2')) && (isValidUserId(getDefRefid())))) {
+       if ((!isSessionVariableSet('refid')) || (!isValidUserId(getReferralId())) || ((!isValidUserId(getSession('refid'))) && (isExtensionInstalledAndNewer('sql_patches', '0.1.2')) && (isValidUserId(getDefRefid())))) {
                // Default is not found
                $found = false;
 
                // Do we have nickname or userid set?
-               if ((isExtensionActive('nickname')) && (isNicknameUsed(getReferalId()))) {
+               if ((isExtensionActive('nickname')) && (isNicknameUsed(getReferralId()))) {
                        // Nickname in URL, so load the id
-                       $found = fetchUserData(getReferalId(), 'nickname');
+                       $found = fetchUserData(getReferralId(), 'nickname');
 
-                       // If we found it, use the userid as referal id
+                       // If we found it, use the userid as referral id
                        if ($found === true) {
                                // Set the userid as 'refid'
-                               setReferalId(getUserData('userid'));
+                               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'Using refid from user account by nickname (' . getUserData('userid') . ')');
+                               setReferralId(getUserData('userid'));
                        } // END - if
-               } elseif (isValidUserId(getReferalId())) {
+               } elseif (isValidUserId(getReferralId())) {
                        // Direct userid entered
-                       $found = fetchUserData(getReferalId());
+                       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'Using direct userid (' . getReferralId() . ')');
+                       $found = fetchUserData(getReferralId());
                }
 
                // Is the record valid?
                if ((($found === false) || (!isUserDataValid())) && (isExtensionInstalledAndNewer('sql_patches', '0.1.2'))) {
-                       // No, then reset referal id
-                       setReferalId(getDefRefid());
+                       // No, then reset referral id
+                       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'Using default refid (' . getDefRefid() . ')');
+                       setReferralId(getDefRefid());
                } // END - if
 
                // Set cookie
-               setSession('refid', getReferalId());
-       } elseif (!isReferalIdValid()) {
+               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'Saving refid to session (' . getReferralId() . ') #1');
+               setSession('refid', getReferralId());
+       } elseif ((!isReferralIdValid()) || (!fetchUserData(getReferralId()))) {
                // Not valid!
-               setSession('refid', 0);
+               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'Not valid referral id (' . getReferralId() . '), setting NULL in session');
+               setReferralId(NULL);
+               setSession('refid', NULL);
+       } else {
+               // Set it from GLOBALS array in session
+               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'Saving refid to session (' . getReferralId() . ') #2');
+               setSession('refid', getReferralId());
        }
 
        // Return determined refid
-       return getReferalId();
+       return getReferralId();
 }
 
 // Enables the reset mode and runs it
@@ -1811,19 +1799,32 @@ function isExtraTitleSet () {
        return ((isset($GLOBALS['extra_title'])) && (!empty($GLOBALS['extra_title'])));
 }
 
-// Reads a directory recursively by default and searches for files not matching
-// an exclusion pattern. You can now keep the exclusion pattern empty for reading
-// a whole directory.
+/**
+ * Reads a directory recursively by default and searches for files not matching
+ * an exclusion pattern. You can now keep the exclusion pattern empty for reading
+ * a whole directory.
+ *
+ * @param      $baseDir                        Relative base directory to PATH to scan from
+ * @param      $prefix                         Prefix for all positive matches (which files should be found)
+ * @param      $fileIncludeDirs        Wether to include directories in the final output array
+ * @param      $addBaseDir                     Wether to add $baseDir to all array entries
+ * @param      $excludeArray           Excluded files and directories, these must be full files names, e.g. 'what-' will exclude all files named 'what-' but won't exclude 'what-foo.php'
+ * @param      $extension                      File extension for all positive matches
+ * @param      $excludePattern         Regular expression to exclude more files (preg_match())
+ * @param      $recursive                      Wether to scan recursively
+ * @param      $suffix                         Suffix for positive matches ($extension will be appended, too)
+ * @return     $foundMatches           All found positive matches for above criteria
+ */
 function getArrayFromDirectory ($baseDir, $prefix, $fileIncludeDirs = false, $addBaseDir = true, $excludeArray = array(), $extension = '.php', $excludePattern = '@(\.|\.\.)$@', $recursive = true, $suffix = '') {
-       // Add default entries we should exclude
-       $excludeArray[] = '.';
-       $excludeArray[] = '..';
-       $excludeArray[] = '.svn';
-       $excludeArray[] = '.htaccess';
+       // Add default entries we should always exclude
+       $excludeArray[] = '.';         // Current directory
+       $excludeArray[] = '..';        // Parent directory
+       $excludeArray[] = '.svn';      // Directories created by Subversion
+       $excludeArray[] = '.htaccess'; // Directory protection files (mostly)
 
        //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'baseDir=' . $baseDir . ',prefix=' . $prefix . ' - Entered!');
-       // Init includes
-       $files = array();
+       // Init found includes
+       $foundMatches = array();
 
        // Open directory
        $dirPointer = opendir(getPath() . $baseDir) or debug_report_bug(__FUNCTION__, __LINE__, 'Cannot read directory ' . basename($baseDir) . '.');
@@ -1846,10 +1847,8 @@ function getArrayFromDirectory ($baseDir, $prefix, $fileIncludeDirs = false, $ad
 
                // Check if the base filenname matches an exclusion pattern and if the pattern is not empty
                if ((!empty($excludePattern)) && (preg_match($excludePattern, $baseFile, $match))) {
-                       // These Lines are only for debugging!!
-                       //* DEBUG: */ debugOutput('baseDir:' . $baseDir);
-                       //* DEBUG: */ debugOutput('baseFile:' . $baseFile);
-                       //* DEBUG: */ debugOutput('FQFN:' . $FQFN);
+                       // Debug message
+                       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'baseDir=' . $baseDir . ',baseFile=' . $baseFile . ',FQFN=' . $FQFN);
 
                        // Exclude this one
                        continue;
@@ -1858,7 +1857,7 @@ function getArrayFromDirectory ($baseDir, $prefix, $fileIncludeDirs = false, $ad
                // Skip also files with non-matching prefix genericly
                if (($recursive === true) && (isDirectory($FQFN))) {
                        // Is a redirectory so read it as well
-                       $files = merge_array($files, getArrayFromDirectory($baseDir . $baseFile . '/', $prefix, $fileIncludeDirs, $addBaseDir, $excludeArray, $extension, $excludePattern, $recursive));
+                       $foundMatches = merge_array($foundMatches, getArrayFromDirectory($baseDir . $baseFile . '/', $prefix, $fileIncludeDirs, $addBaseDir, $excludeArray, $extension, $excludePattern, $recursive));
 
                        // And skip further processing
                        continue;
@@ -1890,10 +1889,10 @@ function getArrayFromDirectory ($baseDir, $prefix, $fileIncludeDirs = false, $ad
                                // Add file with or without base path
                                if ($addBaseDir === true) {
                                        // With base path
-                                       $files[] = $fileName;
+                                       $foundMatches[] = $fileName;
                                } else {
                                        // No base path
-                                       $files[] = $baseFile;
+                                       $foundMatches[] = $baseFile;
                                }
                        } else {
                                // We found .php file but should not search for them, why?
@@ -1901,7 +1900,7 @@ function getArrayFromDirectory ($baseDir, $prefix, $fileIncludeDirs = false, $ad
                        }
                } elseif ($fileExtension == $extension) {
                        // Other, generic file found
-                       $files[] = $fileName;
+                       $foundMatches[] = $fileName;
                }
        } // END - while
 
@@ -1909,11 +1908,11 @@ function getArrayFromDirectory ($baseDir, $prefix, $fileIncludeDirs = false, $ad
        closedir($dirPointer);
 
        // Sort array
-       sort($files);
+       sort($foundMatches);
 
        // Return array with include files
        //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, '- Left!');
-       return $files;
+       return $foundMatches;
 }
 
 // Checks wether $prefix is found in $fileName
@@ -2043,7 +2042,7 @@ function getModuleFromFileName ($file, $accessLevel) {
 // Encodes an URL for adding session id, etc.
 function encodeUrl ($url, $outputMode = '0') {
        // Do we have already have a PHPSESSID inside or view.php is called? Then abort here
-       if ((strpos($url, session_name()) !== false) || (isRawOutputMode())) {
+       if ((isInStringIgnoreCase(session_name(), $url)) || (isRawOutputMode())) {
                // Raw output mode detected or session_name() found in URL
                return $url;
        } // END - if
@@ -2051,19 +2050,19 @@ function encodeUrl ($url, $outputMode = '0') {
        // Do we have a valid session?
        if (((!isset($GLOBALS['valid_session'])) || ($GLOBALS['valid_session'] === false) || (!isset($_COOKIE[session_name()]))) && (isSpider() === false)) {
                // Invalid session
-               // Determine right seperator
-               $seperator = '&amp;';
-               if (strpos($url, '?') === false) {
+               // Determine right separator
+               $separator = '&amp;';
+               if (!isInString('?', $url)) {
                        // No question mark
-                       $seperator = '?';
+                       $separator = '?';
                } elseif ((!isHtmlOutputMode()) || ($outputMode != '0')) {
                        // Non-HTML mode (or forced non-HTML mode
-                       $seperator = '&';
+                       $separator = '&';
                }
 
                // Add it to URL
                if (session_id() != '') {
-                       $url .= $seperator . session_name() . '=' . session_id();
+                       $url .= $separator . session_name() . '=' . session_id();
                } // END - if
        } // END - if
 
@@ -2080,7 +2079,7 @@ function encodeUrl ($url, $outputMode = '0') {
 // Simple check for spider
 function isSpider () {
        // Get the UA and trim it down
-       $userAgent = trim(strtolower(detectUserAgent(true)));
+       $userAgent = trim(detectUserAgent(true));
 
        // It should not be empty, if so it is better a spider/bot
        if (empty($userAgent)) {
@@ -2089,7 +2088,7 @@ function isSpider () {
        } // END - if
 
        // Is it a spider?
-       return ((strpos($userAgent, 'spider') !== false) || (strpos($userAgent, 'slurp') !== false) || (strpos($userAgent, 'bot') !== false) || (strpos($userAgent, 'archiver') !== false));
+       return ((isInStringIgnoreCase('spider', $userAgent)) || (isInStringIgnoreCase('slurp', $userAgent)) || (isInStringIgnoreCase('bot', $userAgent)) || (isInStringIgnoreCase('archiver', $userAgent)));
 }
 
 // Function to search for the last modified file
@@ -2151,10 +2150,10 @@ function handleFieldWithBraces ($field) {
        return $field;
 }
 
-// Converts a userid so it can be used in SQL queries
-function makeZeroToNull ($number) {
+// Converts a zero or NULL to word 'NULL'
+function convertZeroToNull ($number) {
        // Is it a valid username?
-       if ((!is_null($number)) && ($number > 0)) {
+       if ((!is_null($number)) && (!empty($number)) && ($number > 0)) {
                // Always secure it
                $number = bigintval($number);
        } else {
@@ -2166,6 +2165,21 @@ function makeZeroToNull ($number) {
        return $number;
 }
 
+// Converts a NULL to zero
+function convertNullToZero ($number) {
+       // Is it a valid username?
+       if ((!is_null($number)) && (!empty($number)) && ($number > 0)) {
+               // Always secure it
+               $number = bigintval($number);
+       } else {
+               // Is not valid or zero
+               $number = '0';
+       }
+
+       // Return it
+       return $number;
+}
+
 // Capitalizes a string with underscores, e.g.: some_foo_string will become SomeFooString
 // Note: This function is cached
 function capitalizeUnderscoreString ($str) {
@@ -2221,7 +2235,7 @@ function generateAdminMailLinks ($mailType, $mailId) {
        // Is the mail type supported?
        if (!empty($table)) {
                // Query for the mail
-               $result = SQL_QUERY_ESC("SELECT `id`, `%s` AS `mail_status` FROM `{?_MYSQL_PREFIX?}_%s` WHERE `id`=%s LIMIT 1",
+               $result = SQL_QUERY_ESC("SELECT `id`,`%s` AS `mail_status` FROM `{?_MYSQL_PREFIX?}_%s` WHERE `id`=%s LIMIT 1",
                        array(
                                $statusColumn,
                                $table,
@@ -2366,18 +2380,18 @@ function determinePointsColumnFromSubjectLocked ($subject, $locked) {
        return $pointsColumn;
 }
 
-// Setter for referal id (no bigintval, or nicknames will fail!)
-function setReferalId ($refid) {
+// Setter for referral id (no bigintval, or nicknames will fail!)
+function setReferralId ($refid) {
        $GLOBALS['refid'] = $refid;
 }
 
 // Checks if 'refid' is valid
-function isReferalIdValid () {
-       return ((isset($GLOBALS['refid'])) && (getReferalId() !== NULL) && (getReferalId() > 0));
+function isReferralIdValid () {
+       return ((isset($GLOBALS['refid'])) && (getReferralId() !== NULL) && (getReferralId() > 0));
 }
 
-// Getter for referal id
-function getReferalId () {
+// Getter for referral id
+function getReferralId () {
        return $GLOBALS['refid'];
 }
 
@@ -2445,6 +2459,30 @@ function convertStringToBoolean ($str) {
        return (($str == 'true') ? true : false);
 }
 
+/**
+ * "Makes" a variable in given string parseable, this function will throw an
+ * error if the first character is not a dollar sign.
+ *
+ * @param      $varString      String which contains a variable
+ * @return     $return         String with added single quotes for better parsing
+ */
+function makeParseableVariable ($varString) {
+       // The first character must be a dollar sign
+       if (substr($varString, 0, 1) != '$') {
+               // Please report this
+               debug_report_bug(__FUNCTION__, __LINE__, 'varString=' . $varString . ' - No dollar sign detected, will not parse it.');
+       } // END - if
+
+       // Do we have cache?
+       if (!isset($GLOBALS[__FUNCTION__][$varString])) {
+               // Snap them in, if [,] are there
+               $GLOBALS[__FUNCTION__][$varString] = str_replace('[', "['", str_replace(']', "']", $varString));
+       } // END - if
+
+       // Return cache
+       return $GLOBALS[__FUNCTION__][$varString];
+}
+
 //-----------------------------------------------------------------------------
 // Automatically re-created functions, all taken from user comments on www.php.net
 //-----------------------------------------------------------------------------