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

/**
 * MaxSite CMS
 * (c) http://max-3000.com/
 */
 
/*
	Версия 31 января 2009 г.
	
	в текущем варианте API поддерживается только формат text. Варианты для xml и html будут потом. Когда-нибудь...
	
	
	+ Hello : возвращает Hello!
	+ addTwoNumbers : сложение двух чисел
		
	+ getGeneralInfo : общая информация о сайте
		
	-() getUsersBlogs : список всех авторов блога
	-() getUserInfo : информация о авторе
		
	+ newPost : новый пост
	+ setPost : создать или заменить/редактировать пост
	+ getRecentPostTitles : получить список всех постов (без текстов)
	+ getPost : получить текст поста
	- deletePost : удалить пост
		
	+ getCategoryList : рубрики
	- newCategory : создать рубрику
	- setCategory : заменить/редактировать рубрику
	- deleteCategory : удалить рубрику
	
	+ getTags : все метки
		
	- getFileNameUploads : список уже загруженных файлов
	- newMediaObject : загрузить файл
	- deleteMediaObject : удалить файл
 */ 

################################################################################
#
# начальная функция удаленного постинга
#
################################################################################

function mso_remote_post()
{
	# каждый запрос должен содержать логин, пароль, ключ безопасности, имя функции и её аргументы
	if ( $post = mso_check_post(array('remote_login', 'remote_password', 'remote_key', 'remote_function')) )
	{
		//pr($post);
		$post = _mso_trim_array($post);
		//pr($post);
		$remote_login = $post['remote_login'];
		$remote_password = $post['remote_password'];
		$remote_key = $post['remote_key'];

		$CI = & get_instance();
		
		# всегда проверяем логин и пароль
		
		$CI->db->from('users'); # таблица users
		$CI->db->select('users_id');
		$CI->db->limit(1); # одно значение
		$CI->db->where( array('users_login'=>$remote_login, 
							  'users_password'=>mso_md5($remote_password)) );
		
		$query = $CI->db->get();
		if ($query->num_rows() == 0) # нет такого - возможно взлом
		{
			echo 'MaxSite CMS REMOTE (http://max-3000.com/)ERROR: Login/password incorrect';
			return false;
		}
		else
		{
			if ( $remote_key != getinfo('remote_key') )
			{
				echo 'MaxSite CMS REMOTE (http://max-3000.com/)ERROR: Remote key incorrect';
				return false;
			}
			
			// вход корректный, добавим в $post данные юзера
			$r = $query->result_array();
			$post['remote_users_id'] = $r[0]['users_id'];
			$post['remote_users_login'] = $remote_login;
			$post['remote_users_password'] = mso_md5($remote_password);
		}
		
		
		
		# получаем имя функции
		$remote_function = $post['remote_function'];
		
		# формат вывода - для некоторых функций
		# есть только text, xml и html
		if (!isset($post['remote_format_out'])) $post['remote_format_out'] = 'text'; // формат по-умолчанию
		else
		{
			if ($post['remote_format_out'] == 'xml') $post['remote_format_out'] = 'xml';
			elseif ($post['remote_format_out'] == 'html') $post['remote_format_out'] = 'html';
			else $post['remote_format_out'] = 'text';
		}
		
		# контроль
		# echo 'remote_function : ' . $remote_function . "<br />";
		# echo 'remote_function_args : '; pr($remote_function_args);
		
################################################################################

		# выполняем запрашиваемую функцию
		
		$out = '';
		# hello
		if ($remote_function == 'hello')
		{
			$out = mso_remote_f_hello();
		}
		elseif ($remote_function == 'addtwonumbers')# addtwonumbers
		{
			$out = mso_remote_f_addtwonumbers($post);
		}
		elseif ($remote_function == 'getgeneralinfo') # getGeneralInfo : общая информация о сайте
		{
			$out = mso_remote_f_getgeneralinfo($post);
		}
		elseif ($remote_function == 'newpost') # newPost : новый пост
		{
			$out = mso_remote_f_newpost($post);
		}
		elseif ($remote_function == 'setpost')# setPost : заменить/редактировать пост
		{
			$out = mso_remote_f_setpost($post);
		}
		elseif ($remote_function == 'getrecentposttitles') # getRecentPostTitles : получить список всех постов (без текстов)
		{
			$out = mso_remote_f_getrecentposttitles($post);
		}
		elseif ($remote_function == 'getpost') # getPost : получить текст поста
		{
			$out = mso_remote_f_getpost($post);
		}
		elseif ($remote_function == 'deletepost')# deletePost : удалить пост
		{
			$out = mso_remote_f_deletepost($post);
		}
		elseif ($remote_function == 'getcategorylist')# getCategoryList : рубрики
		{
			$out = mso_remote_f_getcategorylist($post);
		}
		elseif ($remote_function == 'newcategory')# newCategory : создать рубрику
		{
			$out = mso_remote_f_newcategory($post);
		}
		elseif ($remote_function == 'setcategory')# setCategory : заменить/редактировать рубрику
		{
			$out = mso_remote_f_setcategory($post);
		}
		elseif ($remote_function == 'deletecategory')# deleteCategory : удалить рубрику
		{
			$out = mso_remote_f_deletecategory($post);
		}
		elseif ($remote_function == 'gettags')# getTags : все метки
		{
			$out = mso_remote_f_gettags($post);
		}
		elseif ($remote_function == 'getfilenameuploads')# getFileNameUploads : список уже загруженных файлов
		{
			$out = mso_remote_f_getfilenameuploads($post);
		}
		elseif ($remote_function == 'newmediaobject')# newMediaObject : загрузить файл
		{
			$out = mso_remote_f_newmediaobject($post);
		}
		elseif ($remote_function == 'deletemediaobject')# deleteMediaObject : удалить файл
		{
			$out = mso_remote_f_deletemediaobject($post);
		}
		else 
		{
			# ни одной функции не выполнилось - выходим
			$out = 'MaxSite CMS REMOTE (http://max-3000.com/)ERROR: No access (unknow function)';
		}
		
		if ($out) # есть результат
		{
			if ($post['remote_format_out'] == 'xml') header("Content-type: text/xml");
			
			// в начало нужно добавить сигнатуру MaxSite CMS
			// если этой сигнатуры нет, блог-клиент должен определить результат как ошибка
			echo 'MaxSite CMS REMOTE (http://max-3000.com/)' . $out; 
		}
		else
		{
			echo 'MaxSite CMS REMOTE (http://max-3000.com/)'; // фиктивный пустой результ
		}
	}
	else
	{
		echo 'MaxSite CMS REMOTE (http://max-3000.com/)ERROR: missing arguments';
	}
}

