<?php

/* 

 * Edition:	ET080708

 * Desc:	Core Engine 3 (Memcache/Compile/Replace)

 * File:	template.core.php

 * Author:	David Meng

 * Site:	http://www.systn.com

 * Email:	mdchinese@gmail.com

 * 

 */

error_reporting(0);



define("ET3!",TRUE);

class ETCore{

	var $ThisFile	= '';				//当前文件

	var $IncFile	= '';				//引入文件

	var $ThisValue	= array();			//当前数值

	var $FileList	= array();			//载入文件列表

	var $IncList	= array();			//引入文件列表

	var $ImgDir		= array('images');	//图片地址目录

	var $HtmDir		= 'cache_htm/';		//静态存放的目录

	var $HtmID		= '';				//静态文件ID

	var $HtmTime	= '180';			//秒为单位，默认三分钟

	var $AutoImage	= 1;				//自动解析图片目录开关默认值

	var $Hacker		= "<?php if(!defined('ET3!')){die('You are Hacker!<br>Power by Ease Template!');}";

	var $Compile	= array();

	var $Analysis	= array();

	var $Emc		= array();



	/**

	*	声明模板用法

	*/

	function ETCoreStart(

		$set = array(

				'ID'		 =>'1',					//缓存ID

				'TplType'	 =>'htm',				//模板格式

				'CacheDir'	 =>'cache',				//缓存目录

				'TemplateDir'=>'template' ,			//模板存放目录

				'AutoImage'	 =>'on' ,				//自动解析图片目录开关 on表示开放 off表示关闭

				'LangDir'	 =>'language' ,			//语言文件存放的目录

				'Language'	 =>'default' ,			//语言的默认文件

				'Copyright'	 =>'off' ,				//版权保护

				'MemCache'	 =>'' ,					//Memcache服务器地址例如:127.0.0.1:11211

			)

		){



		$this->TplID		= (defined('TemplateID')?TemplateID:( ((int)@$set['ID']<=1)?1:(int)$set['ID']) ).'_';



		$this->CacheDir   	= (defined('NewCache')?NewCache:( (trim($set['CacheDir']) != '')?$set['CacheDir']:'cache') ).'/';



		$this->TemplateDir	= (defined('NewTemplate')?NewTemplate:( (trim($set['TemplateDir']) != '')?$set['TemplateDir']:'template') ).'/';



		$this->Ext			= (@$set['TplType'] != '')?$set['TplType']:'htm';



		$this->AutoImage	= (@$set['AutoImage']=='off')?0:1;

		

		$this->Copyright	= (@$set['Copyright']=='off')?0:1;

		

		$this->Server		= (is_array($GLOBALS['_SERVER']))?$GLOBALS['_SERVER']:$_SERVER;

		$this->version		= (trim($_GET['EaseTemplateVer']))?die('Ease Templae E3!'):'';

		

		//载入语言文件

		$this->LangDir		= (defined('LangDir')?LangDir:( ((@$set['LangDir']!='language' && @$set['LangDir'])?$set['LangDir']:'language') )).'/';

		if(is_dir($this->LangDir)){

			$this->Language	= (defined('Language')?Language:( (($set['Language']!='default' && $set['Language'])?$set['Language']:'default') ));

			if(@is_file($this->LangDir.$this->Language.'.php')){

				$lang = array();

				@include_once $this->LangDir.$this->Language.'.php';

				$this->LangData = $lang;

			}

		}else{

			$this->Language = 'default';

		}

		

		

		//缓存目录检测以及运行模式

		if(@ereg(':',$set['MemCache'])){

			$this->RunType		= 'MemCache';

			$memset		= explode(":",$set['MemCache']);

			$this->Emc	= memcache_connect($memset[0], $memset[1]) OR die("Could not connect!");

		}else{

	  	 	$this->RunType		= (@substr(@sprintf('%o', @fileperms($this->CacheDir)), -3)==777 && is_dir($this->CacheDir))?'Cache':'Replace';

		}

		

		$CompileBasic = array(

				'/(\{\s*|<!--\s*)inc_php:([a-zA-Z0-9_\[\]\.\,\/\?\=\#\:\;\-\|\^]{5,200})(\s*\}|\s*-->)/eis',



				'/<!--\s*DEL\s*-->/is',

				'/<!--\s*IF(\[|\()(.+?)(\]|\))\s*-->/is',

				'/<!--\s*ELSEIF(\[|\()(.+?)(\]|\))\s*-->/is',

				'/<!--\s*ELSE\s*-->/is',

				'/<!--\s*END\s*-->/is',

				'/<!--\s*([a-zA-Z0-9_\$\[\]\'\"]{2,60})\s*(AS|as)\s*(.+?)\s*-->/',

				'/<!--\s*while\:\s*(.+?)\s*-->/is',

					

				'/(\{\s*|<!--\s*)lang\:(.+?)(\s*\}|\s*-->)/eis',

				'/(\{\s*|<!--\s*)row\:(.+?)(\s*\}|\s*-->)/eis',

				'/(\{\s*|<!--\s*)color\:\s*([\#0-9A-Za-z]+\,[\#0-9A-Za-z]+)(\s*\}|\s*-->)/eis',

				'/(\{\s*|<!--\s*)dir\:([^\{\}]{1,100})(\s*\}|\s*-->)/eis',

				'/(\{\s*|<!--\s*)run\:(\}|\s*-->)\s*(.+?)\s*(\{|<!--\s*)\/run(\s*\}|\s*-->)/is',

				'/(\{\s*|<!--\s*)run\:(.+?)(\s*\}|\s*-->)/is',

				'/\{([a-zA-Z0-9_\'\"\[\]\$]{1,100})\}/',

		   );

		$this->Compile = (is_array($this->Compile))?array_merge($this->Compile,$CompileBasic):$CompileBasic;



		$AnalysisBasic = array(

				'$this->inc_php("\\2")',



				'";if($ET_Del==true){echo"',

				'";if(\\2){echo"',

				'";}elseif(\\2){echo"',

				'";}else{echo"',

				'";}echo"',

				'";\$_i=0;foreach((array)\\1 AS \\3){\$_i++;echo"',

				'";\$_i=0;while(\\1){\$_i++;echo"',

				

				'$this->lang("\\2")',

				'$this->Row("\\2")',

				'$this->Color("\\2")',

				'$this->Dirs("\\2")',

				'";\\3;echo"',

				'";\\2;echo"',

				'";echo \$\\1;echo"',

		   );

		$this->Analysis = (is_array($this->Analysis))?array_merge($this->Analysis,$AnalysisBasic):$AnalysisBasic;



	}





