diff --git a/README.md b/README.md
index ac6cc47..272a70e 100644
--- a/README.md
+++ b/README.md
@@ -1,3 +1,15 @@
-# rating
+### rating
-Модуль рейтинг Только для AVE.CMS ALT
\ No newline at end of file
+## Модуль Рейтинг v1.26.1
+
+### Данный модуль предназначен присваивать рейтинг документам.
+
+ * Для оценки документа (рейтинга), нужно разместить системный тег [mod_rating] на странице необходимого документа.
+ * Вывод результатов (РЕЗУЛЬТАТОВ! НЕ ВОЗМОЖНОСТИ СТАВИТЬ ОЦЕНКУ!) рейтинга документа в других документах, запросами и .т.д. :
+ * Разместите в нужном месте [mod_rating:[tag:docid]] или [mod_rating:ХХХ] где XXX - ID документа, рейтинг которого нужно вывести.
+
+### Changelog:
+
+04.09.2019 - версия 1.26.1 - адаптация для версии ave.cms 3.26
+
+10.06.2016 - старт версии 1.1
\ No newline at end of file
diff --git a/admin/admin_ratings.tpl b/admin/admin_ratings.tpl
new file mode 100644
index 0000000..33c7676
--- /dev/null
+++ b/admin/admin_ratings.tpl
@@ -0,0 +1,73 @@
+
{#RATING_MODULE_NAME#}
+
+
+
+
+
+
+
+
diff --git a/admin/admin_settings.tpl b/admin/admin_settings.tpl
new file mode 100644
index 0000000..e514abc
--- /dev/null
+++ b/admin/admin_settings.tpl
@@ -0,0 +1,81 @@
+
{#RATING_MODULE_NAME#}
+
+
+
+
+
+
+
+
diff --git a/admin/star.png b/admin/star.png
new file mode 100644
index 0000000..3614a35
Binary files /dev/null and b/admin/star.png differ
diff --git a/class/rating.php b/class/rating.php
new file mode 100644
index 0000000..6b11e0b
--- /dev/null
+++ b/class/rating.php
@@ -0,0 +1,310 @@
+Query("
+ SELECT *
+ FROM " . PREFIX . "_module_rating_settings
+ WHERE Id = '" . $this->_config_id . "'
+ ")->FetchAssocArray();
+ }
+
+ if ($param == '') return $settings;
+
+ // В противном случае возвращаем уже имеющиеся значения
+ return (isset($settings[$param]) ? $settings[$param] : null);
+ }
+
+ /**
+ * Метод, предназначенный для получения Title документа.
+ *
+ * @param string $id ID документа
+ */
+ function _ratingGetDocumentTitle ($id)
+ {
+ global $AVE_DB;
+
+ $doc_title = $AVE_DB->Query("
+ SELECT document_title
+ FROM " . PREFIX . "_documents
+ WHERE id = '" . $id . "'
+ ")->GetCell();
+
+ // В противном случае возвращаем уже имеющиеся значения
+ return $doc_title;
+ }
+
+ /**
+ * Метод, предназначенный для вывода модуля рейтинга в публичной части
+ *
+ * @param string $doc_id ID документа
+ * @param string $type параметр определяющий где выводится модуль (документ|запрос)
+ */
+ function show ($doc_id, $type)
+ {
+ global $AVE_DB, $AVE_Template;
+
+ // Проверяем, что в настройках модуль активен
+ if ($this->_ratingSettingsGet('rating_active') == 1)
+ {
+ // Разрешаем показ модуля на странице
+ $rating_sett['display_rating'] = 1;
+
+ // Если группа пользователя, который в текущий момент просматривает документ попадает в список
+ // разрешенных (в настройках модуля), тогда создаем флаг, который будет разрешать к показу
+ // функцию голосования
+ if (in_array(UGROUP, explode(',', $this->_ratingSettingsGet('rating_user_groups'))))
+ {
+ $rating_sett['rating_can'] = 1;
+ }
+
+ $rating_sett['rating_stars'] = $this->_ratingSettingsGet('rating_stars'); // Кол-во звезд
+ $rating_sett['rating_round'] = $this->_ratingSettingsGet('rating_round'); // Округление
+
+ $rating = $AVE_DB->Query("
+ SELECT *
+ FROM " . PREFIX . "_module_rating_summary
+ WHERE rating_id_doc = '" . $doc_id . "'
+ ")->FetchAssocArray();
+
+ @$rating['rating_type'] = $type;
+ @$rating['rating_total'] = (int)$rating['rating_total'];
+ @$rating['rating_sum'] = (int)$rating['rating_sum'];
+ @$rating['rating_math'] = (round(100/$rating_sett['rating_stars'], 0));
+ @$rating['rating_percent'] = (round($rating['rating_sum']/$rating['rating_total'], $rating_sett['rating_round']))*$rating['rating_math'];
+ @$rating['rating_doc_id'] = $doc_id;
+ @$rating['rating_rating'] = round($rating['rating_sum']/$rating['rating_total'], $rating_sett['rating_round']);
+
+ $AVE_Template->assign($rating);
+ $AVE_Template->assign($rating_sett);
+ $AVE_Template->display($this->tpl_dir . $this->rating_tpl);
+ }
+ }
+
+ /**
+ * Метод, предназначенный для обработки голоса
+ *
+ * @param string $doc_id ID документа
+ * @param string $rate Голос
+ */
+ function vote ($doc_id, $rate)
+ {
+ global $AVE_DB, $AVE_Template;
+
+
+ // Если группа пользователя, который в текущий момент просматривает документ попадает в список
+ // разрешенных (в настройках модуля), тогда создаем флаг, который будет разрешать к показу
+ // функцию голосования
+ if (in_array(UGROUP, explode(',', $this->_ratingSettingsGet('rating_user_groups'))))
+ {
+
+ $user_indent = (isset($_SESSION['user_id']) ? "AND rating_id_user = '". (int)$_SESSION['user_id'] ."'" : "AND rating_user_ip = '". $_SERVER['REMOTE_ADDR'] . "'");
+
+ $rating_exist_detail = (int)$AVE_DB->Query("
+ SELECT COUNT(*) FROM ". PREFIX . "_module_rating_details
+ WHERE
+ rating_id_doc = ". $doc_id ."
+ ". $user_indent ."
+ ")->GetCell();
+
+ $rating_exist_summary = (int)$AVE_DB->Query("
+ SELECT COUNT(*) FROM ". PREFIX . "_module_rating_summary
+ WHERE rating_id_doc = " . $doc_id
+ )->GetCell();
+
+ if ($rate < 1 || $rate > $this->_ratingSettingsGet('rating_stars')) exit;
+
+ if ($rating_exist_detail === 1)
+ {
+ exit (json_encode(array(0,$AVE_Template->get_config_vars('RATING_ALREADY'))));
+ }
+ else
+ {
+ $AVE_DB->Query("
+ INSERT INTO ". PREFIX . "_module_rating_details
+ SET
+ rating_id_doc = '" . $doc_id . "',
+ rating_id_user = '" . (int)$_SESSION['user_id'] ."',
+ rating_vote = '" . $rate . "',
+ rating_date = '" . time() . "',
+ rating_user_ip = '" . $_SERVER['REMOTE_ADDR'] . "'
+ ");
+
+ if ($rating_exist_summary === 1)
+ {
+ $AVE_DB->Query("
+ UPDATE ". PREFIX . "_module_rating_summary
+ SET
+ rating_total = rating_total + 1,
+ rating_sum = rating_sum + " . $rate . "
+ WHERE
+ rating_id_doc = ". $doc_id ."
+ ");
+ }
+ else
+ {
+ $AVE_DB->Query("
+ INSERT INTO ". PREFIX . "_module_rating_summary
+ SET
+ rating_id_doc = '" . $doc_id . "',
+ rating_total = '1',
+ rating_sum = '" . $rate . "'
+ ");
+ }
+
+ $rating = $AVE_DB->Query("
+ SELECT *
+ FROM " . PREFIX . "_module_rating_summary
+ WHERE rating_id_doc = '" . $doc_id . "'
+ ")->FetchAssocArray();
+ $rating_sett['rating_stars'] = $this->_ratingSettingsGet('rating_stars'); // Кол-во звезд
+ $rating_sett['rating_round'] = $this->_ratingSettingsGet('rating_round'); // Округление
+ $rating['rating_math'] = (round(100/$rating_sett['rating_stars'], 0));
+ $rating['rating_total'] = (int)$rating['rating_total'];
+ $rating['rating_percent'] = (round($rating['rating_sum']/$rating['rating_total'], $rating_sett['rating_round']))*$rating['rating_math'];
+ $rating['rating_rating'] = round($rating['rating_sum']/$rating['rating_total'], $rating_sett['rating_round']);
+
+ exit (json_encode(array(1,$AVE_Template->get_config_vars('RATING_THANKS'), $rating['rating_total'], $rating['rating_percent'], $rating['rating_rating'])));
+ }
+ }
+ else
+ {
+ exit (json_encode(array(0,$AVE_Template->get_config_vars('RATING_UGROUP'))));
+ }
+
+ exit;
+ }
+
+ /**
+ * Метод, предназначенный для вывода последних
+ * голосов на главной странице модуля
+ *
+ * @param string $adm_dir - путь к шаблонам модуля
+ */
+ function ratingAdminListShow ($adm_dir)
+ {
+ global $AVE_DB, $AVE_Template;
+
+ $sql = $AVE_DB->Query("
+ SELECT * FROM " . PREFIX . "_module_rating_details
+ ORDER BY Id DESC
+ LIMIT 0, 10
+ ");
+ // Формируем массив из полученных данных
+ while ($row = $sql->FetchRow())
+ {
+ $row->rating_name = $this->_ratingGetDocumentTitle($row->rating_id_doc);
+ $row->rating_id_user = get_username_by_id($row->rating_id_user);
+
+ $ratings[] = $row;
+ }
+
+ $AVE_Template->assign('ratings', $ratings);
+ $AVE_Template->assign('content', $AVE_Template->fetch($adm_dir . $this->_admin_ratings_tpl));
+ }
+
+ /**
+ * Метод, предназначенный для управления настройками модуля
+ *
+ * @param string $adm_dir - путь к шаблонам модуля
+ */
+ function ratingAdminSettingsEdit ($adm_dir)
+ {
+ global $AVE_DB, $AVE_Template;
+
+ // Если в запросе содержится подзапрос на сохранение данных (пользователь нажал кнопку
+ // сохранить изменения), тогда выполняем запрос к БД на обновление информации.
+
+ if (isset($_REQUEST['sub']) && $_REQUEST['sub'] == 'save')
+ {
+ $AVE_DB->Query("
+ UPDATE " . PREFIX . "_module_rating_settings
+ SET
+ rating_user_groups = '" . @implode(',', $_POST['rating_user_groups']) . "',
+ rating_stars = '" . @(int)$_POST['rating_stars'] . "',
+ rating_round = '" . @(int)$_POST['rating_round'] . "',
+ rating_active = '" . @(int)$_POST['rating_active'] . "'
+ WHERE
+ Id = 1
+ ");
+
+ // Сохраняем системное сообщение в журнал
+ reportLog($AVE_Template->get_config_vars('RATING_SETTINGS_SAVE'));
+
+ // Выполняем обновление страницы с настройками модуля
+ header('Location:index.php?do=modules&action=modedit&mod=rating&moduleaction=settings&cp=' . SESSION);
+ }
+
+ // Получаем список всех настроек модуля
+ $row = $this->_ratingSettingsGet();
+ $row['rating_user_groups'] = explode(',', $row['rating_user_groups']);
+
+ // Передаем данные в шаблон и показываем страницу с настройками модуля
+ $AVE_Template->assign($row);
+ $AVE_Template->assign('content', $AVE_Template->fetch($adm_dir . $this->_admin_settings_tpl));
+ }
+
+}
+?>
\ No newline at end of file
diff --git a/css/rating.css b/css/rating.css
new file mode 100644
index 0000000..999ecd9
--- /dev/null
+++ b/css/rating.css
@@ -0,0 +1,68 @@
+.rating {
+ position: relative;
+ display: block;
+ float: left;
+ height: 16px;
+}
+
+.rating_name, .rating_total, .rating_summary {
+ position: relative;
+ float: left;
+ height: 16px;
+ line-height: 16px;
+}
+
+.rating_total, .rating_summary {
+ margin: 0 0 0 5px;
+ font-size: 12px;
+}
+
+.rating_vote {
+ position: relative;
+ float: left;
+ margin: 0;
+ height: 16px;
+ background: url(../images/skin.png) left top repeat-x;
+ cursor: pointer;
+}
+
+.rating_not_vote {
+ cursor: default;
+}
+
+.rating_hover, .rating_percent {
+ position: absolute;
+ top: 0;
+ bottom: 0;
+ left: 0;
+ width: 0;
+ background: url(../images/skin.png) repeat-x;
+}
+
+.rating_percent {
+ background-position: left center;
+}
+
+.rating_hover {
+ background-position: left bottom;
+}
+
+.rating_mark {
+ position: relative;
+ float: left;
+ width: 18px;
+ height: 16px;
+}
+
+.rating_status {
+ position: absolute;
+ top: 16px;
+ right: 0;
+ left: 0;
+ display: none;
+ height: 16px;
+ color: #aaa;
+ text-align: left;
+ font-size: 11px;
+ line-height: 20px;
+}
\ No newline at end of file
diff --git a/images/skin.png b/images/skin.png
new file mode 100644
index 0000000..9b5a025
Binary files /dev/null and b/images/skin.png differ
diff --git a/images/skin_old.png b/images/skin_old.png
new file mode 100644
index 0000000..628c3ef
Binary files /dev/null and b/images/skin_old.png differ
diff --git a/index.php b/index.php
new file mode 100644
index 0000000..4ca25aa
--- /dev/null
+++ b/index.php
@@ -0,0 +1,4 @@
+
\ No newline at end of file
diff --git a/info.php b/info.php
new file mode 100644
index 0000000..185c129
--- /dev/null
+++ b/info.php
@@ -0,0 +1,20 @@
+ 'rating',
+ 'ModuleVersion' => '1.26.1',
+ 'ModuleAutor' => 'AVE.cms Team',
+ 'ModuleCopyright' => '© 2007-' . date('Y') . ' AVE.cms',
+ 'ModuleStatus' => 1,
+ 'ModuleIsFunction' => 1,
+ 'ModuleTemplate' => 0,
+ 'ModuleAdminEdit' => 1,
+ 'ModuleFunction' => 'mod_rating',
+ 'ModuleTag' => '[mod_rating]',
+ 'ModuleTagLink' => null,
+ 'ModuleAveTag' => '#\\\[mod_rating(:[\\\d]+)?]#',
+ 'ModulePHPTag' => ""
+ );
+?>
\ No newline at end of file
diff --git a/js/rating.js b/js/rating.js
new file mode 100644
index 0000000..e3d1ac8
--- /dev/null
+++ b/js/rating.js
@@ -0,0 +1,43 @@
+window.onload = function() {
+ // Рейтинг
+ $('.rating_mark').click(function(e) {
+ e.preventDefault();
+ var rating, doc_id, mark;
+ rating = $(this).parents('.rating');
+ doc_id = rating.attr('data-id');
+ mark = parseInt($(this).attr('data-mark'));
+ $.ajax({
+ type: 'GET',
+ url: '/index.php?module=rating&action=vote',
+ data: ({ 'mark':mark, 'doc_id': doc_id }),
+ success: function(data) {
+ var array = $.parseJSON(data);
+ if (array[0])
+ {
+ rating.find('.rating_percent').css('width',array[3]+'%');
+ rating.find('.rating_total_num').text(array[2]);
+ rating.find('.rating_summary').find('strong').text(array[4]);
+ }
+ rating.find('.rating_status').text(array[1]).fadeIn();
+ setTimeout(function() {
+ rating.find('.rating_status').fadeOut();
+ }, 3000);
+ }
+ });
+ });
+ //
+ $('.rating_mark').hover(
+ function () {
+ var rating, mark, hover, stars;
+ rating = $(this).parents('.rating');
+ mark = parseInt($(this).attr('data-mark'));
+ stars = rating.attr('data-stars');
+ hover = Math.round(mark / stars * 100);
+ rating.find('.rating_hover').css('width', hover+'%');
+ },
+ function () {
+ $(this).parents('.rating').find('.rating_hover').css('width', 0);
+ }
+ );
+
+};
\ No newline at end of file
diff --git a/lang/index.php b/lang/index.php
new file mode 100644
index 0000000..4ca25aa
--- /dev/null
+++ b/lang/index.php
@@ -0,0 +1,4 @@
+
\ No newline at end of file
diff --git a/lang/ru.txt b/lang/ru.txt
new file mode 100644
index 0000000..51b8105
--- /dev/null
+++ b/lang/ru.txt
@@ -0,0 +1,37 @@
+[name]
+MODULE_NAME = "Рейтинг документов"
+MODULE_DESCRIPTION = "Звездный рейтинг документов"
+
+[public]
+RATING_NAME = "Рейтинг"
+RATING_SUMMARY = "Оценка:"
+RATING_NOT = "нет оценки"
+RATING_VOTES = "Голосов:"
+RATING_FROM = "из"
+RATING_THANKS = "Спасибо, ваш голос учтён!"
+RATING_ALREADY = "Вы уже голосовали!"
+RATING_UGROUP = "У вас нет прав для голосования!"
+
+[admin]
+RATING_MODULE_NAME = "Звездный рейтинг"
+RATING_MODULE_SETTINGS = "Настройки модуля"
+RATING_ENABLE = "Модуль активен"
+RATING_SETTINGS_STARS = "Количество звезд"
+RATING_ROUND = "Округление значения рейтинга"
+RATING_ROUND_1 = "Целое число (0)"
+RATING_ROUND_2 = "Десятые (0.0)"
+RATING_ROUND_3 = "Сотые (0.00)"
+RATING_ROUND_4 = "Тысячные (0.000)"
+RATING_SETTINGS_SAVE = "Изменил настройки модуля «Звездный рейтинг»"
+RATING_FOR_GROUPS = "Группы пользователей, которым разрешены комментарии:"
+RATING_BUTTON_SAVE = "Сохранить настройки"
+
+RATING_STATISTIC = "Статистика"
+RATING_LAST_TEN = "Последние 10 оценок"
+RATING_NO_ITEMS = "Нет данных по рейтингу документов"
+RATING_ID = "Id"
+RATING_DATE = "Дата создания"
+RATING_DOCUMENT = "Документ"
+RATING_USER_ID = "Пользователь"
+RATING_RATE = "Рейтинг (Оценка)"
+RATING_IP = "IP Пользователя"
\ No newline at end of file
diff --git a/module.php b/module.php
new file mode 100644
index 0000000..b989564
--- /dev/null
+++ b/module.php
@@ -0,0 +1,104 @@
+tpl_dir = BASE_DIR . '/modules/rating/templates/';
+
+ // ланги
+ $lang_file = BASE_DIR . '/modules/rating/lang/' . $_SESSION['user_language'] . '.txt';
+ $AVE_Template->config_load($lang_file, 'public');
+ $config_vars = $AVE_Template->get_config_vars();
+ $AVE_Template->assign('config_vars', $config_vars);
+
+ // выводим рейтинг
+ $rating->show($doc_id, $type);
+}
+
+//Публичные функции модуля
+if (!defined('ACP') && !empty($_REQUEST['action']) && $_REQUEST['module'] == 'rating')
+{
+ // подключаем класс
+ require_once(BASE_DIR . '/modules/rating/class/rating.php');
+ $rating = new docRating;
+
+ // ланги
+ $lang_file = BASE_DIR . '/modules/rating/lang/' . $_SESSION['user_language'] . '.txt';
+ $AVE_Template->config_load($lang_file, 'public');
+
+ switch($_REQUEST['action'])
+ {
+ case 'vote': // Учет голоса
+
+ $percent = $rating->vote((int)$_REQUEST['doc_id'],(int)$_REQUEST['mark']);
+ $rating->vote((int)$_REQUEST['doc_id'], (int)$_REQUEST['mark']);
+ break;
+ }
+}
+
+//Административные функции
+if (defined('ACP') && !empty($_REQUEST['moduleaction']))
+{
+ // Подключаем основной класс и создаем объект
+ require_once(BASE_DIR . '/modules/rating/class/rating.php');
+ $rating = new docRating;
+
+ $adm_dir = BASE_DIR . '/modules/rating/admin/';
+ $tpl_dir = BASE_DIR . '/modules/rating/templates/';
+
+ // Определяем директори, где хранятся файлы с шаблонами модуля и подключаем языковые переменные
+ $lang_file = BASE_DIR . '/modules/rating/lang/' . $_SESSION['user_language'] . '.txt';
+ $AVE_Template->config_load($lang_file, 'admin');
+ $config_vars = $AVE_Template->get_config_vars();
+ $AVE_Template->assign('config_vars', $config_vars);
+
+ // Определяем, какой параметр пришел из строки запроса браузера
+ switch ($_REQUEST['moduleaction'])
+ {
+ // Если 1, тогда отображаем список всех голосов
+ case '1':
+ $rating->ratingAdminListShow($adm_dir);
+ break;
+
+ // Если settings, тогда открываем страницу с настройками данного модуля
+ case 'settings':
+ // Подключаем файл класса для работы с пользователями, создаем объект и получаем список
+ // всех групп пользователей, имеющихся в системе.
+ require_once(BASE_DIR . '/class/class.user.php');
+ $AVE_User = new AVE_User;
+
+ $AVE_Template->assign('groups', $AVE_User->userGroupListGet());
+ $rating->ratingAdminSettingsEdit($adm_dir);
+ break;
+ }
+}
+
+?>
\ No newline at end of file
diff --git a/sql.php b/sql.php
new file mode 100644
index 0000000..ca23b49
--- /dev/null
+++ b/sql.php
@@ -0,0 +1,107 @@
+
\ No newline at end of file
diff --git a/templates/rating.tpl b/templates/rating.tpl
new file mode 100644
index 0000000..4d4fccb
--- /dev/null
+++ b/templates/rating.tpl
@@ -0,0 +1,58 @@
+{*
+
+*}
+
+{if $display_rating ==1 }
+
+ {assign var='width_1_star' value='18'}
+
+
+
+ {if $rating_type == 'document'}
+
+
+
+
+ {#RATING_NAME#}:
+
+
+ {if $rating_can}
+
+ {section name=stars loop=$rating_stars step=1 start=0}
+
+ {/section}
+ {/if}
+
+ ({#RATING_VOTES#} {$rating_total} )
+
+ {#RATING_SUMMARY#} {$rating_rating}
+
+
+
+ {elseif $rating_type == 'request'}
+
+
+
+ {#RATING_SUMMARY#} {if $rating_rating != "0"}{$rating_rating}{else}{#RATING_NOT#}{/if}
+
+
+ {/if}
+
+{/if}
\ No newline at end of file