################################################################################
#
# обьявления функций
#
################################################################################

# функция addtwonumbers
function mso_remote_f_addtwonumbers($post)
{
	# в начале всегда проверяем корректность полученных аргументов данной функции
	# если неверные, то либо выводим ошибку, либо ставим дефолтные значения
	
	if (!isset($post['remote_function_args'][1])) $post['remote_function_args'][1] = 1;
	if (!isset($post['remote_function_args'][2])) $post['remote_function_args'][2] = 1;
	
	return $post['remote_function_args'][1] + $post['remote_function_args'][2];
}

# функция hello
function mso_remote_f_hello()
{
	return 'Hello!';
}

# getGeneralInfo : общая информация о сайте
function mso_remote_f_getgeneralinfo($post)
{
	$out = '';
	
	# версия MaxSite CMS 
	$out .= 'version=' . getinfo('version');
	# http-адрес сайта 
	$out .= NR . 'siteurl=' . getinfo('siteurl');
	# http-адрес шаблона 
	$out .= NR . 'stylesheet_url=' . getinfo('stylesheet_url');
	# текущий шаблон 
	$out .= NR . 'template=' . getinfo('template');
	# полный путь к каталогу шаблона 
	$out .= NR . 'template_dir=' . getinfo('template_dir');
	# полный путь к каталогам всех шаблонов (templates) 
	$out .= NR . 'templates_dir=' . getinfo('templates_dir');
	# http-адрес для нового комментария 
	$out .= NR . 'url_new_comment=' . getinfo('url_new_comment');
	# http-адрес RSS-ленты сайта 
	$out .= NR . 'rss_url=' . getinfo('rss_url');
	# http-адрес RSS-ленты сайта 
	$out .= NR . 'feed=' . getinfo('feed');
	# полный http-адрес админки (application/maxsite/admin/) 
	$out .= NR . 'admin_url=' . getinfo('admin_url');
	# http-адрес админки (сайт/admin/) 
	$out .= NR . 'site_admin_url=' . getinfo('site_admin_url');
	# полный путь к каталогу common 
	$out .= NR . 'common_dir=' . getinfo('common_dir');
	# полный http-адрес к common (application/maxsite/comon/) 
	$out .= NR . 'common_url=' . getinfo('common_url');
	# http-путь к uploads (сайт/uploads/) 
	$out .= NR . 'uploads_url=' . getinfo('uploads_url');
	# полный путь к каталогу uploads 
	$out .= NR . 'uploads_dir=' . getinfo('uploads_dir');
	# name_site - название сайта 
	$out .= NR . 'name_site=' . getinfo('name_site');
	# description_site - описание сайта 
	$out .= NR . 'description_site=' . getinfo('description_site');
	# титул сайта 
	$out .= NR . 'title=' . getinfo('title');
	# описание сайта в meta description 
	$out .= NR . 'description=' . getinfo('description');
	# keywords - ключевые слова сайта в meta description 
	$out .= NR . 'keywords=' . getinfo('keywords');
	# временная зона сервера 
	$out .= NR . 'time_zone=' . getinfo('time_zone');
	# http-путь к каталогу plugins 
	$out .= NR . 'plugins_url=' . getinfo('plugins_url');
	# полный путь к каталогу plugins 
	$out .= NR . 'plugins_dir=' . getinfo('plugins_dir');
	# http-путь для AJAX (сайт/ajax/) 
	$out .= NR . 'ajax=' . getinfo('ajax');
	# полный путь к каталогу admin/plugins 
	$out .= NR . 'admin_plugins_dir=' . getinfo('admin_plugins_dir');
	# информация о текущем юзере
	$out .= NR . 'remote_users_id=' . $post['remote_users_id'];
	$out .= NR . 'remote_users_login=' . $post['remote_users_login'];
	
	// получаем все типы страниц
	$CI = & get_instance();
	$all_post_types = '';
	$query = $CI->db->get('page_type');
	$out .= NR . 'page_type=';
	foreach ($query->result_array() as $row)
	{
		$out .= $row['page_type_id'] . '=' . $row['page_type_name'] . '!RMTNR!';
	}
	
	return $out;
}

