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

/**
 * MaxSite CMS
 * (c) http://max-3000.com/
 */



# функция автоподключения плагина
function admin_plugin_options_autoload($args = array())
{	
	mso_hook_add( 'admin_init', 'admin_plugin_options_admin_init');
	mso_create_allow('admin_plugin_options', t('Админ-доступ к редактированию опций плагинов'));
}

# функция выполняется при указаном хуке admin_init
function admin_plugin_options_admin_init($args = array()) 
{

	if ( mso_check_allow('admin_plugin_options') ) 
	{
		$this_plugin_url = 'plugin_options'; // url и hook
		
		# добавляем свой пункт в меню админки
		# первый параметр - группа в меню
		# второй - это действие/адрес в url - http://сайт/admin/demo
		#			можно использовать добавочный, например demo/edit = http://сайт/admin/demo/edit
		# Третий - название ссылки	
		# Четвертый - номер в меню
		
		// в меню не нужно
		// mso_admin_menu_add('plugins', $this_plugin_url, t('Опции плагинов'), 3);

		# прописываем для указаного admin_url_ + $this_plugin_url - (он будет в url) 
		# связанную функцию именно она будет вызываться, когда 
		# будет идти обращение по адресу http://сайт/admin/admin_plugin_options
		mso_admin_url_hook ($this_plugin_url, 'admin_plugin_options_admin');
	}
	
	return $args;
}

# функция вызываемая при хуке, указанном в mso_admin_url_hook
function admin_plugin_options_admin($args = array()) 
{
	if ( !mso_check_allow('admin_plugin_options') ) 
	{
		echo t('Доступ запрещен');
		return $args;
	}
	
	mso_hook_add_dinamic( 'mso_admin_header', ' return $args . "' . t('Настройка плагина') . '"; ' );
	mso_hook_add_dinamic( 'admin_title', ' return "' . t('Настройка плагина') . ' - " . $args; ' );
	
	if ($plugin = mso_segment(3))
	{
		if ( !file_exists(getinfo('plugins_dir') . $plugin . '/index.php') )
		{
			echo t('Плагин не найден.');
			return $args;
		}	
		
		if (!function_exists($plugin . '_mso_options'))
		{
			echo t('Для данного плагина настроек не предусмотрено.');
			return $args;
		}
		else 
		{
			$fn = $plugin . '_mso_options';
			$fn();
		}
	}
	else
	{
		echo t('Неверно указан плагин.');
	}
}

