<?php
/**
 * Система управления сайтом HostCMS v. 5.xx
 * Copyright © 2005-2010 ООО "Хостмэйк" (Hostmake LLC), http://www.hostcms.ru
 *
 * Ajax загрузчик для файлового менеджера.
 *
 * Файл: /admin/wysiwyg/fm/action/load_file_manager.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']['all'] = array('begin' => $begin, 'count' => $on_page);

	$kernel = & singleton('kernel');
	
	$Files = new File();

	// Получаем данные о корневом пути для группы, в которой размещен текущий пользователь
	$UserAccess = new user_access();
	$user_row = $UserAccess->GetUserByName($_SESSION['valid_user']);

	if ($user_row)
	{
		$users_type_row = $UserAccess->GetUserType($user_row['users_type_id']);

		// Текущая папка, в которой находимся
		$users_type_root_dir = $Files->PathCorrection($users_type_row['users_type_root_dir']);

		if (trim($users_type_root_dir) == '')
		{
			$users_type_root_dir = DIRECTORY_SEPARATOR;
		}

		// Удаляем первый слэш в $users_type_root_dir (путь - только относительный от CMS_FOLDER)
		$users_type_root_dir = (mb_substr($users_type_root_dir, 0, 1) == DIRECTORY_SEPARATOR && mb_strlen($users_type_root_dir) > 1)
		? mb_substr($users_type_root_dir, 1, mb_strlen($users_type_root_dir) - 1)
		: $users_type_root_dir;
	}
	else
	{
		ob_start();
		show_error_message($GLOBALS['MSG_wysiwyg_fm']['fm_user_not_find_message']);

		$error = ob_get_clean();

		// Отправляем только сообщение о произведенных действиях
		$GLOBALS['_RESULT'] = array(
		'error' => $error,
		'form_html' => '',
		'title' => '');

		echo $JsHttpRequest->LOADER;
		exit();
	}

	// Обрабатываем путь к директории
	$current_dir = cdir_correction(trim(to_str($_REQUEST['cdir'])));

	// Строка пути НЕ начинается относительно корневого пути
	// или корневой путь DIRECTORY_SEPARATOR - пропускаем
	if (mb_strpos($current_dir, $users_type_root_dir) !== 0 && $users_type_root_dir != DIRECTORY_SEPARATOR)
	{
		$current_dir = $users_type_root_dir;
					
		if (!isset($_REQUEST['JsHttpRequest']))
		{
			show_error_message($GLOBALS['MSG_wysiwyg_fm']['fm_user_access_denide_dir']);
		}
		else
		{
			ob_start();
			show_error_message($GLOBALS['MSG_wysiwyg_fm']['fm_user_access_denide_dir']);

			$error = ob_get_clean();

			// Отправляем только сообщение о произведенных действиях
			$GLOBALS['_RESULT'] = array(
			'error' => $error,
			'form_html' => '',
			'title' => '');

			echo $JsHttpRequest->LOADER;
			exit();
		}
	}

	if ($current_dir == DIRECTORY_SEPARATOR)
	{
		$path = CMS_FOLDER;
	}
	else
	{
		$path = CMS_FOLDER . $current_dir;
	}

	// Директория не существует
	if (!is_dir($path))
	{
		show_error_message(sprintf($GLOBALS['MSG_wysiwyg_fm']['fm_dir_not_isset'], $current_dir));

		$current_dir = $users_type_root_dir;
		// Заменяем путь на путь по умочланию
		$path = CMS_FOLDER . $users_type_root_dir;
	}

	// Строим "хлебные крошки"
	$new_path_array[] = array (
	'link' => $admin_forms->GetHtmlCallDoLoadAjax('/admin/wysiwyg/fm/fm.php', '&cdir=', 130, 'load_data'),
	'onclick' => $admin_forms->GetOnClickCallDoLoadAjax('/admin/wysiwyg/fm/fm.php', '&cdir=', 130, 'load_data'),
	'name' => $GLOBALS['MSG_wysiwyg_fm']['fm_path_root']);

	// Находимся не в корне
	if (trim($current_dir) != DIRECTORY_SEPARATOR)
	{
		$mas_path = explode(DIRECTORY_SEPARATOR, $current_dir);

		$path_segment = '';
		foreach ($mas_path as $key => $value)
		{
			if ($value != '')
			{
				$path_segment .= DIRECTORY_SEPARATOR . $value;
				$new_path_array[] = array (
				'link' => $admin_forms->GetHtmlCallDoLoadAjax('/admin/wysiwyg/fm/fm.php', '&cdir='.rawurlencode($path_segment. DIRECTORY_SEPARATOR), 130, 'load_data'),
				'onclick' => $admin_forms->GetOnClickCallDoLoadAjax('/admin/wysiwyg/fm/fm.php', '&cdir='.rawurlencode($path_segment. DIRECTORY_SEPARATOR), 130, 'load_data'),
				'name' => $value);
			}
		}
	}

	$param['path_array'] = $new_path_array;

	// Разделитель при отображении
	$param['path_separator'] = ' / ';

	$mas_dir = array();
	$mas_file = array();

	if (is_dir($path) && !is_link($path))
	{
		if ($dh = opendir($path))
		{
			$i = 0;

			// Читаем файлы и каталоги из данного каталога
			while (($file = readdir($dh)) !== false)
			{
				if ($file != '.' && $file != '..')
				{
					// создаем массив каталогов
					if (file_exists($path . $file) && filetype($path . $file) == "dir")
					{
						$mas_date = stat($path . $file);
						$mas_dir[$i][0] = $kernel->Windows1251ToUtf8($file); // имя файла или директории
						$mas_dir[$i][1] = 'dir'; // [i][1]- файл или каталог
						$mas_dir[$i][2] = '<DIR>'; // [i][2]- размер в байтах
						// Обрабатываем в ф-и обратного вызова, т.к. сортировка ведется по временной метке
						$mas_dir[$i][3] = $mas_date[9];
					}
					elseif (file_exists($path . $file)) // создаем массив файлов
					{
						$mas_date = stat($path . $file);
						$mas_file[$i][0] = $kernel->Windows1251ToUtf8($file);
						$mas_file[$i][1] = 'file';
						$mas_file[$i][2] = number_format($mas_date['size'], 0, '.', ' ');
						// Обрабатываем в ф-и обратного вызова, т.к. сортировка ведется по временной метке
						$mas_file[$i][3] = $mas_date[9];
					}
					$i++;
				}
			}

			closedir($dh);

			array_multisort($mas_dir);

			if (isset($mas_file))
			{
				array_multisort($mas_file);
			}
		}
	}

	$count_dir = count($mas_dir);

	foreach ($mas_dir as $key => $value)
	{
		$param['data'][0][] = array('file_image' =>'',
		'file_name' => $value[0],
		'file_hash_name' => sha1($value[0]),
		'file_date' => $value[3],
		'file_size' => $value[2],
		'currentdir' => $current_dir,
		'file_attributes' => $Files->get_file_perms($kernel->Utf8ToWindows1251($path.$value[0]), 1));
	}

	$param['total_count'][0] = $count_dir;

	$count_files = count($mas_file);

	foreach ($mas_file as $key => $value)
	{
		$param['data'][1][] = array('file_image' =>'',
		'file_name' => $value[0],
		'file_hash_name' => sha1($value[0]),
		'file_date' => $value[3],
		'file_size' => $value[2],
		'currentdir' => $current_dir,
		'file_attributes' =>$Files->get_file_perms($kernel->Utf8ToWindows1251($path.$value[0]), 1));
	}

	$param['total_count'][1] = $count_files;
	$param['current_page'] = $page;
	$param['on_page'] = $on_page;

	// Заголовок формы
	$param['title'] = $GLOBALS['MSG_wysiwyg_fm']['fm_title'];

	$param['field_params'][0]['file_image']['callback_function'] = 'callback_function_file_image';
	$param['field_params'][0]['file_name']['callback_function'] = 'callback_function_file_name';

	$param['field_params'][1]['file_image']['callback_function'] = 'callback_function_file_image';
	$param['field_params'][1]['file_name']['callback_function'] = 'callback_function_file_name';
	$param['field_params'][0]['file_checked']['callback_function'] = 'callback_function_file_checked';
	$param['field_params'][1]['file_checked']['callback_function'] = 'callback_function_file_checked';

	$param['field_params'][0]['file_date']['callback_function'] = 'callback_function_file_date';
	$param['field_params'][1]['file_date']['callback_function'] = 'callback_function_file_date';
	
	// Функция обратного вызова для отображениия изображений файлов и директорий
	function callback_function_file_image($field_value, $value, $row)
	{
		$kernel = & singleton('kernel');

		// Файл
		if ($row['file_size'] != '<DIR>')
		{
			// Ассоциированные иконки
			$icon_array = $kernel->icon_array;

			// Определяем иконку файла
			$ext = mb_strtolower($kernel->GetExtension($row['file_name']));

			if (isset($icon_array[$ext]))
			{
				$icon_file = "/admin/images/icons/".to_str($icon_array[$ext]);
			}
			else
			{
				$icon_file = "/admin/images/icons/file.gif";
			}
		}
		else // Директория
		{
			switch ($row['file_name'])
			{
				case '..': // Корень
					{
						$icon_file = "/admin/images/top_point.gif";
						break;
					}

				default:
					{
						$icon_file = "/admin/images/folder.gif";
						break;
					}
			}
		}
		?> <img src="<?php echo $icon_file?>" /> <?php
	}

	// Функция обратного вызова для преобразования имен директорий в ссылки
	function callback_function_file_name($field_value, $value, $row)
	{
		$kernel = & singleton('kernel');

		$oFile = & singleton('File');

		$admin_forms = & singleton('admin_forms');

		// Файл
		if ($row['file_size'] != '<DIR>')
		{
			echo $row['file_name'];
		}
		else // Директория
		{
			$current_dir = $row['currentdir'];

			// Текущая папка, в которой находимся
			if (empty($current_dir))
			{
				$UserAccess = new user_access();
				$user_row = $UserAccess->GetUserByName($_SESSION['valid_user']);

				if ($user_row)
				{
					$users_type_row = $UserAccess->GetUserType($user_row['users_type_id']);

					// Текущая папка, в которой находимся
					$users_type_root_dir = $oFile->PathCorrection($users_type_row['users_type_root_dir']);

					// Удаляем первый слэш в $users_type_root_dir (путь - только относительный от CMS_FOLDER)
					$users_type_root_dir = (mb_substr($users_type_root_dir, 0, 1) == DIRECTORY_SEPARATOR && mb_strlen($users_type_root_dir) > 1)
					? mb_substr($users_type_root_dir, 1, mb_strlen($users_type_root_dir) - 1)
					: $users_type_root_dir;
				}

				// Положим равной корневой для группы
				$current_dir = $users_type_root_dir;
			}

			switch ($row['file_name'])
			{
				case '..': // Выход на уровень вверх
					{
						// путь к верхней папке (вызывать именно здесь, т.к. выше при создании папки, например, меняется $curent_dir)
						$segments = explode (DIRECTORY_SEPARATOR, $current_dir);

						// Число элементов, которые надо собрать, за исключением последнего элемента и пустого элемента после DIRECTORY_SEPARATOR
						$count_dir = count($segments)-2;

						$top_dir = '';

						for ($i = 0; $i < $count_dir; $i++)
						{
							$top_dir .= $segments[$i] . DIRECTORY_SEPARATOR;
						}

						?>
<a
	href="<?php echo $admin_forms->GetHtmlCallDoLoadAjax('/admin/wysiwyg/fm/fm.php', '&cdir=' . rawurlencode($top_dir), 130, 'load_data')?>"
	onclick="<?php echo $admin_forms->GetOnClickCallDoLoadAjax('/admin/wysiwyg/fm/fm.php', '&cdir=' . rawurlencode($top_dir), 130, 'load_data')?>">[
						<?php echo $row['file_name']?> ]</a>
						<?php
						break;
					}

default:
	{
		?>
<a
	href="<?php echo $admin_forms->GetHtmlCallDoLoadAjax('/admin/wysiwyg/fm/fm.php', '&cdir=' . rawurlencode($current_dir . $row['file_name'] . DIRECTORY_SEPARATOR), 130, 'load_data')?>"
	onclick="<?php echo $admin_forms->GetOnClickCallDoLoadAjax('/admin/wysiwyg/fm/fm.php', '&cdir=' . rawurlencode($current_dir . $row['file_name'] . DIRECTORY_SEPARATOR), 130, 'load_data')?>">[<?php echo $row['file_name']?>]</a>
		<?php
		break;
	}
			}

		}
	}

	// Функция обратного вызова для отображениия даты, дата обрабатывается здесь, т.к. сортировка
	// ведется по временной метке
	function callback_function_file_date($field_value, $value, $row)
	{
		echo date('d.m.Y H:i', $value);
	}

	// Функция обратного вызова для отображения пиктограммы со ссылкой для скачивания файлов
	function callback_function_file_checked($field_value, $value, $row)
	{
		$kernel = & singleton('kernel');

		$oFile = & singleton('File');

		// Файл
		if ($row['file_size'] != '<DIR>')
		{
			// Т.к. пути для вставки в поле разделяются /
			$row['currentdir'] = str_replace('\\', '/', $row['currentdir']);
			
			$current_dir = $row['currentdir'] != '/'
				? '/' . $row['currentdir']
				: $row['currentdir'];
			
			?><a href="javascript:void(0)" onclick="insertURL('<?php echo $current_dir. to_str($row['file_name'])?>');"><img
	src="/admin/images/apply.gif" /></a><?php
		}
		else // Директория
		{
			echo '';
		}
	}

	$admin_forms_fields = & singleton('admin_forms_fields');
	
	ob_start();
	?>

<form
	action="/admin/wysiwyg/fm/fm.php?cdir=<?php echo rawurlencode($current_dir)?>"
	method="post" enctype="multipart/form-data" id="form_load_file_id">
	<div class="load_file">
		<div class="input_field">
			<?php echo $GLOBALS['MSG_wysiwyg_fm']['fm_form_file'];?>
			<INPUT NAME="file" TYPE="file" size="39" />
		</div>
		<div class="input_button">
			<input name="load_file"
			value="<?php echo $GLOBALS['MSG_wysiwyg_fm']['fm_form_file_button'];?>"
			onclick="return SendForm('<?php echo $admin_forms_fields->GetWindowId()?>', '/admin/wysiwyg/fm/fm.php', '', this, 130)"
			type="submit" />
		</div>
	</div>
</form>

<form
	action="/admin/wysiwyg/fm/fm.php?cdir=<?php echo rawurlencode($current_dir)?>"
	method="post" enctype="multipart/form-data" id="form_create_dir_id">
	<div class="load_file">
		<div class="input_field">
			<?php echo $GLOBALS['MSG_wysiwyg_fm']['fm_form_dir'];?>
			<input name="dir" type="text" value="" size=38> 
			<INPUT	NAME="dir_mode" TYPE="text" size="7" value="0<?php echo decoct(CHMOD)?>"/>
		</div>
		<div class="input_button">
			<input name="create_dir"
			value="<?php echo $GLOBALS['MSG_wysiwyg_fm']['fm_form_dir_button'];?>"
			onclick="return SendForm('<?php echo $admin_forms_fields->GetWindowId()?>', '/admin/wysiwyg/fm/fm.php', '', this, 130)"
			type="submit" />
		</div>
	</div>
</form>
	<?php
	$load_files_form_content = ob_get_clean();

	$admin_forms->data_under_menu = $load_files_form_content;

	return $param;
}


// Удаление директорий и файлов
function delete_file(&$param)
{
	ob_start();

	$kernel = & singleton('kernel');

	if (defined('READ_ONLY') && READ_ONLY)
	{
		$kernel->ReadMode();
	}
	else
	{
		// Удаление файлов
		if (isset($param['data'][0]) && $param['data'][0])
		{
			$File = new File();
	
			$flag_delete_dir_success = true;

			$count_deleted_dirs = 0;

			$current_dir = cdir_correction(to_str($_REQUEST['cdir']));

			// Получаем список файлов в текущей директории
			$handle = opendir(CMS_FOLDER . $current_dir);

			foreach ($param['data'][0] as $key => $value)
			{
				// Сбрасываем на начало директории
				rewinddir($handle);

				// Просматриваем директорию и удаляем файл с указанным хэшем
				while ($file = readdir($handle))
				{
					if ($file == '.' || $file == '..')
					{
						continue;
					}

					$file_utf8 = $kernel->Windows1251ToUtf8($file);
					
					// Хэш совпал, удаляем директорию
					if (sha1($file_utf8) == $key)
					{
						if (!$File->DeleteDir(CMS_FOLDER . $current_dir . $file . DIRECTORY_SEPARATOR))
						{
							$flag_delete_dir_success = false;
						}
						else
						{
							$count_deleted_dirs++;
						}
					}
				}
			}

			if ($flag_delete_dir_success)
			{
				if ($count_deleted_dirs == 1)
				{
					show_message($GLOBALS['MSG_wysiwyg_fm']['fm_delete_dir_message']);
				}
				else
				{
					show_message($GLOBALS['MSG_wysiwyg_fm']['fm_delete_dirs_message']);
				}
			}
			else // Ошибка при удалении файлов
			{
				show_error_message($GLOBALS['MSG_wysiwyg_fm']['fm_del_dir_error']);
			}
		}

		// Удаление файлов
		if (isset($param['data'][1]) && $param['data'][1])
		{
			$flag_delete_file_success = true;

			$count_deleted_files = 0;

			$current_dir = cdir_correction(to_str($_REQUEST['cdir']));

			// Получаем список файлов в текущей директории
			$handle = opendir(CMS_FOLDER . $current_dir);

			foreach ($param['data'][1] as $key => $value)
			{
				// Сбрасываем на начало директории
				rewinddir($handle);

				// Просматриваем директорию и удаляем файл с указанным хэшем
				while ($file = readdir($handle))
				{
					if ($file == '.' || $file == '..')
					{
						continue;
					}

					$file_utf8 = $kernel->Windows1251ToUtf8($file);
					
					// Хэш совпал, удаляем файл
					if (sha1($file_utf8) == $key)
					{
						$file_path = CMS_FOLDER . $current_dir . $file;

						if (file_exists($file_path) && @unlink($file_path))
						{
							$count_deleted_files++;
						}
						else
						{
							$flag_delete_file_success = false;
						}
					}
				}
			}

			if ($flag_delete_file_success)
			{
				if ($count_deleted_files == 1)
				{
					show_message($GLOBALS['MSG_wysiwyg_fm']['fm_delete_file_message']);
				}
				elseif ($count_deleted_files > 1)
				{
					show_message($GLOBALS['MSG_wysiwyg_fm']['fm_delete_files_message']);
				}
			}
			else // Ошибка при удалении файлов
			{
				show_error_message($GLOBALS['MSG_wysiwyg_fm']['fm_delete_file_error']);
			}
		}
	}

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

// Редактирование файла.
function edit_file(&$param)
{
	ob_start();

	if (defined('READ_ONLY') && READ_ONLY)
	{
		$kernel = & singleton('kernel');
		$kernel->ReadMode();
	}
	else
	{
		$kernel = & singleton('kernel');
			
		if (isset($param['data']))
		{
			// Редактирование документа.
			if (isset($param['data'][1]))
			{
				$current_dir = cdir_correction(to_str($_REQUEST['cdir']));

				// Получаем список файлов в текущей директории
				$handle = opendir(CMS_FOLDER . $current_dir);

				foreach ($param['data'][1] as $key => $value)
				{
					// Сбрасываем на начало директории
					rewinddir($handle);

					// Просматриваем директорию и удаляем файл с указанным хэшем
					while ($file = readdir($handle))
					{
						if ($file == '.' || $file == '..')
						{
							continue;
						}

						$file_utf8 = $kernel->Windows1251ToUtf8($file);
						
						// Хэш совпал, удаляем директорию
						if (sha1($file_utf8) == $key)
						{
							$file_path = CMS_FOLDER . $current_dir . $file;
							include(CMS_FOLDER . 'admin/wysiwyg/fm/action/edit_file_form.php');

							$param['title'] = sprintf($GLOBALS['MSG_wysiwyg_fm']['fm_edit_file_form_title'], basename($file_path));
							break;
						}
					}
				}
			}
		}
	}

	$param['result'] = ob_get_clean();
	return true;
}