	/**

	*	设置数值

	*	set_var(变量名或是数组,设置数值[数组不设置此值]);

	*/

	function set_var(

				$name,

				$value = ''

			){

		if (is_array($name)){

			$this->ThisValue = @array_merge($this->ThisValue,$name);

		}else{

			$this->ThisValue[$name] = $value;

		}

	}





	/**

	*	设置模板文件

	*	set_file(文件名,设置目录);

	*/

	function set_file(

				$FileName,

				$NewDir = ''

			){

		//当前模板名

		$this->ThisFile  = $FileName.'.'.$this->Ext;



		//目录地址检测

		$this->FileDir[$this->ThisFile] = (trim($NewDir) != '')?$NewDir.'/':$this->TemplateDir;



		$this->IncFile[$FileName]		 = $this->FileDir[$this->ThisFile].$this->ThisFile;

		

		if(!is_file($this->IncFile[$FileName]) && $this->Copyright==1){

			die('Sorry, The file <b>'.$this->IncFile[$FileName].'</b> does not exist.');

		}

		

		

		//bug 系统

		$this->IncList[] = $this->ThisFile;

	}



	//解析替换程序

	function ParseCode(

				$FileList = '',

				$CacheFile = ''

			){

		//模板数据

		$ShowTPL = '';

		//解析续载

		if (@is_array($FileList) && $FileList!='include_page'){

			foreach ($FileList AS $K=>$V) {

				$ShowTPL .= $this->reader($V.$K);

			}

		}else{



			

			//如果指定文件地址则载入

			$SourceFile = ($FileList!='')?$FileList:$this->FileDir[$this->ThisFile].$this->ThisFile;

			

			if(!is_file($SourceFile) && $this->Copyright==1){

				die('Sorry, The file <b>'.$SourceFile.'</b> does not exist.');

			}

			

			$ShowTPL = $this->reader($SourceFile);

		}

		

		//引用模板处理

		$ShowTPL = $this->inc_preg($ShowTPL);

		

		//检测run方法

		$run = 0;

		if (eregi("run:",$ShowTPL)){

			$run	 = 1;

			//Fix =

			$ShowTPL = preg_replace('/(\{|<!--\s*)run:(\}|\s*-->)\s*=/','{run:}echo ',$ShowTPL);

			$ShowTPL = preg_replace('/(\{|<!--\s*)run:\s*=/','{run:echo ',$ShowTPL);

			//Fix Run 1

			$ShowTPL = preg_replace('/(\{|<!--\s*)run:(\}|\s*-->)\s*(.+?)\s*(\{|<!--\s*)\/run(\}|\s*-->)/is', '(T_T)\\3;(T_T!)',$ShowTPL);

		}

		

		//Fix XML

		if (eregi("<?xml",$ShowTPL)){

			$ShowTPL = @preg_replace('/<\?(xml.+?)\?>/is', '<ET>\\1</ET>', $ShowTPL);

		}

		

		//修复代码中\n换行错误

		$ShowTPL = str_replace('\\','\\\\',$ShowTPL);

 		//修复双引号问题

		$ShowTPL = str_replace('"','\"',$ShowTPL);

		

		//编译运算

 		$ShowTPL = @preg_replace($this->Compile, $this->Analysis, $ShowTPL);

 		

		//分析图片地址

 		$ShowTPL = $this->ImgCheck($ShowTPL);

 		

 		//Fix 模板中金钱符号

 		$ShowTPL = str_replace('$','\$',$ShowTPL);

 		

			//修复php运行错误

			$ShowTPL = @preg_replace("/\";(.+?)echo\"/e", '$this->FixPHP(\'\\1\')', $ShowTPL);

			

			//Fix Run 2

			if ($run==1){

				$ShowTPL = preg_replace("/\(T_T\)(.+?)\(T_T!\)/ise", '$this->FixPHP(\'\\1\')', $ShowTPL);

			}

			

			//还原xml

			$ShowTPL = (strrpos($ShowTPL,'<ET>'))?@preg_replace('/ET>(.+?)<\/ET/is', '?\\1?', $ShowTPL):$ShowTPL;

			

			//修复"问题

			$ShowTPL = str_replace('echo ""','echo "\"',$ShowTPL);

			

			

			//从数组中将变量导入到当前的符号表

			@extract($this->Value());

			ob_start();

			ob_implicit_flush(0);

				@eval('echo "'.$ShowTPL.'";');

				$contents = ob_get_contents();

			ob_end_clean();

			

			//Cache htm

			if($this->HtmID){

				$this->writer($this->HtmDir.$this->HtmID,$this->Hacker."?>".$contents);

			}

			

			

			//编译模板

			if ($this->RunType=='Cache'){

				$this->CompilePHP($ShowTPL,$CacheFile);

			}

			

			

			//错误检查

			if(strlen($contents)<=0){

				//echo $ShowTPL;

				die('<br>Sorry, Error or complicated syntax error exists in '.$SourceFile.' file.');

			}

			

		return $contents;

	}





