From e2f2452623fc9c43f938b8370da46f991a8ee742 Mon Sep 17 00:00:00 2001
From: themohooks <81331307+themohooks@users.noreply.github.com>
Date: Tue, 25 Feb 2025 23:02:27 +0300
Subject: [PATCH] some updates

---
 static/js/index.js           |  27 --------
 views/pages/@footer.latte    |  12 ++++
 views/pages/@head.latte      | 125 +++++++++++++++++++++++++++++++++++
 views/pages/@layout.latte    | 110 ++++++++++++++++++++++++++++++
 views/pages/About.php        |  79 ----------------------
 views/pages/Errors/404.latte |  29 ++++++++
 6 files changed, 276 insertions(+), 106 deletions(-)
 create mode 100644 views/pages/@footer.latte
 create mode 100644 views/pages/@head.latte
 create mode 100644 views/pages/@layout.latte
 delete mode 100644 views/pages/About.php
 create mode 100644 views/pages/Errors/404.latte

diff --git a/static/js/index.js b/static/js/index.js
index dba393c..7fdc917 100644
--- a/static/js/index.js
+++ b/static/js/index.js
@@ -22,14 +22,6 @@ $(document).ready(function()
 	});
 
 
-	$(window).on('load resize', function()
-	{
-		var list = $('#idx-regions-list');
-		var h = list.closest('table').height() - list.position().top + 40;
-		list.css('height', h + 'px');
-	});
-
-
 	$('#loadmore').on('click', LoadRecentPhotos).click();
 	$('#newrand' ).on('click', LoadRandomPhotos).click();
 
@@ -71,25 +63,6 @@ $(document).ready(function()
 	});
 
 
