public static function Error($ErrNo, $ErrStr, $ErrFile, $ErrLine)
 {
     if ($ErrNo == E_STRICT) {
         return;
     }
     // catch smarty TODO
     if (strstr($ErrFile, 'core.get_include_path.php')) {
         return;
     }
     // catch double session_start()
     if (strstr($ErrStr, 'session_start()')) {
         return;
     }
     // catch stupid PHP 5.1 error
     if (strstr($ErrStr, 'Indirect modification of overloaded property')) {
         return;
     }
     // catch smarty_compile TODO
     if (strstr($ErrFile, 'smarty_compile')) {
         return;
     }
     // catch mysql_escape_string()
     if (strstr($ErrStr, 'mysql_real_escape_string()')) {
         return;
     }
     // catch the noob programmers notices from vB
     if (self::$PreventErrorsByPath && strstr($ErrFile, '/' . self::$PreventErrorsByPath . '/')) {
         RDD::Log('[[' . self::$ErrorMap[$ErrNo] . ':' . $ErrFile . ':' . $ErrLine . ']] ' . $ErrStr, ERROR);
         return;
     }
     // catch akismet warnings
     if (!defined('AKISMET_WARNINGS') && stristr($ErrStr, 'akismet')) {
         RDD::Log($ErrStr, WARN);
         return;
     }
     $params = array();
     $params['text'] = '[[' . self::$ErrorMap[$ErrNo] . ':' . $ErrFile . ':' . $ErrLine . ']] ' . $ErrStr;
     if (!self::$DisableTime) {
         if (!isset(self::$FirstTime)) {
             self::$FirstTime = microtime(true);
             $params['time'] = 0;
         } else {
             $params['time'] = microtime(true) - self::$FirstTime;
         }
     }
     if (self::$MemUsage && function_exists('memory_get_usage')) {
         $params['mem'] = memory_get_usage();
     }
     $params['level'] = ERROR;
     $params['from'] = self::CallFrom(2);
     $params['fulltrace'] = debug_backtrace();
     self::AddLog($params);
     if (self::$ShowError) {
         echo "<b style='color: red'>ERROR: " . $params['text'] . "</b>\n";
         // $trace = debug_backtrace();
         // echo "<pre>Backtrace:\n".self::EchoDebugDump($trace)."</pre>";
     }
     return;
 }