<?php if (!defined('BASEPATH')) exit('No direct script access allowed');
/**
 * MaxSite CMS
 * (c) https://max-3000.com/ 
 * Функции для работы с шаблоном
 */

/**
 * Вывод секции HEAD
 */
function my_default_head_section()
{
	// атирибуты <HTML>
	$html_attr = mso_get_val('head_section_html_add');
	$html_attr = mso_hook('html_attr', $html_attr);
	$html_attr = $html_attr ? ' ' . $html_attr : '';

	echo
		'<!DOCTYPE html>
<html' . $html_attr . '><head>' . mso_hook('head_start') . '
<meta charset="UTF-8">
<title>' . mso_head_meta('title') . '</title>
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta name="generator" content="MaxSite CMS">
<meta name="description" content="' . mso_head_meta('description') . '">';

	// для html-кода favicon можно использовать отдельный type_foreach-файл. 
	// Создать код можно здесь: https://realfavicongenerator.net/
	if ($fn = mso_page_foreach('favicon')) {
		require $fn;
	} else {
		echo '<link rel="icon" href="' . getinfo('uploads_url') . 'favicons/' . mso_get_option('default_favicon', 'templates', 'favicon1.png') . '" type="image/png">';
	}
	
	if (mso_get_option('default_canonical', 'templates', 0)) echo mso_link_rel('canonical');

	echo mso_rss();

	if ($fn = mso_fe('custom/head-start.php')) require $fn;

	// autoload файлов
	if ($autoload_css = mso_get_path_files(getinfo('template_dir') . 'assets/css/', getinfo('template_url') . 'assets/css/', true, ['css'])) {
		foreach ($autoload_css as $fn_css) {
			echo mso_load_style($fn_css);
		}
	}

	my_out_component_css();
	mso_hook('head_css');
	my_default_out_profiles();

	echo mso_load_jquery();

	mso_hook('head');

	// autoload js-файлов
	if ($autoload_js = mso_get_path_files(getinfo('template_dir') . 'assets/js/autoload/', getinfo('template_url') . 'assets/js/autoload/', true, ['js'])) {
		foreach ($autoload_js as $fn_js) {
			echo '<script src="' . $fn_js . '"></script>' . NR;
		}
	}

	my_out_component_js(); // компоненты и файл _head.php

	if ($fn = mso_fe('custom/head.php')) require $fn;
	if ($fn = mso_page_foreach('head')) require $fn;
	if (function_exists('ushka')) echo ushka('head');

	if (mso_fe('assets/js/my.js')) mso_add_file('assets/js/my.js');

	if ($my_style = mso_get_option('my_style', getinfo('template'), ''))
		echo NR . '<!-- custom style --><style>' . $my_style . '</style>';

	mso_hook('head_end');

	if (function_exists('ushka')) echo ushka('google_analytics_top');

	echo '</head>';
}

/**
 * вывод подключенных css-профилей
 * @param type $path
 */
function my_default_out_profiles($path = 'assets/css/profiles/')
{
	if ($default_profiles = mso_get_option('default_profiles', getinfo('template'), [])) {

		$css_out = '';

		// theme и lazy профили подключаются как link rel="stylesheet
		foreach ($default_profiles as $css_file) {
			$fn = $path . $css_file;

			$theme = (strpos($css_file, 'theme-') === 0  or strpos($css_file, '-head') !== false);
			$lazy = (strpos($css_file, '-lazy') !== false);

			if ($theme)
				mso_add_file($fn); // подключаем внешими стилями в HEAD
			elseif ($lazy)
				mso_add_file($fn, true); // подключаем внешими стилями в BODY
			else
				$css_out .= mso_out_css_file($fn, false, false); // получение и обработка CSS из файла
		}

		if ($css_out)
			echo '<style>' . $css_out . '</style>';
	}

	// здесь же выводим css-профиль записи
	// он задан через метаполе
	if (is_type('page')) {
		if ($pageData = mso_get_val('mso_pages', 0, true)) {
			if ($page_css_profiles = mso_page_meta_value('page_css_profiles', $pageData['page_meta'])) {

				$fn = $path . $page_css_profiles;

				$theme = (strpos($page_css_profiles, 'theme-') === 0);
				$lazy = (strpos($page_css_profiles, '-lazy') !== false);

				if ($theme)
					mso_add_file($fn); // подключаем внешими стилями в HEAD
				elseif ($lazy)
					mso_add_file($fn, true); // подключаем внешими стилями в BODY
				else {
					if ($css_out = mso_out_css_file($fn, false, false))
						echo '<style>' . $css_out . '</style>';
				}
			}
		}
	}
}

