<?php if (!defined('BASEPATH')) exit('No direct script access allowed');
/**
 * MaxSite CMS
 * (c) https://max-3000.com/
 * 
 */

// функция получения выборки страниц
function mso_get_pages($r = [], &$pag = [])
{
	global $MSO, $mso_page_current;

	$CI = &get_instance();

	if (!isset($r['limit']))
		$r['limit'] = 7; // сколько отдавать страниц
	else {
		// проверим входящий лимит - он должен быть числом
		$r['limit'] = (int) $r['limit'];
		$r['limit'] = abs($r['limit']);
		if (!$r['limit']) $r['limit'] = 7; // что-то не то, заменяем на дефолт=7
	}

	if (!isset($r['cut'])) $r['cut'] = tf('Далее'); // ссылка на [cut]
	if (!isset($r['xcut'])) $r['xcut'] = true; // для тех у кого нет cut, но есть xcut выводить после xcut

	if (!isset($r['show_cut'])) $r['show_cut'] = true; // отображать ссылку «далее» для [cut] ? 
	if (!isset($r['show_xcut'])) $r['show_xcut'] = true; // отображать ссылку «далее» для [xcut] ? 

	// приписка к ссылке на страницу полной записи
	if (!isset($r['a_link_cut'])) $r['a_link_cut'] = '#cut';

	// удалять ли [cut], если false, то cut не обрабатывается
	// если false, то $r['cut'] и $r['xcut'] уже не учитываются
	if (!isset($r['work_cut'])) $r['work_cut'] = true;

	// отдавать все поля из таблиц (только для типов home и page)
	// если false, то только то, что предопределено
	if (!isset($r['all_fields'])) $r['all_fields'] = false;

	if (!isset($r['cat_order'])) $r['cat_order'] = 'category_name'; // сортировка рубрик
	if (!isset($r['cat_order_asc'])) $r['cat_order_asc'] = 'asc'; // порядок рубрик

	if (!isset($r['meta_order'])) $r['meta_order'] = 'meta_value'; // сортировка meta
	if (!isset($r['meta_order_asc'])) $r['meta_order_asc'] = 'asc'; // порядок meta

	if (!isset($r['pagination'])) $r['pagination'] = true; // использовать пагинацию
	if (!isset($r['content'])) $r['content'] = true; // получать весь текст

	// если 0, значит все страницы - только для главной
	// можно указать номера страниц через запятую
	if (!isset($r['page_id'])) $r['page_id'] = 0;

	// можно указать номера рубрик через запятую
	if (!isset($r['cat_id'])) $r['cat_id'] = 0; // если 0, значит все рубрики - только для главной

	// исключить указанные в массиве рубрики
	if (!isset($r['exclude_cat_id'])) $r['exclude_cat_id'] = 0;

	if (!isset($r['type'])) $r['type'] = 'blog'; // если false - то все, иначе blog или static
	if ($r['page_id']) $r['type'] = false; // если указан номер, то тип страницы сбрасываем

	if (!isset($r['order'])) $r['order'] = 'page_date_publish'; // поле сортировки страниц
	if (!isset($r['order_asc'])) $r['order_asc'] = 'desc'; // поле сортировки страниц

	// если нужно вывести все данные, невзирая на limit, то no_limit=true - пагинация при этом отключается
	if (!isset($r['no_limit'])) $r['no_limit'] = false;

	// если указаны номера записей, то limit отключаем
	if ($r['page_id']) $r['no_limit'] = true;

	if ($r['no_limit']) $r['pagination'] = false;

	// custom_type - аналог is_type - анализ явного указания типа данных
	if (!isset($r['custom_type']))	$r['custom_type'] = false;

	// кастомная функция - вызывается вместо автоанализа по is_type
	// эта функция обязательно должна быть подобна _mso_sql_build_home($r, &$pag) и т.п.
	if (!isset($r['custom_func'])) $r['custom_func'] = false;

	// для функции mso_page_title - передаем тип ссылки для страниц
	if (!isset($r['link_page_type'])) $r['link_page_type'] = 'page';

	// для _mso_sql_build_category можно указать массив номеров рубрик
	// и получить все записи указанных рубрик
	if (!isset($r['categories'])) $r['categories'] = [];

	// исключить указанные в массиве записи
	if (!isset($r['exclude_page_id'])) $r['exclude_page_id'] = [];

	// произвольный slug - используется там, где вычисляется mso_segment(2)
	// страница, рубрика, метка, поиск
	if (!isset($r['slug']))			$r['slug'] = false;

	// если true, то публикуется только те, которые старше текущей даты
	// если false - то публикуются все
	// если юзер залогинен, то дата сбрасывается при выводе page
	if (!isset($r['date_now']))		$r['date_now'] = true;

	// смещение времени в формате ЧЧ:ММ
	// если нет, то берется из настроек 
	if (!isset($r['time_zone'])) {
		$time_zone = getinfo('time_zone');

		if ($time_zone < 10 and $time_zone > 0) {
			$time_zone = '0' . $time_zone;
		} elseif ($time_zone > -10 and $time_zone < 0) {
			$time_zone = '0' . $time_zone;
			$time_zone = str_replace('0-', '-0', $time_zone);
		} else {
			$time_zone = '00.00';
		}

		$time_zone = str_replace('.', ':', $time_zone);
		$r['time_zone'] = $time_zone;
	}

	// если указано учитывать время публикации, то выполняем запрос в котором получаем
	// все записи, которые будущие и которые следует исключить из выборки
	// сей алгоритм связан с оптимизацией запросов к MySQL и значительным (очень!) ускорением
	// сложного select без использования NOW()
	if ($r['date_now']) {
		$CI->db->select('`page_id`', false);
		$CI->db->where('page_date_publish > ', 'DATE_ADD(NOW(), INTERVAL "' . $r['time_zone'] . '" HOUR_MINUTE)', false);
		$query = $CI->db->get('page');

		if ($query and $query->num_rows() > 0) {
			$page_id_date_now = $query->result_array();
			$r['page_id_date_now'] = [];

			foreach ($page_id_date_now as $key => $val) {
				$r['page_id_date_now'][] = $val['page_id'];
			}
		} else {
			$r['page_id_date_now'] = false; // нет записей 
		}
	} else {
		$r['page_id_date_now'] = false; // не нужно учитывать время
	}

	// учитывать ли опцию публикация RSS в странице -
	// если true, то отдаются только те, которые отмечены с этой опцией, false - все
	if (!isset($r['only_feed'])) $r['only_feed'] = false;

	// стутус страниц - если false, то не учитывается
	if (!isset($r['page_status'])) {
		$r['page_status'] = 'publish';
		$r['page_status0'] = ''; // флаг что статус страницы не указан в исходном виде
	} else {
		$r['page_status0'] = $r['page_status'];
	}
	
	// можно указать номер автора - получим только его записи
	if (!isset($r['page_id_autor'])) $r['page_id_autor'] = false;

	// получать ли информацию о рубриках
	// если false, то возвращает пустые массивы page_categories и page_categories_detail
	if (!isset($r['get_page_categories'])) $r['get_page_categories'] = true;

	// получать ли информацию о метках и мета страницы
	// объединены, потому что это один sql-запрос
	// если false, то возвращает пустые массивы page_tags и page_meta
	// при этом перестанет работать парсер текста
	if (!isset($r['get_page_meta_tags'])) $r['get_page_meta_tags'] = true;

	// нужно ли получать данные по количеству комментариев к страницам
	if (!isset($r['get_page_count_comments'])) $r['get_page_count_comments'] = true;

	// после получения записей можно изменить порядрк записей на обратный
	// если true, то делаем реверс 
	if (!isset($r['pages_reverse'])) $r['pages_reverse'] = false;

	// можно указать key и table для получения произвольных выборок мета, например метки
	// используется только для _mso_sql_build_tag
	// в качестве meta_value используется $slug
	if (!isset($r['meta_key']))	$r['meta_key'] = 'tags';
	if (!isset($r['meta_table'])) $r['meta_table'] = 'page';

	// сегмент, признак пагинации
	if (!isset($r['pagination_next_url']))	$r['pagination_next_url'] = 'next';

	// функция со своим sql, в которой можно добавить свои условия
	if (!isset($r['function_add_custom_sql']))
		$r['function_add_custom_sql'] = false;
	else 
		if (!function_exists($r['function_add_custom_sql'])) $r['function_add_custom_sql'] = false;

	// хук, если нужно поменять параметры
	// $r_restore = $r; 
	$r = mso_hook('mso_get_pages', $r);

	// для каждого типа страниц строится свой sql-запрос
	// мы оформляем его в $CI, а здесь только выполняем $CI->db->get();

	// если указана кастомная функция, то выполняем r1
	if ($r['custom_func'] and function_exists($r['custom_func'])) {
		$r['custom_func']($r, $pag);
	} elseif ($r['custom_type']) {
		// указан какой-то свой тип данных - аналог is_type
		$custom_type = $r['custom_type'];

		if ($custom_type == 'home') _mso_sql_build_home($r, $pag);
		elseif ($custom_type == 'page') _mso_sql_build_page($r, $pag);
		elseif ($custom_type == 'category') _mso_sql_build_category($r, $pag);
		elseif ($custom_type == 'tag') _mso_sql_build_tag($r, $pag);
		elseif ($custom_type == 'archive') _mso_sql_build_archive($r, $pag);
		elseif ($custom_type == 'search') _mso_sql_build_search($r, $pag);
		elseif ($custom_type == 'author') _mso_sql_build_author($r, $pag);
		else return [];
	} elseif (is_type('home')) _mso_sql_build_home($r, $pag);
	elseif (is_type('page')) _mso_sql_build_page($r, $pag);
	elseif (is_type('category')) _mso_sql_build_category($r, $pag);
	elseif (is_type('tag')) _mso_sql_build_tag($r, $pag);
	elseif (is_type('archive')) _mso_sql_build_archive($r, $pag);
	elseif (is_type('search')) _mso_sql_build_search($r, $pag);
	elseif (is_type('author')) _mso_sql_build_author($r, $pag);
	else return [];

	// сам запрос и его обработка
	// $query = $CI->db->get();

	// нужно добавить SQL_BUFFER_RESULT
	// поскольку CodeIgniteryt не позволяет добавлять его явно, придется извращаться	
	// $query_sql = str_replace('SELECT ', 'SELECT SQL_BUFFER_RESULT ', $CI->db->_compile_select());

	// SQL_BUFFER_RESULT - убрал, неактуально на новых версиях mysql
	$query_sql = $CI->db->_compile_select();

	// экранирование CodeIgniter - используем свои костыли для запятых в запросе
	$query_sql = str_replace('_MSO_ZAP_', ',', $query_sql);

	// pr($query_sql);

	$query = $CI->db->query($query_sql);
	$CI->db->_reset_select();
	
	// восстанавливать после запроса???
	// $r = mso_hook('mso_get_pages_restore', $r_restore);
	
	if ($query and $query->num_rows() > 0) {
		$pages = $query->result_array();
				
		if ($r['pages_reverse']) $pages = array_reverse($pages);

		$MSO->data['pages_is'] = true; // ставим признак, что записи получены

		// если явно указано какое-то условие статуса, то отдаем как есть
		if (is_type('page') and !$r['page_status0']) {
			// проверяем статус публикации - если page_status <> publish то смотрим автора и сравниваем с текущим юзером
			$page_status = $pages[0]['page_status']; // в page - всегда одна запись

			if ($page_status != 'publish') {
				// не опубликовано
				if (isset($MSO->data['session']['users_id'])) {
					// залогинен
					if ($pages[0]['page_id_autor'] <> $MSO->data['session']['users_id'] && !mso_check_allow('admin_page_edit_other')) return [];
					else {
						if ($page_status == 'draft') $pages[0]['page_title'] .= ' ' . tf('(черновик)');
						// else $pages[0]['page_title'] .= ' (личное)';
					}
				} else {
					return []; // не залогинен
				}
			}			
		}

		// массив всех page_id
		$all_page_id = [];

		foreach ($pages as $key => $page) {
			$all_page_id[] = $page['page_id'];

			$content = $page['page_content'];
			$content = mso_hook('content_init', $content);
			$content = str_replace('<!-- pagebreak -->', '[cut]', $content); // совместимость с TinyMCE

			// если после [cut] пробелы до конца строки, то удалим их 
			$content = preg_replace('|\[cut\]\s*<br|', '[cut]<br', $content);
			$content = preg_replace('|\[cut\](\&nbsp;)*<br|', '[cut]<br', $content);
			$content = preg_replace('|\[cut\](\&nbsp;)*(\s)*<br|', '[cut]<br', $content);

			$pages[$key]['page_slug'] = $page['page_slug'] = mso_slug($page['page_slug']);

			if ($r['work_cut']) {
				// обрабатывать cut
				if ($r['xcut']) // можно использовать [xcut]
					$content = str_replace('[xcut', '[mso_xcut][cut', $content);
				else
					$content = str_replace('[xcut', '[cut', $content);

				if (preg_match('/\[cut(.*?)?\]/', $content, $matches)) {
					$content = explode($matches[0], $content, 2);
					$cut = $matches[1];
				} else {
					$content = array($content);
					$cut = '';
				}

				$output = $content[0];

				if (count($content) > 1) {
					// ссылка на «далее...»
					if ($r['cut'] !== false) {
						if ($cut) {
							if (isset($content[1])) {
								if (strpos($cut, '%wordcount%') !== false)
									$cut = str_replace('%wordcount%', mso_wordcount($content[1]), $cut);
							}
						} else $cut = $r['cut'];

						// отображать ссылку?
						if ($r['show_cut'])
							$output .= mso_page_title(
								$page['page_slug'] . $r['a_link_cut'],
								$cut,
								'<span class="mso-cut">',
								'</span>',
								true,
								false,
								$r['link_page_type']
							);
					} else {
						$output .= '<a id="cut"></a>' .  $content[1];
					}
				}

				if ($r['xcut']) {
					if (strpos($output, '[mso_xcut]') !== false) {
						$xcontent = explode('[mso_xcut]', $output);

						if ($r['cut'] and $cut) {
							if ($r['show_xcut'])
								$cut = mso_page_title(
									$page['page_slug'] . $r['a_link_cut'],
									$cut,
									'<span class="mso-cut">',
									'</span>',
									true,
									false,
									$r['link_page_type']
								);
							else
								$cut = '';

							$output = $xcontent[0] . $cut;
						} else {
							$output = $xcontent[1];
						}
					}
				}
			} else {
				$output = $content; // отдаем как есть
			}

			// $mso_page_current глобальная переменная, где хранится текущая обрабатываемая page
			$mso_page_current = $page;

			$output = mso_hook('content_in', $output);

			// замена [pi] и [page_images] на http://сайт/uploads/_pages/IDзаписи/ 
			$output = str_replace(array('[pi]', '[page_images]'), getinfo('uploads_url') . '_pages/' . $page['page_id'] . '/', $output);

			$output = mso_hook('content', $output);

			$pages[$key]['page_content'] = $output;
			$pages[$key]['page_categories'] = [];
			$pages[$key]['page_categories_detail'] = [];
			$pages[$key]['page_tags'] = [];
			$pages[$key]['page_meta'] = [];
			
			$mso_page_current = $pages[$key];
		}

		if ($r['get_page_categories']) {
			// теперь одним запросом получим все рубрики каждой записи

			$CI->db->select('page_id, category.category_id, category.category_name, category.category_slug, category.category_desc, category.category_id_parent');
			$CI->db->where_in('page_id', $all_page_id);
			$CI->db->order_by('category.' . $r['cat_order'], $r['cat_order_asc']); // сортировка рубрик
			$CI->db->from('cat2obj');
			$CI->db->join('category', 'cat2obj.category_id = category.category_id');

			if ($query = $CI->db->get())
				$cat = $query->result_array();
			else
				$cat = [];


			// переместим все в массив page_id[] = category_id
			$page_cat = [];
			$page_cat_detail = [];

			foreach ($cat as $key => $val) {
				$page_cat[$val['page_id']][] = $val['category_id'];

				$page_cat_detail[$val['page_id']][$val['category_id']] = [
					'category_name' => $val['category_name'],
					'category_slug' => $val['category_slug'],
					'category_desc' => $val['category_desc'],
					'category_id_parent' => $val['category_id_parent'],
					'category_id' => $val['category_id']
				];
			}
		}

		if ($r['get_page_meta_tags']) {
			// по этому же принципу получаем все метки
			$CI->db->select('`meta_id_obj`, `meta_key`, `meta_value`', false);
			$CI->db->where(array('meta_table' => 'page'));
			$CI->db->where_in('meta_id_obj', $all_page_id);
			$CI->db->order_by($r['meta_order'], $r['meta_order_asc']); // сортировка мета

			if ($query = $CI->db->get('meta'))
				$meta = $query->result_array();
			else
				$meta = [];

			// переместим все в массив page_id[] = category_id
			$page_meta = [];

			foreach ($meta as $key => $val) {
				$page_meta[$val['meta_id_obj']][$val['meta_key']][] = $val['meta_value'];
			}
		}

		// нужно получить колво комментариев к записям
		if ($r['get_page_count_comments']) {
			$CI->db->select('`comments_page_id`, COUNT(`comments_id`) AS `page_count_comments`', false);
			$CI->db->where_in('comments_page_id', $all_page_id);
			$CI->db->where('comments_approved', '1');
			$CI->db->group_by('comments_page_id');
			$CI->db->from('comments');

			$query = $CI->db->get();
			$count_comments = $query->result_array();

			// переместим все в массив page_count_comments
			$page_count_comments = [];

			foreach ($count_comments as $key => $val) {
				$page_count_comments[$val['comments_page_id']] = $val['page_count_comments'];
			}
		}

		// получим данные о всех парсерах
		$parser_all = mso_hook('parser_register', []); // все зарегистрированные парсеры

		// добавим в массив pages полученную информацию по меткам и рубрикам
		foreach ($pages as $key => $val) {
			// рубрики
			if ($r['get_page_categories'] and isset($page_cat[$val['page_id']]) and $page_cat[$val['page_id']]) {
				$pages[$key]['page_categories'] = $page_cat[$val['page_id']];
				$pages[$key]['page_categories_detail'] = $page_cat_detail[$val['page_id']];
			}

			// метки отдельно как page_tags
			if ($r['get_page_meta_tags'] and isset($page_meta[$val['page_id']]['tags']) and $page_meta[$val['page_id']]['tags'])
				$pages[$key]['page_tags'] = $page_meta[$val['page_id']]['tags'];

			// остальные мета отдельно в page_meta
			if ($r['get_page_meta_tags'] and isset($page_meta[$val['page_id']]) and $page_meta[$val['page_id']])
				$pages[$key]['page_meta'] = $page_meta[$val['page_id']];


			// колво комментариев
			if ($r['get_page_count_comments']) {
				if (isset($page_count_comments[$val['page_id']]))
					$pages[$key]['page_count_comments'] = $page_count_comments[$val['page_id']];
				else
					$pages[$key]['page_count_comments'] = 0; // нет комментариев
			} else {
				$pages[$key]['page_count_comments'] = 0; // ставим, что нет комментариев
			}
			// обработка контента хуками
			$output = $pages[$key]['page_content'];

			// обработка парсером
			if (isset($pages[$key]['page_meta']['parser_content'])) {
				if ($pages[$key]['page_meta']['parser_content'][0] !== 'none') {
					$p = $pages[$key]['page_meta']['parser_content'][0];

					if (isset($parser_all[$p]['content'])) {
						$func = $parser_all[$p]['content']; // функция, которую нужно выполнить
						if (function_exists($func)) $output = $func($output);
					}
				}
			} else {
				// парсер не указан, используем дефолтный
				// проверим его наличие по функции parser_default_content()
				// иначе нужно включить плагин
				if (!function_exists('parser_default_content')) {
					require_once(getinfo('plugins_dir') . 'parser_default/index.php');
				}

				$output = parser_default_content($output);
			}

			$output = mso_hook('content_complete', $output);
			$pages[$key]['page_content'] = $output;
			$pages[$key] = mso_hook('page_complete', $pages[$key]);
			
			$mso_page_current = $pages[$key];
		}
	} else {
		$pages = [];
		$MSO->data['pages_is'] = false; // ставим признак, что записей нет
	}

	return $pages;
}