	/**

	*  多语言

	*/

	function lang(

				$str = ''

			){

		if (is_dir($this->LangDir)){

			

			//采用MD5效验

			$id 	 = md5($str);

			

			//不存在数据则写入

			if($this->LangData[$id]=='' && $this->Language=='default'){

							

				//语言包文件

				if (@is_file($this->LangDir.$this->Language.'.php')){

					unset($lang);

					@include($this->LangDir.$this->Language.'.php');

				}

				

				

				//如果检测到有数据则输出

				if ($lang[$id]){

						$out	= str_replace('\\','\\\\',$lang[$id]);

					return str_replace('"','\"',$out);

				}

				

				

				//修复'多\问题

				$str = str_replace("\\'","'",$str);

				

				

				//语言文件过大时采取建立新文件

				if(strlen($docs)>400){

					$this->writer($this->LangDir.$this->Language.'.'.$id.'.php','<? $etl = "'.$str.'";?>');

					$docs= substr($str,0,40);		//简要说明

					$docs = str_replace('\"','"',$docs);

					$docs = str_replace('\\\\','\\',$docs);

					$str = 'o(O_O)o.ET Lang.o(*_*)o';	//语言新文件

				}else{

					$docs = str_replace('\"','"',$str);

					$docs = str_replace('\\\\','\\',$docs);

				}



				//文件安全处理

				$data = (!is_file($this->LangDir.'default.php'))?"<?\n/**\n/* SYSTN ET Language For ".$this->Language."\n*/\n\n\n":'';

				

				

				if (trim($str)){

					//写入数据

					$data .= "/**".date("Y.m.d",time())."\n";

					$data.= $docs."\n";

					$data.= "*/\n";

					$data.= '$lang["'.$id.'"] = "'.$str.'";'."\n\n";

					$this->writer($this->LangDir.'default.php',$data,'a+');

				}

			}



				//单独语言文件包

				if($this->LangData[$id]=='o(O_O)o.ET Lang.o(*_*)o'){

					unset($etl);

					include($this->LangDir.$this->Language.".".$id.".php");

					$this->LangData[$id] = $etl;

				}

				

				$out = ($this->LangData[$id])?$this->LangData[$id]:$str;

				

				//输出部分要做处理

				if(($this->RunType=='Replace' || $this->RunType!='Replace') && $data==''){

					$out	= str_replace('\\','\\\\',$out);

					$out	= str_replace('"','\"',$out);

				}

				

			return $out;

		}else{

			return $str;

		}

	}



