<?php
/**
 * Система управления сайтом HostCMS v. 5.xx
 * Copyright © 2005-2010 ООО "Хостмэйк" (Hostmake LLC), http://www.hostcms.ru
 *
 * Ajax загрузчик формы списка меток.
 * 
 * Файл: /admin/tag/action/load_tags.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();
	$Tag = new Tag();

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

	$tags_group_parent_id = to_int($_REQUEST['tags_group_parent_id']);
	
	if ($tags_group_parent_id)
	{
		// Строим "хлебные крошки"
		$path_array = $Tag->GetTagsGroupsPathArray($tags_group_parent_id);
		
		unset($path_array[0]);
	
		$new_path_array = array();
	
		$new_path_array[] = array(
		'link' => $admin_forms->GetHtmlCallDoLoadAjax('/admin/tag/tag.php', '&tags_group_parent_id=0', 173, 'load_data'),
		'onclick' => $admin_forms->GetOnClickCallDoLoadAjax('/admin/tag/tag.php', '&tags_group_parent_id=0', 173, 'load_data'),
		'name' => $GLOBALS['MSG_tag']['title']);
		
		// Меняем порядок следования элементов в массиве на обратный
		$path_array = array_reverse($path_array, true);
	
		// Преобразуем идентификаторы групп в ссылки на группы.
		if ($path_array)
		{
			foreach ($path_array as $group_parent_id => $value)
			{
				$new_path_array[] = array (
				'link' => $admin_forms->GetHtmlCallDoLoadAjax('/admin/tag/tag.php', "&tags_group_parent_id={$group_parent_id}", 173, 'load_data'),
				'onclick' => $admin_forms->GetOnClickCallDoLoadAjax('/admin/tag/tag.php', "&tags_group_parent_id={$group_parent_id}", 173, 'load_data'),
				'name' => $value['tags_group_name']);
			}
		}
	
		$param['path_array'] = $new_path_array;
	} 
	
	// Запрос для выборки групп тэгов
	$param['data'][] = "SELECT tags_group_id AS code, tags_group_name AS name," .
			"tags_group_id AS site_count, tags_group_id AS all_count  	
	FROM `tags_group_table`
	WHERE `tags_group_parent_id`= $tags_group_parent_id	 
	{FILTER_STRING} {ORDER_STRING} {LIMIT}";

	// Количество групп тэгов
	$count_groups = "SELECT COUNT(tags_group_id) AS count	
	FROM `tags_group_table`
	WHERE `tags_group_parent_id`= $tags_group_parent_id
	{FILTER_STRING}";		

	// Выборка нужных записей.
	$param['data'][] = "SELECT *, `tags_table`.`tag_id` as code,`tags_table`.`tag_name` as name, 
	SUM(IF(`tags_relation_table`.`site_id` = '" . CURRENT_SITE . "', 1, 0)) AS site_count,
	COUNT(`tags_relation_table`.`tag_id`) AS all_count
	FROM `tags_table` LEFT JOIN `tags_relation_table` 
	ON `tags_table`.`tag_id` = `tags_relation_table`.`tag_id`
	WHERE 1 AND tags_table.tags_group_id = $tags_group_parent_id {FILTER_STRING}		
	GROUP BY `tags_table`.`tag_id`	
	{ORDER_STRING} {LIMIT}";//
	//`tags_relation_table`.`site_id` = '".CURRENT_SITE."'

	// Число нужных записей.
	$count = "SELECT count(*) AS count
	FROM `tags_table`
	WHERE 1 AND tags_table.tags_group_id = $tags_group_parent_id
	{FILTER_STRING}";

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

	// Метка
	$menu[$k = 0]['name'] = $GLOBALS['MSG_tag']['main_menu'];
	$menu[$k]['link'] = '';

	// Добавить
	$sub_menu = array();
	$sub_menu[$p = 0]['name'] = $GLOBALS['MSG_tag']['menu_add'];
	$sub_menu[$p]['link'] =  $admin_forms->GetHtmlCallTrigerSingleAction('edit_tag', 'check_1_0', 173, 0, 0);
	$sub_menu[$p]['onclick'] = $admin_forms->GetOnClickCallTrigerSingleAction('edit_tag', 'check_1_0', 173, 0, 0);
	///admin/images/add.gif
	$sub_menu[$p]['icon'] = '/admin/images/page_add.gif';
		
	// Добавляем подэлементы.
	$menu[$k]['sub_items'] = $sub_menu;
	
	$k++;
	
	$menu[$k]['name'] = $GLOBALS['MSG_tag']['menu_group'];
	$menu[$k]['link'] = '';

	// Добавить
	$sub_menu = array();
	$sub_menu[$p = 0]['name'] = $GLOBALS['MSG_tag']['menu_group_add'];
	$sub_menu[$p]['link'] =  $admin_forms->GetHtmlCallTrigerSingleAction('edit_tag', 'check_0_0', 173, 0, 0);
	$sub_menu[$p]['onclick'] = $admin_forms->GetOnClickCallTrigerSingleAction('edit_tag', 'check_0_0', 173, 0, 0);
	$sub_menu[$p]['icon'] = '/admin/images/folder_add.gif';
		
	// Добавляем подэлементы.
	$menu[$k]['sub_items'] = $sub_menu;

	$param['menus'] = array($menu);
	$param['total_count'][0] = $count_groups;
	$param['total_count'][1]= $count;
	
	$param['current_page'] = $page;
	$param['on_page'] = $on_page;

	$param['field_params'][0][834]['admin_forms_field_image'] = "=/admin/images/folder.gif";
	//$param['field_params'][0][824]['admin_forms_field_image'] = "=/admin/images/folder.gif";
	$param['field_params'][0][824]['admin_forms_field_type'] = 4;
	
	
	//Заголовок формы
	$param['title'] = $GLOBALS['MSG_tag']['title'];

	// Вычисляемое поле
	$param['field_params'][0]['site_count']['admin_forms_field_type'] = 10; 
	$param['field_params'][0]['site_count']['callback_function'] = 'callback_function_site_count';

	function callback_function_site_count($field_value, $value, $row)
	{
		
	}
	
	// Вычисляемое поле
	$param['field_params'][0]['all_count']['admin_forms_field_type'] = 10; 
	$param['field_params'][0]['all_count']['callback_function'] = 'callback_function_all_count';

	function callback_function_all_count($field_value, $value, $row)
	{
		
	}
	
	return $param;
}

/**
 * Определение реального имени столбца по псевдониму.
 *
 * @param string $field_name
 * @param integer $dataset_id
 * @return boolean
 */
