<?php
/**
 *  base.php
 *
 * @copyright			(C) 2005-2010 NewsTeng Inc.
 * @license				This is NOT a freeware, use is subject to license terms
 * @lastmodify			2010-12-16
   $Id: base.php 2 2010-12-16 10:59:13Z xuchao $
 */
define ( 'IN_XTCMS', true );

// XTCMS框架路径
define ( 'XT_PATH', dirname ( __FILE__ ) . DIRECTORY_SEPARATOR );

if (! defined ( 'XTCMS_PATH' )) define ( 'XTCMS_PATH', XT_PATH . '..' . DIRECTORY_SEPARATOR );

// 缓存文件夹地址
define ( 'CACHE_PATH', XT_PATH . '..' . DIRECTORY_SEPARATOR . 'caches' . DIRECTORY_SEPARATOR );
// 主机协议
define ( 'SITE_PROTOCOL', isset ( $_SERVER ['SERVER_PORT'] ) && $_SERVER ['SERVER_PORT'] == '443' ? 'https://' : 'http://' );
// 当前访问的主机名
define ( 'SITE_URL', (isset ( $_SERVER ['HTTP_HOST'] ) ? $_SERVER ['HTTP_HOST'] : '') );
// 来源
define ( 'HTTP_REFERER', isset ( $_SERVER ['HTTP_REFERER'] ) ? $_SERVER ['HTTP_REFERER'] : '' );

// 系统开始时间
define ( 'SYS_START_TIME', microtime () );

// 加载公用函数库
base::load_sys_func ( 'global' );
base::load_config ( 'system', 'errorlog' ) ? set_error_handler ( 'my_error_handler' ) : error_reporting ( E_ERROR | E_WARNING | E_PARSE );
// 设置本地时差
function_exists ( 'date_default_timezone_set' ) && date_default_timezone_set ( base::load_config ( 'system', 'timezone' ) );

define ( 'CHARSET', base::load_config ( 'system', 'charset' ) );
// 输出页面字符集
header ( 'Content-type: text/html; charset=' . CHARSET );

define ( 'SYS_TIME', time () );
// 定义网站根路径
define ( 'WEB_PATH', base::load_config ( 'system', 'web_path' ) );
// js 路径
define ( 'JS_PATH', base::load_config ( 'system', 'js_path' ) );
// css 路径
define ( 'CSS_PATH', base::load_config ( 'system', 'css_path' ) );
// img 路径
define ( 'IMG_PATH', base::load_config ( 'system', 'img_path' ) );
// 动态程序路径
define ( 'APP_PATH', base::load_config ( 'system', 'app_path' ) );

if (base::load_config ( 'system', 'gzip' ) && function_exists ( 'ob_gzhandler' )) {
	ob_start ( 'ob_gzhandler' );
} else {
	ob_start ();
}

class base {

	/**
	 * 初始化应用程序
	 */
	public static function creat_app() {
		return self::load_sys_class ( 'application' );
	}
	/**
	 * 加载系统类方法
	 *
	 * @param string $classname
	 *        	类名
	 * @param string $path
	 *        	扩展地址
	 * @param intger $initialize
	 *        	是否初始化
	 */
	public static function load_sys_class($classname, $path = '', $initialize = 1) {
		return self::_load_class ( $classname, $path, $initialize );
	}

	/**
	 * 加载应用类方法
	 *
	 * @param string $classname
	 *        	类名
	 * @param string $m
	 *        	模块
	 * @param intger $initialize
	 *        	是否初始化
	 */
	public static function load_app_class($classname, $m = '', $initialize = 1) {
		$m = empty ( $m ) && defined ( 'ROUTE_M' ) ? ROUTE_M : $m;
		if (empty ( $m )) return false;
		return self::_load_class ( $classname, 'modules' . DIRECTORY_SEPARATOR . $m . DIRECTORY_SEPARATOR . 'classes', $initialize );
	}

	/**
	 * 加载数据模型
	 *
	 * @param string $classname
	 *        	类名
	 */
	public static function load_model($classname) {
		return self::_load_class ( $classname, 'model' );
	}

