<?php
if ($_GET["source"]=="view") {
    
show_source($_SERVER['SCRIPT_FILENAME']);
    exit;
}


session_start();

// Функция для проверки, начинается ли сообщение с команды изображения
function isImageCommand($msg) {
  
$lower = mb_strtolower($msg, 'UTF-8');
  
$commands = ["нарисуй", "рисунок", "изобрази", "изображение", "покажи", "фото"];
  foreach (
$commands as $cmd) {
    if (
mb_substr($lower, 0, mb_strlen($cmd, 'UTF-8')) === $cmd) {
      return 
true;
    }
  }
  return 
false;
}

// Функция перевода текста с помощью неофициального Google Translate API
function translateText($text, $sourceLang = 'ru', $targetLang = 'en') {
  
$translateUrl = "https://translate.google.com/translate_a/single?client=gtx&sl=" .
      
urlencode($sourceLang) . "&tl=" . urlencode($targetLang) . "&dt=t&q=" . urlencode($text);
  
$ch = curl_init($translateUrl);
  
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    
"User-Agent: Mozilla/5.0"
  
]);
  
$response = curl_exec($ch);
  if (
$response === false) {
    
$err = curl_error($ch);
    
curl_close($ch);
    
header("Content-Type: text/plain; charset=utf-8");
    exit(
"Ошибка перевода: " . $err);
  }
  
curl_close($ch);
  
$data = json_decode($response, true);
  if (
$data === null || !isset($data[0][0][0])) {
    
header("Content-Type: text/plain; charset=utf-8");
    exit(
"Ошибка разбора ответа перевода.");
  }
  return 
$data[0][0][0];
}

// Функция генерации изображения через API 
function generateImage($prompt) {
    
    
// Очищаем запрос от ключевых слов
    
$commands = ["нарисуй", "рисунок", "изобрази", "изображение", "покажи", "фото"];
    foreach (
$commands as $cmd) {
        
// Удаляем команду и лишние пробелы в начале
        
if (mb_stripos($prompt, $cmd) === 0) {
            
$prompt = ltrim(mb_substr($prompt, mb_strlen($cmd)));
            break;
        }
    }

    
// Параметры для URL, как в первом скрипте
    
$seed = rand(1, 100000);
    
$params = http_build_query([
        
'width'  => 1280,
        
'height' => 720,
        
'seed'   => $seed,
        
'nologo' => 'true',
        
'model'  => 'flux'
    
]);
    
    
// Формируем итоговый URL
    
$imageUrl = "https://image.pollinations.ai/prompt/" . urlencode($prompt) . "?" . $params;
    
    
// Отправляем URL обратно клиенту (JavaScript)
    
header("Content-Type: text/plain; charset=utf-8");
    echo 
$imageUrl;
    exit;
}


// Если выбран «Новый чат» – очищаем историю и перенаправляем
if (isset($_GET['action']) && $_GET['action'] === 'new_chat') {
  
$_SESSION['messages'] = [];
  
header("Location: " . strtok($_SERVER["REQUEST_URI"], '?'));
  exit;
}

// Если получен POST-запрос – обрабатываем сообщение
if ($_SERVER["REQUEST_METHOD"] === "POST") {
  
header("Content-Type: text/plain; charset=utf-8");
  
  
// Получаем данные из формы
  
$userMessage = isset($_POST['message']) ? trim($_POST['message']) : '';
  
$model       = isset($_POST['model']) ? trim($_POST['model']) : 'openai';
  
$fileName    = isset($_POST['fileName']) ? trim($_POST['fileName']) : '';
  
$fileContent = isset($_POST['fileContent']) ? trim($_POST['fileContent']) : '';
  
  
// Если сообщение начинается с команды на изображение – генерируем картинку и возвращаем URL
  
if (isImageCommand($userMessage)) {
    
generateImage($userMessage);
  }
  
  if (!isset(
$_SESSION['messages'])) {
    
$_SESSION['messages'] = [];
  }
  
  
// Добавляем сообщение пользователя в историю
  
$_SESSION['messages'][] = [
    
"role"    => "user",
    
"content" => $userMessage
  
];
  
  
// Если файл прикреплён – добавляем его содержимое как часть сообщения
  
if ($fileName && $fileContent) {
    
$_SESSION['messages'][] = [
      
"role"    => "user",
      
"content" => "[Прикрепленный файл: $fileName]\n$fileContent"
    
];
  }
  
  
// Формируем пэйлоад для запроса к API
  
$payloadData = [
    
"messages"    => $_SESSION['messages'],
    
"model"       => $model,
   
// "stream"      => true,
   // "temperature" => 0.6,
    
"top_p"       => 1
  
];
  
$payload = json_encode($payloadData, JSON_UNESCAPED_UNICODE);
  
  
// Отправляем запрос к API (укажите корректный URL для выбранной модели)
  
$ch = curl_init("https://text.pollinations.ai/");
  
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  
curl_setopt($ch, CURLOPT_POST, true);
  
curl_setopt($ch, CURLOPT_POSTFIELDS, $payload);
  
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    
"Content-Type: application/json"
  
]);
  