// главная страница - home
function _mso_sql_build_home($r, &$pag)
{
	$CI = &get_instance();
	$offset = 0;
	$cat_id = $r['cat_id'] ? mso_explode($r['cat_id']) : false;
	$exclude_cat_id = $r['exclude_cat_id'] ? mso_explode($r['exclude_cat_id']) : false;
	$r['page_id'] = mso_explode($r['page_id']);

	// еслу указан массив номеров рубрик, значит выводим только его
	$categories = $r['categories'] ? true : false;

	// если указаны номера записей, котоыре следует исключить
	$exclude_page_id = $r['exclude_page_id'] ? true : false;

	if ($r['pagination']) {
		// пагинация
		// для неё нужно при том же запросе указываем общее кол-во записей и кол-во на страницу
		// сама пагинация выводится отдельным плагином
		// запрос один в один, кроме limit и юзеров
		$CI->db->select($CI->db->dbprefix('page') . '.`page_id`', false);
		$CI->db->from('page');

		if ($r['page_status']) $CI->db->where('page.page_status', $r['page_status']);

		// if ($r['date_now']) 
		//	$CI->db->where('page_date_publish < ', 'DATE_ADD(NOW(), INTERVAL "' . $r['time_zone'] . '" HOUR_MINUTE)', false);

		if ($r['date_now'] and $r['page_id_date_now']) $CI->db->where_not_in('page.page_id', $r['page_id_date_now']);

		if ($r['type']) {
			if (is_array($r['type']))
				$CI->db->where_in('page_type.page_type_name', $r['type']);
			else
				$CI->db->where('page_type.page_type_name', $r['type']);
		}

		$CI->db->join('page_type', 'page_type.page_type_id = page.page_type_id');

		if ($cat_id or $categories or $exclude_cat_id) {
			$CI->db->join('cat2obj', 'cat2obj.page_id = page.page_id', 'left');
			$CI->db->join('category', 'cat2obj.category_id = category.category_id', 'left');
		}

		if ($r['page_id'])
			$CI->db->where_in('page.page_id', $r['page_id']);

		if ($r['page_id_autor'])
			$CI->db->where('page.page_id_autor', $r['page_id_autor']);

		if ($cat_id)
			$CI->db->where_in('category.category_id', $cat_id);

		if ($categories)
			$CI->db->where_in('category.category_id', $r['categories']);

		if ($exclude_page_id)
			$CI->db->where_not_in('page.page_id', $r['exclude_page_id']);

		if ($exclude_cat_id)
			$CI->db->where_not_in('category.category_id', $exclude_cat_id);

		if ($r['order'])
			$CI->db->order_by($r['order'], $r['order_asc']);

		$CI->db->group_by('page.page_id');

		if ($function_add_custom_sql = $r['function_add_custom_sql'])
			$function_add_custom_sql();

		$query = $CI->db->get();

		$pag_row = $query->num_rows();

		if ($pag_row > 0) {
			$pag['maxcount'] = ceil($pag_row / $r['limit']); // всего станиц пагинации
			$pag['limit'] = $r['limit']; // записей на страницу
			$pag['rows'] = $pag_row; // всего записей

			$current_paged = mso_current_paged($r['pagination_next_url']);

			if ($current_paged > $pag['maxcount']) $current_paged = $pag['maxcount'];

			$offset = $current_paged * $pag['limit'] - $pag['limit'];
		} else {
			$pag = false;
		}
	} else {
		$pag = false;
	}

	// теперь сами страницы
	if (!$r['all_fields']) {
		if ($r['content']) {
			$CI->db->select('page.page_id, page_type_name, page_slug, page_title, page_date_publish, page_status, users_nik, page_content, page_view_count, page_rating, page_rating_count, page_password, page_comment_allow, page_id_parent, page_menu_order, users_avatar_url, page.page_id_autor, users_description, users_login');
		} else {
			// такие селекты теперь нужно вызывать с false в конце...
			$CI->db->select('page.page_id, page_type_name, page_slug, page_title, "" AS page_content, page_date_publish, page_status, users_nik, page_view_count, page_rating, page_rating_count, page_password, page_comment_allow, page_id_parent, page_menu_order, users_avatar_url, page.page_id_autor, users_description, users_login', false);
		}
	} else {
		$CI->db->select('page.*, page_type.*, users.*');
	}

	$CI->db->from('page');
	$CI->db->join('users', 'users.users_id = page.page_id_autor', 'left');
	$CI->db->join('page_type', 'page_type.page_type_id = page.page_type_id', 'left');

	if ($cat_id or $categories or $exclude_cat_id) {
		$CI->db->join('cat2obj', 'cat2obj.page_id = page.page_id', 'left');
		$CI->db->join('category', 'cat2obj.category_id = category.category_id', 'left');
	}

	if ($r['page_id']) $CI->db->where_in('page.page_id', $r['page_id']);
	if ($r['page_status']) $CI->db->where('page_status', $r['page_status']);

	if ($r['type']) {
		if (is_array($r['type']))
			$CI->db->where_in('page_type_name', $r['type']);
		else
			$CI->db->where('page_type_name', $r['type']);
	}

	// $CI->db->where('page_date_publish < ', 'DATE_ADD(NOW(), INTERVAL "' . $r['time_zone'] . '" HOUR_MINUTE)', false);
	if ($r['date_now'] and $r['page_id_date_now'])
		$CI->db->where_not_in('page.page_id', $r['page_id_date_now']);

	if ($r['only_feed'])
		$CI->db->where('page_feed_allow', '1');

	if ($r['page_id_autor'])
		$CI->db->where('page.page_id_autor', $r['page_id_autor']);

	if ($cat_id)
		$CI->db->where_in('category.category_id', $cat_id);

	if ($categories)
		$CI->db->where_in('category.category_id', $r['categories']);

	if ($exclude_page_id)
		$CI->db->where_not_in('page.page_id', $r['exclude_page_id']);

	if ($exclude_cat_id)
		$CI->db->where_not_in('category.category_id', $exclude_cat_id);

	// экранирование CodeIgniter! Приходится делать свои замены! 
	if ($r['page_id']) {
		$CI->db->order_by('FIELD(`' . $CI->db->dbprefix . 'page`.`page_id`_MSO_ZAP_' . implode('_MSO_ZAP_', $r['page_id']) . ')');
	} else {
		if ($r['order'])
			$CI->db->order_by($r['order'], $r['order_asc']);
	}

	$CI->db->group_by('page.page_id');

	if (!$r['no_limit']) {
		if ($pag and $offset)
			$CI->db->limit($r['limit'], $offset);
		else
			$CI->db->limit($r['limit']);
	}
	// pr(_sql($query));
	if ($function_add_custom_sql = $r['function_add_custom_sql'])
		$function_add_custom_sql();
}