	/**
	 * 加载类文件函数
	 *
	 * @param string $classname
	 *        	类名
	 * @param string $path
	 *        	扩展地址
	 * @param intger $initialize
	 *        	是否初始化
	 */
	private static function _load_class($classname, $path = '', $initialize = 1) {
		static $classes = array ();
		if (empty ( $path )) $path = 'libs' . DIRECTORY_SEPARATOR . 'classes';
		$key = md5 ( $path . $classname );
		if (isset ( $classes [$key] )) {
			if (! empty ( $classes [$key] )) {
				return $classes [$key];
			} else {
				return true;
			}
		}
		if (file_exists ( XT_PATH . $path . DIRECTORY_SEPARATOR . $classname . '.class.php' )) {
			include XT_PATH . $path . DIRECTORY_SEPARATOR . $classname . '.class.php';
			$name = $classname;
			if ($my_path = self::my_path ( XT_PATH . $path . DIRECTORY_SEPARATOR . $classname . '.class.php' )) {
				include $my_path;
				$name = 'MY_' . $classname;
			}
			if ($initialize) {
				$classes [$key] = new $name ();
			} else {
				$classes [$key] = true;
			}
			return $classes [$key];
		} else {
			return false;
		}
	}

	/**
	 * 加载系统的函数库
	 *
	 * @param string $func
	 *        	函数库名
	 */
	public static function load_sys_func($func) {
		return self::_load_func ( $func );
	}

	/**
	 * 加载应用函数库
	 *
	 * @param string $func
	 *        	函数库名
	 * @param string $m
	 *        	模型名
	 */
	public static function load_app_func($func, $m = '') {
		$m = empty ( $m ) && defined ( 'ROUTE_M' ) ? ROUTE_M : $m;
		if (empty ( $m )) return false;
		return self::_load_func ( $func, 'modules' . DIRECTORY_SEPARATOR . $m . DIRECTORY_SEPARATOR . 'functions' );
	}

	/**
	 * 加载函数库
	 *
	 * @param string $func
	 *        	函数名
	 * @param string $path
	 *        	地址
	 */
	private static function _load_func($func, $path = '') {
		static $funcs = array ();
		if (empty ( $path )) $path = 'libs' . DIRECTORY_SEPARATOR . 'functions';
		$path .= DIRECTORY_SEPARATOR . $func . '.func.php';
		$key = md5 ( $path );
		if (isset ( $funcs [$key] )) return true;
		if (file_exists ( XT_PATH . $path )) {
			include XT_PATH . $path;
		} else {
			$funcs [$key] = false;
			return false;
		}
		$funcs [$key] = true;
		return true;
	}

	/**
	 * 是否有自己的扩展文件
	 *
	 * @param string $filepath
	 *        	路径
	 */
	public static function my_path($filepath) {
		$path = pathinfo ( $filepath );
		if (file_exists ( $path ['dirname'] . DIRECTORY_SEPARATOR . 'MY_' . $path ['basename'] )) {
			return $path ['dirname'] . DIRECTORY_SEPARATOR . 'MY_' . $path ['basename'];
		} else {
			return false;
		}
	}

	/**
	 * 加载配置文件
	 *
	 * @param string $file
	 *        	配置文件
	 * @param string $key
	 *        	要获取的配置荐
	 * @param string $default
	 *        	默认配置。当获取配置项目失败时该值发生作用。
	 * @param boolean $reload
	 *        	强制重新加载。
	 */
	public static function load_config($file, $key = '', $default = '', $reload = false) {
		static $configs = array ();
		if (! $reload && isset ( $configs [$file] )) {
			if (empty ( $key )) {
				return $configs [$file];
			} elseif (isset ( $configs [$file] [$key] )) {
				return $configs [$file] [$key];
			} else {
				return $default;
			}
		}
		$path = XTCMS_PATH . 'configs' . DIRECTORY_SEPARATOR . $file . '.php';
		if (file_exists ( $path )) {
			$configs [$file] = include $path;
		}
		if (empty ( $key )) {
			return $configs [$file];
		} elseif (isset ( $configs [$file] [$key] )) {
			return $configs [$file] [$key];
		} else {
			return $default;
		}
	}
}