	/**

	*  inc引用函数

	*/

	function inc_preg(

				$content

			){

		return preg_replace('/<\!--\s*\#include\s*file\s*=(\"|\')([a-zA-Z0-9_\.\|]{1,100})(\"|\')\s*-->/eis', '$this->inc("\\2")', preg_replace('/(\{\s*|<!--\s*)inc\:([^\{\} ]{1,100})(\s*\}|\s*-->)/eis', '$this->inc("\\2")', $content));

	}





	/**

	*  引用函数运算

	*/

	function inc(

				$Files = ''

			){

		if($Files){

			if (!strrpos($Files,$this->Ext)){

				$Files	= $Files.".".$this->Ext;

			}

			$FileLs		= $this->TemplateDir.$Files;

			$contents	=$this->ParseCode($FileLs,$Files);

			

			if($this->RunType=='Cache'){

				//引用模板

				$this->IncList[] = $Files;

				$cache_file = $this->CacheDir.$this->TplID.$Files.".".$this->Language.".php";

				return "<!-- ET_inc_cache[".$Files."] -->

<!-- IF(@is_file('".$cache_file."')) -->{inc_php:".$cache_file."}

<!-- IF(\$EaseTemplate3_Cache) -->{run:@eval('echo \"'.\$EaseTemplate3_Cache.'\";')}<!-- END -->

<!-- END -->";

			}elseif($this->RunType=='MemCache'){

				//cache date

				memcache_set($this->Emc,$Files.'_date', time()) OR die("Failed to save data at the server.");

				memcache_set($this->Emc,$Files, $contents) OR die("Failed to save data at the server");

				return "<!-- ET_inc_cache[".$Files."] -->".$contents;

			}else{

				//引用模板

				$this->IncList[] = $Files;

				return $contents;

			}

		}

	}





	/**

	*  编译解析处理

	*/

	function CompilePHP(

				$content='',

				$cachename = ''

			){

		if ($content){

			//如果没有安全文件则自动创建

			if($this->RunType=='Cache' && !is_file($this->CacheDir.'index.htm')){

				$Ease_name   = 'Ease Template!';

				$Ease_base   = "<title>$Ease_name</title><a href='http://www.systn.com'>$Ease_name</a>";

				$this->writer($this->CacheDir.'index.htm',$Ease_base);

				$this->writer($this->CacheDir.'index.html',$Ease_base);

				$this->writer($this->CacheDir.'default.htm',$Ease_base);

			}

			

			

			//编译记录

			$content = str_replace("\\","\\\\",$content);

			$content = str_replace("'","\'",$content);

			$content = str_replace('echo"";',"",$content);		//替换多余数据

	

			$wfile = ($cachename)?$cachename:$this->ThisFile;

			$this->writer($this->FileName($wfile,$this->TplID) ,$this->Hacker.'$EaseTemplate3_Cache = \''.$content.'\';');

		}

	}

	

	