// одиночная страница
function _mso_sql_build_page($r, &$pag)
{
	$CI = &get_instance();

	$pag = false; // здесь нет пагинации

	if ($r['slug'])
		$slug = $r['slug'];
	else
		$slug = mso_segment(2);

	if (!$r['all_fields']) {
		$CI->db->select('page.page_id, page_type_name, page_slug, page_title, page_date_publish, page_last_modified, page_status, users_nik, page_content, page_view_count, page_rating, page_rating_count, page_password, page_comment_allow, page_id_parent, page_menu_order, users_avatar_url, page.page_id_autor, users_description, users_login');
	} else {
		$CI->db->select('page.*, page_type.*, users.*');
	}

	$CI->db->from('page');

	if ($r['type']) {
		if (is_array($r['type']))
			$CI->db->where_in('page_type_name', $r['type']);
		else
			$CI->db->where('page_type_name', $r['type']);
	}

	if (!is_login()) {
		if ($r['date_now'] and $r['page_id_date_now']) $CI->db->where_not_in('page.page_id', $r['page_id_date_now']);
		// if ($r['date_now']) $CI->db->where('page_date_publish < ', 'DATE_ADD(NOW(), INTERVAL "' . $r['time_zone'] . '" HOUR_MINUTE)', false);
	}

	if ($r['page_id_autor']) $CI->db->where('page.page_id_autor', $r['page_id_autor']);
	if ($r['page_status0']) $CI->db->where('page_status', $r['page_status0']);
		
	$CI->db->where(array('page_slug' => $slug));
	$CI->db->join('users', 'users.users_id = page.page_id_autor');
	$CI->db->join('page_type', 'page_type.page_type_id = page.page_type_id');
	$CI->db->limit(1);

	if ($function_add_custom_sql = $r['function_add_custom_sql']) $function_add_custom_sql();
}

