<?php
/**
 * @version   $Id: gantry.php 2468 2012-08-17 06:16:57Z btowles $
 * @author    RocketTheme http://www.rockettheme.com
 * @copyright Copyright (C) 2007 - 2012 RocketTheme, LLC
 * @license   http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 only
 *
 * Gantry uses the Joomla Framework (http://www.joomla.org), a GNU/GPLv2 content management system
 *
 */

defined('JPATH_BASE') or die();

if (!defined('GANTRY_VERSION')) {

	/** @var $gantry Gantry */
	global $gantry;

	/**
	 * @name GANTRY_VERSION
	 */
	define('GANTRY_VERSION', '4.0.5');

	if (!defined('DS')) {
		define('DS', DIRECTORY_SEPARATOR);
	}

	require_once (realpath(dirname(__FILE__)) . '/core/gantryloader.class.php');

	/**
	 * @param  string $path the gantry path to the class to import
	 *
	 * @return void
	 */
	function gantry_import($path)
	{
		return GantryLoader::import($path);
	}

	/**
	 * Adds a script file to the document with platform based checks
	 *
	 * @param  $file
	 *
	 * @return void
	 */
	function gantry_addScript($file)
	{
		gantry_import('core.gantryplatform');
		$platform      = new GantryPlatform();
		$document      = JFactory::getDocument();
		$filename      = basename($file);
		$relative_path = dirname($file);

		// For local url path get the local path based on checks
		$file_path       = gantry_getFilePath($file);
		$url_file_checks = $platform->getJSChecks($file_path, true);
		foreach ($url_file_checks as $url_file) {
			$full_path = realpath($url_file);
			if ($full_path !== false && file_exists($full_path)) {
				$document->addScript($relative_path . '/' . basename($full_path) . '?ver=4.0.5');
				break;
			}
		}
	}

	/**
	 * Add inline script to the document
	 *
	 * @param  $script
	 *
	 * @return void
	 */
	function gantry_addInlineScript($script)
	{
		$document = JFactory::getDocument();
		$document->addScriptDeclaration($script);
	}

	/**
	 * Add a css style file to the document with browser based checks
	 *
	 * @param  $file
	 *
	 * @return void
	 */
	function gantry_addStyle($file)
	{
		gantry_import('core.gantrybrowser');
		$browser       = new GantryBrowser();
		$document      = JFactory::getDocument();
		$filename      = basename($file);
		$relative_path = dirname($file);

		// For local url path get the local path based on checks
		$file_path       = gantry_getFilePath($file);
		$url_file_checks = $browser->getChecks($file_path, true);
		foreach ($url_file_checks as $url_file) {
			$full_path = realpath($url_file);
			if ($full_path !== false && file_exists($full_path)) {
				$document->addStyleSheet($relative_path . '/' . basename($full_path) . '?ver=4.0.5');
			}
		}
	}

	/**
	 * Add inline css to the document
	 *
	 * @param  $css
	 *
	 * @return void
	 */
	function gantry_addInlineStyle($css)
	{
		$document = JFactory::getDocument();
		$document->addStyleDeclaration($css);
	}

	/**
	 * Get the current template name either from the front end or the template being edited on the backend
	 * @return null|string
	 */
	function gantry_getTemplateById($id = 0)
	{
		$templates = gantry_getAllTemplates();
		$template  = $templates[$id];
		return $template;
	}

	/**
	 * @return array|mixed
	 */
	function gantry_getAllTemplates()
	{
		$cache = JFactory::getCache('com_templates', '');
		$tag   = JFactory::getLanguage()->getTag();

		$templates = $cache->get('templates0' . $tag);
		if ($templates === false) {
			// Load styles
			$db    = JFactory::getDbo();
			$query = $db->getQuery(true);
			$query->select('id, home, template, params');
			$query->from('#__template_styles');
			$query->where('client_id = 0');

			$db->setQuery($query);
			$templates = $db->loadObjectList('id');
			foreach ($templates as &$template) {
				$registry = new JRegistry;
				$registry->loadString($template->params);
				$template->params = $registry;

				// Create home element
				if ($template->home == '1' && !isset($templates[0]) && $template->home == $tag) {
					$templates[0] = clone $template;
				}
			}
			$cache->store($templates, 'templates0' . $tag);
		}

		return $templates;
	}

	/**
	 * @param $template_name
	 *
	 * @return bool
	 */
	function gantry_getMasterTemplateStyleByName($template_name)
	{
		$templates = gantry_getAllTemplates();
		foreach ($templates as $template) {
			if ($template->template == $template_name && $template->params->get('master') == 'true') {
				return $template;
			}
		}
		return false;
	}


	/**
	 * @return bool|string
	 */
	function gantry_getTemplate()
	{
		// if its an ajax call then return the requested template master
		if (JRequest::getWord('option') == 'com_gantry' && JRequest::getWord('task') == 'ajax') {
			$template_name = JRequest::getString('template');
			$template      = gantry_getMasterTemplateStyleByName($template_name);
		} else {
			$app      = JFactory::getApplication();
			$template = $app->getTemplate(true);
		}
		return $template;
	}


	/**
	 * @param int $id
	 *
	 * @return mixed
	 */
	function gantry_getTemplateParams($id = 0)
	{
		$template = gantry_getTemplateById($id);
		return $template->params;
	}

	/**
	 * @param      $params
	 * @param null $parent_name
	 *
	 * @return array
	 */
	function gantry_flattenParams($params, $parent_name = null)
	{
		$values = array();
		foreach ($params as $param_name => $param_value) {
			$pname = (null != $parent_name) ? $parent_name . '-' : '';
			if (is_array($param_value)) {
				$sub_values = gantry_flattenParams($param_value, $param_name);
				foreach ($sub_values as $sub_value_name => $sub_value) {
					$values[$pname . $sub_value_name] = $sub_value;
				}
			} else {
				$values[$pname . $param_name] = $param_value;
			}
		}
		return $values;
	}

	/**
	 * @param $url
	 *
	 * @return string
	 */
	function gantry_getFilePath($url)
	{
		$uri  = JURI::getInstance();
		$base = $uri->toString(array('scheme', 'host', 'port'));
		$path = JURI::Root(true);
		if ($url && $base && strpos($url, $base) !== false) $url = preg_replace('|^' . $base . '|', "", $url);
		if ($url && $path && strpos($url, $path) !== false) $url = preg_replace('|^' . $path . '|', '', $url);
		if (substr($url, 0, 1) != '/') $url = '/' . $url;
		$filepath = JPATH_SITE . $url;
		return $filepath;
	}

	/**
	 *
	 */
	function gantry_setup()
	{
		gantry_import('core.gantry');
		gantry_import('core.utilities.gantrycache');
		jimport('joomla.html.parameter');

		/** @var $gantry Gantry */
		global $gantry;

		$template      = gantry_getTemplate();
		$template_name = $template->template;
		if ($template->params->get('master') != 'true') $template->params = gantry_getTemplateParams($template->params->get('master'));
		$conf = JFactory :: getConfig();
		$app  = JFactory::getApplication();
		if ($template->params->get("cache.enabled", 1) == 1) {
			$cache = GantryCache::getCache(GantryCache::GROUP_NAME);
			$cache->addWatchFile(JPATH_SITE . '/templates/' . $template_name . '/templateDetails.xml');
			$cache->addWatchFile(JPATH_SITE . '/templates/' . $template_name . '/template-options.xml');
			$gantry = $cache->call('Gantry-' . $template_name, array('Gantry', 'getInstance'), array($template_name));
		} else {
			$gantry = Gantry::getInstance($template_name);
		}
		$gantry->init();
	}

	/**
	 *
	 */
	function gantry_template_initialize()
	{
		if (defined('GANTRY_INITTEMPLATE')) {
			return;
		}
		define('GANTRY_INITTEMPLATE', "GANTRY_INITTEMPLATE");
		/** @var $gantry Gantry */
		global $gantry;
		$gantry->initTemplate();
	}

	/**
	 *
	 */
	function gantry_admin_setup()
	{
		gantry_import('core.gantry');
		gantry_import('core.utilities.gantrycache');

		/** @var $gantry Gantry */
		global $gantry;

		$template_id = gantry_admin_getCurrentTemplateId();

		$template = gantry_getTemplateById($template_id);

		$cache = GantryCache::getCache(GantryCache::ADMIN_GROUP_NAME, null, true);
		$cache->addWatchFile(JPATH_SITE . '/templates/' . $template->template . '/templateDetails.xml');
		$cache->addWatchFile(JPATH_SITE . '/templates/' . $template->template . '/template-options.xml');
		$gantry = $cache->call('Gantry-' . $template->template, array(
		                                                             'Gantry', 'getInstance'
		                                                        ), array($template->template));
		$gantry->adminInit();
	}


	/**
	 * @return bool
	 */
	function gantry_getCurrentTemplateId()
	{
		$id  = false;
		$app = JFactory::getApplication();
		if (!$app->isAdmin()) {
			// get from ajax passed in
			if (JRequest::getString('option') == 'com_gantry' && JRequest::getString('task') == 'ajax') {
				$template = JRequest::getString('template');
			} else {
				$template = $app->getTemplate(true);
			}
		}
		return $id;
	}


	/**
	 * Get the template style id that is being worked with on the admin side
	 *
	 * @return bool|int
	 */
	function gantry_admin_getCurrentTemplateId()
	{
		$id  = false;
		$app = JFactory::getApplication();
		if ($app->isAdmin()) {
			$session          = JFactory::getSession();
			$session_registry = $session->get('registry');


			if (JRequest::getint('id', 0) > 0 && JRequest::getString('option') == 'com_gantry' && JRequest::getString('layout') == 'edit'
			) {
				$id = JRequest::getInt('id', 0);
			} else if (JRequest::getString('option') == 'com_gantry' && JRequest::getString('task') == 'ajax') {
				$name = JRequest::getString('template');
				$id   = gantry_getMasterTemplateStyleByName($name)->id;
			} else if ($session_registry->exists('com_gantry.edit.template.id')) {
				$session_ids = $session_registry->get('com_gantry.edit.template.id');
				$id          = (int)array_shift($session_ids);
			}

		}

		return $id;
	}


	/**
	 * @param $filename
	 */
	function gantry_run_alternate_template($filename)
	{
		/** @var $gantry Gantry */
		global $gantry;
		// $filename comes from included scope
		$ext  = substr($filename, strrpos($filename, '.'));
		$file = basename($filename, $ext);

		$checks = $gantry->browser->getChecks($filename);

		$platform = $gantry->browser->platform;
		$enabled  = $gantry->get($platform . '-enabled', 0);
		$view     = 'viewswitcher-' . $gantry->get('template_prefix') . $platform . '-switcher';

		// flip to get most specific first
		$checks = array_reverse($checks);

		// remove the default index.php page
		array_pop($checks);

		$template_paths = array(
			$gantry->templatePath, $gantry->gantryPath . '/' . 'tmpl'
		);

		foreach ($template_paths as $template_path) {
			if (file_exists($template_path) && is_dir($template_path)) {
				foreach ($checks as $check) {
					$check_path = preg_replace("/\?(.*)/", '', $template_path . '/' . $check);
					if (file_exists($check_path) && is_readable($check_path) && $enabled && JRequest::getVar($view, false, 'COOKIE', 'STRING') != '0') {
						// include the wanted index page
						ob_start();
						include_once($check_path);
						$contents = ob_get_contents();
						ob_end_clean();
						$gantry->altindex = $contents;
						break;
					}
				}
				if ($gantry->altindex !== false) break;
			}
		}
	}

	/**
	 * @return bool
	 */
	function gantry_is_template_include()
	{
		/** @var $gantry Gantry */
		global $gantry;
		$stack = debug_backtrace();
		if ($stack[1]['file'] == realpath($gantry->templatePath . '/lib/gantry/gantry.php')) {
			return true;
		}
		return false;
	}

	// Run the appropriate init
	$app = JFactory::getApplication();
	if ($app->isAdmin()) {
		gantry_admin_setup();
	} else {
		gantry_setup();
		if (!gantry_is_template_include()) {
			// setup for post
			$dispatcher = JDispatcher::getInstance();
			$dispatcher->register('onAfterDispatch', 'gantry_template_initialize');
			$dispatcher->register('onGantryTemplateInit', 'gantry_run_alternate_template');
		} else {
			gantry_template_initialize();
			gantry_run_alternate_template($filename);
		}
	}
}

