/**
  * @brief head 输出头部信息
  *
  * @return void
  */
 public function head()
 {
     $head = '<meta http-equiv="content-type" content="text/html; charset=UTF-8" />' . "\n";
     $head .= '<meta name="description" content="';
     $head .= $this->description ? $this->description : OptionLibrary::get('description');
     $head .= '" />' . "\n";
     $head .= '<meta name="keywords" content="';
     $head .= $this->keywords ? $this->keywords . ',' . OptionLibrary::get('keywords') : OptionLibrary::get('keywords');
     $head .= '" />' . "\n";
     $head .= '<meta name="generator" content="LogX V' . LOGX_VERSION . '" />' . "\n";
     echo Plugin::call('head', $head);
 }
 /**
  * @brief register 用户注册
  *
  * @return void
  */
 public function register()
 {
     if (OptionLibrary::get('register') == 'close') {
         $r = array('success' => FALSE, 'message' => _t('Register closed.'));
         Response::ajaxReturn($r);
         return;
     }
     $u = array();
     $u['username'] = Request::P('username', 'string');
     $u['email'] = Request::P('email', 'string');
     if ($u['username'] == NULL || $u['email'] == NULL) {
         $r = array('success' => FALSE, 'message' => _t('Username or Email missed.'));
         Response::ajaxReturn($r);
         return;
     }
     $u['password'] = LogX::randomString(8);
     $u['website'] = '';
     $u['group'] = 1;
     $user = new UserLibrary();
     if ($uid = $user->addUser($u)) {
         $r = array('success' => TRUE, 'message' => sprintf(_t('Register successed, you password is <b>%s</b>.'), $u['password']));
     } else {
         $r = array('success' => FALSE, 'message' => _t('Username or Email existed.'));
     }
     Response::ajaxReturn($r);
 }
?>
</label>
				</li>
				</ul>
				<p class="description"><?php 
_e('Please make sure that your server supports rewrite.');
?>
</p>
			</li>
			<li>
				<label class="add-post-label" for="timezone"><?php 
_e('Timezone');
?>
</label>
				<?php 
$timezone = OptionLibrary::get('timezone');
?>
				<ul class="clearfix">
				<li>
					<select name="timezone" id="timezone">
					<option value="Etc/GMT"<?php 
if ($timezone == 'Etc/GMT') {
    ?>
 selected="true"<?php 
}
?>
>格林威治(子午线)标准时间 (GMT)</option>
					<option value="Etc/GMT-1"<?php 