# newPost : новый пост
function mso_remote_f_newpost($post)
{
	if (!isset($post['remote_page_title']) or !$post['remote_page_title']) return 'ERROR: missing arguments (remote_page_title)';
	if (!isset($post['remote_page_content']) or !$post['remote_page_content']) return 'ERROR: missing arguments (remote_page_content)';
	if (!isset($post['remote_page_id_autor']) or !$post['remote_page_id_autor']) return 'ERROR: missing arguments (remote_page_id_autor)';
	 
	// if (!isset($post['remote_page_cat_ids']) or !$post['remote_page_cat_ids']) return 'ERROR: missing arguments (remote_page_cat_ids)';
	// if (!isset($post['remote_page_tags']) or !$post['remote_page_tags']) return 'ERROR: missing arguments (remote_page_tags)';
	// if (!isset($post['remote_page_slug']) or !$post['remote_page_slug']) return 'ERROR: missing arguments (remote_page_slug)';
	// if (!isset($post['remote_page_date_publish']) or !$post['remote_page_date_publish']) return 'ERROR: missing arguments (remote_page_date_publish)';
	// if (!isset($post['remote_page_type_id']) or !$post['remote_page_type_id']) return 'ERROR: missing arguments ()';
	// if (!isset($post['remote_page_status']) or !$post['remote_page_status']) return 'ERROR: missing arguments (remote_page_status)';
	// if (!isset($post['remote_page_password']) or !$post['remote_page_password']) return 'ERROR: missing arguments (remote_page_password)';
	// if (!isset($post['remote_page_id_parent']) or !$post['remote_page_id_parent']) return 'ERROR: missing arguments (remote_page_id_parent)';
	// if (!isset($post['remote_page_meta_options']) or !$post['remote_page_meta_options']) return 'ERROR: missing arguments (remote_page_meta_options)';

	$f_comment_allow = isset($post['remote_page_comment_allow']) ? '1' : '0';
	$f_ping_allow = isset($post['remote_page_ping_allow']) ? '1' : '0';
	$f_feed_allow = isset($post['remote_page_feed_allow']) ? '1' : '0';
	$f_date_change = isset($post['remote_page_date_change']) ? '1' : '0'; // сменить дату?
	
	if ( $f_date_change and isset($post['remote_page_date_publish']) and $post['remote_page_date_publish'] )
		$f_date_publish = $post['remote_page_date_publish'];
	else
		$f_date_publish = false;

	$data = array(
		'page_title' => $post['remote_page_title'],
		'page_content' => $post['remote_page_content'],
		'page_comment_allow' => $f_comment_allow,
		'page_ping_allow' => $f_ping_allow,
		'page_feed_allow' => $f_feed_allow,
		'user_login' => $post['remote_users_login'],
		'password' => $post['remote_users_password'],
		'page_id_autor' => $post['remote_page_id_autor'],
	);
	
	if ($f_date_publish) $data['page_date_publish'] = $f_date_publish;
	
	if (isset($post['remote_page_slug'])) $data['page_slug'] = $post['remote_page_slug'];
	
	if (isset($post['remote_page_tags'])) $data['page_tags'] = $post['remote_page_tags'];
	if (isset($post['remote_page_type_id'])) $data['page_type_id'] = $post['remote_page_type_id'];
	if (isset($post['remote_page_status'])) $data['page_status'] = $post['remote_page_status'];
	if (isset($post['remote_page_password'])) $data['page_password'] = $post['remote_page_password'];
	if (isset($post['remote_page_id_parent'])) $data['page_id_parent'] = $post['remote_page_id_parent'];
	if (isset($post['remote_page_meta_options'])) $data['page_meta_options'] = $post['remote_page_meta_options'];
	if (isset($post['remote_page_id_cat'])) $data['page_id_cat'] = $post['remote_page_id_cat'];

	//return pr($data, false, false);

	require_once( getinfo('common_dir') . 'functions-edit.php' ); // функции редактирования
	
	
	$result = mso_new_page($data);
	
	if (isset($result['result']) and $result['result']) 
	{
		mso_flush_cache(); // сбросим кэш
		$out = 'OK: ' . $result['description'] 
			. '#' . $result['result'][0] // id
			. '#' . $result['result'][1] // slug
			. '#' . $result['result'][2]; // status
		
		// return pr($result['result'], false, false);
		
		return $out;
	}
	else
	{
		$out = 'ERROR: ' . $result['description'];
		return $out;
	}
}