$response = curl_exec($ch);
  if (
curl_errno($ch)) {
    
http_response_code(500);
    echo 
"Ошибка: " . curl_error($ch);
    exit;
  }
  
curl_close($ch);
  
  
// Обрабатываем потоковый ответ API
  
$finalAnswer = '';
$trim = trim($response);

// SSE формат?
if (strpos($trim, 'data:') === 0 || strpos($trim, "\ndata: ") !== false) {
  foreach (
explode("\n", $response) as $line) {
    
$line = trim($line);
    if (
$line === '' || $line === '[DONE]') continue;
    if (
strpos($line, 'data: ') === 0) {
      
$jsonPart = substr($line, 6);
      
$obj = json_decode($jsonPart, true);
      if (isset(
$obj['choices'][0]['delta']['content'])) {
        
$finalAnswer .= $obj['choices'][0]['delta']['content'];
      } elseif (isset(
$obj['message']['content'])) {
        
$finalAnswer .= $obj['message']['content'];
      }
    }
  }
} else {
  
// Не SSE: пробуем как JSON, иначе как текст
  
$obj = json_decode($response, true);
  if (
is_array($obj) && isset($obj['choices'][0]['message']['content'])) {
    
$finalAnswer = $obj['choices'][0]['message']['content'];
  } else {
    
$finalAnswer = $response;
  }
}
  
  
//$finalAnswer = "";
  //$lines = explode("\n", $response);
  //foreach ($lines as $line) {
    //$line = trim($line);
    //if ($line === "" || $line === "[DONE]") continue;
    //if (strpos($line, "data: ") === 0) {
      //$jsonPart = substr($line, 6);
      //$obj = json_decode($jsonPart, true);
      //if (isset($obj['choices'][0]['delta']['content'])) {
        //$finalAnswer .= $obj['choices'][0]['delta']['content'];
      //}
    //}
  //}
  
  // Добавляем ответ бота в историю
  
$_SESSION['messages'][] = [
    
"role"    => "assistant",
    
"content" => $finalAnswer
  
];
  
  echo 
$finalAnswer;
  exit;
}
?>