if ($timezone == 'Etc/GMT-1') {
    ?>
 selected="true"<?php 
 /**
  * @brief patch 路由组装
  *
  * @param $routeName 路由名
  * @param $params 路由规则参数
  *
  * @return string
  */
 public static function patch($routeName, $params)
 {
     if ($route = self::getRoute($routeName)) {
         $pattern = array();
         foreach ($route['params'] as $row) {
             $pattern[$row] = isset($params[$row]) ? $params[$row] : '{' . $row . '}';
         }
         if (OptionLibrary::get('rewrite') == 'open') {
             return Request::getDomain() . substr(LOGX_PATH, 0, strlen(LOGX_PATH) - 1) . vsprintf($route['format'], $pattern);
         } else {
             return Request::getDomain() . LOGX_PATH . 'index.php' . vsprintf($route['format'], $pattern);
         }
     } else {
         return '';
     }
 }
 /**
  * @brief showAttachment 防盗链显示、下载附件
  *
  * @param $params 参数
  *
  * @return void
  */
 public function showAttachment($params)
 {
     $meta = new MetaLibrary();
     $meta->setType(3);
     $meta->setMID($params['mid']);
     if (!($m = $meta->getMeta())) {
         Response::error(404);
         return;
     }
     $m = $m[0];
     // 判断 referer 防盗链
     $referer = Request::S('HTTP_REFERER', 'string');
     if ($referer) {
         $referer = parse_url($referer);
         $host = parse_url(OptionLibrary::get('domain'));
         if (LogX::getDomain($referer['host']) != LogX::getDomain($host['host'])) {
             Response::error(403);
             exit;
         }
     }
     $m['alias'] = LOGX_FILE . $m['alias'];
     // 通过判断getimagesize取出的图片信息是否存在类型标记和色彩位深来防止伪造。
     $isimage = false;
     if (stristr($m['description'], 'image')) {
         if (function_exists('getimagesize')) {
             $imginfo = @getimagesize($m['alias']);
             if (isset($imginfo[2]) && isset($imginfo['bits'])) {
                 $isimage = true;
             }
             unset($imginfo);
         } else {
             $isimage = true;
         }
     }
     // 附件读取形式,inline直接读取,attachment下载到本地
     $disposition = $isimage ? 'inline' : 'attachment';
     // 统计附件下载次数
     if ($disposition == 'attachment') {
         $meta->incReply($params['mid']);
     }
     $m['description'] = $m['description'] ? $m['description'] : 'application/octet-stream';
     if (is_readable($m['alias'])) {
         @ob_end_clean();
         if ($disposition == 'inline') {
             Response::setExpire(60 * 24 * 365);
         }
         header('content-Encoding: none');
         header('content-type: ' . $m['description']);
         header('content-Disposition: ' . $disposition . '; filename=' . urlencode($m['name']));
         header('content-Length: ' . abs(filesize($m['alias'])));
         $fp = @fopen($m['alias'], 'rb');
         @fpassthru($fp);
         @fclose($fp);
         exit;
     } else {
         Response::error(404);
     }
 }
 /**
  * @brief postPath 输出文章路径
  *
  * @return void
  */
 public function postPath()
 {
     // 检查是否有文章
     if (!$this->postHave()) {
         return;
     }
     $path = $this->postTitle(0, FALSE);
     $meta = new MetaLibrary();
     $meta->setType(1);
     $meta->setPID($this->postID(FALSE));
     $metas = $meta->getMeta();
     $me = isset($metas[0]['mid']) ? $metas[0]['mid'] : 0;
     $m = isset($metas[0]) ? $metas[0] : array();
     $meta->setPID(0);
     while ($me) {
         $path = '<a href="' . Router::patch('Category', array('alias' => $m['alias'])) . '">' . $m['name'] . '</a> &raquo; ' . $path;
         if ($m['parent'] == 0) {
             break;
         }
         $meta->setMID($m['parent']);
         $metas = $meta->getMeta();
         $me = isset($metas[0]['mid']) ? $metas[0]['mid'] : 0;
         $m = isset($metas[0]) ? $metas[0] : array();
     }
     $path = '<a href="' . LOGX_PATH . '">' . OptionLibrary::get('title') . '</a> &raquo; ' . $path;
     echo $path;
 }
		},
		success: function(data){
			data = eval('('+data+')');
			if( data.success ) {
				$("#tabRegister").html('<div class="success">'+data.message+'</div>');
			} else {
				$("#login-tips").html('<font color="red">'+data.message+'</font>');
				$("#r_submit").attr('disabled',false);
			}
		}});
	});
	</script>
</head>
<body style="background-color: #F6F8FF;">
<?php 
$register = OptionLibrary::get('register') == 'close' ? FALSE : TRUE;
?>
	<div id="content">
		<div id="content-in">
			<dl class="Tabs login-box">
				<dt id="AdminTabs"><a href="#tabLogin" class="select"><?php 
