<?

$thisprog="forumfix.php";
$forumfile="datafile/forumdata.php";

require("adminglobal.php");

print "<tr><td bgcolor=#80809b colspan=3><font color=#FFFFFF>
    <b>欢迎来到讨论区管理程式 / 论坛版块管理</b>
    </td></tr>
";

if (file_exists($forumfile)) {
	$forumdata=file($forumfile);
}
	$count=count($forumdata);
	$t=time();
if (empty($action)) {
	//$forumselect="";
	$forumonly="";
	for($i=0; $i<$count; $i++) {
	  $detail=explode("|",$forumdata[$i]);
	  //$forumselect.="<option value=\"$detail[3]\">$detail[1]</option>";
	  if ($detail[0]!="category") $forumonly.="<option value=\"$detail[3]\">$detail[1]</option>";
	}
	//$forumselect.="</select>";
	$forumonly.="</select>";
	print <<<EOT
    <tr><td bgcolor=#FFFFFF colspan=3>
    <b>1.清理旧贴</a>：</b><form action="$thisprog" method=POST><input type=hidden name="action" value="cleanup">
    $tab_top
    过多的旧贴堆积会影响整个论坛的运行效率，通常应当根据自己论坛的使用情况和服务端速度保留适当数目的贴子。<br><br>
    <input type=radio name="method" value="byamount" checked>按照数量 删除<input type=text size=3 name="limitnum">个外的主题(比如1000个)<br>
    <input type=radio name="method" value="bydate">按照时间 删除<input type=text size=3 name="limitdate">天外的主题(比如30天)<br><br>
    <select name="target"><option value="all">所有版块</option>$forumonly <input type=submit value="提 交"><br><br>
    注意：删除的单位是<b>主题</b>，不是<b>贴子</b>。一个主题通常包含一个话题及多个回复，即多个贴子。
    $tab_bottom
    </form>
    <b>2.重新统计：</b><form action="$thisprog" method=POST><input type=hidden name="action" value="updatecount">
    $tab_top
    对论坛的贴子重新统计总数，这样可以修复首页上总数显示的错误。<br>
    <select name="target"><option value="all">所有版块</option>$forumonly <input type=submit value="提 交"><br>
    $tab_bottom
    </form>
    <b>3.重建版块索引：</b><form action="$thisprog" method=POST><input type=hidden name="action" value="fixindex">
    $tab_top
    当版块索引由于服务器端影响而受损时，或者导入了论坛数据后，使用本功能可以重建索引，但是点击统计将会丢失。<br>
    <select name="target">$forumonly <input type=submit value="提 交"><br>
    $tab_bottom
    </form>
    </td></tr>
    </td></tr></table></body></html>
EOT;
exit;
}elseif ($action=="cleanup"){
	if (($method=="byamount" && empty($limitnum)) || ($method=="bydate" && empty($limitdate))) {
		print "<tr><td bgcolor=#EEEEEE colspan=3><b>数据发生错误</b></td></tr>
		<tr><td bgcolor=#FFFFFF colspan=3><br><b>请填写完整数据以便程式执行动作</b><br><br>
		&gt;&gt; <a href='javascript:history.go(-1)'>返回前页</a></td></tr></td></tr></table></body></html>";
		exit;
	}
	if ($target=="all") {
		for ($i=0; $i<$count; $i++) {
			$detail=explode("|",$forumdata[$i]);
			if ($detail[0]!="category") clean_up_forum($detail[3]);
		}
	} else {
		clean_up_forum($target);
	}
	update_sum();
}elseif ($action=="updatecount"){
	if ($target=="all") {
		for ($i=0; $i<$count; $i++) {
			$detail=explode("|",$forumdata[$i]);
			if ($detail[0]!="category") update_count_forum($detail[3]);
		}
	} else {
		update_count_forum($target);
	}
	update_sum();
}elseif ($action=="fixindex"){
	fix_index($target);
}
print "<tr><td bgcolor=#EEEEEE colspan=3><b>动作执行完毕</b></td></tr>
<tr><td bgcolor=#FFFFFF colspan=3><br><b>操作已经成功执行，你可以选择其他项目</b><br><br>
&gt;&gt; <a href='javascript:history.go(-1)'>返回前页</a></td></tr>
</td></tr></table></body></html>";
exit;
function clean_up_forum($id) {
//--------Clear the old posts in a forum-----------
global $method,$limitnum,$limitdate,$t;
	if (!file_exists("forum$id/last_mo.php")) return;
	$listfile = "forum$id/list.php";
	$lastmofile = "forum$id/last_mo.php";
	$listdata = explode("\n",readfromfile($listfile));
	$count = count($listdata);
	$topictominus=0;
	if ($method=="byamount") {
	  for ($i=$limitnum; $i<$count; $i++) {
	    if (empty($listdata[$i])) continue;
	    $detail = explode("|",$listdata[$i]);
	    unset($listdata[$i]);
	    unlink("forum$id/$detail[5]");
	    $topictominus=$topictominus+$detail[6]+1;
	  }
	}elseif ($method=="bydate") {
	  $limitdate=$limitdate*86400;
	  for ($i=0; $i<$count; $i++) {
	    if (empty($listdata[$i])) continue;
	    $detail = explode("|",$listdata[$i]);
	    list($nouse1,$nouse2,$lasttime)=explode(",",$detail[8]);
	    if ($t-$lasttime>$limitdate) {
		unset($listdata[$i]);
	 	if (file_exists("forum$id/$detail[5]")) unlink("forum$id/$detail[5]");
	 	if (file_exists("forum$id/$detail[5].u")) unlink("forum$id/$detail[5].u");
		if (file_exists("forum$id/$detail[5].sta")) unlink("forum$id/$detail[5].sta");
		$topictominus=$topictominus+$detail[6]+1;
	    }
	  }
	}
	writetofile($listfile, implode("\n",$listdata));
	$temp=explode("|",readfromfile($lastmofile));
	$temp[1]-=$topictominus;
	writetofile($lastmofile,"$temp[0]|$temp[1]");
}
function update_count_forum($id) {
//-----------重新统计版块文章数目-----------
	if (!file_exists("forum$id/list.php")) return;
	$listfile = "forum$id/list.php";
	$lastmofile = "forum$id/last_mo.php";
	$listdata = explode("\n",readfromfile($listfile));
	$count = count($listdata);
	$sum=0;
	for ($i=0; $i<$count; $i++) {
		if (empty($listdata[$i])) continue;
		$detail=explode("|",$listdata[$i]);
		$sum=$sum+$detail[6]+1;
	}
	$temp=explode("|",readfromfile($lastmofile));
	$temp[1]=$sum;
	writetofile($lastmofile,"$temp[0]|$temp[1]");
}
function update_sum() {
//----------各版块文章数目求和------------
global $forumdata,$count;
	$sum=0;
	for ($i=0; $i<$count; $i++) {
		$detail=explode("|",$forumdata[$i]);
		if ($detail[0]!="category" && file_exists("forum$detail[3]/last_mo.php")) {
			$temp=explode("|",readfromfile("forum$detail[3]/last_mo.php"));
			$sum+=$temp[1];
		}
	}
	$temp=explode("|",readfromfile("datafile/newuser.php"));
	writetofile("datafile/newuser.php","$temp[0]|$temp[1]|$sum");
}
function fix_index($forumid) {
	if (!file_exists("forum$forumid")) return;
	$dh=opendir("forum$forumid/");
	while ($postfile=readdir($dh)) {
		if (ereg("^f_[0-9]+$",$postfile)) {
			$postdata=file("forum$forumid/$postfile");
			$count=count($postdata);
			$or_line=$postdata[0];
				$or_detail=explode("|",$or_line);
				$title  = $or_detail[0];
				$author = $or_detail[1];
				$time   = $or_detail[3];
				$icon   = $or_detail[5];
			
			$last_line=$postdata[$count-1];
				$last_detail=explode("|",str_replace(",","，",$last_line));
				$lm     = "$last_detail[0],$last_detail[1],$last_detail[3]";
				
			$reply=$count-1;
			$hit=$reply*2;
			
			$keytemp="$title|$author|$time||$icon|$postfile|$reply|$hit|$lm|0|";
			if (file_exists("forum$forumid/$postfile.sta")) $keytemp.="1|";
			elseif (file_exists("forum$forumid/$postfile.u")) $keytemp.="2|";
			$keytemp.="\n";
			$line[$keytemp]=$last_detail[3];
		}
	}
	arsort($line);
	$fp=fopen("forum$forumid/list.php","w");
	flock($fp,LOCK_EX);
	for(reset($line); $key = key($line); next($line)) {
		fputs($fp,$key);
	}
	fclose($fp);
}