/**
 * получить список компонентов шапки или подвала
 * $type = header или footer
 * на выходе массив: компонент => файл для подключения
 */
function my_get_components($type) {
	
	static $r = []; // кэш результатов
	
	$out = [];
	
	// где-то явно указаны компоненты: mso_set_val('my_header_components', 'header1');
	if ($my = mso_get_val('my_' . $type . '_components')) {
		
		if (isset($r['my_' . $type . '_components'])) return $r['my_' . $type . '_components'];
		
		$my_components = mso_explode($my, false, true, false, false);
		
		foreach($my_components as $dir) {
			if ($fn = mso_fe('components/' . $dir . '/' . $dir . '.php')) $out[$dir] = $fn;
			elseif ($fn = mso_fe('components/' . $dir . '/index.php')) $out[$dir] = $fn;
		}
		
		$r['my_' . $type . '_components'] = $out;
				
		return $out;
	}
	
	if (isset($r[$type])) return $r[$type];
	
	$flag = true; // признак, чтобы использовать общие компоненты

	// для адреса может быть заданы свои компоненты
	// они в опции custom_header_components
	if ($custom_components = mso_get_option('custom_' . $type . '_components', getinfo('template'), false)) {		
		if ($ar = mso_text_find_key($custom_components)) {
			
			$current_url = mso_current_url();
			
			if (isset($ar[$current_url])) {
		
				$flag = false; // да есть свои компоненты
				
				$my_components = mso_explode($ar[$current_url], false, true, false, false);
				
				foreach($my_components as $dir) {
					if ($fn = mso_fe('components/' . $dir . '/' . $dir . '.php')) $out[$dir] = $fn;
					elseif ($fn = mso_fe('components/' . $dir . '/index.php')) $out[$dir] = $fn;
				}
			}
		}		
	}
		
	if ($flag) {
		// общие компоненты
		$my_components = [
			$type . '_component1' => 'default_' . $type . '_component1',
			$type . '_component2' => 'default_' . $type . '_component2',
			$type . '_component3' => 'default_' . $type . '_component3',
			$type . '_component4' => 'default_' . $type . '_component4',
			$type . '_component5' => 'default_' . $type . '_component5',
		];

		foreach ($my_components as $option => $def_component) {
			if ($dir = mso_get_option($option, getinfo('template'), $def_component)) {
				if ($fn = mso_fe('components/' . $dir . '/' . $dir . '.php')) $out[$dir] = $fn;
				elseif ($fn = mso_fe('components/' . $dir . '/index.php')) $out[$dir] = $fn;
			}
			
		}
	}
	
	$r[$type] = $out;
	
	return $out;
}

/**
 * функция подключает файлы js-файлы компонентов
 * Имя js-файла совпадает и каталогом компонента
 * Также подключается файл _head.php, если есть
 */
function my_out_component_js()
{
	$components1 = my_get_components('header');
	$components2 = my_get_components('footer');
	
	$components = array_merge($components1, $components2);
	
	foreach($components as $dir => $fn) {
		mso_add_file('components/' . $dir . '/' . $dir . '.js');
		
		if ($fn = mso_fe('components/' . $dir . '/_head.php')) require $fn;
	}	
}

/**
 * функция подключает файлы style.css установленных компонентов
 * 
 */
function my_out_component_css()
{
	$components1 = my_get_components('header');
	$components2 = my_get_components('footer');
	
	$components = array_merge($components1, $components2);
	
	foreach($components as $dir => $fn) {
		mso_add_file('components/' . $dir . '/style.css'); // подключаем внешими стилями
	}
}

/**
 * Раняя инициализация компонентов в момент загрузки шаблона
 * Если в подключенном компоненте есть файл _init.php, то он подключается
 */
function my_init_components()
{
	$components1 = my_get_components('header');
	$components2 = my_get_components('footer');
	
	$components = array_merge($components1, $components2);
	
	foreach($components as $dir => $fn) {
		if ($fn = mso_fe('components/' . $dir . '/_init.php')) require $fn;
	}
}

/**
 * присваивает опции (для текущего шаблона) значение
 * если опция не содержит заданного значение
 * если $imp = true то принудительно ставим опцию
 */
function my_set_opt($key, $val = '', $imp = false)
{
	if ($imp) {
		mso_add_option($key, $val, getinfo('template'));
	} else {
		if (mso_get_option($key, getinfo('template'), false) != $val)
			mso_add_option($key, $val, getinfo('template'));
	}
}

# end of file
