<?php if (!defined('BASEPATH')) exit('No direct script access allowed'); 

$content_file = '';
$file_path = '';
$curfile = '';

$AJAX1 = getinfo('ajax') . base64_encode('admin/plugins/editor_files/load-file-ajax.php');
$AJAX2 = getinfo('ajax') . base64_encode('admin/plugins/editor_files/save-file-ajax.php');
$A_LINK = getinfo('site_admin_url') .'editor_files/';

$t1 = t('Файл загружен!');
$t2 = t('Текущий файл: ');


$directory = getinfo('template_dir');
$directory = str_replace('\\', '/', $directory);

$r = new RecursiveDirectoryIterator($directory);

$files = _getFiles($r, 0, $directory);

// кнопка Сохранить должна быть только если загружен файл, в остальнйх случаях скрываем
$button_show = "$('#b-save').fadeOut(0);";

// в третьем сегменте можно указать адрес файла в base64
if (mso_segment(3)) 
{
	$f = htmlentities(base64_decode(mso_segment(3)));
	
	if ($f)
	{
		$f = str_replace('~', '-', $f);
		$f = str_replace('\\', '-', $f);
		
		// $ff = getinfo('template_dir') . $f;
		$ff = mso_check_dir_file(getinfo('template_dir'), $f);
        
		// есть такой файл
		if ($ff and file_exists($ff)) 
		{
			$curfile = $t2 . '<b>' . $f . '</b>';
			$content_file = file_get_contents($ff);
			$file_path = mso_segment(3);
			$button_show = '';
		}
	}
}


$select = '<option value="" selected>-</option>';

foreach ($files as $file)
{
	if (strpos($file, 'optgroup') === false)
	{
		$opt_selected = (mso_segment(3) and base64_encode($file) === mso_segment(3)) ? ' selected' : '';
		
		$select .= '<option value="' . base64_encode($file) . '"' . $opt_selected . '>' . $file . '</option>';
	}
	else
	{
		$select .= $file;
	}
}

?>

<h1><?= t('Файлы шаблона') . ' «' . getinfo('template') . '»' ?></h1>

<div class="flex flex-vcenter">
	<div class="flex-grow0 pad5-r"><?= t('Файл:') ?></div>
	<div class="flex-grow3"> <select id="select_file" class="w100"><?= $select ?></select></div>
	
	<?php
		// если есть custom/my-editor-files.php (в нём только <option>), то подключаем его
		if ($f1 = mso_fe('custom/my-editor-files.php')) 
		{
			echo '<div class="flex-grow0 pad5-rl">' . t('или') . '</div><div class="flex-grow3"><select id="select_file1" class="w100">';
			require($f1);
			echo '</select></div>';
		}
	?>
</div>

<div class="t90 mar10-t"><span id="curfile"><?= $curfile ?></span></div>
<div id="success"></div>

<?php

echo '<form class="mar10-t" method="post" id="edit_form"><textarea name="content" id="content" class="w100 h500px bg-gray50">' . $content_file . '</textarea><input type="hidden" id="file_path" name="file_path" value="' . $file_path . '"><p><button id="b-save" class="button i-save" type="submit">Сохранить</button></p></form>';

echo <<<EOF
<script>
$(document).ready(function() {
	
	{$button_show}
	
	$('#select_file, #select_file1').change(function(){
		
		var f = $("option:selected", this).val();
		
		if (f)
		{			
			$('#success').hide();
			
			$.post("{$AJAX1}", {file:f},  function(response) {
				$('#file_path').val(f);
				$('#content').val(response);
				$('#success').html('<div class="update pos-fixed w200px pad10 pos20-r pos0-t t-center">{$t1}</div>');
				$('#success').show();
				$('#success').fadeOut(5000);
			});
			
			$('#curfile').html('{$t2} <a class="bold" href="{$A_LINK}' + f + '">' + $("option:selected", this).text() + '</a>');
			$('#b-save').fadeIn(500);
		}
	})
	
	$('#edit_form').submit(function(){
		$.post("{$AJAX2}", $("#edit_form").serialize(),  function(response) {
			$('#success').html(response);
			$('#success').show();
			$('#success').fadeOut(5000);
			$('#b-save').fadeIn(500);
		});
		
		return false;
	})
});
</script>
EOF;



function _getFiles($rdi, $depth = 0, $dir = '') 
{
	$out = array();
	
	if (!is_object($rdi)) return $out;

	for ($rdi->rewind(); $rdi->valid(); $rdi->next()) 
	{
		if ($rdi->isDot()) continue;

		if ($rdi->isDir() || $rdi->isFile()) 
		{
			$cur = $rdi->current();
			$cur = str_replace('\\', '/', $cur);
			if (_is_exclude($cur)) continue;
			
			$cur = str_replace($dir, '', $cur);
			
			if ($rdi->isDir()) 
			{
				if ($depth == 0) 
				{
					$out[] = '<optgroup class="bg-gray100" label="' . $cur . '"></optgroup>';
				}
			}
			
			if ($rdi->isFile())
			{
				$file_ext = strtolower(str_replace('.', '', strrchr($cur, '.')));

				// php', 'txt', 'css', 'less', 'js', 'html', 'htm', 'ini', 'sass', 'scss'
				if (in_array($file_ext, array('php', 'txt', 'css', 'js', 'html', 'htm', 'ini'))) 
				{
					$pn = $rdi->getPathname();
					if (is_writable($pn)) $out[] = $cur;
				}
			}
			
			if ($rdi->hasChildren())
			{
				$out1 = _getFiles($rdi->getChildren(), 1 + $depth, $dir);
				$out = array_merge($out, $out1); 
			}
		}
	}
	 
	return $out;
}

// проверка части вхождения каждого элемента массива $a в строку $str
// если вхождение есть, то отдаем true если нет, то false 
function _is_exclude($str)
{
	// исключаемые из списка элементы задаются в custom/set_val_admin.php
	// mso_set_val('editor_files_exclude', array('/node_modules/'));
	
	$a = mso_get_val('editor_files_exclude', array());
	
	foreach ($a as $find)
	{
		if (stripos($str, $find) !== false) return true; // найдено вхождение
	}
	
	return false;
}

# end of file