<?php

/**
 * Класс работы с модулем Звездный рейтинг
 *
 * @package AVE.cms
 * @subpackage mod_rating
 * @filesource
 */

class docRating
{
/**
 * Свойства класса
 */

	/**
	 * Идентификатор записи с настройками модуля
	 *
	 * @var int
	 */
	var $_config_id = 1;

	/**
	 * Имя файла с шаблоном списка голосов в административной части
	 *
	 * @var string
	 */
	var $_admin_ratings_tpl = 'admin_ratings.tpl';

	/**
	 * Имя файла с шаблоном редактирования настроек модуля в административной части
	 *
	 * @var string
	 */
	var $_admin_settings_tpl = 'admin_settings.tpl';

	/**
	 * Имя файла с шаблоном в публичной части
	 *
	 * @var string
	 */
	var $rating_tpl = 'rating.tpl';

/**
 *	Внешние методы класса
 */

	/**
	 * Метод, предназначенный для получения основных настроек модуля, которые задаются в Панели управления.
	 *
	 * @param string $param название параметра
	 * @return mixed значение настройки
	*/
	function _ratingSettingsGet ($param = '')
	{
		global $AVE_DB;

		// Определяем статическую переменную, которая будет хранить полученные настройки
		// на протяжении всего срока жизни объекта.
		static $settings = null;

		// Если переменная $settings еще не имеет значений, тогда выполняем
		// запрос к БД на получение данных
		if ($settings === null)
		{
			$settings = $AVE_DB->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));
	}

}
?>