/**
 * Преобразует строки объекта или массива в кодировку UTF-8
 * @param  $var
 * @return array|string
 * @since 1.3.5
 */
function ObjectCp1251ToUtf8(&$var)
{
    if (is_array($var)) {
        foreach ($var as &$v) {
            $v = ObjectCp1251ToUtf8($v);
        }
    } elseif (is_object($var)) {
        $vars = get_object_vars($var);
        foreach ($vars as $f => &$v) {
            $var->{$f} = ObjectCp1251ToUtf8($v);
        }
    } elseif (is_string($var)) {
        $var = Cp1251ToUtf8($var);
    }
    return $var;
}
/**
 * Отправляет E-mail
 * @param $ToName
 * @param $ToEmail
 * @param $Subject
 * @param $Text
 * @param bool $Html
 * @param string $From
 * @param string $FromEmail
 */
function SendMail($ToName, $ToEmail, $Subject, $Text, $Html = false, $From = '', $FromEmail = '')
{
    $mail = LmEmailExtended::Instance();
    if ($From == '' && $FromEmail == '') {
        $mail->SetFrom(System::config('general/site_email'), Cp1251ToUtf8(System::config('general/site_name')));
    } else {
        $mail->SetFrom($FromEmail, Cp1251ToUtf8($From));
    }
    $mail->SetSubject(Cp1251ToUtf8($Subject));
    if (!$Html) {
        $mail->AddTextPart(Cp1251ToUtf8($Text));
    } else {
        $mail->AddHtmlPart(Cp1251ToUtf8($Text));
    }
    $mail->AddTo($ToEmail, Cp1251ToUtf8($ToName));
    if (!$mail->Send()) {
        ErrorHandler(USER_ERROR, 'Проблема при отправке E-mail "' . $Subject . '".', __FILE__);
    }
}
 public function ToString($EncodeQuery = true)
 {
     $url = '';
     if ($this->Protocol != '') {
         $url .= $this->Protocol . '://';
     }
     if ($this->User != '') {
         $url .= rawurlencode($this->User);
         if ($this->Password != '') {
             $url .= ':' . rawurlencode($this->Password);
         }
         $url .= '@';
     }
     if ($this->Host != '') {
         $url .= $this->Host;
     }
     if ($this->Port != '') {
         $url .= ':' . $this->Port;
     }
     $url .= $this->Path . $this->Document;
     if (count($this) > 0) {
         $url .= '?';
         foreach ($this as $key => $value) {
             if ($EncodeQuery) {
                 $url .= $key . '=' . rawurlencode(Cp1251ToUtf8($value)) . '&';
             } else {
                 $url .= $key . '=' . $value . '&';
             }
         }
         $url = rtrim($url, '&');
     }
     if ($this->Anchor != '') {
         $url .= '#' . $this->Anchor;
     }
     return $url;
 }