// рубрики
function _mso_sql_build_category($r, &$pag)
{
	$CI = &get_instance();

	if ($r['slug'])
		$slug = $r['slug'];
	else
		$slug = mso_segment(2);

	// если указан массив номеров рубрик, значит выводим только его
	if ($r['categories'])
		$categories = true;
	else
		$categories = false;

	// если указаны номера записей, котоыре следует исключить
	if ($r['exclude_page_id'])
		$exclude_page_id = true;
	else
		$exclude_page_id = false;

	$offset = 0;

	if ($r['pagination']) {
		// пагинация
		// для неё нужно при том же запросе указываем общее кол-во записей и кол-во на страницу
		// сама пагинация выводится отдельным плагином
		// запрос один в один, кроме limit и юзеров
		//$CI->db->select('page.page_id');

		$CI->db->select($CI->db->dbprefix('page') . '.`page_id`', false);
		$CI->db->from('page');

		if ($r['page_status']) $CI->db->where('page_status', $r['page_status']);

		if ($r['type']) {
			if (is_array($r['type']))
				$CI->db->where_in('page_type_name', $r['type']);
			else
				$CI->db->where('page_type_name', $r['type']);
		}

		// if ($r['date_now']) $CI->db->where('page_date_publish < ', 'DATE_ADD(NOW(), INTERVAL "' . $r['time_zone'] . '" HOUR_MINUTE)', false);

		if ($r['date_now'] and $r['page_id_date_now']) $CI->db->where_not_in('page.page_id', $r['page_id_date_now']);

		if ($r['page_id_autor']) $CI->db->where('page.page_id_autor', $r['page_id_autor']);

		$CI->db->join('page_type', 'page_type.page_type_id = page.page_type_id');
		$CI->db->join('cat2obj', 'cat2obj.page_id = page.page_id');
		$CI->db->join('category', 'cat2obj.category_id = category.category_id');

		if ($categories) {
			$CI->db->where_in('category.category_id', $r['categories']);
		} else {
			$CI->db->where('category.category_slug', $slug);
		}

		if ($exclude_page_id)
			$CI->db->where_not_in('page.page_id', $r['exclude_page_id']);

		if ($function_add_custom_sql = $r['function_add_custom_sql']) $function_add_custom_sql();

		$query = $CI->db->get();

		$pag_row = $query->num_rows();

		if ($pag_row > 0) {
			$pag['maxcount'] = ceil($pag_row / $r['limit']); // всего станиц пагинации
			$pag['limit'] = $r['limit']; // записей на страницу
			$pag['rows'] = $pag_row; // всего записей

			$current_paged = mso_current_paged($r['pagination_next_url']);
			if ($current_paged > $pag['maxcount']) $current_paged = $pag['maxcount'];

			$offset = $current_paged * $pag['limit'] - $pag['limit'];
		} else {
			$pag = false;
		}
	} else {
		$pag = false;
	}

	if (!$r['all_fields']) {
		// теперь сами страницы
		if ($r['content'])
			$CI->db->select('page.page_id, page_type_name, page_slug, page_title, page_date_publish, page_status, users_nik, page_content, page_view_count, page_rating, page_rating_count, page_password, page_comment_allow, page_id_parent, page_menu_order, users_avatar_url, page.page_id_autor, users_description, users_login');
		else
			$CI->db->select('page.page_id, page_type_name, page_slug, page_title, "" AS page_content, page_date_publish, page_status, users_nik, page_view_count, page_rating, page_rating_count, page_password, page_comment_allow, page_id_parent, page_menu_order, users_avatar_url, page.page_id_autor, users_description, users_login', false);
	} else {
		$CI->db->select('page.*, page_type.*, users.*');
	}

	$CI->db->from('page');

	if ($r['page_status']) $CI->db->where('page_status', $r['page_status']);
	if ($r['date_now'] and $r['page_id_date_now']) $CI->db->where_not_in('page.page_id', $r['page_id_date_now']);
	// if ($r['date_now']) $CI->db->where('page_date_publish < ', 'DATE_ADD(NOW(), INTERVAL "' . $r['time_zone'] . '" HOUR_MINUTE)', false);

	if ($r['only_feed']) $CI->db->where('page.page_feed_allow', '1');
	if ($r['page_id_autor']) $CI->db->where('page.page_id_autor', $r['page_id_autor']);

	if ($r['type']) {
		if (is_array($r['type'])) $CI->db->where_in('page_type_name', $r['type']);
		else $CI->db->where('page_type_name', $r['type']);
	}

	$CI->db->join('users', 'users.users_id = page.page_id_autor');
	$CI->db->join('page_type', 'page_type.page_type_id = page.page_type_id');
	$CI->db->join('cat2obj', 'cat2obj.page_id = page.page_id');
	$CI->db->join('category', 'cat2obj.category_id = category.category_id');

	if ($categories) {
		$CI->db->where_in('category.category_id', $r['categories']);
	} else {
		$CI->db->where('category.category_slug', $slug);
	}

	if ($exclude_page_id)
		$CI->db->where_not_in('page.page_id', $r['exclude_page_id']);

	$CI->db->order_by($r['order'], $r['order_asc']);
	$CI->db->group_by('page.page_id');

	if (!$r['no_limit']) {
		if ($pag and $offset)
			$CI->db->limit($r['limit'], $offset);
		else
			$CI->db->limit($r['limit']);
	}

	if ($function_add_custom_sql = $r['function_add_custom_sql']) $function_add_custom_sql();
}