# setPost : заменить/редактировать пост
function mso_remote_f_setpost($post)
{
	if (!isset($post['remote_page_id']) or !$post['remote_page_id']) return 'ERROR: missing arguments (remote_page_id)';
	if (!isset($post['remote_page_title']) or !$post['remote_page_title']) return 'ERROR: missing arguments (remote_page_title)';
	if (!isset($post['remote_page_content']) or !$post['remote_page_content']) return 'ERROR: missing arguments (remote_page_content)';
	if (!isset($post['remote_page_id_autor']) or !$post['remote_page_id_autor']) return 'ERROR: missing arguments (remote_page_id_autor)';
	 
	// if (!isset($post['remote_page_cat_ids']) or !$post['remote_page_cat_ids']) return 'ERROR: missing arguments (remote_page_cat_ids)';
	// if (!isset($post['remote_page_tags']) or !$post['remote_page_tags']) return 'ERROR: missing arguments (remote_page_tags)';
	// if (!isset($post['remote_page_slug']) or !$post['remote_page_slug']) return 'ERROR: missing arguments (remote_page_slug)';
	// if (!isset($post['remote_page_date_publish']) or !$post['remote_page_date_publish']) return 'ERROR: missing arguments (remote_page_date_publish)';
	// if (!isset($post['remote_page_type_id']) or !$post['remote_page_type_id']) return 'ERROR: missing arguments ()';
	// if (!isset($post['remote_page_status']) or !$post['remote_page_status']) return 'ERROR: missing arguments (remote_page_status)';
	// if (!isset($post['remote_page_password']) or !$post['remote_page_password']) return 'ERROR: missing arguments (remote_page_password)';
	// if (!isset($post['remote_page_id_parent']) or !$post['remote_page_id_parent']) return 'ERROR: missing arguments (remote_page_id_parent)';
	// if (!isset($post['remote_page_meta_options']) or !$post['remote_page_meta_options']) return 'ERROR: missing arguments (remote_page_meta_options)';

	$f_comment_allow = isset($post['remote_page_comment_allow']) ? '1' : '0';
	$f_ping_allow = isset($post['remote_page_ping_allow']) ? '1' : '0';
	$f_feed_allow = isset($post['remote_page_feed_allow']) ? '1' : '0';
	$f_date_change = isset($post['remote_page_date_change']) ? '1' : '0'; // сменить дату?
	
	if ( $f_date_change and isset($post['remote_page_date_publish']) and $post['remote_page_date_publish'] )
		$f_date_publish = $post['remote_page_date_publish'];
	else
		$f_date_publish = false;

	$data = array(
		'page_id' => $post['remote_page_id'],
		'page_title' => $post['remote_page_title'],
		'page_content' => $post['remote_page_content'],
		'page_comment_allow' => $f_comment_allow,
		'page_ping_allow' => $f_ping_allow,
		'page_feed_allow' => $f_feed_allow,
		'user_login' => $post['remote_users_login'],
		'password' => $post['remote_users_password'],
		'page_id_autor' => $post['remote_page_id_autor'],
	);
	
	if ($f_date_publish) $data['page_date_publish'] = $f_date_publish;
	
	if (isset($post['remote_page_slug'])) $data['page_slug'] = $post['remote_page_slug'];
	
	if (isset($post['remote_page_tags'])) $data['page_tags'] = $post['remote_page_tags'];
	if (isset($post['remote_page_type_id'])) $data['page_type_id'] = $post['remote_page_type_id'];
	if (isset($post['remote_page_status'])) $data['page_status'] = $post['remote_page_status'];
	if (isset($post['remote_page_password'])) $data['page_password'] = $post['remote_page_password'];
	if (isset($post['remote_page_id_parent'])) $data['page_id_parent'] = $post['remote_page_id_parent'];
	if (isset($post['remote_page_meta_options'])) $data['page_meta_options'] = $post['remote_page_meta_options'];
	if (isset($post['remote_page_id_cat'])) $data['page_id_cat'] = $post['remote_page_id_cat'];

	//return pr($data, false, false);

	require_once( getinfo('common_dir') . 'functions-edit.php' ); // функции редактирования
	
	
	$result = mso_edit_page($data);
	
	if (isset($result['result']) and $result['result']) 
	{
		mso_flush_cache(); // сбросим кэш
		$out = 'OK: ' . $result['description'] 
			. '#' . $result['result'][0] // id
			. '#' . $result['result'][1] // slug
			. '#' . $result['result'][2]; // status
		
		// return pr($result['result'], false, false);
		
		return $out;
	}
	else
	{
		$out = 'ERROR: ' . $result['description'];
		return $out;
	}
}