function IndexFeedBackSend()
{
    $err = array();
    if (!isset($_POST['name']) || !isset($_POST['email']) || !isset($_POST['subject']) || !isset($_POST['department']) || !isset($_POST['message']) || !isset($_POST['feedback_form'])) {
        GO(Ufu('index.php'));
    } else {
        if ($_POST['name'] != '') {
            $name = SafeDB($_POST['name'], 250, str);
        } else {
            $err[] = 'Пожалуйста, укажите Ваше имя!';
        }
        if ($_POST['email'] != '') {
            $email = SafeDB($_POST['email'], 50, str);
        } else {
            $err[] = 'Пожалуйста, укажите Ваш действительный адрес E-mail!';
        }
        if ($_POST['subject'] != '') {
            $subject = SafeDB($_POST['subject'], 250, str, false, false, false);
        } else {
            $err[] = 'Пожалуйста, введите тему сообщения!';
        }
        // Проверяем капчу
        if (!System::user()->isDef('captcha_keystring') || System::user()->Get('captcha_keystring') != $_POST['keystr']) {
            $err[] = 'Вы ошиблись при вводе кода с картинки.';
        }
        if ($_POST['department'] != '') {
            $department = SafeEnv($_POST['department'], 11, int);
            System::database()->Select('feedback', "`active`='1' and `id`='{$department}'");
            if (System::database()->NumRows() > 0) {
                $dep = System::database()->FetchRow();
                $dep_email = SafeDB($dep['email'], 255, str);
                $department = SafeDB($dep['name'], 255, str);
            } else {
                $err[] = 'Департамент больше не существует или обратная связь с этим департаментом отключена.';
            }
        } else {
            $err[] = 'Пожалуйста, выберите департамент!';
        }
        if ($_POST['message'] != '') {
            $message = SafeDB($_POST['message'], 65535, str, false, false, false);
        } else {
            $err[] = 'Пожалуйста, введите сообщение!';
        }
    }
    $size = $_FILES['attach']['size'];
    // / 1024;
    if ($_FILES['attach']['error'] == UPLOAD_ERR_OK && $size >= System::config('feedback/max_filesize')) {
        $err[] = 'Слишком большой размер файла.';
    }
    if (count($err) == 0) {
        $mail = LmEmailExtended::Instance();
        $mail->SetTo($dep_email, Cp1251ToUtf8($department));
        $mail->SetFrom($email, Cp1251ToUtf8($name));
        $mail->SetSubject(Cp1251ToUtf8($subject));
        $text = Indent("\n\t\t\tЗдравствуйте!\n\n\t\t\tС помощью формы обратной связи на сайте \"" . System::config('general/site_name') . "\"\n\t\t\tвам было отправлено сообщение.\n\n\t\t\tДепартамент: {$department}\n\t\t\tИмя: {$name}\n\t\t\tE-mail: {$email}\n\t\t\tТема сообщения: {$subject}\n\t\t\tДата отправки: " . TimeRender(time(), true, false) . "\n\t\t\tСообщение: {$message}\n\t\t");
        $mail->AddTextPart(Cp1251ToUtf8($text));
        if ($_FILES['attach']['error'] == UPLOAD_ERR_OK) {
            $mail->AddAttachmentPart(file_get_contents($_FILES['attach']['tmp_name']), $_FILES['attach']['name']);
        }
        if ($mail->Send()) {
            System::site()->AddTextBox('Обратная связь', '<div style="text-align: center;">Ваше сообщение успешно отправлено!</div>');
        } else {
            System::site()->AddTextBox('Обратная связь', '<div style="text-align: center;">При отправке вашего сообщения произошла ошибка, повторите попытку или обратитесь к администратору.</div>');
        }
    } else {
        $text = 'Сообщение не отправлено:<br /><ul>';
        foreach ($err as $error) {
            $text .= '<li>' . $error . '</li>';
        }
        $text .= '</ul>';
        System::site()->AddTextBox('Ошибка', $text);
        IndexFeedBackForm();
    }
}
/**
 * Безопасная функция для вывода ЧПУ ссылок.
 * @param               $Url
 * @param string        $Ufu
 * @param string|bool   $NavLink
 * @param string        $NavParam
 * @param int           $MinOrder
 * @return string
 * @examples
 *           Ufu('index.php?name=news&topic=5', 'news/{topic}/');
 *           Ufu('index.php?name=news&topic=5', 'news:show-topics');
 */