// страница меток
function _mso_sql_build_tag($r, &$pag)
{
	$CI = &get_instance();

	if ($r['slug'])
		$slug = $r['slug'];
	else
		$slug = mso_segment(2);

	// если метка не указана, то иммитируем несуществующую метку, чтобы была 404-страница
	if (!$slug and !isset($r['no_meta_value']) and !isset($r['meta_value'])) {
		$slug = md5(time());
		$r['pagination'] = false;
	}

	// если no_meta_value = true, то делаем $slug = false
	// чтобы можно было делать запросы без этого поля
	// если указан meta_value, то $slug = meta_value
	if (isset($r['no_meta_value']) and $r['no_meta_value'] === true) $slug = false;
	elseif (isset($r['meta_value']) and $r['meta_value']) $slug = $r['meta_value'];

	if ($r['exclude_page_id'])
		$exclude_page_id = true;
	else
		$exclude_page_id = false;

	$offset = 0;

	if ($r['pagination']) {
		$CI->db->select($CI->db->dbprefix('page') . '.`page_id`', false);
		$CI->db->from('page');

		if ($r['page_status']) $CI->db->where('page_status', $r['page_status']);

		if ($r['date_now'] and $r['page_id_date_now']) $CI->db->where_not_in('page.page_id', $r['page_id_date_now']);

		// if ($r['date_now']) $CI->db->where('page_date_publish < ', 'DATE_ADD(NOW(), INTERVAL "' . $r['time_zone'] . '" HOUR_MINUTE)', false);

		if ($r['type']) {
			if (is_array($r['type'])) $CI->db->where_in('page_type_name', $r['type']);
			else $CI->db->where('page_type_name', $r['type']);
		}

		if ($exclude_page_id)
			$CI->db->where_not_in('page.page_id', $r['exclude_page_id']);

		if ($r['page_id_autor']) $CI->db->where('page.page_id_autor', $r['page_id_autor']);

		$CI->db->join('page_type', 'page_type.page_type_id = page.page_type_id');
		$CI->db->join('meta', 'meta.meta_id_obj = page.page_id');
		$CI->db->where('meta_key', $r['meta_key']);
		$CI->db->where('meta_table', $r['meta_table']);

		if ($slug) $CI->db->where('meta_value', $slug);
		if ($function_add_custom_sql = $r['function_add_custom_sql']) $function_add_custom_sql();

		$query = $CI->db->get();

		$pag_row = $query->num_rows();

		if ($pag_row > 0) {
			$pag['maxcount'] = ceil($pag_row / $r['limit']); // всего станиц пагинации
			$pag['limit'] = $r['limit']; // записей на страницу
			$pag['rows'] = $pag_row; // всего записей

			$current_paged = mso_current_paged($r['pagination_next_url']);
			if ($current_paged > $pag['maxcount']) $current_paged = $pag['maxcount'];

			$offset = $current_paged * $pag['limit'] - $pag['limit'];
		} else {
			$pag = false;
		}
	} else {
		$pag = false;
	}

	if (!$r['all_fields']) {
		// теперь сами страницы
		if ($r['content'])
			$CI->db->select('page.page_id, page_type_name, page_slug, page_title, page_date_publish, page_status, users_nik, page_content, page_view_count, page_rating, page_rating_count, page_password, page_comment_allow, page_id_parent, page_menu_order, users_avatar_url, meta.meta_value AS tag_name, page.page_id_autor, users_description, users_login');
		else
			$CI->db->select('page.page_id, page_type_name, page_slug, page_title, "" AS page_content, page_date_publish, page_status, users_nik, page_view_count, page_rating, page_rating_count, page_password, page_comment_allow, page_id_parent, page_menu_order, users_avatar_url, meta.meta_value AS tag_name, page.page_id_autor, users_description, users_login', false);
	} else {
		$CI->db->select('page.*, page_type.*, users.*');
	}

	$CI->db->from('page');

	if ($r['page_status']) $CI->db->where('page_status', $r['page_status']);

	//if ($r['date_now']) $CI->db->where('page_date_publish < ', 'DATE_ADD(NOW(), INTERVAL "' . $r['time_zone'] . '" HOUR_MINUTE)', false);
	if ($r['date_now'] and $r['page_id_date_now']) $CI->db->where_not_in('page.page_id', $r['page_id_date_now']);

	if ($r['type']) {
		if (is_array($r['type']))
			$CI->db->where_in('page_type_name', $r['type']);
		else
			$CI->db->where('page_type_name', $r['type']);
	}

	if ($r['page_id_autor']) $CI->db->where('page.page_id_autor', $r['page_id_autor']);

	$CI->db->join('users', 'users.users_id = page.page_id_autor');
	$CI->db->join('page_type', 'page_type.page_type_id = page.page_type_id');
	$CI->db->join('meta', 'meta.meta_id_obj = page.page_id');

	if ($exclude_page_id)
		$CI->db->where_not_in('page.page_id', $r['exclude_page_id']);

	$CI->db->where('meta_key', $r['meta_key']);
	$CI->db->where('meta_table', $r['meta_table']);

	if ($slug) $CI->db->where('meta_value', $slug);

	$CI->db->order_by($r['order'], $r['order_asc']);
	$CI->db->group_by('page.page_id');

	if (!$r['no_limit']) {
		if ($pag and $offset)
			$CI->db->limit($r['limit'], $offset);
		else
			$CI->db->limit($r['limit']);
	}

	if ($function_add_custom_sql = $r['function_add_custom_sql']) $function_add_custom_sql();
}