# ключ, тип, ключи массива
# функция проверяет входящий post
# если все ок, то вносит новые значения в опции
# если post нет, то выводит форму с текущими значениями опций
function mso_admin_plugin_options($key, $type, $ar, $title = '', $info = '', $text_other = '', $show_goto_plugins = false)
{
	if ($show_goto_plugins) echo '<p><a href="' . getinfo('site_admin_url') . 'plugins" class="i plugins">' . t('Плагины') . '</a></p>';
	
	if ($title)
		echo '<h1><a href="">' . $title . '</a></h1>';
	else
		echo '<h1><a href="">' . t('Опции плагина') . '</a></h1>';
	

	if ($info)
		echo '<p class="info">' . $info . '</p>';
	else
		echo '<p class="info">' . t('Укажите необходимые опции плагина.') . '</p>';
		
	
	if ($text_other) echo '<p>' . $text_other . '</p>';
	
	
	# тут получаем текущие опции
	$options = mso_get_option($key, $type, array() ); // получаем опции
	
	# здесь смотрим post
	# в post должен быть $key . '-' . $type
	if ( $post = mso_check_post(array('f_session_id', 'f_submit', $key . '-' . $type)) )
	{
		# защита рефера
		mso_checkreferer();
		
		# наши опции
		$in = $post[$key . '-' . $type];
		
		if (isset($in['_mso_checkboxs'])) // есть чекбоксы
		{
			$ch_names = array_keys($in['_mso_checkboxs']); // получили все чекбоксы
			$t = array(); // временный массив
			foreach($ch_names as $val) // проверим каждый чекбокс
			{
				if (isset($in[$val])) $t[$val] = '1'; // если есть, значит отмечен
			}
			
			$t = array_merge($in['_mso_checkboxs'], $t); // объединим с чекбоксамии
			unset($in['_mso_checkboxs']); // удалим _mso_checkboxs
			$in = array_merge($in, $t); // объединим с $in
			// теперь в $in все чекбоксы
		}
		
		# перед проверкой удалим из $ar все типы info
		$ar1 = $ar;
		foreach($ar1 as $m => $val)
			if ($val['type'] == 'info')	unset($ar1[$m]);
		
		# проверяем их с входящим $ar - ключи должны совпадать
		# финт ушами: смотрим разность ключей массивов - красиво?
		# если будет разность, значит неверные входящие данные, все рубим
		if (array_diff(array_keys($ar1), array_keys($in))) die('Error key. :-(');
		
		$newoptions = array_merge($options, $in); // объединим
		
		if ( $options != $newoptions ) 
		{
			mso_add_option($key, $newoptions, $type); // обновим
			$options = $newoptions; // сразу обновим переменную на новые опции
			mso_flush_cache(); // сбросим кэш
		}
		
		echo '<div class="update">' . t('Обновлено!') . '</div>';
	}
	
	if ($ar) // есть опции
	{
		# тут генерируем форму
		$form = '';
		
		foreach($ar as $m => $val)
		{
			if ($val['type'] == 'info')
			{
				
				if (isset($val['id'])) $tag_id = ' id="' . $val['id'] . '"';
					else $tag_id= '';
				
				if (isset($val['class'])) $tag_class = ' ' . $val['class'];
					else $tag_class= '';
				
				$form .= '<div class="admin_plugin_options_info' . $tag_class . '"' . $tag_id . '>'; 
				
				if (isset($val['title'])) $form .= '<h3>' . $val['title'] . '</h3>'; 
				if (isset($val['text'])) $form .= '<p>' . $val['text'] . '</p>'; 
				
				$form .= '</div>'; 
				
				continue;
			}
			
			if (!isset($options[$m])) $options[$m] = $val['default'];
			
			$group_start = (isset($val['group_start'])) ? $val['group_start'] : '';
			
			$group_end = (isset($val['group_end'])) ? $val['group_end'] : '';
		
			$attr = isset($val['attr']) ? ' ' .	$val['attr'] : '';
					
					
			/*
			// обрамление группы опций
			if (isset($val['group_start']))
			{
				if ($val['group_start']) $group_start = '<div class="admin_plugin_options">';
				else $group_start = '';
			}
			else $group_start = '<div class="admin_plugin_options">';
			
			if (isset($val['group_end']))
			{
				if ($val['group_end']) $group_end = '</div>';
				else $group_end = '<br>';
			}
			else $group_end = '</div>';
			
			*/
			
			if ($val['description']) $val['description'] = '<span class="hint-options">' . $val['description'] . '</span>';
			
			if ($val['type'] == 'text')
			{
				
				if (isset($val['itype'])) $itype = $val['itype'];
					else $itype = 'text';
				
				if ($itype == 'hidden')
				{
					$form .= $group_start . '<p><span>' 
							. $val['name'] . '</span>'
							. '<input type="' . $itype . '" value="'
							. htmlspecialchars($options[$m]) 
							. '" name="'
							. $key . '-' . $type . '[' . $m . ']'
							. '"' . $attr . '>' 
							. $val['description']
							. '</p>'
							. $group_end . NR;
				}
				else
				{
					$form .= $group_start . '<p><label><span>' 
							. $val['name'] . '</span>'
							. '<input type="' . $itype . '" value="'
							. htmlspecialchars($options[$m]) 
							. '" name="'
							. $key . '-' . $type . '[' . $m . ']'
							. '"' . $attr . '></label>' 
							. $val['description']
							. '</p>'
							. $group_end . NR;
				}
			}
			elseif ($val['type'] == 'textarea')
			{
				if (isset($val['rows'])) $rows = (int) $val['rows'];
				else $rows = 10;
				
				
				$form .= $group_start . '<p><label><span>' 
						. t($val['name']) . '</span>'
						. '<textarea rows="' . $rows . '" name="'
						. $key . '-' . $type . '[' . $m . ']'
						. '"' . $attr . '>'
						. htmlspecialchars($options[$m]) 
						. '</textarea></label>' 
						. $val['description']
						. '</p>'
						. $group_end . NR;
			}
			elseif ($val['type'] == 'checkbox')
			{
				$ch_val = $options[$m];
				
				if ($ch_val) $checked = 'checked="checked"';
					else $checked = '';
				
				$form .= $group_start  
						. '<p><label><input class="checkbox" type="checkbox" value="' . $ch_val . '"'
						. ' name="' . $key . '-' . $type . '[' . $m . ']' . '" ' . $checked . $attr . '> <span>'
						. $val['name']
						. '</span></label>' 
						. $val['description']
						. '</p>'
						. $group_end . NR;
				
				# поскольку не отмеченные чекбоксы не передаются в POST, сделаем массив чекбоксов в hidden
				$form .= '<input type="hidden" name="' . $key . '-' . $type . '[_mso_checkboxs][' . $m . ']" value="0">';	
						
			}
			elseif ($val['type'] == 'select')
			{
				$form .= $group_start . '<p><label><span>' 
						. $val['name'] . '</span>'
						. '<select name="'
						. $key . '-' . $type . '[' . $m . ']'
						. '"' . $attr . '>';
				
				// если есть values, то выводим - правила задания, как в ini-файлах
				if (isset($val['values']))
				{
					$values = explode('#', $val['values']);
					foreach( $values as $v ) 
					{
						$v = trim($v);
						$v_t = $v;
						
						$ar = explode('||', $v);
						if (isset($ar[0])) $v = trim($ar[0]);
						if (isset($ar[1])) $v_t = trim($ar[1]);
						
						if (htmlspecialchars($options[$m]) == $v) $checked = 'selected="selected"';
							else $checked = '';
						$form .= NR . '<option value="' . $v . '" ' . $checked . '>' . $v_t . '</option>';
					}
				}
				$form .= '</select></label>' 
						. $val['description']
						. '</p>'
						. $group_end . NR;
			}
			elseif ($val['type'] == 'radio')
			{
				$form .= $group_start . '<p><span>' 
						. $val['name']
						. '</span></p><p>';
						
				if ( !isset($val['delimer']) ) $delimer = '<br>';
					else $delimer = stripslashes($val['delimer']);
							
				// если есть values, то выводим - правила задания, как в ini-файлах
				if (isset($val['values']))
				{
					$values = explode('#', $val['values']);
					foreach( $values as $v ) 
					{
						$v = trim($v);
						$v_t = $v;
						
						$ar = explode('||', $v);
						if (isset($ar[0])) $v = trim($ar[0]);
						if (isset($ar[1])) $v_t = trim($ar[1]);
						
						if (htmlspecialchars($options[$m]) == $v) $checked = 'checked="checked"';
							else $checked = '';
						
						$form .= NR . '<label><input type="radio" value="' . $v . '" ' . $checked . ' name="' . $key . '-' . $type . '[' . $m . ']' . '"' . $attr . '> ' . $v_t . '</label>' . $delimer;
					}
				}
				
				$form .= $val['description'] . '</p><hr>'. $group_end . NR;
			}
		}
		
		
		# выводим форму
		echo NR . '<form method="post" class="mso_admin_plugin_options">' . mso_form_session('f_session_id');
		echo $form;
		echo NR . '<button type="submit" name="f_submit" class="button i-save">' . t('Сохранить') . '</button>';
		echo '</form>' . NR;
	}
	else
	{
		echo t('<p>Опции не определены.</p>') . NR;
	}
	
}

# end of file