_e('Login');
?>
</a> <?php 
if ($register) {
    ?>
<a href="#tabRegister"><?php 
    _e('Register');
    ?>
</a><?php 
}
 /**
  * @brief advancedSettingsDo 保存高级设置
  *
  * @return void
  */
 private function advancedSettingsDo()
 {
     // 验证用户权限
     if (!Widget::getWidget('User')->isAdmin()) {
         Response::ajaxReturn(array('success' => FALSE, 'message' => _t('Permission denied.')));
         return;
     }
     $rewrite = Request::P('rewrite', 'string');
     $timezone = Request::P('timezone', 'string');
     $register = Request::P('register', 'string');
     if (!$rewrite || !$timezone || !$register) {
         $r = array('success' => FALSE, 'message' => _t('Option can not be null.'));
         Response::ajaxReturn($r);
     } else {
         if ($rewrite == 'close') {
             if (file_exists(LOGX_ROOT . '.htaccess') && !@unlink(LOGX_ROOT . '.htaccess')) {
                 $r = array('success' => FALSE, 'message' => _t('Can not delete .htaccess file.'));
                 Response::ajaxReturn($r);
                 return;
             }
         } else {
             $content = "# BEGIN LogX\n\n<IfModule mod_rewrite.c>\nRewriteEngine On\nRewriteBase " . LOGX_PATH . "\nRewriteCond \$1 ^(index\\.php)?\$ [OR]\nRewriteCond \$1 \\.(gif|jpg|png|css|js|ico)\$ [NC,OR]\nRewriteCond %{REQUEST_FILENAME} -f [OR]\nRewriteCond %{REQUEST_FILENAME} -d\nRewriteRule ^(.*)\$ - [S=1]\nRewriteRule . " . LOGX_PATH . "index.php [L]\n</IfModule>\n\n# END LogX";
             if (!file_exists(LOGX_ROOT . '.htaccess') && !@file_put_contents(LOGX_ROOT . '.htaccess', $content)) {
                 $r = array('success' => FALSE, 'message' => _t('Can not create .htaccess file.'));
                 Response::ajaxReturn($r);
                 return;
             }
         }
         OptionLibrary::set('rewrite', $rewrite);
         OptionLibrary::set('timezone', $timezone);
         OptionLibrary::set('register', $register);
         $r = array('success' => TRUE, 'message' => _t('Settings Saved.'));
         Response::ajaxReturn($r);
     }
 }
 /**
  * @brief init LogX 全局初始化方法
  *
  * @return void
  */
 public static function init()
 {
     // 输出 Logo
     if (isset($_GET['591E-D5FC-8065-CD36-D3E8-E45C-DB86-9197'])) {
         Response::logo();
     }
     // 非 DEBUG 模式下关闭错误输出
     if (defined('LOGX_DEBUG')) {
         error_reporting(E_ALL);
     } else {
         error_reporting(0);
     }
     // 设置自动载入函数
     function __autoLoad($className)
     {
         if (substr($className, -7) == 'Library' && is_file(LOGX_LIB . $className . '.php')) {
             @(require_once LOGX_LIB . $className . '.php');
         }
     }
     // 设置错误与异常处理函数
     set_error_handler(array(__CLASS__, 'error'));
     set_exception_handler(array(__CLASS__, 'exception'));
     // 运行环境检查
     if (!version_compare(PHP_VERSION, '5.0.0', '>=')) {
         throw new LogXException(sprintf(_t('LogX needs PHP 5.0.x or higher to run. You are currently running PHP %s.'), PHP_VERSION));
     }
     if (!version_compare(PHP_VERSION, '5.2.0', '>=')) {
         // 针对低版本 PHP 的兼容代码
         @(require_once LOGX_CORE . 'Compat.php');
     }
     // 设置语言
     if (defined('LOGX_LANGUAGE')) {
         Language::set(LOGX_LANGUAGE);
     } else {
         Language::set('zh-cn');
     }
     // 预编译核心文件
     global $coreFiles;
     if (!defined('LOGX_DEBUG') && !file_exists(LOGX_CACHE . '~core.php')) {
         Compile::build(LOGX_CACHE, $coreFiles, 'core');
     } elseif (!defined('LOGX_DEBUG')) {
         $file_time = filemtime(LOGX_CACHE . '~core.php');
         foreach ($coreFiles as $file) {
             if (filemtime($file) > $file_time) {
                 Compile::build(LOGX_CACHE, $coreFiles, 'core');
                 break;
             }
         }
     }
     self::$_globalVars = array('RUN' => array('TIME' => microtime(TRUE), 'MEM' => function_exists('memory_get_usage') ? memory_get_usage() : 0, 'LANG' => 'zh-cn'), 'SYSTEM' => array('OS' => PHP_OS, 'HTTP' => Request::S('SERVER_SOFTWARE', 'string'), 'PHP' => PHP_VERSION, 'MYSQL' => ''), 'SUPPORT' => array('MYSQL' => function_exists('mysql_connect'), 'GD' => function_exists('imagecreate'), 'MEMCACHE' => function_exists('memcache_connect'), 'SHMOP' => function_exists('shmop_open'), 'GZIP' => function_exists('ob_gzhandler'), 'TIMEZONE' => function_exists('date_default_timezone_set'), 'AUTOLOAD' => function_exists('spl_autoload_register')), 'INI' => array('ALLOW_CALL_TIME_PASS_REFERENCE' => ini_get('allow_call_time_pass_reference'), 'MAGIC_QUOTES_GPC' => ini_get('magic_quotes_gpc'), 'REGISTER_GLOBALS' => ini_get('register_globals'), 'ALLOW_URL_FOPEN' => ini_get('allow_url_fopen'), 'ALLOW_URL_INCLUDE' => ini_get('allow_url_include'), 'SAFE_MODE' => ini_get('safe_mode'), 'MAX_EXECUTION_TIME' => ini_get('max_execution_time'), 'MEMORY_LIMIT' => ini_get('memory_limit'), 'POST_MAX_SIZE' => ini_get('post_max_size'), 'FILE_UPLOADS' => ini_get('file_uploads'), 'UPLOAD_MAX_FILESIZE' => ini_get('upload_max_filesize'), 'MAX_FILE_UPLOADS' => ini_get('max_file_uploads')));
     // 清除不需要的变量,防止变量注入
     $defined_vars = get_defined_vars();
     foreach ($defined_vars as $key => $value) {
         if (!in_array($key, array('_POST', '_GET', '_COOKIE', '_SERVER', '_FILES'))) {
             ${$key} = '';
             unset(${$key});
         }
     }
     // 对用户输入进行转义处理
     if (!get_magic_quotes_gpc()) {
         $_GET = self::addSlashes($_GET);
         $_POST = self::addSlashes($_POST);
         $_COOKIE = self::addSlashes($_COOKIE);
     }
     // 开启输出缓存
     if (defined('LOGX_GZIP') && self::$_globalVars['SUPPORT']['GZIP']) {
         ob_start('ob_gzhandler');
     } else {
         ob_start();
     }
     // 连接到数据库
     Database::connect(DB_HOST, DB_USER, DB_PWD, DB_NAME, DB_PCONNECT);
     self::$_globalVars['SYSTEM']['MYSQL'] = Database::version();
     // 设定时区
     if (self::$_globalVars['SUPPORT']['TIMEZONE']) {
         date_default_timezone_set(OptionLibrary::get('timezone'));
     }
     // 连接到缓存
     Cache::connect(CACHE_TYPE);
     // 初始化路由表
     Router::init();
     // 初始化主题控制器
     Theme::init();
     // 初始化 Plugin
     Plugin::initPlugins();
     // 初始化全局组件
     Widget::initWidget('Global');
     Widget::initWidget('Widget');
     Widget::initWidget('Page');
     Widget::initWidget('User');
     // 尝试自动登录
     Widget::getWidget('User')->autoLogin();
     // 启动路由分发
     Router::dispatch();
 }
 /**
  * @brief setTheme 设置默认主题
  *
  * @param $theme 主题名称
  *
  * @return bool
  */
 public static function setTheme($theme)
 {
     if (in_array($theme, self::$_themes)) {
         OptionLibrary::set('theme', $theme);
         return TRUE;
     } else {
         return FALSE;
     }
 }