// архивы по датам
function _mso_sql_build_archive($r, &$pag)
{
	global $MSO;

	$CI = &get_instance();

	// [1]=>archive [2]=>Y [3]=>M [4]=>D [5]=>next
	$seg = $MSO->data['uri_segment'];

	// если есть пагинация, то отсекаем её
	$in_next = array_search($r['pagination_next_url'], $seg);

	if ($in_next !== false) {
		// есть вхождение - отсекаем
		// эти операции, чтобы начать счёт в массиве с 1, как в $MSO->data['uri_segment'])
		$seg = array_merge(array(0), array_slice($seg, 0, $in_next - 1));
		unset($seg[0]);
	}

	$count_segment = count($seg) - 1;
	$year = (int) mso_segment(2, true, $seg); // используем свой массив сегментов

	if ($year > date('Y', time()) or $year < 2006) $year = date('Y', time());

	$month = (int) mso_segment(3, true, $seg);
	$day = (int) mso_segment(4, true, $seg);

	if ($count_segment >= 3) {
		// [2]=>Y [3]=>M [4]=>D
		// указаны год-месяц-дата

		if ($month > 12 or $month < 1) $month = 1;

		$dmax = get_total_days($month, $year);

		if ($day == 0) $day = 1;
		if ($day > $dmax) $day = $dmax;

		$date_in = mso_date_convert('Y-m-d H:i:s', $year . '-' . $month . '-' . $day . ' 00:00:00', false);
		$date_in_59 = mso_date_convert('Y-m-d H:i:s', $year . '-' . $month . '-' . $day . ' 23:59:59', false);
	} elseif ($count_segment == 2) {
		// [2]=>Y [3]=>M
		// указано год-месяц

		if ($month > 12 or $month < 1) $month = 1;

		$dmax = get_total_days($month, $year);
		$date_in = mso_date_convert('Y-m-d H:i:s', $year . '-' . $month . '-1 00:00:00', false);
		$date_in_59 = mso_date_convert('Y-m-d H:i:s', $year . '-' . $month . '-' . $dmax . ' 23:59:59', false);
	} elseif ($count_segment == 1) {
		// [2]=>Y
		// указан только год
		$date_in = mso_date_convert('Y-m-d H:i:s', $year . '-01-01 00:00:00', false);
		$date_in_59 = mso_date_convert('Y-m-d H:i:s', $year . '-12-31 23:59:59', false);
	} else {
		// ничего не указано - выводим архив за все время
		$year = date('Y', time());
		$date_in = mso_date_convert('Y-m-d H:i:s', '2006-01-01 00:00:00', false);
		$date_in_59 = mso_date_convert('Y-m-d H:i:s', $year . '-12-31 23:59:59', false);
	}

	$offset = 0;

	if ($r['pagination']) {
		$CI->db->select($CI->db->dbprefix('page') . '.`page_id`', false);
		$CI->db->from('page');

		if ($r['page_status']) $CI->db->where('page_status', $r['page_status']);

		if ($r['date_now'] and $r['page_id_date_now']) $CI->db->where_not_in('page.page_id', $r['page_id_date_now']);
		// if ($r['date_now']) $CI->db->where('page_date_publish < ', 'DATE_ADD(NOW(), INTERVAL "' . $r['time_zone'] . '" HOUR_MINUTE)', false);

		if ($r['type']) {
			if (is_array($r['type']))
				$CI->db->where_in('page_type_name', $r['type']);
			else
				$CI->db->where('page_type_name', $r['type']);
		}

		$CI->db->where('page_date_publish >= ', $date_in);
		$CI->db->where('page_date_publish <= ', $date_in_59);

		if ($r['page_id_autor']) $CI->db->where('page.page_id_autor', $r['page_id_autor']);

		$CI->db->join('page_type', 'page_type.page_type_id = page.page_type_id');
		$CI->db->order_by($r['order'], $r['order_asc']);

		if ($function_add_custom_sql = $r['function_add_custom_sql']) $function_add_custom_sql();

		$query = $CI->db->get();

		$pag_row = $query->num_rows();
		if ($pag_row > 0) {
			$pag['maxcount'] = ceil($pag_row / $r['limit']); // всего станиц пагинации
			$pag['limit'] = $r['limit']; // записей на страницу
			$pag['rows'] = $pag_row; // всего записей

			$current_paged = mso_current_paged($r['pagination_next_url']);

			if ($current_paged > $pag['maxcount']) $current_paged = $pag['maxcount'];

			$offset = $current_paged * $pag['limit'] - $pag['limit'];
		} else {
			$pag = false;
		}
	} else {
		$pag = false;
	}

	// теперь сами страницы
	if (!$r['all_fields']) {
		$CI->db->select('page.page_id, page_type_name, page_slug, page_title, page_date_publish, page_status, users_nik, page_content, page_view_count, page_rating, page_rating_count, page_password, page_comment_allow, page_id_parent, page_menu_order, users_avatar_url, page.page_id_autor, users_description, users_login');
	} else {
		$CI->db->select('page.*, page_type.*, users.*');
	}

	$CI->db->from('page');

	if ($r['page_status']) $CI->db->where('page_status', $r['page_status']);

	$CI->db->where('page_date_publish >= ', $date_in);
	$CI->db->where('page_date_publish <= ', $date_in_59);

	if ($r['page_id_autor']) $CI->db->where('page.page_id_autor', $r['page_id_autor']);

	// if ($r['date_now']) $CI->db->where('page_date_publish < ', 'DATE_ADD(NOW(), INTERVAL "' . $r['time_zone'] . '" HOUR_MINUTE)', false);
	if ($r['date_now'] and $r['page_id_date_now']) $CI->db->where_not_in('page.page_id', $r['page_id_date_now']);

	if ($r['type']) {
		if (is_array($r['type']))
			$CI->db->where_in('page_type_name', $r['type']);
		else
			$CI->db->where('page_type_name', $r['type']);
	}

	$CI->db->join('users', 'users.users_id = page.page_id_autor');
	$CI->db->join('page_type', 'page_type.page_type_id = page.page_type_id');
	$CI->db->order_by($r['order'], $r['order_asc']);
	$CI->db->group_by('page.page_id');

	if (!$r['no_limit']) {
		if ($pag and $offset)
			$CI->db->limit($r['limit'], $offset);
		else
			$CI->db->limit($r['limit']);
	}

	if ($function_add_custom_sql = $r['function_add_custom_sql']) $function_add_custom_sql();
}