# getRecentPostTitles : получить список всех постов (без текстов)
function mso_remote_f_getrecentposttitles($post)
{
	require_once(getinfo('common_dir') . 'page.php');
	
	$par = array(
		'custom_type'=> 'home', 
		'pagination' => false,
		'content'=> false,
		'no_limit' => true,
		'type' => false,
		'page_id_autor'=> $post['remote_users_id'],  // - только указанного автора
		'date_now' => false, // все, независимо от даты
		'page_status' => false, // не зависимо от статуса
		); 

	// если юзеру разрешено редактировать чужие страницы, то 'page_id_autor' сбрасываем
	// иначе только свои страницы можно загружать
	if ( mso_check_user_password($post['remote_users_login'], $post['remote_users_password'], 'admin_page_edit_other') )
		$par['page_id_autor'] = false;

				
	$pages = mso_get_pages($par, $pagination); // получим странички
	
	$out = '';
	
	if ($pages)
	{
		foreach ($pages as $page)
		{
			$out .= NR  . 'page_id=' . $page['page_id'];
			$out .= '!RMTNR!' . 'page_title=' . $page['page_title'];
			$out .= '!RMTNR!' . 'page_type_name=' . $page['page_type_name'];
			$out .= '!RMTNR!' . 'page_slug=' . $page['page_slug'];
			$out .= '!RMTNR!' . 'page_date_publish=' . $page['page_date_publish'];
			$out .= '!RMTNR!' . 'page_status=' . $page['page_status'];
			$out .= '!RMTNR!' . 'page_id_parent=' . $page['page_id_parent'];
			$out .= '!RMTNR!' . 'page_id_autor=' . $page['page_id_autor'];
		}	
	}
	
	return trim($out);
}