	//修复PHP执行时产生的错误

	function FixPHP(

				$content=''

			){

		$content = str_replace('\\\\','\\',$content);

		return '";'.str_replace('\\"','"',str_replace('\$','$',$content)).'echo"';

	}

	

	

	/**

	*  检测缓存是否要更新

	*	filename	缓存文件名

	*	settime		指定事件则提供更新，只用于memcache

	*/

	function FileUpdate($filname,$settime=0){

		

		//检测设置模板文件

		if (is_array($this->IncFile)){

			unset($k,$v);

			$update		= 0;

			$settime	= ($settime>0)?$settime:@filemtime($filname);

			foreach ($this->IncFile AS $k=>$v) {

				if (@filemtime($v)>$settime){$update = 1;}

			}

			//更新缓存

			if($update==1){

				return false;

			}else {

				return $filname;

			}

			

		}else{

			return $filname;

		}

	}

	

	

	/**

	*	输出运算

	*   Filename	连载编译输出文件名

	*/

	function output(

				$Filename = ''

			){

		switch($this->RunType){

			

			//Mem编译模式

			case'MemCache':

				if ($Filename=='include_page'){

					//直接输出文件

					return $this->reader($this->FileDir[$this->ThisFile].$this->ThisFile);

				}else{

					

					$FileNames	= ($Filename)?$Filename:$this->ThisFile;

					$CacheFile	= $this->FileName($FileNames,$this->TplID);

					

					//检测记录时间

					$updateT	= memcache_get($this->Emc,$CacheFile.'_date');

					$update		= $this->FileUpdate($CacheFile,$updateT);

					

					$CacheData = memcache_get($this->Emc,$CacheFile);

					

					if(trim($CacheData) && $update){

							//获得列表文件

								unset($ks,$vs);

								preg_match_all('/<\!-- ET\_inc\_cache\[(.+?)\] -->/',$CacheData, $IncFile);

								if (is_array($IncFile[1])){

									foreach ($IncFile[1] AS $ks=>$vs) {

										$this->IncList[] = $vs;

										$listDate	= memcache_get($this->Emc,$vs.'_date');

										

										echo @filemtime($this->TemplateDir.$vs).' - '.$listDate.'<br>';

										

										//更新inc缓存

										if (@filemtime($this->TemplateDir.$vs)>$listDate){

											$update = 1;

											$this->inc($vs);

										}

									}

									

									//更新数据

									if ($update == 1){

										$CacheData	= $this->ParseCode($this->FileList,$Filename);

										//cache date

										@memcache_set($this->Emc,$CacheFile.'_date', time()) OR die("Failed to save data at the server.");

										@memcache_set($this->Emc,$CacheFile, $CacheData) OR die("Failed to save data at the server.");

									}

								}

							//Close

							memcache_close($this->Emc);

						return $CacheData;

					}else{

						if ($Filename){

							$CacheData	= $this->ParseCode($this->FileList,$Filename);

							//cache date

							@memcache_set($this->Emc,$CacheFile.'_date', time()) OR die("Failed to save data at the server.");

							@memcache_set($this->Emc,$CacheFile, $CacheData) OR die("Failed to save data at the server.");

							//Close

							memcache_close($this->Emc);

							return $CacheData;

						}else{

							$CacheData	= $this->ParseCode();

							//cache date

							@memcache_set($this->Emc,$CacheFile.'_date', time()) OR die("Failed to save data at the server.");

							@memcache_set($this->Emc,$CacheFile, $CacheData) OR die("Failed to save data at the server2");

							//Close

							memcache_close($this->Emc);

							return $CacheData;

						}

					}

				}

			break;

			

			

			//编译模式

			case'Cache':

				if ($Filename=='include_page'){

					//直接输出文件

					return $this->reader($this->FileDir[$this->ThisFile].$this->ThisFile);

				}else{

					

					$FileNames = ($Filename)?$Filename:$this->ThisFile;

					$CacheFile = $this->FileName($FileNames,$this->TplID);

					

					$CacheFile = $this->FileUpdate($CacheFile);

					

					if (@is_file($CacheFile)){

						@extract($this->Value());

						ob_start();

						ob_implicit_flush(0);

							include $CacheFile;

							

							//获得列表文件

							if($EaseTemplate3_Cache!=''){

								unset($ks,$vs);

								preg_match_all('/<\!-- ET\_inc\_cache\[(.+?)\] -->/',$EaseTemplate3_Cache, $IncFile);

								

								if (is_array($IncFile[1])){

									foreach ($IncFile[1] AS $ks=>$vs) {

										$this->IncList[] = $vs;

										//更新inc缓存

										if (@filemtime($this->TemplateDir.$vs)>@filemtime($this->CacheDir.$this->TplID.$vs.'.'.$this->Language.'.php')){

											$this->inc($vs);

										}

									}

								}

								

								@eval('echo "'.$EaseTemplate3_Cache.'";');

								$contents = ob_get_contents();

								ob_end_clean();

								return $contents;

							}

					}else{

						if ($Filename){

							return $this->ParseCode($this->FileList,$Filename);

						}else{

							return $this->ParseCode();

						}

					}

				}

			break;

			

			

			//替换引擎

			default:

				if($Filename){

					if ($Filename=='include_page'){

						//直接输出文件

						return $this->reader($this->FileDir[$this->ThisFile].$this->ThisFile);

					}else {

						return $this->ParseCode($this->FileList);

					}

				}else{

					return $this->ParseCode();

				}

		}

	}