<!DOCTYPE html>
<html lang="ru">
<head>
  <meta charset="UTF-8">
  <title>Чат</title>
  <!-- Подключаем Roboto и Highlight.js для подсветки кода -->
  <link href="https://fonts.googleapis.com/css?family=Roboto:400,500&display=swap" rel="stylesheet">
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/styles/default.min.css">
  <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/highlight.min.js"></script>
  <style>
    /* Общие стили */
    body {
      font-family: 'Roboto', sans-serif;
      margin: 0;
      padding: 0;
      background-color: #f2f2f2;
      color: #333;
      height: 100vh;
      display: flex;
      align-items: center;
      justify-content: center;
    }
    /* Контейнер чата */
    #chatContainer {
      width: 90%;
      max-width: 1000px;
      height: 100vh;
      background: #fff;
      border-radius: 8px;
      box-shadow: 0 8px 20px rgba(0,0,0,0.15);
      display: flex;
      flex-direction: column;
      overflow: hidden;
      position: relative;
    }
    /* Заголовок – название и выбор модели */
    #headerContainer {
      display: flex;
      justify-content: space-between;
      align-items: center;
      padding: 15px;
      border-bottom: 1px solid #ccc;
    }
    #headerContainer h1 {
      margin: 0;
      font-size: 20px;
    }
    #model {
      padding: 5px;
      font-size: 14px;
    }
    /* Область сообщений */
    #chatbox {
      flex-grow: 1;
      padding: 15px;
      overflow-y: auto;
      background: #fff;
    }
    /* Кнопка копирования диалога */
    #copyArea {
      position: absolute;
      bottom: 60px;
      right: 65px;
      width: 50px;
      height: 50px;
    }
    #copyChatBtn {
      opacity: 0;
      transition: opacity 0.3s ease;
      padding: 5px 10px;
      font-size: 12px;
      background-color: rgba(0,123,255,0.9);
      color: #fff;
      border: none;
      border-radius: 3px;
      cursor: pointer;
    }
    #copyArea:hover #copyChatBtn {
      opacity: 1;
    }
    /* Стили сообщений */
    .message {
      margin: 10px 0;
      padding: 12px 15px;
      border-radius: 15px;
      max-width: 70%;
      word-wrap: break-word;
      position: relative;
      line-height: 1.4;
    }
    .user {
      background-color: #dcf8c6;
      margin-left: auto;
    }
    .bot {
      background-color: #f1f0f0;
      margin-right: auto;
      text-align: left;
    }
    /* Hover-кнопки в сообщениях */
    .hover-buttons {
      position: absolute;
      top: 5px;
      right: 5px;
      display: none;
      gap: 5px;
    }
    .message:hover .hover-buttons {
      display: flex;
    }
    .message-copy-button,
    .message-play-button {
      border: none;
      background-color: rgba(0,123,255,0.9);
      color: #fff;
      cursor: pointer;
      font-size: 12px;
      padding: 2px 6px;
      border-radius: 3px;
      transition: background-color 0.2s ease;
    }
    .message-copy-button:hover,
    .message-play-button:hover {
      background-color: rgba(0,123,255,1);
    }
    /* Блок кода */
    .code-block {
      background-color: #2d2d2d;
      color: #f8f8f2;
      margin: 10px 0;
      border-radius: 5px;
      overflow: hidden;
      font-family: 'Courier New', Courier, monospace;
      font-size: 14px;
      position: relative;
    }
    .code-header {
      background-color: #44475a;
      padding: 5px 10px;
      font-weight: 500;
      text-transform: uppercase;
      font-size: 12px;
    }
    pre {
      background: transparent;
      padding: 10px;
      margin: 0;
      white-space: pre-wrap;
      overflow-x: auto;
    }
    .code-buttons {
      display: flex;
      justify-content: flex-end;
      gap: 10px;
      padding: 5px 10px;
      background-color: #44475a;
    }
    .copy-button,
    .run-button,
    .download-button {
      padding: 5px 10px;
      font-size: 12px;
      background-color: #007BFF;
      color: #fff;
      border: none;
      border-radius: 3px;
      cursor: pointer;
      transition: background-color 0.2s ease;
    }
    .run-button { background-color: #28a745; }
    .copy-button:hover { background-color: #0056b3; }
    .run-button:hover { background-color: #218838; }
    .download-button:hover { background-color: #0056b3; }
    /* Область ввода */
    #userInput {
      display: flex;
      flex-direction: column;
      gap: 5px;
      padding: 10px 15px;
      background: #f7f7f7;
    }
    #inputRow {
      display: flex;
      flex-direction: row;
      gap: 10px;
      align-items: center;
    }
    #message {
      flex-grow: 1;
      min-height: 40px;
      max-height: 25vh;
      padding: 10px;
      font-size: 16px;
      border: 1px solid #ccc;
      resize: none;
      box-sizing: border-box;
      border-radius: 5px;
      overflow-y: auto;
    }
    #attachFileBtn, #sendBtn {
      padding: 10px 15px;
      font-size: 16px;
      border: none;
      cursor: pointer;
      border-radius: 5px;
      transition: background-color 0.2s ease;
    }
    #attachFileBtn { background-color: #6c757d; color: #fff; }
    #attachFileBtn:hover { background-color: #5a6268; }
    #sendBtn { background-color: #007BFF; color: #fff; }
    #sendBtn:hover { background-color: #0056b3; }
    /* Стили прикреплённых файлов – скрытый контент за кнопками */
    #selectedFiles {
      padding: 0 15px;
      font-size: 14px;
      color: #333;
      background: #fff;
    }
    .file-item {
      display: flex;
      align-items: center;
      justify-content: space-between;
      background-color: #fff;
      padding: 5px 10px;
      margin-bottom: 5px;
      border: 1px solid #ccc;
      border-radius: 3px;
    }
    .file-item span {
      overflow: hidden;
      text-overflow: ellipsis;
      white-space: nowrap;
    }
    .remove-file-btn {
      background-color: #dc3545;
      border: none;
      color: #fff;
      padding: 2px 6px;
      border-radius: 3px;
      cursor: pointer;
      font-size: 12px;
      transition: background-color 0.2s ease;
    }
    .remove-file-btn:hover {
      background-color: #c82333;
    }
    /* Авторасширение textarea */
    .auto-expand {
      max-height: 50vh;
      overflow-y: auto;
      resize: none;
    }
    /* Индикатор ожидания ответа */
    #loading-indicator {
      text-align: center;
      padding: 10px;
      background: #f7f7f7;
      display: none;
    }
    /* Стили для скрытого содержимого прикреплённых файлов */
    .toggle-content {
      display: none;
      font-size: 0.9em;
      line-height: 1.2;
      color: #555;
      margin-top: 8px;
      border-top: 1px dashed #aaa;
      padding-top: 5px;
    }
    .toggle-icon {
      cursor: pointer;
      font-size: 14px;
      user-select: none;
      background: #fff;
      padding: 2px 5px;
      border: 1px solid #ccc;
      border-radius: 3px;
      margin-left: 10px;
    }
  </style>
  <script>
    // Функция экранирования символов для HTML
    function escapeHtml(str) {
      return str.replace(/&/g, '&amp;')
                .replace(/</g, '&lt;')
                .replace(/>/g, '&gt;');
    }
    function updateHighlighting() {
      document.querySelectorAll('pre code').forEach(function(block) {
        hljs.highlightElement(block);
      });
    }
    function isImageUrl(text) {
      const url = text.trim();
      // Проверяем, начинается ли URL с домена генератора изображений.
      // Этого достаточно, чтобы отличить его от обычного текстового ответа.
      if (url.startsWith('https://image.pollinations.ai/prompt/')) {
        return true;
      }   
      // Оставим старую проверку на всякий случай для других URL с картинками
      const pattern = /^(https?:\/\/.*\.(?:png|jpg|jpeg|gif|webp|bmp))(?:\?.*)?$/i;
      return pattern.test(url);
    }
    // Отображение текстового сообщения с обработкой блоков кода и прикреплённых файлов
    function displayMessage(text, sender, fileAttachment) {
      const chatbox = document.getElementById('chatbox');
      const messageDiv = document.createElement('div');
      messageDiv.className = 'message ' + sender;
      
      const regex = /```(\w+)?\s*\n([\s\S]*?)```/g;
      let lastIndex = 0;
      let finalHtml = '';
      let match;
      while ((match = regex.exec(text)) !== null) {
        const nonCodePart = text.substring(lastIndex, match.index);
        finalHtml += escapeHtml(nonCodePart).replace(/\n/g, '<br>');
        const codeType = match[1] ? match[1].trim() : '';
        const codeContent = match[2];
        let codeHtml = '<div class="code-block" ' + (codeType ? 'data-lang="'+codeType.toLowerCase()+'"' : '') + '>';
        if (codeType) {
          codeHtml += '<div class="code-header">' + codeType.toUpperCase() + '</div>';
        }
        codeHtml += '<pre><code>' + escapeHtml(codeContent.trim()) + '</code></pre>';
        codeHtml += '<div class="code-buttons">';
        codeHtml += '<button class="copy-button" onclick="copyCode(this)">Скопировать</button>';
        if(codeType && codeType.toLowerCase() === 'html'){
          codeHtml += '<button class="run-button" onclick="runCode(this)">Запустить</button>';
        } else {
          codeHtml += '<button class="run-button" disabled title="Запуск доступен только для HTML" style="opacity: 0.3;">Запустить</button>';
        }
        codeHtml += '<button class="download-button" onclick="downloadCode(this)">Скачать</button>';
        codeHtml += '</div></div>';
        finalHtml += codeHtml;
        lastIndex = regex.lastIndex;
      }
      finalHtml += escapeHtml(text.substring(lastIndex)).replace(/\n/g, '<br>');
      messageDiv.innerHTML = finalHtml;
      
      // Если передан прикреплённый файл – создаём кнопку для показа/скрытия содержимого файла,
      // который отображается в блоке кода с сохранением переносов и подсветкой синтаксиса.
      if (fileAttachment && fileAttachment.name && fileAttachment.content) {
        const fileLink = document.createElement('span');
        fileLink.className = 'toggle-icon';
        fileLink.textContent = fileAttachment.name;
        fileLink.title = 'Показать/Скрыть содержимое файла';
        messageDiv.appendChild(fileLink);
        
        const fileContentDiv = document.createElement('div');
        fileContentDiv.className = 'toggle-content';
        // Помещаем содержимое файла в виде блока кода (с экранированием и сохранением переносов)
        fileContentDiv.innerHTML = '<pre><code>' + escapeHtml(fileAttachment.content) + '</code></pre>';
        messageDiv.appendChild(fileContentDiv);
        
        fileLink.addEventListener('click', function() {
          fileContentDiv.style.display = (fileContentDiv.style.display === 'block') ? 'none' : 'block';
          updateHighlighting();
        });
      }
      
      if (sender === 'bot') {
        const hoverContainer = document.createElement('div');
        hoverContainer.className = 'hover-buttons';
        const copyMsgBtn = document.createElement('button');
        copyMsgBtn.className = 'message-copy-button';
        copyMsgBtn.title = 'Скопировать сообщение';
        copyMsgBtn.textContent = 'Скопировать';
        copyMsgBtn.onclick = function() { copyMessage(this); };
        hoverContainer.appendChild(copyMsgBtn);
        messageDiv.appendChild(hoverContainer);
      }
      
      chatbox.appendChild(messageDiv);
      updateHighlighting();
      chatbox.scrollTop = chatbox.scrollHeight;
    }
    // Отображение сообщения с изображением
    function displayImageMessage(url) {
      const chatbox = document.getElementById('chatbox');
      const messageDiv = document.createElement('div');
      messageDiv.className = 'message bot';
      const img = document.createElement('img');
      img.src = url;
      img.style.width = "100%";
      img.style.borderRadius = "8px";
      
      const hoverContainer = document.createElement('div');
      hoverContainer.className = 'hover-buttons';
      const copyBtn = document.createElement('button');
      copyBtn.className = 'message-copy-button';
      copyBtn.textContent = "Скопировать";
      copyBtn.onclick = function() {
        if (navigator.clipboard && navigator.clipboard.writeText) {
          navigator.clipboard.writeText(url).then(() => {
            copyBtn.textContent = "Скопировано!";
            setTimeout(() => { copyBtn.textContent = "Скопировать"; }, 2000);
          }).catch(() => { copyBtn.textContent = "Ошибка"; });
        }
      };
      const saveBtn = document.createElement('button');
      saveBtn.className = 'message-copy-button';
      saveBtn.textContent = "Сохранить";
      saveBtn.style.marginLeft = "5px";
      saveBtn.onclick = function() {
        const a = document.createElement('a');
        a.href = url;
        a.download = "image.jpg";
        document.body.appendChild(a);
        a.click();
        document.body.removeChild(a);
      };
      hoverContainer.appendChild(copyBtn);
      hoverContainer.appendChild(saveBtn);
      messageDiv.appendChild(img);
      messageDiv.appendChild(hoverContainer);
      chatbox.appendChild(messageDiv);
      chatbox.scrollTop = chatbox.scrollHeight;
    }
    function copyCode(button) {
      const codeBlock = button.parentElement.parentElement.querySelector('pre code');
      const codeText = codeBlock.innerText;
      if (navigator.clipboard && navigator.clipboard.writeText) {
        navigator.clipboard.writeText(codeText).then(() => {
          button.textContent = 'Скопировано!';
          setTimeout(() => { button.textContent = 'Скопировать'; }, 2000);
        }).catch(() => { button.textContent = 'Ошибка'; });
      }
    }
    function runCode(button) {
      const codeBlockElement = button.parentElement.parentElement;
      const codeBlock = codeBlockElement.querySelector('pre code');
      const codeText = codeBlock.innerText;
      const lang = codeBlockElement.getAttribute('data-lang');
      if (lang && lang.toLowerCase() === 'html') {
        const win = window.open();
        win.document.open();
        win.document.write(codeText);
        win.document.close();
      }
    }
    function downloadCode(button) {
      const codeBlock = button.parentElement.parentElement.querySelector('pre code');
      const codeText = codeBlock.innerText;
      let fileName = prompt("Введите имя файла (например, code.txt):", "code.txt");
      if (!fileName) return;
      const blob = new Blob([codeText], { type: "text/plain;charset=utf-8" });
      const url = URL.createObjectURL(blob);
      const a = document.createElement("a");
      a.href = url;
      a.download = fileName;
      document.body.appendChild(a);
      a.click();
      document.body.removeChild(a);
      URL.revokeObjectURL(url);
    }
    function copyMessage(button) {
      const messageDiv = button.closest('.message');
      const clone = messageDiv.cloneNode(true);
      const buttons = clone.querySelectorAll('button');
      buttons.forEach(btn => btn.remove());
      const textToCopy = clone.innerText;
      if (navigator.clipboard && navigator.clipboard.writeText) {
        navigator.clipboard.writeText(textToCopy).then(() => {
          button.textContent = 'Скопировано';
          setTimeout(() => { button.textContent = 'Скопировать'; }, 2000);
        }).catch(() => { button.textContent = 'Ошибка'; });
      }
    }
    function copyEntireChat() {
      const chatbox = document.getElementById('chatbox');
      const messages = chatbox.querySelectorAll('.message');
      let fullChat = '';
      messages.forEach(msg => { fullChat += msg.innerText + "\n\n"; });
      if (navigator.clipboard && navigator.clipboard.writeText) {
        navigator.clipboard.writeText(fullChat).then(() => {
          alert("Диалог скопирован в буфер обмена.");
        }).catch(() => {
          alert("Ошибка копирования диалога!");
        });
      }
    }
    let attachedFiles = [];
    function updateSelectedFiles() {
      const selectedFilesDiv = document.getElementById('selectedFiles');
      if (attachedFiles.length > 0) {
        selectedFilesDiv.innerHTML = "";
        attachedFiles.forEach((file, index) => {
          const fileItem = document.createElement('div');
          fileItem.className = "file-item";
          fileItem.innerHTML = `<span>${file.name}</span>
                                  <button class="remove-file-btn" onclick="removeFile(${index})">Удалить</button>`;
          selectedFilesDiv.appendChild(fileItem);
        });
      } else {
        selectedFilesDiv.innerHTML = "";
      }
    }
    function handleFiles(files) {
      attachedFiles = Array.from(files);
      updateSelectedFiles();
    }
    function removeFile(index) {
      attachedFiles.splice(index, 1);
      document.getElementById('fileInput').value = "";
      updateSelectedFiles();
    }
    function sendMessage() {
      const messageInput = document.getElementById('message');
      let userMessage = messageInput.value.trim();
      if (!userMessage) return;
      const modelSelect = document.getElementById('model');
      const model = modelSelect.value;
      const fileInput = document.getElementById('fileInput');
      if (fileInput.files && fileInput.files.length > 0) {
        const file = fileInput.files[0];
        const reader = new FileReader();
        reader.onload = function(e) {
          processSending(userMessage, file.name, e.target.result);
        };
        reader.onerror = function() {
          alert("Ошибка чтения файла.");
          processSending(userMessage, "", "");
        };
        reader.readAsText(file);
      } else {
        processSending(userMessage, "", "");
      }
    }
    function processSending(userMessage, fileName, fileContent) {
      let fileAttachment = (fileName && fileContent) ? { name: fileName, content: fileContent } : null;
      displayMessage(userMessage, 'user', fileAttachment);
      document.getElementById('message').value = "";
      document.getElementById('fileInput').value = "";
      attachedFiles = [];
      updateSelectedFiles();
      const loadingIndicator = document.getElementById('loading-indicator');
      loadingIndicator.style.display = 'block';
      const params = new URLSearchParams();
      params.append("message", userMessage);
      params.append("model", document.getElementById('model').value);
      if (fileName && fileContent) {
        params.append("fileName", fileName);
        params.append("fileContent", fileContent);
      }
      fetch(window.location.href, {
        method: 'POST',
        headers: { "Content-Type": "application/x-www-form-urlencoded;charset=UTF-8" },
        body: params.toString()
      })
      .then(response => response.text())
      .then(data => {
        loadingIndicator.style.display = 'none';
        if (isImageUrl(data.trim())) {
          displayImageMessage(data.trim());
        } else {
          displayMessage(data, 'bot');
        }
      })
      .catch(error => {
        loadingIndicator.style.display = 'none';
        displayMessage('Ошибка: ' + error, 'bot');
      });
    }
    window.onload = function() {
      document.getElementById('message').addEventListener('keydown', function(event) {
        if (event.key === 'Enter' && !event.shiftKey) {
          event.preventDefault();
          sendMessage();
        }
      });
      const textarea = document.querySelector('.auto-expand');
      if(textarea) {
        textarea.addEventListener('input', function() {
          this.style.height = 'auto';
          this.style.height = this.scrollHeight + 'px';
        });
      }
    };
  </script>