-	$('#loginbtn').on('click', function()
-	{
-		var username = $('#username').val().trim();
-		var password = $('#password').val().trim();
-
-		if (username != '' && username != '')
-		{
-			$('#loginbtn').prop('disabled', true).val(_text['IX_LOGGING']);
-
-			$.post('/api.php?action=check-login', { username: username, password: password, remember: $('#remember').is('checked') }, function(r)
-			{
-				if (r == 0)
-					 $('#loginform').submit();
-				else window.location.reload();
-			})
-			.fail(function(jx) { if (jx.responseText != '') alert(jx.responseText); });
-		}
-	});
-
 
 	$('#mobile-menu').on('click', function()
 	{
diff --git a/views/pages/@footer.latte b/views/pages/@footer.latte
new file mode 100644
index 0000000..f339f0c
--- /dev/null
+++ b/views/pages/@footer.latte
@@ -0,0 +1,12 @@
+{block footer}
+
+<td class="footer">
+            <p>Aloha, Hawaii! | PHP {phpversion()} | MySQL {$mysqlversion} | Версия {$lastcommit}</p>
+            <b><a href="/">Главная</a> &nbsp; &nbsp; <a href="/lk/">Личный кабинет</a> &nbsp; &nbsp; <a href="/rules">Правила</a> &nbsp; &nbsp; <a href="/about">О сервере</a></b><br>
+            
+          
+          
+
+        </td>
+
+{/block}
\ No newline at end of file
diff --git a/views/pages/@head.latte b/views/pages/@head.latte
new file mode 100644
index 0000000..fcda323
--- /dev/null
+++ b/views/pages/@head.latte
@@ -0,0 +1,125 @@
+{block head}
+<meta http-equiv="content-type" content="text/html;charset=UTF-8">
+    <meta name="viewport" content="width=1000,user-scalable=yes">
+    <title>j</title>
+    <link rel="preconnect" href="https://fonts.googleapis.com">
+    <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
+    <link href="https://fonts.googleapis.com/css2?family=PT+Sans+Narrow:wght@400;700&amp;display=swap" rel="stylesheet">
+    <link rel="stylesheet" href="/static/css/fontawesome/css/all.min.css">
+    <link rel="stylesheet" href="/static/css/style.css{if $ngallery['root']['cloudflare-caching'] === true}?{time()}{/if}">
+    <link rel="stylesheet" href="/static/css/desktop.css{if $ngallery['root']['cloudflare-caching'] === true}?{time()}{/if}">
+    <link rel="stylesheet" href="/static/css/trans.css{if $ngallery['root']['cloudflare-caching'] === true}?{time()}{/if}">
+    <link rel="stylesheet" href="/static/css/photo.css{if $ngallery['root']['cloudflare-caching'] === true}?{time()}{/if}">
+    <link rel="stylesheet" href="/static/css/notie.css{if $ngallery['root']['cloudflare-caching'] === true}?{time()}{/if}">
+    <link rel="stylesheet" href="/static/css/comments.css{if $ngallery['root']['cloudflare-caching'] === true}?{time()}{/if}">
+    <link rel="stylesheet" href="/static/css/map.css{if $ngallery['root']['cloudflare-caching'] === true}?{time()}{/if}">
+    <link rel="stylesheet" href="/static/css/jquery-ui-1.8.20.custom.css{if $ngallery['root']['cloudflare-caching'] === true}?{time()}{/if}">
+    <script src="/static/js/jquery.js{if $ngallery['root']['cloudflare-caching'] === true}?{time()}{/if}"></script>
+    <script src="/static/js/jquery.form.min.js{if $ngallery['root']['cloudflare-caching'] === true}?{time()}{/if}"></script>
+    <script src="/static/js/core.js{if $ngallery['root']['cloudflare-caching'] === true}?{time()}{/if}"></script>
+    <script src="/static/js/index.js{if $ngallery['root']['cloudflare-caching'] === true}?{time()}{/if}"></script>
+    <script src="/static/js/jquery-ui.js{if $ngallery['root']['cloudflare-caching'] === true}?{time()}{/if}"></script>
+    <script src="/static/js/selector.js{if $ngallery['root']['cloudflare-caching'] === true}?{time()}{/if}"></script>
+    <script src="/static/js/selector2.js{if $ngallery['root']['cloudflare-caching'] === true}?{time()}{/if}"></script>
+    <script src="/static/js/imageupload.js{if $ngallery['root']['cloudflare-caching'] === true}?{time()}{/if}"></script>
+    <script src="/static/js/progress.js{if $ngallery['root']['cloudflare-caching'] === true}?{time()}{/if}"></script>
+    <script src="/static/js/notie.js{if $ngallery['root']['cloudflare-caching'] === true}?{time()}{/if}"></script>
+    <script src="/static/js/photo.js{if $ngallery['root']['cloudflare-caching'] === true}?{time()}{/if}"></script>
+    <script src="/static/js/comments.js{if $ngallery['root']['cloudflare-caching'] === true}?{time()}{/if}"></script>
+    <script src="/static/js/newcore.js{if $ngallery['root']['cloudflare-caching'] === true}?{time()}{/if}"></script>
+    <script src="/static/js/act.js{if $ngallery['root']['cloudflare-caching'] === true}?{time()}{/if}"></script>
+    <script src="/static/js/core_lk.js{if $ngallery['root']['cloudflare-caching'] === true}?{time()}{/if}"></script>
+    <script src="/static/js/tablesort.js{if $ngallery['root']['cloudflare-caching'] === true}?{time()}{/if}"></script>
+    <link href='https://unpkg.com/boxicons@2.1.4/css/boxicons.min.css' rel='stylesheet'>
+    <script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js"></script>
+<link rel="stylesheet" href="https://ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/themes/smoothness/jquery-ui.css">
+    <div class="progress-container fixed-top">
+<span class="progress-bard"></span>
+</div>
+<style>
+
+        .progress-container {
+  width: 100%;
+  background:linear-gradient(rgba(0,0,0,0.2),rgba(0,0,0,0.2)) var(--theme-bg-color); 
+  height: 5px;
+  display: block;
+}
+
+@media screen and (max-width: 768px) {
+                                :root {
+                                    --bckgr: -1500px 0;
+                                    --bckgr2: 1500px 0;
+                                }
+                            }
+
+                            @media screen and (min-width: 768px) {
+                                :root {
+                                    --bckgr: -3500px 0;
+                                    --bckgr2: 3500px 0;
+                                }
+                            }
+@-webkit-keyframes bg-move {
+  0%   { background-position: var(--bckgr); }
+  100% { background-position: var(--bckgr2); }
+}
+@keyframes bg-move {
+0%   { background-position: var(--bckgr); }
+  100% { background-position: var(--bckgr2); }
+}
+
+.progress-bard {
+  background-color: #fff; 
+  width: 0%;
+  display: block;
+  height: inherit;
+  transition: width 0.6s ease;
+  background-image: linear-gradient(270deg, rgba(100, 181, 239, 0) 48.44%,  var(--theme-bg-hover-color) 75.52%, rgba(100, 181, 239, 0) 100%);
+    background-repeat: no-repeat;
+  animation: bg-move linear 2s infinite;
+}
+  
+</style>
+<script>
+    notie.setOptions({
+    transitionCurve: 'cubic-bezier(0.2, 0, 0.2, 1)'
+});
+var Notify =  {
+    noty: function(status, text) {
+
+        if (status == 'danger') status = 'error';
+
+        return notie.alert({ type: status, text: text })
+
+    },
+}
+function scrollProgressBarWidth(number) {
+                var getMax = function() {
+                    return $(document).height() - $(window).height();
+                };
+                var progressBar = $(".progress-bard"),
+                    max = getMax(),
+                    value,
+                    width;
+
+                var setWidth = function() {
+                    progressBar.css({
+                        width: number + '%'
+                    });
+                };
+
+                setWidth();
+            }
+            
+function escapeHtml(text) {
+    var map = {
+      '&': '&amp;',
+      '<': '&lt;',
+      '>': '&gt;',
+      '"': '&quot;',
+      "'": '&#039;'
+    };
+    
+    return text.replace(/[&<>"']/g, function(m) { return map[m]; });
+  }
+</script>
+{/block}
diff --git a/views/pages/@layout.latte b/views/pages/@layout.latte
new file mode 100644
index 0000000..275643c
--- /dev/null
+++ b/views/pages/@layout.latte
@@ -0,0 +1,110 @@
+<!DOCTYPE html>
+<html lang="ru">
+
+<head>
+{include "@head.latte"}
+</head>
+<body>
+    <div id="backgr"></div>
+    <table class="tmain">
+    <tr>
+    <td class="mm-bar">
+    {if explode('/', $_SERVER['REQUEST_URI'])[1] === 'photo'}
+    <a id="title-small" href="/"><img src="{$ngallery['root']['logo']}">{$ngallery['root']['title']}</a>
+    {/if}
+        <ul class="mm mm-level-1">
+            <li><a href="#" onclick="return false" class="mm-item"><span class="mm-label">Дополнительно</span></a>
+                <div>
+                    <ul class="mm-level-2">
+                        <li><a href="/news.php" class="mm-item"><span class="mm-label">Новости и хронология</span></a></li>
+                        <li><a href="/misc/" class="mm-item"><span class="mm-label">Разные фотогалереи</span></a></li>
+                        <li><a href="/voting.php" class="mm-item"><span class="mm-label">Фотоконкурс</span></a></li>
+                        <li><a href="/news2.php" class="mm-item"><span class="mm-label">Новости сайта</span></a></li>
+                        <li><a href="/links.php" class="mm-item"><span class="mm-label">Ссылки</span></a></li>
+                    </ul>
+                </div>
+            </li>
+            <li><a href="/comments" class="mm-item"><span class="mm-label">Комментарии</span></a></li>
+            <li><a href="#" onclick="return false" class="mm-item"><span class="mm-label">Обновления</span><?=$nonrw?></a>
+                <div>
+                    <ul class="mm-level-2">
+                        <li><a href="/update.php?time=24" class="mm-item"><span class="mm-label">Новые фотографии</span></a></li>
+                        <li><a href="/feed" class="mm-item"><span class="mm-label">Лента обновлений</span></a></li>
+                        <li><a href="/fav_authors" class="mm-item"><span class="mm-label">Фотографии избранных авторов</span><?=$nonrw?></a></li>
+                        <li><a href="/update.php" class="mm-item"><span class="mm-label">Архив обновлений по датам</span></a></li>
+                    </ul>
+                </div>
+            </li>
+            <li><a href="/help/" class="mm-item"><span class="mm-label">Помощь</span></a>
+                <div>
+                    <ul class="mm-level-2">
+                        <li><a href="/rules/" class="mm-item"><span class="mm-label">Правила сайта</span></a></li>
+                        <li><a href="/rules/pub/" class="mm-item"><span class="mm-label">Критерии отбора фотографий</span></a></li>
+                        <li><a href="/rules/photo/" class="mm-item"><span class="mm-label">Правила подписи фотографий</span></a></li>
+                        <li><a href="/rules/video/" class="mm-item"><span class="mm-label">Правила видеокаталога</span></a></li>
+                    </ul>
+                </div>
+            </li>
+            <li><a href="/search.php" class="mm-item"><span class="mm-label">Поиск</span></a>
+                <div>
+                    <ul class="mm-level-2">
+                        <li><a href="/search.php" class="mm-item"><span class="mm-label">Поиск фотографий</span></a></li>
+                        <li><a href="/vsearch.php" class="mm-item"><span class="mm-label">Поиск ТС</span></a></li>
+                        <li><a href="/csearch.php" class="mm-item"><span class="mm-label">Поиск комментариев</span></a></li>
+                        <li><a href="/authors.php" class="mm-item"><span class="mm-label">Поиск авторов</span></a></li>
+                    </ul>
+                </div>
+            </li>
+            {if App\Services\Auth::userid() <= 0}
+            
+                <li class="mm-pad-right"><a href="/login" class="mm-item"><span class="mm-icon"><i class="fas fa-xs fa-address-card"></i></span><span class="mm-label">Войти</span></a></li>
+                <li><a href="/register" class="mm-item"><span class="mm-icon"><i class="fas fa-xs fa-user"></i></span><span class="mm-label">Регистрация</span></a></li>
+            {else}
+                <li class="mm-pad-right mm-wide">
+                <a href="/author/{$user_id}/" class="mm-item"><span class="mm-icon"><i class="fas fa-xs fa-user"></i></span><span class="mm-label">{$user->i('username')}</span>{if $nonreviewedimgs > 0 && $user->i('admin') > 0}<span class="mm-notify notify-count">{$nonreviewedimgs}</span>{/if}</a>
+                    <div>
+                        <ul class="mm-level-2">
+                            <li><a href="/lk/" class="mm-item"><span class="mm-icon"><i class="fas fa-sm fa-fw fa-info-circle"></i></span><span class="mm-label">Общая информация</span></a></li>
+                            {if $user->i('admin') > 0}
+                                <li><a href="/admin" class="mm-item"><span class="mm-icon"><i class="fas fa-sm fa-fw fa-info-circle"></i></span><span class="mm-label">Admin</span><?=$nonr?></a></li>
+                            {/if}
+                            {if $ngallery['root']['registration']['emailverify'] != true || $user->i('status') != 3}
+                            <li><a href="/lk/upload" class="mm-item"><span class="mm-icon"><i class="fas fa-sm fa-fw fa-plus-square"></i></span><span class="mm-label"><b>Предложить медиа</b></span></a></li>
+                            {/if}
+                            <li><a href="/lk/history" class="mm-item"><span class="mm-icon"><i class="fas fa-sm fa-fw fa-images"></i></span><span class="mm-label">Журнал</span></a></li>
+                            <li><a href="/lk/konkurs.php" class="mm-item"><span class="mm-icon"><i class="fas fa-sm fa-fw fa-compass"></i></span><span class="mm-label">Конкурс</span></a></li>
+                            <li><a href="/vehicle/edit" class="mm-item"><span class="mm-icon"><i class="fas fa-sm fa-fw fa-folder-plus"></i></span><span class="mm-label"><b>Правка БД</b></span></a></li>
+                            <li><a href="/lk/ticket.php" class="mm-item"><span class="mm-icon"><i class="fas fa-sm fa-fw fa-question-circle"></i></span><span class="mm-label">Мои заявки</span></a></li>
+                            <li><a href="/lk/profile" class="mm-item"><span class="mm-icon"><i class="fas fa-sm fa-fw fa-cog"></i></span><span class="mm-label">Настройки профиля</span></a></li>
+                            <li><a href="/search?id={$user_id}" class="mm-item"><span class="mm-icon"><i class="far fa-sm fa-fw fa-images"></i></span><span class="mm-label">Мои фотографии</span></a></li>
+                            <li><a href="/fav" class="mm-item"><span class="mm-icon"><i class="fas fa-sm fa-fw fa-star"></i></span><span class="mm-label">Избранные снимки</span></a></li>
+                            <li><a href="/logout" class="mm-item"><span class="mm-icon"><i class="fas fa-sm fa-fw fa-sign-out-alt"></i></span><span class="mm-label">Выход</span></a></li>
+                        </ul>
+                    </div>
+                </li>
+                <li class="mm-wide">
+                <a href="/messages" class="mm-item"><span class="mm-icon"><i class="fas fa-xs fa-message"></i></span></a>
+                </li>
+           {/if}
+        </ul>
+    </td>
+</tr>
+{if explode('/', $_SERVER['REQUEST_URI'])[1] != 'photo'}
+<tr>
+    <td><a href="/" id="title"><img style="width: <?=$width?>;" src="{$ngallery['root']['logo']}" alt="{$ngallery['root']['title']}"><span>{$ngallery['root']['title']}</span></a></td>
+</tr>
+{/if}
+<td class="main">
+{block content}{/block}
+</td>
+ <tr>
+
+    {include "@footer.latte"}
+
+
+        </tr>
+    </table>
+
+</body>
+
+</html>
diff --git a/views/pages/About.php b/views/pages/About.php
deleted file mode 100644
index 3bdb905..0000000
--- a/views/pages/About.php
+++ /dev/null
@@ -1,79 +0,0 @@
-<?php
-
-use \App\Services\{Auth, DB, Date};
-use \App\Models\User;
-
-?>
-<!DOCTYPE html>
-<html lang="ru">
-
-<head>
-    <?php include($_SERVER['DOCUMENT_ROOT'] . '/views/components/LoadHead.php'); ?>
-
-
-</head>
-
-
-<body>
-    <div id="backgr"></div>
-    <table class="tmain">
-        <?php include($_SERVER['DOCUMENT_ROOT'] . '/views/components/Navbar.php'); ?>
-        <tr>
-            <td class="main">
-                <h1>О сервере <b><?= NGALLERY['root']['title'] ?></b></h1>
-                <p><?=NGALLERY['root']['description']?></p>
-                <table width="100%">
-                <div class="p20">
-                        <h4><img src="/static/img/go-home.png">Общая информация</h4>
-                        <ul class="straight">
-                            <li>Зарегистрировано пользователей: <b><?=DB::query('SELECT COUNT(*) FROM users')[0]['COUNT(*)'];?></b></li>
-                            <li>Опубликовано фотографий: <b><?=DB::query('SELECT COUNT(*) FROM photos WHERE moderated=1')[0]['COUNT(*)'];?></b></li>
-                            <li>Пользователей онлайн: <b><?=DB::query('SELECT COUNT(*) FROM users WHERE online>=:time-300 ORDER BY online DESC', array(':time'=>time()))[0]['COUNT(*)'];?></b></li>
-                        </ul>
-                    </div>
-                    <div class="p20">
-                        <h4><img src="/static/img/220.ico">Администраторы</h4>
-                        <ul style="list-style: none; margin: 0; padding: 0;">
-                            <?php
-                            $admins = DB::query('SELECT * FROM users WHERE admin=1');
-                            foreach ($admins as $a) {
-                                echo '<li><b><a href="/author/'.$a['id'].'/"><img onerror="this.src = `/static/img/avatar.png`; this.onerror = null;" src="'.$a['photourl'].'" width="32" style="border-radius: 3px; margin-right: 5px;">'.htmlspecialchars($a['username']).'</a></b></li>';
-                            }
-                            ?>
-                        </ul>
-                    </div>
-                    <div class="p20">
-                        <h4><img src="/static/img/248.ico">Фотомодераторы</h4>
-                        <ul style="list-style: none; margin: 0; padding: 0;">
-                            <?php
-                            $admins = DB::query('SELECT * FROM users WHERE admin=2');
-                            foreach ($admins as $a) {
-                                echo '<li><b><a href="/author/'.$a['id'].'/"><img onerror="this.src = `/static/img/avatar.png`; this.onerror = null;" src="'.$a['photourl'].'" width="32" style="border-radius: 3px; margin-right: 5px;">'.htmlspecialchars($a['username']).'</a></b></li>';
-                            }
-                            ?>
-                        </ul>
-                    </div>
-                    <div class="p20">
-                        <h4><img src="/static/img/152.ico">Модераторы</h4>
-                        <ul style="list-style: none; margin: 0; padding: 0;">
-                            <?php
-                            $admins = DB::query('SELECT * FROM users WHERE admin=3');
-                            foreach ($admins as $a) {
-                                echo '<li><b><a href="/author/'.$a['id'].'/"><img onerror="this.src = `/static/img/avatar.png`; this.onerror = null;" src="'.$a['photourl'].'" width="32" style="border-radius: 3px; margin-right: 5px;">'.htmlspecialchars($a['username']).'</a></b></li>';
-                            }
-                            ?>
-                        </ul>
-                    </div>
-                </table>
-
-            </td>
-        </tr>
-        <tr>
-            <?php include($_SERVER['DOCUMENT_ROOT'] . '/views/components/Footer.php'); ?>
-        </tr>
-    </table>
-
-
-</body>
-
-</html>
\ No newline at end of file
diff --git a/views/pages/Errors/404.latte b/views/pages/Errors/404.latte
new file mode 100644
index 0000000..e704989
--- /dev/null
+++ b/views/pages/Errors/404.latte
@@ -0,0 +1,29 @@
+<!DOCTYPE html><!-- "' --></textarea></script></style></pre></xmp></a></audio></button></canvas></datalist></details></dialog></iframe></listing></meter></noembed></noframes></noscript></optgroup></option></progress></rp></select></table></template></title></video>
+<meta charset="utf-8">
+<meta name=robots content=noindex>
+<title>Server Error</title>
+
+<style>
+    @import url("https://rsms.me/inter/inter.css");
+    body {
+        font-family: Inter !important;
+    }
+	#tracy-error { all: initial; position: absolute; top: 0; left: 0; right: 0; height: 70vh; min-height: 400px; display: flex; align-items: center; justify-content: center; z-index: 1000 }
+	#tracy-error div { all: initial; max-width: 550px; background: white; color: #333; display: block }
+	#tracy-error h1 { all: initial; font-family: Inter !important; font-size: 50px; font-weight: 700; display: block; margin: 40px }
+	#tracy-error p { all: initial; font-family: Inter !important; margin: 40px; display: block }
+    #tracy-error pre { all: initial; font-family: Inter !important; margin: 40px; display: block }
+	#tracy-error small { color: gray }
+	#tracy-error small span { color: silver }
+</style>
+
+<div id=tracy-error>
+	<div>
+		<h1>Not Found</h1>
+
+		<p>The requested page not found on server.</p><br>
+        <pre>{$_SERVER['REQUEST_URI']}</pre>
+
+
+	</div>
+</div>
\ No newline at end of file