function ResolveFieldName(&$field_name, $dataset_id)
{
	switch ($dataset_id)
	{
		case 0: // Список меток.
		{
			switch ($field_name)
			{
				case 'name':
					{
						$field_name = '`tags_group_table`.`tags_group_name`';
						break;
					}		
					
				default:
					{
						$field_name = '`tags_group_table`.`tags_group_id`';
						break;
					}
			}

			break;
		}
		case 1: // Список меток.
		{
			switch ($field_name)
			{
				case 'code':
					{
						$field_name = '`tags_table`.`tag_id`';
						break;
					}
				case 'name':
					{
						$field_name = '`tags_table`.`tag_name`';
						break;
					}
			}

			break;
		}
		
	}

	return true;
}

//Обработчики событий

/**
 * Редактирование метки
 *
 * @param unknown_type $param
 * @return unknown
 */
function edit_tag(&$param)
{
	ob_start();

	// Установлен режим "только для чтения"
	if (defined('READ_ONLY') && READ_ONLY)
	{
		$kernel = & singleton('kernel');

		$kernel->ReadMode();
	}
	else
	{
		// Редактирование групп меток
		if (isset($param['data'][0]))
		{
			$Tag = & singleton('Tag');

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

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

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

				if ($user_access->IssetUserAccessForObject($object_user_id))
				{
					$tags_group_id = intval($key);
					include(CMS_FOLDER . 'admin/tag/action/form_edit_add_tags_group.php');

					// Title для страницы
					$param['title'] = $tags_group_id == 0
					? $GLOBALS['MSG_tag']['form_edit_add_tags_group_title_add']
					: $GLOBALS['MSG_tag']['form_edit_add_tags_group_title_edit'];

					// Редактировать можно только 1 элемент
					break;
				}
				else
				{
					$user_access->MessageOnlyOwn();
				}
			}
		}
		
		// Редактирование меток
		if (isset($param['data'][1]))
		{
			$Tag = & singleton('Tag');

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

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

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

				if ($user_access->IssetUserAccessForObject($object_user_id))
				{
					$tag_id = intval($key);
					include(CMS_FOLDER . 'admin/tag/action/form_edit_add_tag.php');

					// Title для страницы
					$param['title'] = $tag_id == 0
					? $GLOBALS['MSG_tag']['form_edit_add_title_add']
					: $GLOBALS['MSG_tag']['form_edit_add_title_edit'];

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

	return true;
}

/**
 * Обработчик события "Удалить"
 *
 * @param array $param
 */
function delete_tag(&$param)
{
	ob_start();

	// Установлен режим "только для чтения"
	if (defined('READ_ONLY') && READ_ONLY)
	{
		$kernel = & singleton('kernel');

		$kernel->ReadMode();
	}
	else
	{
		$Tag = & singleton('Tag');
		
		$count_deleted_tikets_groups = 0;

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

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

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

				if ($user_access->IssetUserAccessForObject($object_user_id))
				{
					// Удаление группы тикетов
					if (!$Tag->DeleteTagsGroup($key))
					{
						$flag_success_tags_group = false;
					}
					else
					{
						++$count_deleted_tikets_groups;

						$flag_success_tags_group = true;
					}
				}
				else
				{
					$user_access->MessageOnlyOwn();

					$flag_success_tags_group = false;
				}
			}

			// Сообщения на странице
			// Удаление завершено успешно
			if ($flag_success_tags_group)
			{
				if ($count_deleted_tikets_groups == 1)
				{
					show_message($GLOBALS['MSG_tag']['delete_tags_group_one_success']);
				}
				else
				{
					show_message($GLOBALS['MSG_tag']['delete_tags_group_many_success']);
				}
			}
			// Ошибка удаления
			else
			{
				show_error_message($GLOBALS['MSG_tag']['delete_tags_group_error']);
			}
		}
		
		$count_deleted_tikets = 0;
		
		// Удаление  тикетов
		if (isset($param['data'][1]))
		{
			foreach ($param['data'][1] as $key => $value)
			{
				// Определяем режим доступа пользователя и принадлежит ли объект пользователю
				$user_access = new user_access();

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

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

				if ($user_access->IssetUserAccessForObject($object_user_id))
				{
					// Удаление категории тикетов
					if (!$Tag->DeleteTag($key))
					{
						$flag_success_catalog = false;
					}
					else
					{
						++$count_deleted_tikets;

						$flag_success_catalog = true;
					}
				}
				else
				{
					$user_access->MessageOnlyOwn();

					$flag_success_catalog = false;
				}
			}

			// Сообщения на странице
			// Удаление завершено успешно
			if ($flag_success_catalog)
			{
				if ($count_deleted_tikets == 1)
				{
					show_message($GLOBALS['MSG_tag']['delete_tag_one_success']);
				}
				else
				{
					show_message($GLOBALS['MSG_tag']['delete_tag_many_success']);
				}
			}
			// Ошибка удаления
			else
			{
				show_error_message($GLOBALS['MSG_tag']['delete_tag_error']);
			}
		}
	}

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

/**
 * Обработчик события "Объединение тикетов"
 *
 * @param array $param
 */
function combine_tags(&$param)
{
	ob_start();

	// Установлен режим "только для чтения"
	if (defined('READ_ONLY') && READ_ONLY)
	{
		$kernel = & singleton('kernel');

		$kernel->ReadMode();
	}
	else
	{
		$Tag = & singleton('Tag');
		
		$accepted_tags_array = array();
		
		$error_tags_array = array();

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

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

					if ($object_row)
					{
						$object_user_id = $object_row['users_id'];
					}
					else
					{
						$object_user_id = 0;
					}
					
					if ($user_access->IssetUserAccessForObject($object_user_id))
					{
						$accepted_tags_array[] = $key;
					}
					else
					{
						$user_access->MessageOnlyOwn();
						
						$error_tags_array[] = $key;
					}
				}
				
				if(count($accepted_tags_array) > 1)
				{
					// Передаем сгенерированный массив методу объединения
					$Tag->JoinTags($accepted_tags_array);
				}
				if(count($error_tags_array) > 0)
				{
					// Не все теги удалось объединить из-за недостатка прав доступа
					show_message(sprintf($GLOBALS['MSG_tag']['error_join_some_tags'], implode(', ', $error_tags_array)));
				}
			}
		}
	}

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