// страница поиска
function _mso_sql_build_search($r, &$pag)
{
	$CI = &get_instance();

	if ($r['slug'])
		$search = $r['slug'];
	else
		$search = mso_segment(2);

	// $search = mso_segment(2);
	$search = mso_strip(strip_tags($search));
	$offset = 0;

	if ($r['pagination']) {
		$CI->db->select($CI->db->dbprefix('page') . '.`page_id`', false);
		$CI->db->from('page');
		if ($r['page_status']) $CI->db->where('page_status', $r['page_status']);

		if ($r['type']) {
			if (is_array($r['type']))
				$CI->db->where_in('page_type_name', $r['type']);
			else
				$CI->db->where('page_type_name', $r['type']);
		}

		// if ($r['date_now']) $CI->db->where('page_date_publish < ', 'DATE_ADD(NOW(), INTERVAL "' . $r['time_zone'] . '" HOUR_MINUTE)', false);
		if ($r['date_now'] and $r['page_id_date_now']) $CI->db->where_not_in('page.page_id', $r['page_id_date_now']);

		if ($r['page_id_autor']) $CI->db->where('page.page_id_autor', $r['page_id_autor']);

		$CI->db->where(
			'(`page_content` LIKE \'%' . $CI->db->escape_str($search) . '%\' OR `page_title` LIKE \'%' . $CI->db->escape_str($search) . '%\')',
			'',
			false
		);

		$CI->db->join('page_type', 'page_type.page_type_id = page.page_type_id');
		$CI->db->order_by($r['order'], $r['order_asc']);

		if ($function_add_custom_sql = $r['function_add_custom_sql']) $function_add_custom_sql();

		$query = $CI->db->get();
		$pag_row = $query->num_rows();

		if ($pag_row > 0) {
			$pag['maxcount'] = ceil($pag_row / $r['limit']); // всего станиц пагинации
			$pag['limit'] = $r['limit']; // записей на страницу
			$pag['rows'] = $pag_row; // всего записей

			$current_paged = mso_current_paged($r['pagination_next_url']);
			if ($current_paged > $pag['maxcount']) $current_paged = $pag['maxcount'];

			$offset = $current_paged * $pag['limit'] - $pag['limit'];
		} else {
			$pag = false;
		}
	} else {
		$pag = false;
	}

	// теперь сами страницы
	if (!$r['all_fields']) {
		$CI->db->select('page.page_id, page_type_name, page_slug, page_title, page_date_publish, page_status, users_nik, page_content, page_view_count, page_rating, page_rating_count, page_password, page_comment_allow, page_id_parent, page_menu_order, users_avatar_url, page.page_id_autor, users_description, users_login');
	} else {
		$CI->db->select('page.*, page_type.*, users.*');
	}

	$CI->db->from('page');

	// if ($r['date_now']) $CI->db->where('page_date_publish < ', 'DATE_ADD(NOW(), INTERVAL "' . $r['time_zone'] . '" HOUR_MINUTE)', false);
	if ($r['date_now'] and $r['page_id_date_now']) $CI->db->where_not_in('page.page_id', $r['page_id_date_now']);

	if ($r['page_id_autor']) $CI->db->where('page.page_id_autor', $r['page_id_autor']);

	// like делаем свой
	$CI->db->where(
		'(`page_content` LIKE \'%' . $CI->db->escape_str($search) . '%\' OR `page_title` LIKE \'%' . $CI->db->escape_str($search) . '%\')',
		'',
		false
	);

	if ($r['page_status']) $CI->db->where('page_status', $r['page_status']);

	if ($r['type']) {
		if (is_array($r['type']))
			$CI->db->where_in('page_type_name', $r['type']);
		else
			$CI->db->where('page_type_name', $r['type']);
	}

	$CI->db->join('users', 'users.users_id = page.page_id_autor', 'left');
	$CI->db->join('page_type', 'page_type.page_type_id = page.page_type_id', 'left');
	$CI->db->order_by($r['order'], $r['order_asc']);
	$CI->db->group_by('page.page_id');

	if (!$r['no_limit']) {
		if ($pag and $offset)
			$CI->db->limit($r['limit'], $offset);
		else
			$CI->db->limit($r['limit']);
	}

	if ($function_add_custom_sql = $r['function_add_custom_sql']) $function_add_custom_sql();
}

