Removed @deprecated from CSS inline/PHP output
[mailer.git] / inc / template-functions.php
index 1cbc12b0ad56091054acf38728b304a4c43ec4a3..9d8412562c1ec72d02d08e28957a32ab5531a8ae 100644 (file)
@@ -16,7 +16,7 @@
  * $Author::                                                          $ *
  * -------------------------------------------------------------------- *
  * Copyright (c) 2003 - 2009 by Roland Haeder                           *
- * Copyright (c) 2009 - 2012 by Mailer Developer Team                   *
+ * Copyright (c) 2009 - 2013 by Mailer Developer Team                   *
  * For more information visit: http://mxchange.org                      *
  *                                                                      *
  * This program is free software; you can redistribute it and/or modify *
@@ -144,7 +144,7 @@ function outputHtml ($htmlCode = NULL, $newLine = TRUE) {
                                reportBug(__FUNCTION__, __LINE__, '<strong>{--FATAL_ERROR--}:</strong> {--NO_RENDER_DIRECT--}');
                                break;
                } // END - switch
-       } elseif ((getPhpCaching() == 'on') && ((!isset($GLOBALS['http_header'])) || (count($GLOBALS['http_header']) == 0)) && (!isRawOutputMode())) {
+       } elseif ((getPhpCaching() == 'on') && (!isFilledArray($GLOBALS['http_header'])) && (!isRawOutputMode())) {
                //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'getPhpCaching()=' . getPhpCaching() . ',isset(http_header)=' . intval(isset($GLOBALS['http_header'])) . ',getScriptOutputMode()=' . getScriptOutputMode() . '');
                // Output cached HTML code
                $GLOBALS['__output'] = ob_get_contents();
@@ -235,26 +235,26 @@ function doFinalCompilation ($code, $insertComments = TRUE, $enableCodes = TRUE)
        enableTemplateHtml($insertComments);
 
        // Init counter
-       $count = 0;
+       $totalCompilations = 0;
 
        // Compile all out
-       while (((isInString('{--', $code)) || (isInString('{DQUOTE}', $code)) || (isInString('{?', $code)) || (isInString('{%', $code) !== FALSE)) && ($count < 7)) {
+       while (((isInString('{--', $code)) || (isInString('{DQUOTE}', $code)) || (isInString('{?', $code)) || (isInString('{%', $code) !== FALSE)) && ($totalCompilations < 7)) {
                // Init common variables
                $content = array();
                $newContent = '';
 
                // Compile it
-               //* DEBUG: */ debugOutput('<pre>'.linenumberCode($code).'</pre>');
+               //* DEBUG: */ debugOutput('<pre>'.lineNumberCode($code).'</pre>');
                $eval = '$newContent = "' . str_replace('{DQUOTE}', '"', compileCode(escapeQuotes($code), $enableCodes)) . '";';
-               //* DEBUG: */ if (!$insertComments) print('EVAL=<pre>'.linenumberCode($eval).'</pre>');
+               //* DEBUG: */ if (!$insertComments) print('EVAL=<pre>'.lineNumberCode($eval).'</pre>');
                eval($eval);
-               //* DEBUG: */ if (!$insertComments) print('NEW=<pre>'.linenumberCode($newContent).'</pre>');
+               //* DEBUG: */ if (!$insertComments) print('NEW=<pre>'.lineNumberCode($newContent).'</pre>');
                //* DEBUG: */ die('<pre>'.encodeEntities($newContent).'</pre>');
 
                // Was that eval okay?
                if (empty($newContent)) {
                        // Something went wrong!
-                       reportBug(__FUNCTION__, __LINE__, 'Evaluation error:<pre>' . linenumberCode($eval) . '</pre>', FALSE);
+                       reportBug(__FUNCTION__, __LINE__, 'Evaluation error:<pre>' . lineNumberCode($eval) . '</pre>', FALSE);
                } // END - if
 
                // Use it again
@@ -267,14 +267,14 @@ function doFinalCompilation ($code, $insertComments = TRUE, $enableCodes = TRUE)
                } // END - if
 
                // Count round
-               $count++;
+               $totalCompilations++;
        } // END - while
 
        // Add debugging data in HTML code, if mode is enabled
        if ((isDebugModeEnabled()) && ($insertComments === TRUE) && (isHtmlOutputMode())) {
                // Add loop count
                //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'isDebugModeEnabled()=' . intval(isDebugModeEnabled()) . ',insertComments=' . intval($insertComments) . ',isHtmlOutputMode()=' . intval(isHtmlOutputMode()));
-               $code .= '<!-- Total compilation loop=' . $count . ' //-->';
+               $code .= '<!-- Total compilation loop=' . $totalCompilations . ' //-->';
        } // END - if
 
        // Return the compiled code
@@ -322,17 +322,17 @@ function loadTemplate ($template, $return = FALSE, $content = array(), $compileC
                $template = strtolower($template);
 
                // Base directory
-               $basePath = sprintf("%stemplates/%s/html/", getPath(), getLanguage());
+               $basePath = getTemplateBasePath('html');
                $extraPath = detectExtraTemplatePath('html', $template);
 
                // Generate FQFN
-               $FQFN = $basePath . $extraPath . $template . '.tpl';
+               $FQFN = $basePath . '/' . $extraPath . $template . '.tpl';
                //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'Template ' . $template . ' is solved to FQFN=' . $FQFN);
 
                // Does the special template exists?
                if (!isFileReadable($FQFN)) {
                        // Reset to default template
-                       $FQFN = $basePath . $template . '.tpl';
+                       $FQFN = $basePath . '/' . $template . '.tpl';
                } // END - if
 
                // Now does the final template exists?
@@ -509,18 +509,18 @@ function loadEmailTemplate ($template, $content = array(), $userid = NULL, $load
                unset($GLOBALS['template_eval']['email'][$template]);
        } elseif (!isset($GLOBALS['template_eval']['email'][$template])) {
                // Base directory
-               $basePath = sprintf("%stemplates/%s/emails/", getPath(), getLanguage());
+               $basePath = getTemplateBasePath('emails');
 
                // Detect extra path
                $extraPath = detectExtraTemplatePath('email', $template);
 
                // Generate full FQFN
-               $FQFN = $basePath . $extraPath . $template . '.tpl';
+               $FQFN = $basePath . '/' . $extraPath . $template . '.tpl';
 
                // Does the special template exists?
                if (!isFileReadable($FQFN)) {
                        // Reset to default template
-                       $FQFN = $basePath . $template . '.tpl';
+                       $FQFN = $basePath . '/' . $template . '.tpl';
                } // END - if
 
                // Now does the final template exists?
@@ -562,6 +562,7 @@ function loadEmailTemplate ($template, $content = array(), $userid = NULL, $load
                // Eval the code
                //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'template=' . $template . ' - BEFORE EVAL');
                //* DEBUG: */ print('<pre>'.htmlentities($GLOBALS['template_eval']['email'][$template]).'</pre>');
+               //* DEBUG: */ die('<pre>'.print_r($content, TRUE).'</pre><pre>'.htmlentities($GLOBALS['template_eval']['email'][$template]).'</pre>');
                eval($GLOBALS['template_eval']['email'][$template]);
                //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'template=' . $template . ' - AFTER EVAL');
        } // END - if
@@ -616,7 +617,7 @@ function getMenuCssClasses ($data) {
 
 // Generate XHTML code for the CAPTCHA
 function generateCaptchaCode ($code, $type, $urlId, $userid) {
-       return '<img border="0" alt="Code ' . $code . '" src="{%url=mailid_top.php?userid=' . $userid . '&amp;' . $type . '=' . $urlId . '&amp;do=img&amp;code=' . $code . '%}" />';
+       return '<img border="0" alt="Code ' . $code . '" src="{%url=mailid.php?userid=' . $userid . '&amp;' . $type . '=' . $urlId . '&amp;do=img&amp;code=' . $code . '%}" />';
 }
 
 // Compiles the given HTML/mail code
@@ -677,17 +678,20 @@ function compileRawCode ($code, $full = TRUE, $compileCode = TRUE) {
        //* NOISY-DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'Second regex gave ' . count($matches[0]) . ' matches.');
 
        // Are some matches found?
-       if ((count($matches) > 0) && (count($matches[0]) > 0)) {
+       if ((isFilledArray($matches)) && (isFilledArray($matches[0]))) {
                // Replace all matches
                $matchesFound = array();
                foreach ($matches[0] as $key => $match) {
                        // Fuzzy look has failed by default
                        $fuzzyFound = FALSE;
 
+                       // "Cache" match length
+                       $matchLength = strlen($match);
+
                        // Fuzzy look on match if already found
                        foreach ($matchesFound as $found => $set) {
                                // Get test part
-                               $test = substr($found, 0, strlen($match));
+                               $test = substr($found, 0, $matchLength);
 
                                // Does this entry exist?
                                //* NOISY-DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'found=' . $found . ',match=' . $match . ',set=' . $set);
@@ -734,7 +738,7 @@ function compileRawCode ($code, $full = TRUE, $compileCode = TRUE) {
        preg_match_all('/\$([a-z_A-Z\[\]]){0,}/', $code, $matches);
 
        // Are some matches found?
-       if ((count($matches) > 0) && (count($matches[0]) > 0)) {
+       if ((isFilledArray($matches)) && (isFilledArray($matches[0]))) {
                // Scan all matches for not $content
                foreach ($matches[0] as $match) {
                        // Trim match
@@ -787,7 +791,7 @@ function addSelectionBox ($type, $default, $prefix = '', $id = NULL, $class = 'f
                        // Use configured min age or fixed?
                        if (isExtensionInstalledAndNewer('other', '0.2.1')) {
                                // Configured
-                               $startYear = $year - getConfig('min_age');
+                               $startYear = $year - getMinAge();
                        } else {
                                // Fixed 16 years
                                $startYear = $year - 16;
@@ -829,6 +833,14 @@ function addSelectionBox ($type, $default, $prefix = '', $id = NULL, $class = 'f
                        } // END - for
                        break;
 
+               case 'mn': // Months, numeric
+                       for ($idx = 0; $idx <= 12; $idx++) {
+                               $OUT .= '<option value="' . $idx . '"';
+                               if ($default == $idx) $OUT .= ' selected="selected"';
+                               $OUT .= '>{%pipe,padLeftZero=' . $idx . '%}</option>';
+                       } // END - for
+                       break;
+
                case 'we': // Weeks
                        for ($idx = 0; $idx <= 4; $idx++) {
                                $OUT .= '  <option value="' . $idx . '"';
@@ -838,29 +850,29 @@ function addSelectionBox ($type, $default, $prefix = '', $id = NULL, $class = 'f
                        break;
 
                case 'da': // Days
-                       for ($idx = 0; $idx < 32; $idx++) {
+                       for ($idx = 0; $idx <= 31; $idx++) {
                                $OUT .= '<option value="' . $idx . '"';
                                if ($default == $idx) $OUT .= ' selected="selected"';
-                               $OUT .= '>' . str_pad($idx, 2, '0', STR_PAD_LEFT) . '</option>';
+                               $OUT .= '>{%pipe,padLeftZero=' . $idx . '%}</option>';
                        } // END - for
                        break;
 
                case 'ho': // Hours
-                       for ($idx = 0; $idx < 24; $idx++) {
-                               if (strlen($idx) == 1) $idx = 0 . $idx;
-                               $OUT .= '<option value="' . $idx . '"';
-                               if ($default == $idx) $OUT .= ' selected="selected"';
-                               $OUT .= '>' . $idx . '</option>';
+                       for ($idx = 0; $idx <= 23; $idx++) {
+                               $padded = padLeftZero($idx);
+                               $OUT .= '<option value="' . $padded . '"';
+                               if ($default == $padded) $OUT .= ' selected="selected"';
+                               $OUT .= '>' . $padded . '</option>';
                        } // END - for
                        break;
 
                case 'mi': // Minutes
                case 'se': // Seconds
-                       for ($idx = 0; $idx < 60; $idx+=5) {
-                               if (strlen($idx) == 1) $idx = 0 . $idx;
-                               $OUT .= '<option value="' . $idx . '"';
-                               if ($default == $idx) $OUT .= ' selected="selected"';
-                               $OUT .= '>' . $idx . '</option>';
+                       for ($idx = 0; $idx <= 59; $idx+=5) {
+                               $padded = padLeftZero($idx);
+                               $OUT .= '<option value="' . $padded . '"';
+                               if ($default == $padded) $OUT .= ' selected="selected"';
+                               $OUT .= '>' . $padded . '</option>';
                        } // END - for
                        break;
 
@@ -892,7 +904,7 @@ function generateImageOrCode ($img_code, $headerSent = TRUE) {
        }
 
        // Load image
-       $img = sprintf("%s/theme/%s/images/code_bg.%s",
+       $img = sprintf('%s/theme/%s/images/code_bg.%s',
                getPath(),
                getCurrentTheme(),
                getImgType()
@@ -912,7 +924,7 @@ function generateImageOrCode ($img_code, $headerSent = TRUE) {
                } // END - switch
        } else {
                // Silently log the error
-               logDebugMessage(__FUNCTION__, __LINE__, sprintf("File for image-type %s in theme %s not found.", getImgType(), getCurrentTheme()));
+               logDebugMessage(__FUNCTION__, __LINE__, sprintf('File for image-type %s in theme %s not found.', getImgType(), getCurrentTheme()));
                return;
        }
 
@@ -1009,7 +1021,7 @@ function createTimeSelections ($timestamp, $prefix = '', $display = '', $align =
                        // Time unit -> field name
                        'unit_field' => array(
                                'Y' => 'ye',
-                               'M' => 'mo',
+                               'M' => 'mn',
                                'W' => 'we',
                                'D' => 'da',
                                'h' => 'ho',
@@ -1154,16 +1166,16 @@ function generateEmailLink ($email, $table = 'admins') {
  * functionality like logging and admin notification (which you can configure
  * through your admin area).
  *
- * @param      $F                      Function or file basename where the error came from
- * @param      $L                      Line number where the error came from
+ * @param      $file           Function or file basename where the error came from
+ * @param      $line           Line number where the error came from
  * @param      $message        Message which shall be output to web
  * @return     void
  */
-function app_exit ($F, $L, $message) {
+function app_exit ($file, $line, $message) {
        // Check if Script is already dieing and not let it kill itself another 1000 times
        if (isset($GLOBALS['app_died'])) {
                // Script tried to kill itself twice
-               die('[' . __FUNCTION__ . ':' . __LINE__ . ']: Script wanted to kill itself more than once! Raw message=' . $message . ', file/function=' . $F . ', line=' . $L);
+               die('[' . __FUNCTION__ . ':' . __LINE__ . ']: Script wanted to kill itself more than once! Raw message=' . $message . ', file/function=' . $file . ', line=' . $line);
        } // END - if
 
        // Make sure, that the script realy realy diese here and now
@@ -1184,8 +1196,8 @@ function app_exit ($F, $L, $message) {
        // Rewrite message for output
        $message = sprintf(
                getMessage('MAILER_HAS_DIED'),
-               basename($F),
-               $L,
+               basename($file),
+               $line,
                $message
        );
 
@@ -1233,6 +1245,12 @@ function displayParsingTime () {
 
        // Load the template
        $GLOBALS['__page_footer'] .= loadTemplate('show_timings', TRUE, $content);
+
+       // Is debug enabled?
+       if (isDebugModeEnabled()) {
+               // Log loading of total includes
+               //* NOISY-DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'Loaded includes: ' . count($GLOBALS['inc_loaded']) . ', readable files: ' . count($GLOBALS['file_readable']));
+       } // END - if
 }
 
 /**
@@ -1244,16 +1262,16 @@ function displayParsingTime () {
  * app_exit() is more a "private" function and will only output a bug message to
  * the user, no email and no logging.
  *
- * @param      $F                      Function or file basename where the error came from
- * @param      $L                      Line number where the error came from
+ * @param      $file           Function or file basename where the error came from
+ * @param      $line           Line number where the error came from
  * @param      $sendEmail      Wether to send an email to all configured administrators
  * @return     void
  */
-function reportBug ($F, $L, $message = '', $sendEmail = TRUE) {
+function reportBug ($file, $line, $message = '', $sendEmail = TRUE) {
        // Is this already called?
        if (isset($GLOBALS[__FUNCTION__])) {
                // Other backtrace
-               print '[' . $F . ':' . $L . ':] ' . __FUNCTION__ . ' has already died! Message:' . $message . '<br />Backtrace:<pre>';
+               print '[' . $file . ':' . $line . ':] ' . __FUNCTION__ . '() has already died! Message:' . $message . '<br />Backtrace:<pre>';
                debug_print_backtrace();
                die('</pre>');
        } // END - if
@@ -1275,7 +1293,7 @@ function reportBug ($F, $L, $message = '', $sendEmail = TRUE) {
                );
 
                // @TODO Add a little more infos here
-               logDebugMessage($F, $L, strip_tags($message));
+               logDebugMessage($file, $line, strip_tags($message));
        } // END - if
 
        // Add output
@@ -1286,7 +1304,7 @@ function reportBug ($F, $L, $message = '', $sendEmail = TRUE) {
        $debug .= '<div class="para">Thank you for finding bugs.</div>';
 
        // Send an email? (e.g. not wanted for evaluation errors)
-       if (($sendEmail === TRUE) && (!isInstallationPhase())) {
+       if (($sendEmail === TRUE) && (!isInstaller()) && (isAdminRegistered())) {
                // Prepare content
                $content = array(
                        'message'   => trim($message),
@@ -1297,10 +1315,28 @@ function reportBug ($F, $L, $message = '', $sendEmail = TRUE) {
                sendAdminNotification('{--REPORT_BUG_SUBJECT--}', 'admin_report_bug', $content);
        } // END - if
 
-       // Is there HTML/CSS/AJAX mode?
-       if (((isHtmlOutputMode()) || (isCssOutputMode()) || (isAjaxOutputMode())) && (isDebugModeEnabled())) {
+       // Is there HTML/CSS/AJAX mode while debug-mode is enabled?
+       if ((isDebugModeEnabled()) && ((isHtmlOutputMode()) || (isCssOutputMode()) || (isAjaxOutputMode()))) {
                // And abort here
-               app_exit($F, $L, $debug);
+               app_exit($file, $line, $debug);
+       } elseif (isAjaxOutputMode()) {
+               // Load include (again?)
+               loadIncludeOnce('inc/ajax-functions.php');
+
+               // Init AJAX
+               initAjax();
+
+               // Set HTTP status to 500 again
+               setHttpStatus('500 Internal Server Error');
+
+               // Is AJAX output mode, then output message as JSON
+               setAjaxReplyContent($debug);
+
+               // Send it out to browser
+               sendAjaxContent(TRUE);
+
+               // Include footer
+               loadIncludeOnce('inc/footer.php');
        } else {
                // Raw/image output mode and all other modes doesn't work well with text ...
                die();
@@ -1471,7 +1507,7 @@ function generateExtensionInactiveNotInstalledMessage ($ext_name) {
 }
 
 // Print code with line numbers
-function linenumberCode ($code)    {
+function lineNumberCode ($code)    {
        // By default copy the code
        $codeE = $code;
 
@@ -1505,7 +1541,7 @@ function determinePageTitle () {
        $pageTitle = '';
 
        // Config and database connection valid?
-       if ((isConfigLocalLoaded()) && (isConfigurationLoaded()) && (SQL_IS_LINK_UP()) && (isExtensionInstalledAndNewer('sql_patches', '0.1.6'))) {
+       if ((isConfigLocalLoaded()) && (isConfigurationLoaded()) && (isSqlLinkUp()) && (isExtensionInstalledAndNewer('sql_patches', '0.1.6'))) {
                // Title decoration enabled?
                if ((isTitleDecorationEnabled()) && (getTitleLeft() != '')) {
                        $pageTitle .= '{%config,trim=title_left%} ';
@@ -1688,12 +1724,12 @@ function sendModeMails ($mod, $modes) {
                                                                break;
 
                                                        case 'password': // Password was changed
-                                                               $content['message'] = '{--MEMBER_CHANGED_PASS--}' . PHP_EOL;
+                                                               $content['message'] = '{--MEMBER_CHANGED_PASSWORD--}' . PHP_EOL;
                                                                break;
 
                                                        default:
-                                                               logDebugMessage(__FUNCTION__, __LINE__, sprintf("Unknown mode %s detected.", $mode));
-                                                               $content['message'] = '{--MEMBER_UNKNOWN_MODE--}' . ': ' . $mode . PHP_EOL . PHP_EOL;
+                                                               logDebugMessage(__FUNCTION__, __LINE__, sprintf('Unknown mode %s detected.', $mode));
+                                                               $content['message'] = '{%message,MEMBER_UNKNOWN_MODE=' .  $mode . '%}' . PHP_EOL . PHP_EOL;
                                                                break;
                                                } // END - switch
                                        } // END - foreach
@@ -1712,23 +1748,23 @@ function sendModeMails ($mod, $modes) {
                                        if (isAdminNotificationEnabled()) {
                                                // The admin needs to be notified about a profile change
                                                $message_admin = 'admin_mydata_notify';
-                                               $sub_adm   = '{--ADMIN_CHANGED_DATA--}';
+                                               $subjectAdmin   = '{--ADMIN_CHANGED_DATA_SUBJECT--}';
                                        } else {
                                                // No mail to admin
                                                $message_admin = '';
-                                               $sub_adm   = '';
+                                               $subjectAdmin  = '';
                                        }
 
                                        // Set subject lines
-                                       $sub_mem = '{--MEMBER_CHANGED_DATA--}';
+                                       $subjectMember = '{--MEMBER_CHANGED_DATA--}';
 
                                        // Output success message
                                        $content['message'] = '<span class="message">{--MEMBER_MYDATA_MAIL_SENT--}</span>';
                                        break;
 
                                default: // Unsupported module!
-                                       logDebugMessage(__FUNCTION__, __LINE__, sprintf("Unsupported module %s detected.", $mod));
-                                       $content['message'] = '<span class="bad">{--UNKNOWN_MODULE--}</span>';
+                                       logDebugMessage(__FUNCTION__, __LINE__, sprintf('Unsupported module %s detected.', $mod));
+                                       $content['message'] = '<span class="bad">{%message,UNKNOWN_MODULE=' . $mod . '%}</span>';
                                        break;
                        } // END - switch
                } else {
@@ -1741,15 +1777,15 @@ function sendModeMails ($mod, $modes) {
        }
 
        // Send email to user if required
-       if ((!empty($sub_mem)) && (!empty($message)) && (!empty($content['userid']))) {
+       if ((!empty($subjectMember)) && (!empty($message)) && (!empty($content['userid']))) {
                // Send member mail
-               sendEmail($content['userid'], $sub_mem, $message);
+               sendEmail($content['userid'], $subjectMember, $message);
        } // END - if
 
        // Send only if no other error has occured
-       if ((!empty($sub_adm)) && (!empty($message_admin)) && (isAdminNotificationEnabled())) {
+       if ((!empty($subjectAdmin)) && (!empty($message_admin)) && (isAdminNotificationEnabled())) {
                // Send admin mail
-               sendAdminNotification($sub_adm, $message_admin, $content, getMemberId());
+               sendAdminNotification($subjectAdmin, $message_admin, $content, getMemberId());
        } elseif (isAdminNotificationEnabled()) {
                // Cannot send mails to admin!
                $content['message'] = '{--CANNOT_SEND_ADMIN_MAILS--}';
@@ -1764,6 +1800,9 @@ function sendModeMails ($mod, $modes) {
 
 // Generates a 'selection box' from given array
 function generateSelectionBoxFromArray ($options, $name, $optionKey, $optionContent = '', $extraName = '', $templateName = '', $default = NULL, $nameElement = '', $allowNone = FALSE, $useDefaultAsArray = FALSE) {
+       // options must be an array
+       assert(is_array($options));
+
        // Default is empty
        $addKey = '';
 
@@ -1948,6 +1987,12 @@ function displayMessage ($message, $return = FALSE) {
        return loadTemplate('admin_settings_saved', $return, $message);
 }
 
+// Displays given error message in admin_settings_saved template
+function displayErrorMessage ($message, $return = FALSE) {
+       // Load the template
+       return loadTemplate('admin_settings_unsaved', $return, $message);
+}
+
 // Generates a selection box for (maybe) given gender
 function generateGenderSelectionBox ($selectedGender = '', $fieldName = 'gender') {
        // Start the HTML code
@@ -2031,6 +2076,71 @@ function addJavaScriptMenuContent ($menuMode, $mainAction, $action, $what) {
        return $OUT;
 }
 
+// Tries to anonymize some sensitive data (e.g. IP address, user agent, referrer, etc.)
+function anonymizeSensitiveData ($data) {
+       // Trim it
+       $data = trim($data);
+
+       // Is it empty?
+       if (empty($data)) {
+               // Then add three dashes
+               $data = '---';
+       } elseif (isUrlValid($data)) {
+               // Is a referrer, so is it black-listed?
+               if (isAdmin()) {
+                       // Is admin, has always priority
+                       $data = '[<a href="{%pipe,generateFrametesterUrl=' . $data . '%}" target="_blank">{--ADMIN_TEST_URL--}</a>]';
+               } elseif ((isExtensionActive('blacklist')) && (isUrlBlacklisted($data))) {
+                       // Yes, so replace it with text
+                       $data = '<em>{--URL_IS_BLACKLISTED--}</em>';
+               } else {
+                       // A  member is viewing this referral URL
+                       $data = '[<a href="{%pipe,generateDereferrerUrl=' . $data . '%}" target="_blank">{--MEMBER_TEST_URL--}</a>]';
+               }
+       } elseif (isIp4AddressValid($data)) {
+               // Is an IPv4 address
+               $ipArray = explode('.', $data);
+
+               // Only display first 2 octets
+               $data = $ipArray[0] . '.' . $ipArray[1] . '.?.?';
+       } else {
+               // Generic data
+               $data = '<em>{--DATA_IS_HIDDEN--}</em>';
+       }
+
+       // Return it (hopefully) anonymized
+       return $data;
+}
+
+/**
+ * Removes all comments, tabs and new-line characters to compact the content
+ *
+ * @param      $uncompactedContent             The uncompacted content
+ * @return     $compactedContent               The compacted content
+ */
+function compactContent ($uncompactedContent) {
+       // First, remove all tab/new-line/revert characters
+       $compactedContent = str_replace(chr(9), '', str_replace(PHP_EOL, '', str_replace(chr(13), '', $uncompactedContent)));
+
+       // Make a space after >
+       $compactedContent = str_replace(array('>', '  '), array('> ', ' '), $compactedContent);
+
+       // Then regex all comments like <!-- //--> away
+       preg_match_all('/<!--[\w\W]*?(\/\/){0,1}-->/', $compactedContent, $matches);
+
+       // Do we have entries?
+       if (isset($matches[0][0])) {
+               // Remove all
+               foreach ($matches[0] as $match) {
+                       // Remove the match
+                       $compactedContent = str_replace($match, '', $compactedContent);
+               } // END - foreach
+       } // END - if
+
+       // Return compacted content
+       return $compactedContent;
+}
+
 //-----------------------------------------------------------------------------
 //                     Template helper functions for EL code
 //-----------------------------------------------------------------------------
@@ -2065,7 +2175,7 @@ function doTemplateExtensionRegistrationLink ($templateName, $clear, $ext_name)
                $OUT = '<span title="{--ADMIN_EXTENSION_IS_DEPRECATED_TITLE--}">---</span>';
        } elseif (isExtensionProductive($ext_name)) {
                // Productive code
-               $OUT = '<a title="{--ADMIN_REGISTER_EXTENSION_TITLE--}" href="{%url=modules.php?module=admin&amp;what=extensions&amp;register_ext=' . $ext_name . '%}">{--ADMIN_REGISTER_EXTENSION--}</a>';
+               $OUT = '<a title="{--ADMIN_TASK_REGISTER_EXTENSION_TITLE--}" href="{%url=modules.php?module=admin&amp;what=extensions&amp;register_ext=' . $ext_name . '%}">{--ADMIN_TASK_REGISTER_EXTENSION--}</a>';
        }
 
        // Return code
@@ -2075,13 +2185,13 @@ function doTemplateExtensionRegistrationLink ($templateName, $clear, $ext_name)
 // Helper function to create bonus mail admin links
 function doTemplateAdminBonusMailLinks ($templateName, $clear, $bonusId) {
        // Call the inner function
-       return generateAdminMailLinks('bid', $bonusId);
+       return generateAdminMailLinks('bonus', $bonusId);
 }
 
 // Helper function to create member mail admin links
 function doTemplateAdminMemberMailLinks ($templateName, $clear, $mailId) {
        // Call the inner function
-       return generateAdminMailLinks('mid', $mailId);
+       return generateAdminMailLinks('normal', $mailId);
 }
 
 // Helper function to create a selection box for YES/NO configuration entries
@@ -2258,69 +2368,57 @@ function doTemplateLoadTemplate ($templateName, $clear = FALSE, $theTemplate, $c
        return loadTemplate($theTemplate, TRUE, $content);
 }
 
-// Tries to anonymize some sensitive data (e.g. IP address, user agent, referrer, etc.)
-function anonymizeSensitiveData ($data) {
-       // Trim it
-       $data = trim($data);
+// Output HTML code for favicon.ico, if found
+function doTemplateMetaFavIcon ($templateName, $clear = FALSE) {
+       // Default is not found
+       $out = '';
 
-       // Is it empty?
-       if (empty($data)) {
-               // Then add three dashes
-               $data = '---';
-       } elseif (isUrlValid($data)) {
-               // Is a referrer, so is it black-listed?
-               if (isAdmin()) {
-                       // Is admin, has always priority
-                       $data = '[<a href="{%pipe,generateFrametesterUrl=' . $data . '%}" target="_blank">{--ADMIN_TEST_URL--}</a>]';
-               } elseif (isUrlBlacklisted($data)) {
-                       // Yes, so replace it with text
-                       $data = '<em>{--URL_IS_BLACKLISTED--}</em>';
-               } else {
-                       // A  member is viewing this referral URL
-                       $data = '[<a href="{%pipe,generateDereferrerUrl=' . $data . '%}" target="_blank">{--MEMBER_TEST_URL--}</a>]';
-               }
-       } elseif (isIp4AddressValid($data)) {
-               // Is an IPv4 address
-               $ipArray = explode('.', $data);
-
-               // Only display first 2 octets
-               $data = $ipArray[0] . '.' . $ipArray[1] . '.?.?';
-       } else {
-               // Generic data
-               $data = '<em>{--DATA_IS_HIDDEN--}</em>';
-       }
+       // Check all common extensions
+       foreach (array('ico', 'gif', 'png') as $extension) {
+               // Is the file there?
+               if (isFileReadable(getPath() . 'favicon.' . $extension)) {
+                       // Then use this and abort
+                       $out = '<link rel="shortcut icon" href="{%url=favicon.' . $extension . '%}" type="image/' . $extension . '" />';
+                       break;
+               } // END - if
+       } // END - while
 
-       // Return it (hopefully) anonymized
-       return $data;
+       // Return code
+       return $out;
 }
 
-/**
- * Removes all commentd, tabs and new-line characters to compact the content
- *
- * @param      $uncompactedContent             The uncompacted content
- * @return     $compactedContent               The compacted content
- */
-function compactContent ($uncompactedContent) {
-       // First, remove all tab/new-line/revert characters
-       $compactedContent = str_replace(chr(9), '', str_replace(PHP_EOL, '', str_replace(chr(13), '', $uncompactedContent)));
+// "Getter" for template base path
+function getTemplateBasePath ($part) {
+       // Is there cache?
+       if (!isset($GLOBALS[__FUNCTION__][$part])) {
+               // "Build" path
+               $GLOBALS[__FUNCTION__][$part] = sprintf('%stemplates/%s/%s', getPath(), getLanguage(), $part);
+       } // END - if
 
-       // Then regex all comments like <!-- //--> away
-       preg_match_all('/<!--[\w\W]*?(\/\/){0,1}-->/', $compactedContent, $matches);
+       // Return cache
+       return $GLOBALS[__FUNCTION__][$part];
+}
 
-       // Do we have entries?
-       if (isset($matches[0][0])) {
-               // Remove all
-               foreach ($matches[0] as $match) {
-                       // Remove the match
-                       $compactedContent = str_replace($match, '', $compactedContent);
-               } // END - foreach
-       } // END - if
+// Removes comments with @DEPRECATED
+function removeDeprecatedComment ($output) {
+       // Explode it into pieces ... ;)
+       $lines = explode(chr(10), $output);
 
-       // Set the content again
-       // @TODO Is this needed for e.g. $GLOBALS['template_content'] ? $this->setRawTemplateData($compactedContent);
+       // Walk through all
+       $return = '';
+       foreach ($lines as $line) {
+               // Is there a @DEPRECATED?
+               if (isInString('@DEPRECATED', $line)) {
+                       // Ignore this line
+                       continue;
+               } // END - if
 
-       // Return compacted content
-       return $compactedContent;
+               // Add it
+               $return .= $line . chr(13);
+       } // END - foreach
+
+       // Returned cleaned content
+       return $return;
 }
 
 // [EOF]