// Групповой перенос информационных меток и групп меток
function move_tags_groups(&$param)
{
	ob_start();
		
	$tags_group_parent_id = to_int($_REQUEST['tags_group_parent_id']);

	$Tag = & singleton('Tag');	
	$admin_forms_fields = & singleton('admin_forms_fields');
	
	if (isset($param['data']))
	{		
		ob_start();
		
		$form_name = 'move_tags_groups_' . time();
		$form_params = array();
		$form_params['form_attribs']['method'] = 'post';
		$form_params['form_attribs']['action'] = '/admin/tag/tag.php';
		$form_params['form_attribs']['id'] = 'form_' . $form_name;
		$form_params['form_attribs']['ENCTYPE'] = 'multipart/form-data';

		$admin_forms_fields->admin_forms_fields($form_params);

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

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

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

				if ($user_access->IssetUserAccessForObject($object_user_id))
				{
					$tags_group_id = intval($key);
										
					$form_params = array();
					$form_params['tab_id'] = $tab_id;
					$form_params['name'] = 'move_group_' . $tags_group_id;
					$form_params['type'] = 4; // Скрытое поле.
					$form_params['value'] = $tags_group_id;
					$admin_forms_fields->AddField($form_params);
				}				
			}
		}
		
		if (isset($param['data'][1]))
		{
			foreach ($param['data'][1] as $key => $value)
			{
				// Определяем режим доступа пользователя и принадлежит ли объект пользователю
				$user_access = & singleton('user_access');

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

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

				if ($user_access->IssetUserAccessForObject($object_user_id))
				{
					$tag_id = intval($key);
															
					$form_params = array();
					$form_params['tab_id'] = $tab_id;
					$form_params['name'] = 'move_tag_' . $tag_id;
					$form_params['type'] = 4; // Скрытое поле.
					$form_params['value'] = $tag_id;
					$admin_forms_fields->AddField($form_params);
				}				
			}
		}
							
		// Список групп		
		$form_params = array();
		$form_params['tab_id'] = $tab_id;
		$form_params['name'] = 'tag_group_id';
		$form_params['caption'] = $GLOBALS['MSG_tag']['move_tags_groups_id'];
		$form_params['type'] = 2; // Выпадающий список.
		$form_params['value'] = 0;

		// Массив, содержащий полное дерево групп
		//$mas = $InformationSystem->GetGroupsInformationSystem(0, $information_system_id, "&nbsp;&nbsp;", false, array('cache' => false));
		
		$param_tags_group = array();

		$param_tags_group['tags_group_parent_id'] = 0; 
		$param_tags_group['separator'] = '&nbsp;';		

		$mas = $Tag->GetTagsGroupsTree($param_tags_group);
					
		// Массив идентификаторов переносимых групп
		$mas_move_groups = array();
		
		foreach($_REQUEST as $request_key => $request_value)
		{
			if (ereg("^check_0_([0-9]*)$", $request_key, $regs))
			{
				$mas_move_groups[] = $regs[1];
			}
		}
		
		// Удаляем из массива с деревом групп меток переносимые группы и их дочерние подгруппы
		foreach($mas as $key_group_tree => $value_group_tree)
		{		
			foreach($mas_move_groups as $key_move_groups => $value_move_groups)
			{
				// Текущая группа в дереве групп является переносимой группой
				// или родительской по отношению к переносимой
				if ($value_group_tree['tags_group_id'] == $value_move_groups 
				|| $value_group_tree['tags_group_parent_id'] == $value_move_groups)
				{
					if ($value_group_tree['tags_group_parent_id'] == $value_move_groups)
					{						
						$mas_move_groups[] = $value_group_tree['tags_group_id'];
					}					
					unset($mas[$key_group_tree]);										
				}			
				
			}	
		}		
		
		$items = array();
		$items[0] = '..';
		
		foreach ($mas as $key_mas => $value_mas)
		{			
			$group_path_array = array();
			$group_path_name_array = array();
	
			// Получаем полный путь к группе меток
			$group_path_array = $Tag->GetTagsGroupsPathArray($value_mas['tags_group_id']);
			//var_dump($group_path_array);
			// Меняем порядок следования меток в массиве на обратный
			$group_path_array = array_reverse($group_path_array, true);
												
			foreach ($group_path_array as $group_path_id => $group_path_row)
			{
				if ($group_path_id)
				{								
					$group_path_name_array[] = $group_path_row['tags_group_name'];
				}
			}
			
			$items[$value_mas['tags_group_id']] = implode(' / ', $group_path_name_array);
		}

		$form_params['items'] = $items;
		$form_params['div_attributes']['style'] = '';
		$form_params['attributes']['style'] = 'width: 320px; float: left;';
		$form_params['apply_filter'] = true;

		$admin_forms_fields->AddField($form_params);								
						
		// Добавляем скрытое поле с идентификатором текущей группы
		$form_params = array();
		$form_params['tab_id'] = $tab_id;
		$form_params['name'] = 'tags_group_parent_id';
		$form_params['type'] = 4; // Скрытое поле.
		$form_params['value'] = $tags_group_parent_id;
		$admin_forms_fields->AddField($form_params);
		
		// Добавляем специальное скрытое поле с именем кнопки		
		$form_params = array();
		$form_params['tab_id'] = $tab_id;
		$form_params['name'] = 'move_tags_groups';
		$form_params['type'] = 4; // Скрытое поле.
		$form_params['value'] = '';
		$admin_forms_fields->AddField($form_params);
				
		$form_params = array();
		$form_params['name'] = 'move_tags_groups';
		$form_params['caption'] = $GLOBALS['MSG_tag']['move_tags_groups_form_button_name'];
		$form_params['image'] = '/admin/images/add.gif';
		// {$admin_forms_fields->AAdditionalParams}
		// var oWindow = document.getElementById('itemshortcut_{$current_item_id}'); 
		// deleteChildNodes('itemshortcut_{$current_item_id}');
		//$param['attributes']['onclick'] = "SendForm('{$admin_forms_fields->GetWindowId()}', '{$admin_forms_fields->AAction}', '&action=load_data&admin_forms_id=12&information_system_id={$information_system_id}&information_groups_parent_id={$information_group_parent_id}', this, " . to_int($_REQUEST['admin_forms_id']) . ", 'load_data', " . to_int($admin_forms_fields->form_params['current_page']) . ", " . to_int($admin_forms_fields->form_params['on_page']) . " ); SlideWindow('move_items_group_{$current_item_id}'); return false;";
		
		$form_params['attributes']['onclick'] = "SendForm('{$admin_forms_fields->GetWindowId()}', '{$admin_forms_fields->AAction}', '&action=load_data&admin_forms_id=173&tags_group_parent_id={$tags_group_parent_id}', this, " . to_int($_REQUEST['admin_forms_id']) . ", 'load_data', " . to_int($admin_forms_fields->form_params['current_page']) . ", " . to_int($admin_forms_fields->form_params['on_page']) . " ); SlideWindow('$form_name'); return false;";
		$form_params['attributes']['type'] = 'button';
		$admin_forms_fields->AddButton($form_params); 

		// Для правильной работы фильтрации списка
		$admin_forms_fields->window_id = $form_name;

		// Отображение формы
		$admin_forms_fields->ShowForm();
		
		$form_content = ob_get_clean();
		?>
		<script>
		var oWindowId = '<?php echo $form_name?>';
		
		if (document.getElementById(oWindowId) == undefined)
		{
			// Создаем окно
			CreateWindow(oWindowId, '<?php echo $GLOBALS['MSG_tag']['move_tags_groups_title']; ?>', '750px', '140px', 1);

			var oWindow = $("#"+oWindowId);

			var ElementDiv = $('<div>').attr('id', "subdiv_small");
			$("#"+oWindowId).append(ElementDiv);
			
			var content = '<?php echo str_replace("script>", "sc' + 'ript>", str_replace("\r\n", '', str_replace("'", "\'", $form_content)))?>';
			insertContent(ElementDiv, content);
		}
		SlideWindow(oWindowId);
		
		</script>
		<?php
	}

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