</head>
<body>
  <div id="chatContainer">
    <div id="headerContainer">
      <h1>Чат</h1>
      <select id="model">
        <option value="openai" selected>OpenAI GPT-5 Nano</option>
        <option value="openai-fast">OpenAI GPT-4.1 Nano</option>
        <option value="qwen-coder">Qwen 2.5 Coder 32B</option>
        <option value="gemini">Gemini 2.5 Flash Lite</option>
        <option value="mistral">Mistral Small 3.1 24B</option>
        <option value="nova-fast">Amazon Nova Micro (Bedrock)</option>
        <option value="midijourney">MIDIjourney</option>
        <option value=""> -----------------------------</option>
        
        <option value="rtist">Rtist image generator by @bqrio</option>
        <option value="searchgpt">SearchGPT with realtime news and web search</option>
        <option value="evil">Evil Mode - Experimental</option>
        <option value="deepseek">DeepSeek-V3</option>
        <option value="claude-hybridspace">Claude Hybridspace</option>
        <option value="deepseek-r1">DeepSeek-R1 Distill Qwen 32B</option>
        <option value="deepseek-reasoner">DeepSeek R1 - Full</option>
        <option value="llamalight">Llama 3.1 8B Instruct</option>
        <option value="llamaguard">Llamaguard 7B AWQ</option>
        <option value="gemini">Gemini 2.0 Flash</option>
        <option value="gemini-thinking">Gemini 2.0 Flash Thinking</option>
        <option value="hormoz">Hormoz 8b by Muhammadreza Haghiri</option>
      </select>
      <a href="?action=new_chat" id="newChatBtn" style="text-decoration:none; font-size:14px; color:#007bff; border:1px solid #007bff; padding:5px 10px; border-radius:3px;">Новый чат</a>
    </div>
    
    <div id="chatbox"></div>
    <div id="copyArea">
      <button id="copyChatBtn" onclick="copyEntireChat()">Копировать диалог</button>
    </div>
    
    <div id="selectedFiles"></div>
    <div id="loading-indicator">Ожидание ответа...</div>
    
    <div id="userInput">
      <div id="inputRow">
        <button id="attachFileBtn" onclick="document.getElementById('fileInput').click()">+файл</button>
        <textarea class="auto-expand" id="message" placeholder="Ваше сообщение..." rows="1"></textarea>
        <button id="sendBtn" onclick="sendMessage()">Отправить</button>
        <input type="file" id="fileInput" style="display:none;" multiple onchange="handleFiles(this.files)">
      </div>
    </div>
  </div>
</body>
</html>