# getPost : получить текст поста
function mso_remote_f_getpost($post)
{
	if (!isset($post['remote_page_id']) or !$post['remote_page_id'])
		return 'ERROR: missing arguments';
		
	require_once(getinfo('common_dir') . 'page.php');
	
	// удалим хуки для текста - должно отдаваться как в базе
	mso_remove_hook('content');
	mso_remove_hook('content_auto_tag');
	mso_remove_hook('content_balance_tags');
	mso_remove_hook('content_out');
	mso_remove_hook('content_complete');
	
	$par = array(
		'custom_type'=> 'home', 
		'pagination' => false,
		'content'=> true,
		'work_cut' => false, // [cut] не обрабатывать - отдать как есть 
		'type' => false,
		'page_id' => $post['remote_page_id'],
		'date_now' => false, // все, независимо от даты
		'page_status' => false, // не зависимо от статуса
		'page_id_autor'=> $post['remote_users_id'],  // - только указанного автора
		'all_fields'=> true,  // все поля page
		);
		
	// если юзеру разрешено редактировать чужие страницы, то 'page_id_autor' сбрасываем
	// иначе только свои страницы можно загружать
	if ( mso_check_user_password($post['remote_users_login'], $post['remote_users_password'], 'admin_page_edit_other') )
		$par['page_id_autor'] = false;	 
	
	$pages = mso_get_pages($par, $pagination); // получим странички
	
	$out = '';
	if ($pages)
	{
		foreach ($pages as $page)
		{
			foreach($page as $p_name => $p_val)
			{
				
				if ($p_name == 'page_categories_detail') continue;
				elseif ($p_name == 'users_description') continue;
				elseif ($p_name == 'users_avatar_url') continue;
				elseif ($p_name == 'users_login') continue;
				elseif ($p_name == 'page_content') $p_val = str_replace("\n", '!RMTNR!', $p_val);
				elseif ($p_name == 'page_categories') 
				{
					// это массив, где хранятся id рубрик
					$p_val = implode(" ", $p_val);
				}
				elseif ($p_name == 'page_tags') 
				{
					// это массив, где хранятся имена меток
					$p_val = implode('!RMTNR!', $p_val);
				}
				elseif ($p_name == 'page_meta') 
				{
					//  это массивы в массиве
					$pm = '';
					foreach($p_val as $page_meta_key => $page_meta_val)
					{
						$pm .= '!RMTMETA!' . $page_meta_key . '=' . implode('!RMTNR!', $page_meta_val);
					}
					$p_val = $pm;
					
				}
				elseif ($p_name == 'page_date_publish')
				{
					//page_date_publish=2009-01-05 22:27:22
					$out .= NR . 'page_date_publish_year=' . mso_date_convert('Y', $p_val, false);
					$out .= NR . 'page_date_publish_mon=' . mso_date_convert('m', $p_val, false);
					$out .= NR . 'page_date_publish_day=' . mso_date_convert('d', $p_val, false);
					$out .= NR . 'page_date_publish_hour=' . mso_date_convert('H', $p_val, false);
					$out .= NR . 'page_date_publish_min=' . mso_date_convert('i', $p_val, false);
					$out .= NR . 'page_date_publish_sec=' . mso_date_convert('s', $p_val, false);
					
				}
				elseif (is_array($p_val)) continue;

				$out .= NR . $p_name . '=' . $p_val;
			}
		}	
	}
	else
	{
		return 'ERROR: no page';
	}
	
	return trim($out);
}