	/**

	*  连载函数

	*/

	function n(){

		//连载模板

		$this->FileList[$this->ThisFile] = $this->FileDir[$this->ThisFile];

	}





	/**

	*	输出模板内容

	*   Filename	连载编译输出文件名

	*/

	function r(

				$Filename = ''

			){

		return $this->output($Filename);

	}





	/**

	*	打印模板内容

	*   Filename	连载编译输出文件名

	*/

	function p(

				$Filename = ''

			){

		echo $this->output($Filename);

	}





	/**

	*	分析图片地址

	*/

	function ImgCheck(

				$content

			){

		//Check Image Dir

		if($this->AutoImage==1){

			$NewFileDir = $this->FileDir[$this->ThisFile];

			

   			//FIX img

			if(is_array($this->ImgDir)){

				foreach($this->ImgDir AS $rep){

					$rep = trim($rep);

					//检测是否执行替换

					if(strrpos($content,$rep."/")){

						if(substr($rep,-1)=='/'){

							$rep = substr($rep,0,strlen($rep)-1);

						}

						$content = str_replace($rep.'/',$NewFileDir.$rep.'/',$content);

					}

				}

			}



			//FIX Dir

			$NewFileDirs = $NewFileDir.$NewFileDir;

			if(strrpos($content,$NewFileDirs)){

				$content = str_replace($NewFileDirs,$NewFileDir,$content);

			}

		}

		return $content;

	}





	/**

	*	获得所有设置与公共变量

	*/

	function Value(){

		return (is_array($this->ThisValue))?array_merge($this->ThisValue,$GLOBALS):$GLOBALS;

	}





	/**

	*	清除设置

	*/

	function clear(){

		$this->RunType = 'Replace';

	}





	/**

	*  静态文件写入

	*/

	function htm_w(

				$w_dir = '',

				$w_filename = '',

				$w_content = ''

			){



		$dvs  = '';

		if($w_dir && $w_filename && $w_content){

			//目录检测数量

			$w_dir_ex  = explode('/',$w_dir);

			$w_new_dir = '';	//处理后的写入目录

			unset($dvs,$fdk,$fdv,$w_dir_len);

			foreach((array)$w_dir_ex AS $dvs){

				if(trim($dvs) && $dvs!='..'){

					$w_dir_len .= '../';

					$w_new_dir .= $dvs.'/';

					if (!@is_dir($w_new_dir)) @mkdir($w_new_dir, 0777);

				}

			}





			//获得需要更改的目录数

			foreach((array)$this->FileDir AS $fdk=>$fdv){

				$w_content = str_replace($fdv,$w_dir_len.str_replace('../','',$fdv),$w_content);

			}



			$this->writer($w_dir.$w_filename,$w_content);

		}

	}





	/**

	*  改变静态刷新时间

	*/

	function htm_time($times=0){

		if((int)$times>0){

			$this->HtmTime = (int)$times;

		}

	}