// страницы автора
function _mso_sql_build_author($r, &$pag)
{
	$CI = &get_instance();

	if ($r['slug'])
		$slug = $r['slug'];
	else
		$slug = mso_segment(2);

	// если slug есть число, то выполняем поиск по id
	if (!is_numeric($slug))
		$id = 0; // slug не число
	else
		$id = (int) $slug;

	$offset = 0;

	if ($r['pagination']) {
		$CI->db->select($CI->db->dbprefix('page') . '.`page_id`', false);
		$CI->db->from('page');

		if ($r['page_status']) $CI->db->where('page_status', $r['page_status']);

		if ($r['type']) {
			if (is_array($r['type']))
				$CI->db->where_in('page_type_name', $r['type']);
			else
				$CI->db->where('page_type_name', $r['type']);
		}

		// if ($r['date_now']) $CI->db->where('page_date_publish < ', 'DATE_ADD(NOW(), INTERVAL "' . $r['time_zone'] . '" HOUR_MINUTE)', false);
		if ($r['date_now'] and $r['page_id_date_now']) $CI->db->where_not_in('page.page_id', $r['page_id_date_now']);

		$CI->db->join('page_type', 'page_type.page_type_id = page.page_type_id');
		$CI->db->where('page.page_id_autor', $id);
		$CI->db->group_by('page.page_id');
		if ($function_add_custom_sql = $r['function_add_custom_sql']) $function_add_custom_sql();

		$query = $CI->db->get();
		$pag_row = $query->num_rows();

		if ($pag_row > 0) {
			$pag['maxcount'] = ceil($pag_row / $r['limit']); // всего станиц пагинации
			$pag['limit'] = $r['limit']; // записей на страницу
			$pag['rows'] = $pag_row; // всего записей

			$current_paged = mso_current_paged($r['pagination_next_url']);

			if ($current_paged > $pag['maxcount']) $current_paged = $pag['maxcount'];

			$offset = $current_paged * $pag['limit'] - $pag['limit'];
		} else {
			$pag = false;
		}
	} else {
		$pag = false;
	}

	// теперь сами страницы
	if (!$r['all_fields']) {
		if ($r['content'])
			$CI->db->select('page.page_id, page_type_name, page_slug, page_title, page_date_publish, page_status, users_nik, page_content, page_view_count, page_rating, page_rating_count, page_password, page_comment_allow, page_id_parent, page_menu_order, users_avatar_url, page.page_id_autor, users_description, users_login');
		else
			$CI->db->select('page.page_id, page_type_name, page_slug, page_title, "" AS page_content, page_date_publish, page_status, users_nik, page_view_count, page_rating, page_rating_count, page_password, page_comment_allow, page_id_parent, page_menu_order, users_avatar_url, page.page_id_autor, users_description, users_login', false);
	} else {
		$CI->db->select('page.*, page_type.*, users.*');
	}

	$CI->db->from('page');
	if ($r['page_status']) $CI->db->where('page_status', $r['page_status']);

	// if ($r['date_now']) $CI->db->where('page_date_publish < ', 'DATE_ADD(NOW(), INTERVAL "' . $r['time_zone'] . '" HOUR_MINUTE)', false);
	if ($r['date_now'] and $r['page_id_date_now']) $CI->db->where_not_in('page.page_id', $r['page_id_date_now']);
	if ($r['only_feed']) $CI->db->where('page.page_feed_allow', '1');

	if ($r['type']) {
		if (is_array($r['type']))
			$CI->db->where_in('page_type_name', $r['type']);
		else
			$CI->db->where('page_type_name', $r['type']);
	}

	$CI->db->join('users', 'users.users_id = page.page_id_autor');
	$CI->db->join('page_type', 'page_type.page_type_id = page.page_type_id');
	$CI->db->where('page.page_id_autor', $id);
	$CI->db->order_by($r['order'], $r['order_asc']);
	$CI->db->group_by('page.page_id');

	if (!$r['no_limit']) {
		if ($pag and $offset)
			$CI->db->limit($r['limit'], $offset);
		else
			$CI->db->limit($r['limit']);
	}

	if ($function_add_custom_sql = $r['function_add_custom_sql']) $function_add_custom_sql();
}

// вспомогательная
// функция из Calendar.php
if (!function_exists('get_total_days')) {
	function get_total_days($month, $year)
	{
		$days_in_month	= array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);

		if ($month < 1 or $month > 12) return 0;
		if ($month == 2) {
			if ($year % 400 == 0 or ($year % 4 == 0 and $year % 100 != 0))	return 29;
		}

		return $days_in_month[$month - 1];
	}
}

# end of file
