<?php 
/**
 * Система управления сайтом HostCMS v. 5.xx
 * Copyright © 2005-2010 ООО "Хостмэйк" (Hostmake LLC), http://www.hostcms.ru
 *
 * Ajax загрузчик формы списка пользователей Центра администрирования.
 * 
 * Файл: /admin/users_access/action/load_users.php
 * 
 * @author Hostmake LLC
 * @version 5.x
 */
function LoadAjaxData(&$admin_forms)
{
	$on_page = $admin_forms->GetOnPageCount();
	$page = to_int($_REQUEST['limit']);
	$begin = ($page == 0) ? 0 : ($page - 1) * $on_page;

	$param = array();

	$param['limit'][0] = array('begin' => $begin, 'count' => $on_page);

	$users_type_id = to_int($_REQUEST['users_type_id']);

	$user_access = new user_access();

	$users_type_row = $user_access->GetUserType($users_type_id);

	// Определяем имя пользователя
	if ($users_type_row)
	{
		$users_type_name = $users_type_row['users_type_name'];
	}
	else
	{
		$users_type_name = '';
	}

	// Строим "хлебные крошки".

	// Ссылка на группы пользователей
	$param['path_array'][] = array (
	'link' => $admin_forms->GetHtmlCallDoLoadAjax('/admin/users_access/users_access.php', '', 7, 'load_data'),
	'onclick' => $admin_forms->GetOnClickCallDoLoadAjax('/admin/users_access/users_access.php', '', 7, 'load_data'),
	'name' => $GLOBALS['MSG_user_access']['ua_link_users_type']
	);

	// Ссылка на группу, в которой находимся
	$param['path_array'][] = array(
	'link' => $admin_forms->GetHtmlCallDoLoadAjax("{$admin_forms->AAction}", "&action=show_users&users_type_id={$users_type_id}", 8, 'load_data'),
	'onclick' => $admin_forms->GetOnClickCallDoLoadAjax("{$admin_forms->AAction}", "&action=show_users&users_type_id={$users_type_id}", 8, 'load_data'),
	'name' => sprintf($GLOBALS['MSG_user_access']['ua_show_users_title'], $users_type_name)
	);

	// Запрос для выборки всех пользователей группы, в которой находимся
	$s1 = $param['data'][] = "SELECT users_table.* FROM users_table, users_type_table
	WHERE users_type_table.users_type_id = '$users_type_id'
	AND users_type_table.users_type_id = users_table.users_type_id
	{FILTER_STRING} {ORDER_STRING} {LIMIT}";

	// Посчитаем общее число, запрос ОБЯЗАТЕЛЬНО должен возвращать столбец `count`.
	$count = "SELECT count(users_table.users_id) AS count
	FROM users_table, users_type_table
	WHERE users_type_table.users_type_id = '$users_type_id'
	AND users_type_table.users_type_id = users_table.users_type_id
	{FILTER_STRING}";

	// Формируем верхнее меню.
	$menu = array();
	$menu[$k = 0]['name'] = $GLOBALS['MSG_user_access']['ua_link_users'];
	$menu[$k]['link'] = '';
	$menu[$k]['icon'] = '';

	$sub_menu = array();
	$sub_menu[$p = 0]['name'] = $GLOBALS['MSG_user_access']['ua_add_user_link'];
	$sub_menu[$p]['link'] = $admin_forms->GetHtmlCallTrigerSingleAction('edit_user', 'check_0_0', 8, 0, 0);
	$sub_menu[$p]['onclick'] = $admin_forms->GetOnClickCallTrigerSingleAction('edit_user', 'check_0_0', 8, 0, 0);
	$sub_menu[$p]['icon'] = '/admin/images/user_add.gif';
	// Добавляем подэлементы.
	$menu[$k]['sub_items'] = $sub_menu;

	$sub_menu[++$p]['name'] = $GLOBALS['MSG_user_access']['ua_link_user_access'];
	$sub_menu[$p]['link'] = $admin_forms->GetHtmlCallDoLoadAjax('/admin/users_access/users_access.php', "&action=show_users_type_access_form&users_type_id={$users_type_id}", 10, 'load_data');
	$sub_menu[$p]['onclick'] = $admin_forms->GetOnClickCallDoLoadAjax('/admin/users_access/users_access.php', "&action=show_users_type_access_form&users_type_id={$users_type_id}", 10, 'load_data');
	$sub_menu[$p]['icon'] = '/admin/images/shield.gif';

	// Добавляем подэлементы.
	$menu[$k]['sub_items'] = $sub_menu;

	$sub_menu[++$p]['name'] = $GLOBALS['MSG_user_access']['ua_link_user_form_access'];
	$sub_menu[$p]['link'] = $admin_forms->GetHtmlCallDoLoadAjax('/admin/users_access/users_access.php', "&users_type_id={$users_type_id}", 138, 'load_data');
	$sub_menu[$p]['onclick'] = $admin_forms->GetOnClickCallDoLoadAjax('/admin/users_access/users_access.php', "&users_type_id={$users_type_id}", 138, 'load_data');
	$sub_menu[$p]['icon'] = '/admin/images/table_shield.gif';

	// Добавляем подэлементы.
	$menu[$k]['sub_items'] = $sub_menu;

	// Формируем массив меню.
	$menu_array = array($menu);

	$param['total_count'][] = $count;
	$param['current_page'] = $page;
	$param['on_page'] = $on_page;
	$param['menus'] = $menu_array;

	$user_access = new user_access();

	$users_type_resource = $user_access->select_user_type($users_type_id);

	if ($users_type_resource)
	{
		$users_type_row = mysql_fetch_assoc($users_type_resource);
		$users_type_name = $users_type_row['users_type_name'];
	}
	else
	{
		$users_type_name = '';
	}

	$param['title'] = sprintf($GLOBALS['MSG_user_access']['ua_show_users_title'], $users_type_name);

	return $param;
}