	/**

	*  静态文件存放的绝对目录

	*/

	function htm_dir($Name = ''){

		if(trim($Name)){

			$this->HtmDir = trim($Name).'/';

		}

	}





	/**

	*  产生静态文件输出

	*/

	function HtmCheck(

				$Name = ''

			){

		$this->HtmID = md5(trim($Name)? trim($Name).'.php' : $this->Server['REQUEST_URI'].'.php' );

		//检测时间

		if(is_file($this->HtmDir.$this->HtmID) && (time() - @filemtime($this->HtmDir.$this->HtmID)<=$this->HtmTime)){

			ob_start();

			ob_implicit_flush(0);

				include $this->HtmDir.$this->HtmID;

				$HtmContent = ob_get_contents();

			ob_end_clean();

			return $HtmContent;

		}

	}





	/**

	*  打印静态内容

	*/

	function htm_p(

				$Name = ''

			){

		$output = $this->HtmCheck($Name);

		if ($output){

			die($this->HtmCheck($Name));

		}

	}





	/**

	*  输出静态内容

	*/

	function htm_r(

				$Name = ''

			){

		return $this->HtmCheck($Name);

	}











	/**

	*	解析文件

	*/

	function FileName(

				$name,

				$id = '1'

			){

		$extdir = explode("/",$name);

		$dircnt = @count($extdir) - 1;

		$extdir[$dircnt] = $id.$extdir[$dircnt];

		

		return $this->CacheDir.implode("_",$extdir).".".$this->Language.'.php';

	}





	/**

	*  检测引入文件

	*/

	function inc_php(

				$url = ''

			){

		$parse	= parse_url($url);

		unset($vals,$code_array);

		foreach((array)explode('&',$parse['query']) AS $vals){

			$code_array .= preg_replace('/(.+)=(.+)/',"\$_GET['\\1']= \$\\1 ='\\2';",$vals);

		}

		return '";'.$code_array.' @include(\''.$parse['path'].'\');echo"';

	}





	/**

	*	换行函数

	*	Row(换行数,换行颜色);

	*	Row("5,#ffffff:#e1e1e1");

	*/

	function Row(

				$Num = ''

			){

		$Num = trim($Num);

		if($Num != ''){

			$Nums  = explode(",",$Num);

			$Numr  = ((int)$Nums[0]>0)?(int)$Nums[0]:2;

			$input = (trim($Nums[1]) == '')?'</tr><tr>':$Nums[1];



			if(trim($Nums[1]) != ''){

				$Co	 	= explode(":",$Nums[1]);

				$OutStr = "if(\$_i%$Numr===0){\$row_count++;echo(\$row_count%2===0)?'</tr><tr bgcolor=\"$Co[0]\">':'</tr><tr bgcolor=\"$Co[1]\">';}";

			}else{

				$OutStr = "if(\$_i%$Numr===0){echo '$input';}";

			}

			return '";'.$OutStr.'echo "';

		}

	}





	/**

	*	间隔变色

	*	Color(两组颜色代码);

	*	Color('#FFFFFF,#DCDCDC');

	*/

	function Color(

				$color = ''

			){

		if($color != ''){

			$OutStr = preg_replace("/(.+),(.+)/","_i%2===0)?'\\1':'\\2';",$color);

			if(strrpos($OutStr,"%2")){

				return '";echo(\$'.$OutStr.'echo "';

			}

		}

	}





	/**

	*	映射图片地址

	*/

	function Dirs(

				$adds = ''

			){

		$adds_ary = explode(",",$adds);

		if(is_array($adds_ary)){

			$this->ImgDir = (is_array($this->ImgDir))?@array_merge($adds_ary, $this->ImgDir):$adds_ary;

		}

	}





	/**

	*	读取函数

	*	reader(文件名);

	*/

	function reader(

				$filename

			){

		$get_fun = @get_defined_functions();

		return (in_array('file_get_contents',$get_fun['internal']))?@file_get_contents($filename):@implode("", @file($filename));

	}





	/**

	*	写入函数

	*	writer(文件名,写入数据, 写入数据方式);

	*/