# deletePost : удалить пост
function mso_remote_f_deletepost($post)
{
	if ( $post = mso_check_post(array('remote_page_id')) )
	{
		$page_id = (int) $post['remote_page_id'];

    $data = array(
//      'user_login' => $MSO->data['session']['users_login'],
//			'password' => $MSO->data['session']['users_password'],
			'page_id' => $page_id,
		);
			
		require_once( getinfo('common_dir') . 'functions-edit.php' ); // функции редактирования
		$result = mso_delete_page($data);
			
		if (isset($result['result']) and $result['result']) 
		{
			mso_flush_cache(); // сбросим кэш
			$out = 'OK: ' . $result['description'];
			return $out;
		}
		else
		{
			$out = 'ERROR: ' . $result['description'];
			return $out;
		}
	}
}

# getCategoryList : рубрики
function mso_remote_f_getcategorylist($post)
{
	$out = '';
	require_once( getinfo('common_dir') . 'category.php' ); // функции рубрик 

	$pages = mso_cat_array('page', 0);
	
	$out = mso_cat_ul('%ID% %NAME%', true, array(), array());
	
	$out = str_replace('</li>' , '', $out);
	$out = str_replace('</ul>' , '', $out);
	$out = str_replace('<ul>' , '', $out);
	$out = str_replace('<ul class="child">' , '', $out);
	$out = str_replace('<ul class="category">' , '', $out);
	$out = str_replace("\t" , '', $out);
	$out = str_replace("\n\n" , "\n", $out);
	$out = str_replace("\n\n" , "\n", $out);
	$out = str_replace(" " , " ", $out);
	$out = str_replace('<li class="' , '', $out);
	$out = str_replace('">' , ' ', $out);
	$out = str_replace('count' , '', $out);
	$out = str_replace('level' , '', $out);
	
	return trim($out);
}


# newCategory : создать рубрику
function mso_remote_f_newcategory($post)
{
	if ( $post = mso_check_post(array('category_id_parent', 'category_name',
		'category_desc', 'category_slug', 'category_menu_order')) )
	{
		// подготавливаем данные
		$data = array(
			'category_id_parent' => (int) $post['category_id_parent'],
			'category_name' => $post['category_name'],
			'category_desc' => $post['category_desc'],
			'category_slug' => $post['category_slug'],
			'category_menu_order' => (int) $post['category_menu_order']
			);
		
		// выполняем запрос и получаем результат
		require_once( getinfo('common_dir') . 'functions-edit.php' ); // функции редактирования
		
		$result = mso_new_category($data);
		
		if (isset($result['result']) and $result['result']) 
		{
			mso_flush_cache(); // сбросим кэш
			$out = 'OK: ' . $result['description'];
			return $out;
		}
		else
		{
			$out = 'ERROR: ' . $result['description'];
			return $out;
		}
	}
	else
	{
		$out = 'ERROR: ' . 'missing arguments';
		return $out;
	}
}


# setCategory : создать или заменить/редактировать рубрику
function mso_remote_f_setcategory($post)
{
	if ( $post = mso_check_post(array('category_id', 'category_id_parent',
		'category_name', 'category_desc', 'category_slug',
		'category_menu_order')) )
	{
		// получаем номер категории 
		$f_id = $post['category_id'];
		
		// подготавливаем данные
		$data = array(
			'category_id' => $f_id,
			'category_id_parent' => (int) $post['category_id_parent'],
			'category_name' => $post['category_name'],
			'category_desc' => $post['category_desc'],
			'category_slug' => $post['category_slug'],
			'category_menu_order' => (int) $post['category_menu_order']
			);
		
		// выполняем запрос и получаем результат
		require_once( getinfo('common_dir') . 'functions-edit.php' ); // функции редактирования
		
		$result = mso_edit_category($data);
		
		if (isset($result['result']) and $result['result']) 
		{
			mso_flush_cache(); // сбросим кэш
			$out = 'OK: ' . $result['description'];
			return $out;
		}
		else
		{
			$out = 'ERROR: ' . $result['description'];
			return $out;
		}
	}
	else
	{
		$out = 'ERROR: ' . 'missing arguments';
		return $out;
	}
}