// Необязательная функция для определения реального имени столбца по псевдониму.
function ResolveFieldName(&$field_name, $dataset_id)
{

	switch ($dataset_id)
	{
		case 0: 
		{
			if ($field_name == 'users_id')
			{
				$field_name = 'users_table.users_id';
			}
			elseif ($field_name == 'users_name')
			{
				$field_name = 'users_table.users_name';
			}
			
			break;
		}
	}
	return true;
}

/**
 * Обработчик события "Редактирование пользователя"
 */
function edit_user(&$param)
{
	ob_start();

	$users_type_id = to_int($_REQUEST['users_type_id']);

	if (isset($param['data'][0]))
	{
		foreach ($param['data'][0] as $key => $value)
		{
			// Определяем режим доступа пользователя и принадлежит ли объект пользователю
			$user_access = new user_access();

			// Определяем информацию об объекте
			$object_row = $user_access->GetUser($key);

			if ($object_row)
			{
				$object_user_id = $object_row['users_own_id'];
			}
			else
			{
				$object_user_id = 0;
			}

			if ($user_access->IssetUserAccessForObject($object_user_id))
			{
				$users_id = intval($key);

				include(CMS_FOLDER . 'admin/users_access/action/form_edit_add_user.php');

				// Редактировать можно только 1 элемент
				break;
			}
			else
			{
				$user_access->MessageOnlyOwn();
				$param['error'] = ob_get_clean();
				return ;
			}
		}
	}

	$param['result'] = ob_get_clean();

	return true;
}

/**
 * Обработчик события "Удалить пользователя"
 */
function delete_user(&$param)
{
	ob_start();

	if (defined('READ_ONLY') && READ_ONLY)
	{
		$kernel = & singleton('kernel');

		$kernel->ReadMode();
	}
	else
	{
		$user_access = new user_access();

		if (isset($param['data']))
		{
			$count_deleted_users = 0;

			foreach ($param['data'][0] as $key => $dataset)
			{
				// Определяем режим доступа пользователя и принадлежит ли объект пользователю
				$user_access = new user_access();

				// Определяем информацию об объекте
				$object_row = $user_access->GetUser($key);

				if ($object_row)
				{
					$object_user_id = $object_row['users_own_id'];
				}
				else
				{
					$object_user_id = 0;
				}

				if ($user_access->IssetUserAccessForObject($object_user_id))
				{
					// Проверяем не удаляет ли пользователь свою учетную запись
					if ($key == to_int($_SESSION['current_users_id']))
					{
						show_error_message($GLOBALS['MSG_user_access']['error_delete_users']);
						$flag_success_delete_user = false;
					}
					else
					{
						// Проверяем не удаляем ли мы последнего пользователя админки
						// если удаляем последнего, то запретить удаление
						$DataBase = & singleton('DataBase');

						// Получаем информацию о всех пользователях Центра администрирования
						$result_users = $user_access->GetAllUsers();

						$count_users = mysql_num_rows($result_users);

						if ($count_users == 1)// остался один пользователь
						{
							show_error_message($GLOBALS['MSG_user_access']['error_delete_end_users']);
						}
						else
						{
							// Проверяем статус текущего пользователя
							$row_current_user = $user_access->select_user($_SESSION['current_users_id']);

							// Пользователь Центра администрирования не является суперюзером
							if ($row_current_user && $row_current_user['users_superuser']!=1)
							{
								// Проверяем является ли удаляемый пользователь суперюзером
								$row_delete_user = $user_access->select_user($key);
								// удаляемый пользователь - суперюзер

								if ($row_delete_user && $row_delete_user['users_superuser']==1)
								{
									show_error_message($GLOBALS['MSG_user_access']['error_row_delete_users']);
									$flag_success_delete_user = false;
								}
							}

							// Пользователь Центра администрирования -  суперюзер или
							// несуперюзер и при этом удаляемый пользователь тоже несуперюзер - удаляем пользователя
							if ($row_current_user['users_superuser'] == 1 ||
							($row_current_user['users_superuser'] !=1 && $row_delete_user['users_superuser'] !=1 ))
							{
								if ($user_access->del_user($key))
								{
									$count_deleted_users++;

									$flag_success_delete_user = true;
								}
								else
								{
									$flag_success_delete_user = false;
								}
							}
						}
					}
					// Не было ошибок при удалении пользователей
					if ($flag_success_delete_user)
					{
						// Удалена одна запись
						if ($count_deleted_users == 1)
						{
							show_message($GLOBALS['MSG_user_access']['ua_delete_user_message']);
						}
						else // Удалено несколько записей
						{
							show_message($GLOBALS['MSG_user_access']['ua_delete_users_message']);
						}
					}
					else // Ошибка при удалении пользователя
					{
						show_error_message($GLOBALS['MSG_user_access']['ua_delete_users_error_message']);
					}
				}
				else
				{
					$user_access->MessageOnlyOwn();
					$param['error'] = ob_get_clean();
					return ;
				}

			}
		}
	}
	$param['error'] = ob_get_clean();
}

