<?php

// Получаем информацию о текущем пользователе
if (class_exists('SiteUsers'))
{
	$SiteUsers = & singleton('SiteUsers');
	$site_user_id = $SiteUsers->GetCurrentSiteUser();
}
else
{
	?>
	<h1>Модуль "Пользователи сайта" отключен!</h1>
	<?php
	return ;
}

$helpdesk = & singleton('helpdesk');

// Массив дополнительных параметров
$property = array();

$property['site_users_id'] = $site_user_id;

/* Фильтр по статусу тикетов */
if (isset($_GET['status']) && (to_int($_GET['status']) != -1))
{
	$property['status'] = to_int($_GET['status']);
}

/* Массив внешних параметров, передаваемых в XML */
$external_propertys = array();

// XSL шаблон для отображения списка сообщений тикета
$xsl_ticket = to_str($GLOBALS['LA']['xsl_ticket']);

// XSL шаблон для отображения службы техподдержки
$xsl_list = to_str($GLOBALS['LA']['xsl_helpdesk_list']);

// XSL шаблон для отображения режима работы службы техподдержки
$xsl_worktime = to_str($GLOBALS['LA']['xsl_worktime']);

// Выводим список сообщений тикета
if (isset($GLOBALS['HelpdeskResult']['ticket_id']))
{
	$ticket_id = to_int($GLOBALS['HelpdeskResult']['ticket_id']);

	// Получаем информацию о тикете
	$ticket_row = $helpdesk->GetTicket($ticket_id);

	if ($ticket_row)
	{
		// Тикет принадлежит пользователю
		if ($ticket_row['site_users_id'] != 0 && $ticket_row['site_users_id'] == $site_user_id)
		{
			// Добавление сообщения
			if (isset($_POST['sent_message']))
			{
				$helpdesk_ticket_email = $ticket_row['helpdesk_ticket_email'];
				$helpdesk_answer_sent = $ticket_row['helpdesk_ticket_sent_answer_for_message'];
				$helpdesk_ticket_is_open = $ticket_row['helpdesk_ticket_is_open'];

				// Проверяем, открыт ли тикет. Если закрыт, то сообщения не добавляем
				if ($helpdesk_ticket_is_open)
				{
					$param = array();

					$param['helpdesk_ticket_id'] = $ticket_id;
					$param['helpdesk_message_parent_id'] = to_int($_POST['parent_id']);
					$param['helpdesk_message_subject'] = htmlspecialchars(to_str($_POST['comment_subject']));
					$param['helpdesk_message_message'] = $helpdesk->ReFormat(to_str($_POST['comment_text']), 0);
					$param['helpdesk_message_grade'] = to_int($_POST['comment_grade']);
					$param['users_id'] = 0;
					$param['helpdesk_message_processed'] = 0;
					$param['helpdesk_message_inbox'] = 1;
					$param['helpdesk_message_type'] = 0;

					// Добавляем сообщение в БД
					if ($helpdesk_message_id = $helpdesk->InsertMessage($param))
					{
						// Пересчитываем дату ответа на тикет
						$helpdesk->RecountAnswerDateTime($param['helpdesk_ticket_id']);

						$helpdesk_row = $helpdesk->GetHelpdesk($ticket_row['helpdesk_id']);

						if ($helpdesk_row)
						{
							$helpdesk_notify_for_query = $helpdesk_row['helpdesk_notify_for_query'];
							$message_text_for_query = $helpdesk_row['helpdesk_report_for_query'];
							$message_subject_for_query = $helpdesk_row['helpdesk_report_for_query_subject'];
							$message_type = $helpdesk_row['helpdesk_message_type'];
						}
						else
						{
							$helpdesk_notify_for_query = 1;
							$message_type = 1;
						}

						// Нужно ли отправлять отчет о получении запроса
						if ($helpdesk_notify_for_query)
						{
							// Маска текста сообщения о получении запроса
							if (!isset($message_text_for_query))
							{
								$message_text_for_query = '';
							}

							// Тема отчета о получении запроса
							if (!isset($message_subject_for_query) || trim($message_subject_for_query) == '')
							{
								$message_subject_for_query = $GLOBALS['MSG_helpdesk']['template_report_for_query_subject'];
							}

							$message_text_for_query = $helpdesk->ReFormat($message_text_for_query, $message_type);

							$arr = array();
							$arr['helpdesk_message_id'] = $helpdesk_message_id;

							$message_text_for_query = $helpdesk->ReplaceMailMacro($message_text_for_query, $arr);
							$message_subject_for_query = $helpdesk->ReplaceMailMacro($message_subject_for_query, $arr);

							$param_email = array();

							// Отсылаем отчет
							$param_email['helpdesk_ticket_id'] = $param['helpdesk_ticket_id'];
							$param_email['email_to'] = $helpdesk_ticket_email;
							$param_email['helpdesk_message_subject'] = $message_subject_for_query;
							$param_email['helpdesk_message_message'] = $message_text_for_query;

							$helpdesk->SendMessage($param_email, $message_type);
						}
					}

					$external_propertys['error_message'] = 'Спасибо, сообщение отправлено!';

					if ($helpdesk_message_id)
					{
						$path = "./";
						$time = 5; // секунд

					?>
					<h1>Добавление сообщения</h1>
					<p>Сообщение успешно добавлено. Через <?php echo $time?> секунд Вы вернетесь к списку сообщений.</p>
					<p>Если Вы не хотите ждать, перейдите по <a href="<?php echo $path?>">ссылке</a>.</p>
					<script language="JavaScript" type="text/javascript">
					<!--
					function set_location()
					{
						location="<?php echo $path?>";
					}
					setTimeout('set_location()', <?php echo $time * 1000?>);
					//-->
					</script>
					<?php
					}

					// Если есть вложенные файлы, загружаем их
					if (isset($_FILES['attachment_1']['tmp_name']) && trim(to_str($_FILES['attachment_1']['tmp_name'])) != '')
					{
						// Загружаем файл
						// Информация о тикете
						$ticket_row = $helpdesk->GetTicket($ticket_id);

						if ($ticket_row)
						{
							$kernel = & singleton ('kernel');

							// Имя дирректории
							$uploaddir = CMS_FOLDER . UPLOADDIR . 'helpdesk_' . $ticket_row['helpdesk_id'] . '/attachments/ticket_' . $ticket_id;

							// Создаем директории
							// Проверяем, существует ли папка
							if (!is_dir($uploaddir))
							{
								// Если нет, создаем директорию
								if (@mkdir($uploaddir, CHMOD))
								{
									@chmod($uploaddir, CHMOD);
								}
							}

							$uploaddir .= '/message_' . $helpdesk_message_id;

							// Проверяем, существует ли папка
							if (!is_dir($uploaddir))
							{
								// Если нет, создаем директорию
								if (@mkdir($uploaddir, CHMOD))
								{
									@chmod($uploaddir, CHMOD);
								}
							}

$n = 0;
							// Формируем путь к создаваемым файлам
							foreach ($_FILES as $key => $val)
							{
								$n++;
								$param_files = array();

								if (isset($val['tmp_name']) && $val['size'])
								{
									// Определяем расширение файла
									$exp = strtolower($kernel->GetExtension($val['name']));

									// Полное имя файла
									$name = $n . '.' . $exp;
									$full_name = $uploaddir . '/' . $name;

									$param_files['use_big_image'] = false;
									$param_files['isset_big_image'] = true;

									// Путь к файлу-источнику;
									$param_files['path_source_big_image'] =  to_str($val['tmp_name']);

									// Оригинальное имя файла
									$param_files['original_file_name_big_image'] = to_str($val['name']);

									// Путь к создаваемому файлу;
									$param_files['path_target_big_image'] =  $full_name;

									// Записываем файл
									$result = $kernel->AdminLoadFiles($param_files);

									$array_attachment = array();

									$array_attachment['helpdesk_attachment_file_name'] = $val['name'];
									$array_attachment['helpdesk_attachment_file_path'] = $name;

									// Записываем информацию о вложениях в БД
									$helpdesk->InsertAttachments($helpdesk_message_id, $array_attachment);
								}
							}
						}
					}
				}
			}
			else
			{
				// Формируем XML для тикета
				$helpdesk->ShowTicket($ticket_id, $xsl_ticket, $property, $external_propertys);
			}
		}
		else
		{
			?>
			<h1>У Вас нет прав доступа к данному тикету!</h1>
			<?php
			return ;
		}
	}
	else
	{
		?>
		<h1>Тикет не найден.</h1>
		<?php
		return ;
	}
}
// Выводим список тикетов службы техподдержки или режим работы
else
{
	$helpdesk_id = to_int($GLOBALS['HelpdeskResult']['helpdesk_id']);

	// Выводим режим работы
	if (isset($GLOBALS['HelpdeskResult']['worktime']) && $GLOBALS['HelpdeskResult']['worktime'] == true)
	{
		// Отображаем режим работы
		$helpdesk->ShowWorktime($helpdesk_id, $xsl_worktime, $property, $external_propertys);
	}
	else
	{
		// Получаем информацию о службе техподдержки
		$helpdesk_row = $helpdesk->GetHelpdesk($helpdesk_id);

		if (!$helpdesk_row)
		{
			?>
			<h1>Служба техподдержки не найдена!</h1>
			<?php
			return ;
		}
		else
		{
			// Добавление нового тикета
			if (isset($_POST['add_ticket']))
			{
				$param = array();

				$param['users_id'] = 0;

				// уровень критичности тикета
				// получаем информацию об уровне критичности
				$critical_level_row = $helpdesk->GetCriticalLevel(to_int($_POST['critical_level_id']));

				if ($critical_level_row)
				{
					$param['helpdesk_critical_level_id'] = to_int($_POST['critical_level_id']);
				}
				else
				{
					// Уровень критичности тикета из настроек службы техподдержки
					$param['helpdesk_critical_level_id'] = $helpdesk_row['helpdesk_critical_level_id'];
				}

				$param['site_users_id'] = $site_user_id;
				$param['helpdesk_id'] = $helpdesk_id;

				// Сообщать об изменении статуса
				if (isset($_POST['notify_status_change']))
				{
					$param['helpdesk_ticket_notify_status_message_change'] = 1;
				}

				// Отправлять ответ
				if (isset($_POST['notify_answer']))
				{
					$param['helpdesk_ticket_sent_answer_for_message'] = 1;
				}

				// Открыт ли тикет
				$param['helpdesk_ticket_is_open'] = 1;

				// Источник тикета, 0 - сайт, 1 - E-mail
				$param['helpdesk_ticket_source'] = 0;

				// Получаем информацию о пользователе сайта
				$site_user_row = $SiteUsers->GetSiteUser($site_user_id);

				if ($site_user_row)
				{
					$param['helpdesk_ticket_email'] = $site_user_row['site_users_email'];
				}

				if (isset($_POST['ticket_category_id']) && to_int($_POST['ticket_category_id']) > 0)
				{
					$helpdesk_ticket_category_id = to_int($_POST['ticket_category_id']);

					// Получаем информацию о категории тикетов
					$ticket_category_row = $helpdesk->GetTicketCategory($helpdesk_ticket_category_id);

					if ($ticket_category_row)
					{
						$param['helpdesk_ticket_category_id'] = $helpdesk_ticket_category_id;
						$email_id = $ticket_category_row['helpdesk_email_id'];
					}
					else
					{
						$param['helpdesk_ticket_category_id'] = 0;
					}
				}

				// если не было указано категории (или указан для категории e-mail = 0),
				// чтобы определить обратный e-mail, определим его от тикета
				if (!isset($email_id) || !$email_id)
				{
					$email_id = $helpdesk_row['helpdesk_email_id'];
				}

				$param['helpdesk_email_id'] = $email_id;

				// Добавляем тикет
				$helpdesk_ticket_id = $helpdesk->InsertTicket($param);

				if ($helpdesk_ticket_id)
				{
					// Вставляем сообщение в БД
					$param['helpdesk_message_type'] = 0;
					$param['helpdesk_ticket_id'] = $helpdesk_ticket_id;
					$param['helpdesk_message_parent_id'] = 0;
					$param['helpdesk_message_subject'] = htmlspecialchars(to_str($_POST['subject']));
					$param['helpdesk_message_message'] = $helpdesk->ReFormat(to_str($_POST['text']), 0);
					$param['helpdesk_message_grade'] = 0;
					$param['users_id'] = 0;
					$param['helpdesk_message_processed'] = 0;
					$param['helpdesk_message_inbox'] = 1;
					$param['helpdesk_message_creation_datetime'] = $param['helpdesk_message_modification_datetime'] = date("d.m.Y H:i:s");

					// Создаем сообщение
					$helpdesk_message_id = $helpdesk->InsertMessage($param);
					
					// Пересчитываем дату ответа на тикет
					$helpdesk->RecountAnswerDateTime($helpdesk_ticket_id);

					if ($helpdesk_message_id)
					{
						$ticket_row = $helpdesk->GetTicket($helpdesk_ticket_id);

						if ($ticket_row)
						{
							$helpdesk_ticket_email = $ticket_row['helpdesk_ticket_email'];
							$helpdesk_answer_sent = $ticket_row['helpdesk_ticket_sent_answer_for_message'];

							$helpdesk_notify_for_query = $helpdesk_row['helpdesk_notify_for_query'];
							$message_text_for_query = $helpdesk_row['helpdesk_report_for_query'];
							$message_subject_for_query = $helpdesk_row['helpdesk_report_for_query_subject'];
							$message_type = $helpdesk_row['helpdesk_message_type'];

							// Нужно ли отправлять отчет о получении запроса
							if ($helpdesk_notify_for_query)
							{
								// Тема отчета о получении запроса
								if (trim($message_subject_for_query) == '')
								{
									$message_subject_for_query = $GLOBALS['MSG_helpdesk']['template_report_for_query_subject'];
								}

								$arr = array();
								$arr['helpdesk_message_id'] = $helpdesk_message_id;

								// Делаем письмо того формата, который указан в настройках службы техподдержки
								$message_text_for_query = $helpdesk->ReFormat($message_text_for_query, $message_type);

								// Делаем макроподстановки
								$message_text_for_query = $helpdesk->ReplaceMailMacro($message_text_for_query, $arr);
								$message_subject_for_query = $helpdesk->ReplaceMailMacro($message_subject_for_query, $arr);

								$param_email = array();

								// Отсылаем отчет
								$param_email['helpdesk_ticket_id'] = $helpdesk_ticket_id;
								$param_email['email_to'] = $helpdesk_ticket_email;
								$param_email['helpdesk_message_subject'] = $message_subject_for_query;
								$param_email['helpdesk_message_message'] = $message_text_for_query;

								$helpdesk->SendMessage($param_email, $message_type);
							}
						}

						// Если есть вложенные файлы, загружаем их
						if (isset($_FILES['attachment_1']['tmp_name']) && trim(to_str($_FILES['attachment_1']['tmp_name'])) != '')
						{
							// Загружаем файл
							// Информация о тикете
							$ticket_row = $helpdesk->GetTicket($helpdesk_ticket_id);

							if ($ticket_row)
							{
								$kernel = & singleton ('kernel');

								// Имя дирректории
								$uploaddir = CMS_FOLDER . UPLOADDIR . 'helpdesk_' . $ticket_row['helpdesk_id'] . '/attachments/ticket_' . $helpdesk_ticket_id;

								// Создаем директории
								// Проверяем, существует ли папка
								if (!is_dir($uploaddir))
								{
									// Если нет, создаем директорию
									if (@mkdir($uploaddir, CHMOD))
									{
										@chmod($uploaddir, CHMOD);
									}
								}

								$uploaddir .= '/message_' . $helpdesk_message_id;

								// Проверяем, существует ли папка
								if (!is_dir($uploaddir))
								{
									// Если нет, создаем директорию
									if (@mkdir($uploaddir, CHMOD))
									{
										@chmod($uploaddir, CHMOD);
									}
								}

$n = 0;
								// Формируем путь к создаваемым файлам
								foreach ($_FILES as $key => $val)
								{
									$param_files = array();
									$n++;

									if (isset($val['tmp_name']) && $val['size'])
									{
										// Определяем расширение файла
										$exp = strtolower($kernel->GetExtension($val['name']));
										// Полное имя файла
										$name = $n . '.' . $exp;
										$full_name = $uploaddir . '/' . $name;

										$param_files['use_big_image'] = false;
										$param_files['isset_big_image'] = true;

										// Путь к файлу-источнику;
										$param_files['path_source_big_image'] =  to_str($val['tmp_name']);

										// Оригинальное имя файла
										$param_files['original_file_name_big_image'] = to_str($val['name']);

										// Путь к создаваемому файлу;
										$param_files['path_target_big_image'] =  $full_name;

										// Записываем файл
										$result = $kernel->AdminLoadFiles($param_files);

										$array_attachment = array();

										$array_attachment['helpdesk_attachment_file_name'] = $val['name'];
										$array_attachment['helpdesk_attachment_file_path'] = $name;

										// Записываем информацию о вложениях в БД
										$helpdesk->InsertAttachments($helpdesk_message_id, $array_attachment);
									}
								}
							}
						}

						// Пересчитываем дату ответа на тикет
						$helpdesk->RecountAnswerDateTime($helpdesk_ticket_id);

						/* Автоответ на первое сообщение тикета */

						// Получаем информацию о сообщении
						$message_row = $helpdesk->GetMessage($helpdesk_message_id);

						if ($message_row)
						{
							$helpdesk_message_subject = $message_row['helpdesk_message_subject'];
							$helpdesk_message_message = $message_row['helpdesk_message_message'];

							// Только для первого сообщения тикета
							if ($message_row['helpdesk_message_number'] == 1)
							{
								// Анализируем текст сообщения для автоматического ответа
								$helpdesk_letter_template_id = $helpdesk->AnalizeForKeyWords($helpdesk_id, $helpdesk_message_subject . "\n\n" . $helpdesk_message_message);

								// Для автоматического ответа на сообщение подходит стандартный ответ
								// Формируем ответ на сообщение
								if ($helpdesk_letter_template_id)
								{
									$helpdesk->SentAutoAnswer($helpdesk_id, $helpdesk_letter_template_id, $helpdesk_message_id);
								}
							}
						}
					}

					$external_propertys['message'] = 'Спасибо, Ваш запрос принят!';

					$path = "./";
					$time = 5; // секунд

				?>
				<h1>Добавление запроса в службу техподдержки</h1>
				<p>Ваш запрос принят. Через <?php echo $time?> секунд Вы вернетесь к списку тикетов.</p>
				<p>Если Вы не хотите ждать, перейдите по <a href="<?php echo $path?>">ссылке</a>.</p>
				<script language="JavaScript" type="text/javascript">
				<!--
				function set_location()
				{
					location="<?php echo $path?>";
				}
				setTimeout('set_location()', <?php echo $time * 1000?>);
				//-->
				</script>
				<?php
				}
				else
				{
					$external_propertys['message'] = 'К сожалению, Ваш запрос не может быть принят.';
				}
			}
			else
			{
				// Закрытие/открытие тикета
				if ((isset($_REQUEST['close_ticket']) && to_int($_REQUEST['close_ticket']) > 0) || (isset($_REQUEST['open_ticket']) && to_int($_REQUEST['open_ticket']) > 0))
				{
					if (isset($_REQUEST['close_ticket']))
					{
						$ticket_id = to_int($_REQUEST['close_ticket']);
						$new_status = 0;
					}
					else 
					{
						$ticket_id = to_int($_REQUEST['open_ticket']);
						$new_status = 1;
					}

					// Получаем информацию о тикете
					$ticket_row = $helpdesk->GetTicket($ticket_id);

					if ($ticket_row)
					{
						$ticket_site_users_id = $ticket_row['site_users_id'];

						// Тикет принадлежит данному пользователю
						if ($ticket_site_users_id == $site_user_id && $ticket_site_users_id > 0)
						{
							// Закрываем/открываем тикет
							$helpdesk->TicketStatusChange($ticket_id, $new_status);
						}
					}
				}

				// Число элементов на страницу
				if (isset($GLOBALS['HelpdeskResult']['ticket_on_page']))
				{
					if ($GLOBALS['HelpdeskResult']['ticket_on_page'] !== true)
					{
						$property['ticket_on_page'] = to_int($GLOBALS['HelpdeskResult']['ticket_on_page']);
					}
				}
				else
				{
					$property['ticket_on_page'] = 10;
				}

				/* Номер тикета, с которого начинается показ */
				if (isset($GLOBALS['HelpdeskResult']['ticket_begin']))
				{
					$property['ticket_begin'] = to_int($GLOBALS['HelpdeskResult']['ticket_begin']);
				}
				else
				{
					$property['ticket_begin'] = 0;
				}

				/* Количество тикетов */
				if (isset($GLOBALS['HelpdeskResult']['ticket_count']))
				{
					$property['ticket_count'] = to_int($GLOBALS['HelpdeskResult']['ticket_count']);
				}

				// Отображаем службу техподдержки
				$helpdesk->ShowHelpdesk ($helpdesk_id, $xsl_list, $property, $external_propertys);
			}
		}
	}
}
?>