# deleteCategory : удалить рубрику
function mso_remote_f_deletecategory($post)
{
	if ( $post = mso_check_post(array('category_id')) )
	{ 
		require_once( getinfo('common_dir') . 'functions-edit.php' ); // функции редактирования

		// получаем номер категории 
		$f_id = $post['category_id'];

		// подготавливаем данные
		$data = array('category_id' => $f_id );

		$result = mso_delete_category($data);

		if (isset($result['result']) and $result['result']) 
		{	
			mso_flush_cache(); // сбросим кэш
			$out = 'OK: ' . $result['description'];
		}
		else
			$out = 'ERROR: ' . $result['description'];
		return $out;
	}
	else
	{
		$out = 'ERROR: ' . 'missing arguments';
		return $out;
	}
}

# getTags : все метки
function mso_remote_f_gettags($post)
{
	require_once(getinfo('common_dir') . 'meta.php');

	$out = '';
	
	if ($post['remote_format_out'] == 'xml') $out .= '<' . '?xml version="1.0" encoding="UTF-8"?' . '>';
	if ($post['remote_format_out'] == 'xml') $out .= NR . '<tags>';
	
	$all_tags = mso_get_all_tags_page();
	if ($all_tags)
	{
		foreach ($all_tags as $tag_name => $tag_count)
		{
			if ($post['remote_format_out'] == 'xml') 
				$out .= NR . '<tag count="' . $tag_count . '">' . $tag_name . '</tag>';
			else
				$out .= NR . 'tag=' . $tag_count . ' ' . $tag_name;
			
		}
	}
	if ($post['remote_format_out'] == 'xml') $out .= '</tags>';
	return trim($out);
}


# getFileNameUploads : список уже загруженных файлов
function mso_remote_f_getfilenameuploads($post)
{
	$out = 'getFileNameUploads';
	return $out;
}


# newMediaObject : загрузить файл
function mso_remote_f_newmediaobject($post)
{
	$out = 'newMediaObject';
	return $out;
}


# deleteMediaObject : удалить файл
function mso_remote_f_deletemediaobject($post)
{
	$out = 'deleteMediaObject';
	return $out;
}



################################################################################
# 
# Вспомогательные функции
#
################################################################################

// функция разворачивания массивов
function _my_expand_array($ar, $tag = 'item', $format = 'xml')
{
	$out = '';
	foreach($ar as $v_name => $v_val)
	{
		$use_tag = $v_name ? $v_name : $tag;
		$use_tag = is_numeric($use_tag) ? $tag : $use_tag; // xml не любит цифровые тэги
		if (is_array($v_val))
		{
			$out .= _my_expand_array($v_val, $use_tag, $format);
		}
		else
		{
			if ($format == 'xml')
				$out .= NR . '<' . $use_tag . '>' . $v_val . '</' . $use_tag . '>';
			else // текст
				$out .= NR . "\t" . $use_tag . '=' . $v_val;
		}
	}
	return $out;
}


# функция обработки каждого элмента массива trim (чтобы удалить мусор ко краям)
function _mso_trim_array($post)
{
	$out = array();
	foreach($post as $key => $val)
	{
		if (is_array($val))
		{
			$out[$key] = _mso_trim_array($val);
		}
		else
		{
			$out[$key] = trim($val);
		}
	}
	
	return $out;
}


# функция переделки массива в строку
function _mso_implode($ar = array())
{
	$out = '';
	
	foreach($ar as $key=>$val)
	{
		if (is_array($val))
		{
			foreach($val as $key1=>$val1)
			{
				if (is_array($val1)) 
				{
					foreach($val1 as $key2=>$val2)
					{
						if (is_array($val2)) $out .= '!RMTL2!' . 'novalue';
							else $out .= '!RMTL2!' . $key . '=' . $key1 . '=' . $key2 . '=' . $val2;
					}
				}
				else $out .= '!RMTL1!' . $key . '=' . $key1 . '=' . $val1;
			}
		}
		else
		{
			$out .= '!RMTL0!' . $key . '=' . $val;
		}
	}
	
	return $out;
}
################################################################################


mso_remote_post();