function Ufu($Url, $Ufu = '', $NavLink = null, $NavParam = null, $MinOrder = 10000)
{
    if (System::config('general/ufu')) {
        if ($Url == 'index.php') {
            return GetSiteUrl() . 'index.html';
        }
        // Вытаскиваем параметры ссылки
        $p = strpos($Url, '?');
        if ($p !== false) {
            $Url = substr($Url, $p + 1);
        }
        $p = strrpos($Url, '#');
        if ($p !== false) {
            $anchor = substr($Url, $p);
            $Url = substr($Url, 0, $p);
        } else {
            $anchor = '';
        }
        parse_str($Url, $params);
        // NavLink
        if (isset($NavLink) && !is_string($NavLink)) {
            if ($NavLink === true) {
                if (isset($NavParam)) {
                    $NavLink = $NavParam;
                } else {
                    $NavLink = 'page';
                }
            } else {
                $NavLink = null;
            }
        }
        // Параметры для замены ключей в ufu шаблоне
        $replace = array();
        foreach ($params as $key => $val) {
            $replace['{' . $key . '}'] = rawurlencode(Cp1251ToUtf8($val));
        }
        // Получаем правило
        $rule = UfuGetRules($Ufu);
        if (!isset($rule)) {
            if (isset($NavLink)) {
                $params[$NavLink] = '1';
            }
            $rule = UfuAddRewriteRule($Ufu, $params, $MinOrder);
        }
        // Парсим шаблон ссылки заменяя ключи
        return strtr($rule['ufu'], $replace) . $anchor;
    } else {
        if ($Url == 'index.php') {
            return GetSiteUrl() . $Url;
        } else {
            $Url = new Url($Url);
            return $Url->ToString();
        }
    }
}
function AdminMailSend()
{
    $topic_id = SafeEnv($_POST['topic'], 11, int);
    $subject = SafeEnv($_POST['subject'], 255, str);
    $from = SafeEnv($_POST['from'], 255, str);
    $from_email = SafeEnv($_POST['from_email'], 255, str);
    $text = SafeEnv($_POST['text'], 0, str);
    $text_html = SafeEnv($_POST['html'], 0, str);
    if (isset($_POST['auto_br'])) {
        $auto_br = '1';
    } else {
        $auto_br = '0';
    }
    if (!isset($_GET['id'])) {
        System::admin()->AddCenterBox('Рассылка');
        System::database()->Select('mail_topics', "`id`='{$topic_id}'");
        $topic = System::database()->FetchRow();
        $list = System::database()->Select('mail_list', "`topic_id`='{$topic_id}'");
        // Сохраняем письмо
        $vals = Values('', $topic_id, $subject, time(), $from, $from_email, $text, $text_html, $auto_br, count($list));
        System::database()->Insert('mail_history', $vals);
        Audit('Рассылки: Произведена рассылка писем по теме "' . $topic['title'] . '"');
        // Отправка
        $mail = LmEmailExtended::Instance();
        $mail->SetSubject(Cp1251ToUtf8($subject));
        $mail->SetFrom($from_email, Cp1251ToUtf8($from));
        if (trim($text) != '') {
            $mail->AddTextPart($text);
        }
        if (trim(strip_tags($text_html))) {
            $mail->AddHtmlPart(Cp1251ToUtf8($text_html));
        }
        $result = true;
        foreach ($list as $row) {
            $mail->SetTo($row['email']);
            if (!$mail->Send()) {
                System::admin()->HighlightError('Ошибка ' . SafeDB($row['email'], 255, str) . ': письмо отправить не удалось.');
                // todo нужно выводить ошибку почему письмо не отправилось
                $result = false;
            }
        }
        if ($result) {
            System::admin()->Highlight('Все письма успешно отправлены.');
        } else {
            System::admin()->HighlightError('При рассылке произошли ошибки. Письмо сохранено в истории.');
        }
        CalcMailCounter($topic_id, true);
    } else {
        $id = SafeEnv($_GET['id'], 11, int);
        $set = "topic_id='{$topic_id}',subject='{$subject}',from='{$from}',from_email='{$from_email}',plain_text='{$text}',text_html='{$text_html}',auto_br='{$auto_br}'";
        System::database()->Update('mail_history', $set, "`id`='{$id}'");
        GO(ADMIN_FILE . '?exe=mail&a=history&topic_id=' . $topic_id);
    }
}
function IndexFormSendMail($email, $form_name, $time, $user, $ip, $data_rows)
{
    if ($user != 0) {
        $user_info = GetUserInfo($user);
        $user = SafeDB($user_info['name'], 255, str) . ' ( id:' . SafeDB($user_info['id'], 11, int) . ' )';
        $from = $user_info['name'];
        $from_email = $user_info['email'];
    } else {
        $user = '******';
        $from = System::config('general/site_name');
        $from_email = System::config('general/site_email');
    }
    $subject = 'Веб форма "' . SafeDB($form_name, 255, str) . '"';
    $mail = LmEmailExtended::Instance();
    $mail->SetSubject(Cp1251ToUtf8($subject));
    $mail->SetFrom($from_email, Cp1251ToUtf8($from));
    $mail->AddTo($email, Cp1251ToUtf8('Администратор'));
    $post_text = '';
    foreach ($data_rows as $row) {
        if ($row[2] == 'file') {
            $mail->AddAttachmentPart(file_get_contents($row[1]), $row[3]);
        } else {
            $post_text .= '<b>' . SafeDB($row[0], 255, str) . ':</b><br />' . SafeDB($row[1], 0, str) . '<br />';
        }
    }
    $text = Indent('
		<html>
		<head>
			<title>Форма</title>
		</head>
		<body>
			<table cellspacing="2" cellpadding="10" border="1">
				<tr>
					<th>Дата: ' . TimeRender($time, true, false) . '</th>
					<th>Пользователь: ' . $user . '</th>
					<th>IP: ' . $ip . '</th>
				</tr>
				<tr>
					<td colspan="3" style="text-align: left;">' . $post_text . '</td>
				</tr>
			</table>
		</body>
		</html>
	');
    $mail->AddHtmlPart(Cp1251ToUtf8($text));
    if (!$mail->Send()) {
        ErrorHandler(USER_ERROR, 'Проблема при отправке E-mail "' . $subject . '".', __FILE__);
    }
}