	function writer(

				$filename,

				$data = '',

				$mode='w'

			){

		if(trim($filename)){

			$file = @fopen($filename, $mode);

			  $filedata = @fwrite($file, $data);

			@fclose($file);

		}

		if(!is_file($filename)){

			die('Sorry,'.$filename.' file write in failed!');

		}

	}





	/**

	*	引入模板系统

	*	察看当前使用的模板以及调试信息

	*/

	function inc_list(){

		if(is_array($this->IncList)){

			$EXTS = explode("/",$this->Server['REQUEST_URI']);

			$Last = count($EXTS) -1;

			//处理清除工作 START

			if(strrpos($EXTS[$Last],'Ease_Templatepage=Clear') && trim($EXTS[$Last]) != ''){

				$dir_name = $this->CacheDir;

				if(file_exists($dir_name)){

					$handle=@opendir($dir_name);

					while($tmp_file=@readdir($handle)){

						if(@file_exists($dir_name.$tmp_file)){

							@unlink($dir_name.$tmp_file);

						}

					}

					@closedir($handle);

				}

				$GoURL = urldecode(preg_replace("/.+?REFERER=(.+?)!!!/","\\1",$EXTS[$Last]));



				die('<script language="javascript" type="text/javascript">location="'.urldecode($GoURL).'";</script>');

			}

			//处理清除工作 END



			$list_file	= array();

			$file_nums	= count($this->IncList);

			$AllSize	= 0;

			foreach($this->IncList AS $Ks=>$Vs){

				$FSize[$Ks] = @filesize($this->TemplateDir.$Vs);

				$AllSize   += $FSize[$Ks];

			}



			foreach($this->IncList AS $K=>$V){

				$File_Size   = @round($FSize[$K] / 1024 * 100) / 100 . 'KB';

				$Fwidth	     = @floor(100*$FSize[$K]/$AllSize);

				$list_file[] = "<tr><td colspan=\"2\" bgcolor=\"#F7F7F7\" title='".$Fwidth."%'><a href='".$this->TemplateDir.$V."' target='_blank'><font color='#6F7D84' style='font-size:14px;'>".$this->TemplateDir.$V."</font></a>

				<font color='#B4B4B4' style='font-size:10px;'>".$File_Size."</font>

				<table border='1' width='".$Fwidth."%' style='border-collapse: collapse' bordercolor='#89A3ED' bgcolor='#4886B3'><tr><td></td></tr></table></td></tr>";

			}



			//连接地址

			$BackURL = preg_replace("/.+\//","\\1",$this->Server['REQUEST_URI']);

			$NowPAGE = 'http://'.$this->Server['HTTP_HOST'].$this->Server['SCRIPT_NAME'];

			$clear_link = $NowPAGE."?Ease_Templatepage=Clear&REFERER=".urlencode($BackURL)."!!!";

			$sf13    = ' style="font-size:13px;color:#666666"';

			echo '<br><table border="1" width="100%" cellpadding="3" style="border-collapse: collapse" bordercolor="#DCDCDC">

<tr bgcolor="#B5BDC1"><td><font color=#000000 style="font-size:16px;"><b>Include Templates (Num:'.count($this-> IncList).')</b></font></td>

<td align="right">';



if($this->RunType=='Cache'){

	echo '[<a onclick="alert(\'Cache file is successfully deleted\');location=\''.$clear_link.'\';return false;" href="'.$clear_link.'"><font'.$sf13.'>Clear Cache</font></a>]';

}



echo '</td></tr><tr><td colspan="2" bgcolor="#F7F7F7"><table border="0" width="100%" cellpadding="0" style="border-collapse: collapse">

<tr><td'.$sf13.'>Cache File ID: <b>'.substr($this->TplID,0,-1).'</b></td>

<td'.$sf13.'>Index: <b>'.((count($this->FileList)==0)?'False':'True').'</b></td>

<td'.$sf13.'>Format: <b>'.$this->Ext.'</b></td>

<td'.$sf13.'>Cache: <b>'.($this->RunType=='MemCache'?'Memcache Engine':($this->RunType == 'Replace'?'Replace Engine':$this->CacheDir)).'</b></td>

<td'.$sf13.'>Template: <b>'.$this->TemplateDir.'</b></td></tr>

</table></td></tr>'.implode("",$list_file)."</table>";

		}

	}



}



?>