/**
 * Применить изменения
 */
function apply_changes_users(&$param)
{
	ob_start();

	if (defined('READ_ONLY') && READ_ONLY)
	{
		$kernel = & singleton('kernel');

		$kernel->ReadMode();
	}
	else
	{
		$flag_error = false;
		$users_access = new user_access();

		$DataBase = & singleton('DataBase');

		if (isset($param['data']) && is_array($param['data']))
		{
			foreach ($param['data'][0] as $key => $row)
			{
				// Определяем режим доступа пользователя и принадлежит ли объект пользователю
				$user_access = new user_access();

				// Определяем информацию об объекте
				$object_row = $user_access->GetUser($key);

				if ($object_row)
				{
					$object_user_id = $object_row['users_own_id'];
				}
				else
				{
					$object_user_id = 0;
				}

				if ($user_access->IssetUserAccessForObject($object_user_id))
				{
					// Получаем информацию о пользователе
					$user_row = $users_access->GetUser($key);

					$param = array();
					$param['users_id'] = $key;
					$param['users_superuser'] = to_int($row['users_superuser']);
					$param['users_type_id'] = $user_row['users_type_id'];
					$param['users_settings'] = $user_row['users_settings'];
					$param['users_name'] = $user_row['users_name'];
					$param['users_name_text'] = $user_row['users_name_text'];
					$param['users_surname'] = $user_row['users_surname'];
					$param['users_patronymic'] = $user_row['users_patronymic'];
					$param['users_email'] = $user_row['users_email'];
					$param['users_position'] = $user_row['users_position'];
					$param['users_icq'] = $user_row['users_icq'];
					$param['users_site'] = $user_row['users_site'];
					$param['users_only_own'] = $user_row['users_only_own'];

					$user_superuser = to_int($row['users_superuser']);

					// Проверяем не является ли пользователь, для которого изменюются данные
					// последним суперюзером
					$query = "SELECT `users_id` FROM `users_table` WHERE `users_superuser` = '1'";
					$DataBase->select($query);

					// пользователь является последним суперюзером и для него снят
					// статус суперюзера - выводим предупреждение
					if ($DataBase->get_count_row() == 1 && !$param['users_superuser'])
					{
						show_error_message($GLOBALS['MSG_user_access']['error_superuser']);
						//$error = 1;
					}
					else
					{

						if (!$users_access->InsertUser($param))
						{
							// Произошла ошибка при редактировании данных о пользователе.
							$flag_error = true;

							// Записываем в массив имена пользователей, для которых не изменен статус привилегиронности.
							$error_users_name[] = $row_user_access['users_name'];
						}
					}
				}
				else
				{
					$user_access->MessageOnlyOwn();
				}

			}

			// Была ошибка при изменении статуса привилегированности.
			if ($flag_error)
			{
				$str_error  = implode(',', $error_users_name);
				show_error_message(sprintf($GLOBALS['MSG_user_access']['error_changes_superuser'], $str_error));
			}
		}
	}

	$param['error'] = ob_get_clean();
}
?>