<?php defined('SYSPATH') or die('No direct access allowed.');

/**
 * This class overrides Kohana's Core
 *
 * @package    OSB
 * @category   Modifications
 * @author     Deon George
 * @copyright  (c) 2009-2013 Open Source Billing
 * @license    http://dev.osbill.net/license.html
 */
abstract class Kohana extends Kohana_Core {
	/**
	 * Work out our Class Name as per Kohana's standards
	 */
	public static function classname($name) {
		return str_replace(' ','_',ucwords(strtolower(str_replace('_',' ',$name))));
	}

	/**
	 * Find files using a multi-site enabled application
	 *
	 * In order of precedence, we'll return:
	 * 1) site-theme file,	ie: site/X/THEME/${file}
	 * 2) site file,	ie: site/X/${file}
	 * 3) theme file,	ie: THEME/${file}
	 * 4) normal search,	ie: ${file}
	 */
	public static function find_file($dir,$file,$ext=NULL,$array=FALSE) {
		// Limit our scope to the following dirs
		// @note, we cannot have classes checked, since Config() doesnt exist yet
		$dirs = array('views','media');

		if (! in_array($dir,$dirs) OR PHP_SAPI === 'cli')
			return parent::find_file($dir,$file,$ext,$array);

		$prefixes = array('');

		// Our search order.
		array_unshift($prefixes,Config::theme().'/');
		array_unshift($prefixes,sprintf('site/%s/',Config::siteid()));
		array_unshift($prefixes,sprintf('site/%s/%s/',Config::siteid(),Config::theme()));

		foreach ($prefixes as $p)
			if ($x = parent::find_file($dir,$p.$file,$ext,$array))
				break;

		// We found a path.
		return $x;
	}

	/**
	 * Override Kohana's shutdown_handler()
	 *
	 * When set up for multi-site, we need to disable Kohana's caching
	 * unless each site has exactly the same modules enabled.
	 * This is because Kohana::$file is cached with the enabled modules
	 * and is not OSB multi-site aware.
	 */
	public static function shutdown_handler() {
		// If caching isnt enabled, we can skip this anyway
		if (! Kohana::$caching)
			return parent::shutdown_handler();

		Kohana::$caching = FALSE;
		$result = parent::shutdown_handler();
		Kohana::$caching = TRUE;

		return $result;
	}
}
?>
