pixmicat - Rev 311

Subversion Repositories:
Rev:
<?php
define("FUTABA_VER",'Pixmicat!-Festival 20060126+'); // 版本資訊文字
// $Id: index.php 278 2006-12-10 16:03:37Z roytam1 $ // SVN版本資訊
/*
Pixmicat! : 圖咪貓貼圖版程式
http://pixmicat.openfoundry.org/
版權所有 © 2005-2006 Pixmicat! Development Team

版權聲明:
此程式是基於レッツPHP!<http://php.s3.to/>的gazou.php、
雙葉<http://www.2chan.net>的futaba.php所改寫之衍生著作程式,屬於自由軟體,
以The Clarified Artistic License作為發佈授權條款。
您可以遵照The Clarified Artistic License來自由使用、散播、修改或製成衍生著作。
更詳細的條款及定義請參考隨附"LICENSE"條款副本。

發佈這一程式的目的是希望它有用,但沒有任何擔保,甚至沒有適合特定目的而隱含的擔保。
關於此程式相關的問題請不要詢問レッツPHP!及雙葉。

如果您沒有隨著程式收到一份The Clarified Artistic License副本,
請瀏覽http://pixmicat.openfoundry.org/license/以取得一份。

設置方法:
根目錄的權限請設為777,
只要將index.php執行過一遍,必要的檔案和資料夾權限皆會自動設定。
細部的設定請打開config.php參考註解修改。
*/


extract($_POST);
extract($_GET);
$upfile = isset($_FILES["upfile"]["tmp_name"]) ? $_FILES["upfile"]["tmp_name"] : "";
$upfile_name = isset($_FILES["upfile"]["name"]) ? $_FILES["upfile"]["name"] : "";
$upfile_status = isset($_FILES["upfile"]["error"]) ? $_FILES["upfile"]["error"] : 4;

include_once("./config.inc.php");
if(USE_REPNG2JPEG) include_once("./lib_repng2jpeg.php"); // 引入自訂函式庫

/* 輸出表頭 */
function head(&$dat){
        $gridprop=''; $floatcss='';
        if (!NO_GALLERY) {
                if (GRID_W) $gridprop.='width: '.GRID_W.';';
                if (GRID_H) $gridprop.='height: '.GRID_H.';';
        } else {$gridprop.='width:99%; height:auto;';}
        if (CLICK_REPLY) $gridprop.='cursor: pointer; cursor: hand;';
        if (USE_FLOAT_FORM) $floatcss='
.hidepost       { float: right; border: 2px '
.BORDER_COLOR.' solid; height: 1.2em; overflow: hidden; width: 70px; background-color:'.BORDER_COLOR.'; text-align:center;}
.show { color: '
.LINK_COL.';}
'
;
        $dat .= '<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd">
<html><head>
<META HTTP-EQUIV="Content-type" CONTENT="text/html; charset=utf-8">
<META HTTP-EQUIV="pragma" CONTENT="no-cache">
<META HTTP-EQUIV="last-modified" CONTENT="Thu, 1 Jan 1970 00:00:00 GMT">
<META HTTP-EQUIV="expires" CONTENT="Thu, 1 Jan 1970 00:00:00 GMT">
<STYLE TYPE="text/css">
<!--
body,tr,td,th { font-size:12pt }
body { background:'
.BODY_BGCOL.'; background-image:url('.BG_IMG.')}
a:hover { color:'
.LINK_HCOL.'; }
a.quote { text-decoration: none; }
small,.small { font-size:10pt }

.grid {float: left; border: 2px '
.BORDER_COLOR.' solid; '.$gridprop.' overflow:auto; margin:2px 2px 2px 2px;}
.container { }
.spacer { clear: both; }
.hide { display: none; }

.Cname { color:'
.NAME_C.'; }
.Cname_admin { color:'
.ADMIN_C.'; }
.Ctitle { color:'
.PTITLE_COL.'; }
.Cre_bg { background:'
.RE_BGCOL.'; }
.Form_hdr { background:'
.FORM_BGCOL.'; color:'.FORM_FGCOL.';}
.List_hdr { background:'
.LIST_HEADER_BGCOLOR.'; color:'.LIST_HEADER_FGCOLOR.';}
.Ptitle { color:'
.HTITLE_COL.'; }
.navi {border: 2px '
.BORDER_COLOR.' solid;}
.nor {text-decoration: none;font-weight:normal;}
form {padding:0px;margin:0px;}
'
.$floatcss.'
-->
</STYLE>
<title>'
.TITLE.'</title>
<script type="text/javascript"><!--
var boxclicked=0;
function l(e){var P=getCookie("pwdc"),N=getCookie("namec"),E=getCookie("emailc"),i;with(document){for(i=0;i<forms.length;i++){if(forms[i].pwd)with(forms[i]){pwd.value=P;}if(forms[i].nick)with(forms[i]){nick.value=N;}if(forms[i].mail)with(forms[i]){mail.value=E.replace("+"," ");}}}};
function getCookie(key, tmp1, tmp2, xx1, xx2, xx3) {tmp1 = " " + document.cookie + ";";xx1 = xx2 = 0;len = tmp1.length; while (xx1 < len) {xx2 = tmp1.indexOf(";", xx1);tmp2 = tmp1.substring(xx1 + 1, xx2);xx3 = tmp2.indexOf("=");if (tmp2.substring(0, xx3) == key) {return(unescape(tmp2.substring(xx3 + 1, xx2 - xx1 - 1)));}xx1 = xx2 + 1;}return("");}
function w(){with(document){if(postform.name&&postform.name.value){ setCookie("namec",postform.name.value);}}};function setCookie(name,value){var exp=new Date();exp.setTime(exp.getTime()+(1000*60*60*24*7));document.cookie = name+"="+escape(value)+"; expires="+exp.toGMTString(); }
function c(){
        try{
                with(document){
                        if(window.clipboardData) postform.upfile_path.value = postform.upfile.value;
                        if(!postform.upfile){ return true; }
                        if(!postform.upfile.value&&!postform.content.value){ alert("在沒有附加檔案的情況下,請寫入內文");return false; }
                        var ext="'
.ALLOW_UPLOAD_EXT.'".toUpperCase().split("|");var ext_allowed=0;
                        if(postform.upfile.value){ for(var j=0;j<ext.length;j++){if(postform.upfile.value.substr(postform.upfile.value.length-3,3).toUpperCase()==ext[j]){ext_allowed=1;break;}}if(!ext_allowed){alert("附加檔案為系統不支援的格式");return false;} }
                        postform.sendbtn.disabled = true;
                }
        }catch(e){  }
}
function quote(text) {
  if (document.selection) {
        document.postform.content.focus();
        sel = document.selection.createRange();
        sel.text = ">>" + text + "\n";
  } else if (document.postform.content.selectionStart || document.postform.content.selectionStart == "0") {
        var startPos = document.postform.content.selectionStart;
        var endPos = document.postform.content.selectionEnd;
        document.postform.content.value = document.postform.content.value.substring(0, startPos) + ">>" + text + "\n" + document.postform.content.value.substring(endPos, document.postform.content.value.length);
  } else {
        document.postform.content.value += ">>" + text + "\n";
  }
}
function replyhl(id) {
  var tdtags=document.getElementsByTagName("td");
  for (i=0; i<tdtags.length; i++){
        if (tdtags[i].id == "r"+id)
          tdtags[i].style.background="#eeaa88";
  }
}
function repquote(rep) {
  if (rep.match(/q([0-9]+)/)) {
        rep=rep.replace(/q/,"");
        if(document.postform.content.value=="") {
          quote(rep);
        }
  }
}
function init() {
  arr=location.href.split(/#/);
  if (arr[1]) {
  if (arr[1].match(/(q)?([0-9]+)/)) {
        rep=arr[1];
        re=arr[1].replace(/q/,"");
        replyhl(re);
        repquote(rep);
  }
  }
}
function ChangeImg(obj,path,w,h){
        if (w>0 && h>0) {
                obj.style.width=w+"px";
                obj.style.height=h+"px";
                obj.width=w;
                obj.height=h;
        }
        obj.src=path;
}
//--></script>
</head>
<body text="'
.BODY_TXTCOL.'" link="'.LINK_COL.'" vlink="'.LINK_VCOL.'">
<div class="small" style="text-align:right;">
[<a href="'
.HOME.'" target="_top">回首頁</a>]
'
.TOP_LINKS.'
[<a href="'
.PHP_SELF.'?mode=cata">Catalog</a>]
[<a href="'
.PHP_SELF.'?mode=list">主題列表</a>]
[<a href="'
.PHP_SELF.'?mode=search">搜尋</a>]
[<a href="'
.PHP_SELF.'?mode=status">系統資訊</a>]
[<a href="'
.PHP_SELF.'?mode=admin">管理區</a>]
[<a href="'
.REFRESH_HREF.'?">重新整理</a>]
</div><br />
<center><font size="5"><b><span style="font-size:20pt;" class="Ptitle">'
.TITLE.'</span></b></font></center>
<hr width="90%" size="1">'
;
}

/* 發表用表單輸出 */
function form(&$dat,$resno,$admin=0){
        global $ADDITION_INFO; $msg = ""; $hidden = "";
        $maxbyte = MAX_KB * 1024;
        $no = $resno;
        if($resno){
                $msg .= "[<a href=\"".PHP_SELF."?\">回到版面</a>]\n";
                $msg .= "<table width='100%' align='center'><tr><th bgcolor='#e04000'>\n";
                $msg .= "<font color='#FFFFFF'>回應模式</font>\n";
                $msg .= "</th></tr></table>\n";
                $dat=str_replace("<body","<body OnLoad=\"init();\"",$dat);
        }
        if($admin){
                $hidden = "<input type='hidden' name='admin' value=\"".ADMIN_PASS."\">";
                $msg = "<h4>目前為管理模式,內文可使用HTML標籤</h4>";
        }
        if(USE_FLOAT_FORM&&!$admin&&!$resno) $msg.="<div id=\"postform\" class=\"hidepost\">[<span id=\"show\" class=\"show\" onmouseover=\"document.getElementById('postform').className='navi';document.getElementById('show').className='hide';document.getElementById('hide').className='show';\" onclick=\"this.onMouseover()\">投稿</span><span id=\"hide\" class=\"hide\" onmouseover=\"document.getElementById('postform').className='hidepost';document.getElementById('hide').className='hide';document.getElementById('show').className='show';\" onclick=\"this.onMouseover()\">隱藏此頁</span>]";
        $dat .= $msg.'
<form action="'
.PHP_SELF.'" method="POST" enctype="multipart/form-data" onsubmit="w();return c();" name="postform">
<input type="hidden" name="upfile_path" value="">
<input type="hidden" name="mode" value="regist">
'
.$hidden.'
<input type=hidden name="MAX_FILE_SIZE" value="'
.$maxbyte.'">';

        if($no){ $dat .= '<input type="hidden" name="resto" value="'.$no.'">'; }

        $dat .= '<center><table cellpadding="1" cellspacing="1" style="text-align:left;">
<tr><td class="Form_hdr"><b>名 稱</b></td><td><input type="text" name="nick" size="28"></td></tr>
<tr><td class="Form_hdr"><b>E-mail</b></td><td><input type="text" name="mail" size="28"></td></tr>
<tr><td class="Form_hdr"><b>標 題</b></td><td><input type="text" name="title" size="35">
<input type="submit" name="sendbtn" value="送 出"><span class="hide"><b>URL:<input type="text" name="url" size="35">(請勿填寫此欄)</b></span></td></tr>
<tr><td class="Form_hdr"><b>內 文</b></td><td><textarea name="content" cols="48" rows="4"></textarea></td></tr>'
."\n";

        if(RESIMG || !$resno){
                $dat .= '<tr><td class="Form_hdr"><b>附加檔案</b></td>
<td><input type=file name=upfile  size="35"></td></tr>'
."\n";
        }
        $dat .= '<tr><td class="Form_hdr"><b>刪除用密碼</b></td><td><input type="password" name="pwd" size="8" maxlength="8" value=""><small>(刪除文章用。英數字8字元以内)</small></td></tr>
<tr><td colspan="2"><div class="small"><ul>
<LI>可附加檔案類型:GIF, JPG, PNG,瀏覽器才能正常附加檔案</li>
<LI>附加檔案最大上傳資料量為 '
.MAX_KB.' KB。當回文時E-mail填入sage為不推文功能</li>
<LI>當檔案超過寬 '
.MAX_W.' 像素、高 '.MAX_H.' 像素時會自動縮小尺寸顯示</li>';
        if(STORAGE_LIMIT){ $dat .= "\n<LI>目前附加檔案使用量大小: ".total_size()." KB / ".STORAGE_MAX." KB\n"; }
        if (CLICK_REPLY) $dat.="<li>新增入帖捷徑 - 點擊框框即可入帖!</li>";
        $dat .= $ADDITION_INFO."</ul></div></td></tr></table></center></form><script type=\"text/javascript\">l();</script>\n";
if(USE_FLOAT_FORM&&!$resno) $dat .= "</div>";
else $dat.="<hr>";
}

/* 更新記錄檔檔案/輸出討論串 */
function updatelog($resno=0,$page=0){
        global $path; $p = 0;$tmp_page=0;

        $tree = file(TREEFILE);
        $counttree = count($tree);
        $find = false;
        if($resno){
                for($i = 0;$i<$counttree;$i++){
                        list($artno,) = explode(",",rtrim($tree[$i]));
                        if($artno==$resno){ $st = $i; $find = true; break; } // 先搜尋欲回應之原文章
                }
                if(!$find){ error("欲回應之文章並不存在!"); }
        }
        $line = file(LOGFILE);
        $countline = count($line);
        for($i = 0; $i < $countline; $i++){
                list($no,) = explode(",", $line[$i]);
                $lineindex[$no] = $i + 1; // 作成逆轉換標籤
        }

        // 附加檔案容量限制功能啟動:預測即將被刪除之檔 (預設為95%的上限即啟動預測)
        $tmp_total_size = (int)total_size(); // 取得目前附加檔案使用量
        $tmp_STORAGE_MAX = ($tmp_total_size >= STORAGE_MAX) ? STORAGE_MAX : STORAGE_MAX * 0.95; // 預估上限值,如果發生一開始就超過上限就直接用上限取代
        $BEKILL_SENSE = FALSE;
        if(STORAGE_LIMIT && ($tmp_total_size >= $tmp_STORAGE_MAX)){ // 超過預估上限值 (或直接超過上限)
                $BEKILL_SENSE = TRUE; // 預測標記打開
                $link_BEKILL = range(0, count($line) - 1); // 預測標記陣列

                if($tmp_total_size >= $tmp_STORAGE_MAX){
                        for($x = count($line) - 1; $tmp_total_size >= $tmp_STORAGE_MAX; $x--){
                                list(,,,,,,,,,$dext,,,$dtime,) = explode(",", $line[$x]);
                                if(is_file($path.$dtime.$dext)){ $tmp_total_size -= filesize($path.$dtime.$dext)/1024; $link_BEKILL[$x] = "DEL"; } // 標記刪除
                                if(is_file(THUMB_DIR.$dtime.'s.jpg')){ $tmp_total_size -= filesize(THUMB_DIR.$dtime.'s.jpg')/1024; }
                        }
                }
        }

        if(!$resno){ // php動態生成討論串用
                if($page < 0 || ($counttree && ($page * PAGE_DEF) >= $counttree)){ error("對不起,您所要求的頁數並不存在"); } // $page 超過範圍則顯示錯誤畫面,與MySQL版不同 (但預設值0不必擋)
                $tmp_page = $page; // 進行跳頁所用
        }
        for($cpage = $tmp_page * PAGE_DEF;$cpage < $counttree;$cpage += PAGE_DEF){
                $dat = '';$tmprno=0;
                head($dat);
                form($dat,$resno);
                if(!$resno){ $st = $cpage; }
                $dat .= '<form action="'.PHP_SELF.'" method=POST><div class="container"><div class="spacer"></div>';
   
                for($i = $st; $i < $st + PAGE_DEF; $i++){
                        $fil=''; $alert='';
                        if(empty($tree[$i])){ continue; }
                        $treeline = explode(",", rtrim($tree[$i]));
                        $disptree = $treeline[0];
                        $j = $lineindex[$disptree] - 1; // 在$j陣列搜尋該本文
                        if(empty($line[$j])){ continue; }   // 在$j之範圍外
                        list($no,$now,$name,$email,$sub,$com,$url,$host,$pwd,$ext,$w,$h,$time,$chk) = explode(",", $line[$j]);
                        if(CLEAR_SAGE_AGE) $email=preg_replace("/^(s){0,1}age( *)/i","",trim($email)); // E-mail和本文自動作成連結
                        if($email){ $name = "<a href=\"mailto:$email\">$name</a>"; }
                        if(AUTO_LINK){ $com = auto_link($com); }
                        $com = quoteLight($com);

                        // 附加檔案名稱
                        $img = $path.$time.$ext;
                        $src = IMG_DIR.$time.$ext;
                        // 輸出<img>標籤
                        $imgsrc = "";
                        if($ext && is_file($img)){
                                if(SHOW_IMGSIZE) list($ow,$oh) = GetImageSize($img);
                                $size = filesize($img); // 在<img>標籤內的alt屬性顯示檔案大小
                                $bflag=($size>=1024)?"KB":"Bytes";
                                $size = ($size>=1024) ? (int)($size/1024) : $size;
                                if($w && $h){ // 有長寬屬性
                                        if(@is_file(THUMB_DIR.$time.'s.jpg')){
                                                        $imgsrc = "<small>[預覽]</small><br>".(!NO_GALLERY&&!$resno?"<table width='100%'><tr><td width='100%' align='center'>":"")."<a href=\"".IMG_URL_PREFIX.$src."\" target=_blank><img src='".THUMB_URL_PREFIX.THUMB_DIR.$time.'s.jpg'."' border=0 width=$w height=$h ".(!NO_GALLERY&&!$resno?"style='float:none'":"align='left' hspace=20")." alt=\"$size $bflag\"></a>".(!NO_GALLERY&&!$resno?"</td></tr></table>":"");
                                        }elseif($ext==".swf"){ // swf檔案僅留連結就好
                                        }else{
                                                        $imgsrc = (!NO_GALLERY&&!$resno?"<table width='100%'><tr><td width='100%' align='center'>":"")."<a href=\"".IMG_URL_PREFIX.$src."\" target=_blank><img src='nothumb.png' border=0 width=200 height=150 ".(!NO_GALLERY&&!$resno?"style='float:none'":"align='left' hspace=20")." alt=\"$size $bflag\" ".(HOVER_SHOWIMG?"onmouseover=\"ChangeImg(this,'".IMG_URL_PREFIX."$src',$w,$h)\"":"")."></a>".(!NO_GALLERY&&!$resno?"</td></tr></table>":"");
                                        }
                                }else{// 沒有長寬屬性
                                                        $imgsrc = (!NO_GALLERY&&!$resno?"<table width='100%'><tr><td width='100%' align='center'>":"")."<a href=\"".IMG_URL_PREFIX.$src."\" target=_blank><img src='nothumb.png' border=0 width=200 height=150 ".(!NO_GALLERY&&!$resno?"style='float:none'":"align='left' hspace=20")." alt=\"$size $bflag\" ".(HOVER_SHOWIMG?"onmouseover=\"ChangeImg(this,'".IMG_URL_PREFIX."$src')\"":"")."></a>".(!NO_GALLERY&&!$resno?"</td></tr></table>":"");
                                }
                                if (!$resno)
                                        $dat .= "<div class=\"grid\" ".(CLICK_REPLY?"onclick=\"if (!boxclicked) window.location='".PHP_SELF."?res=$no';boxclicked=0;\"":"").">";
                                $fil .= "檔名:<a href=\"".IMGLINK_URL_PREFIX."$src\" target='_blank'>$time$ext</a>-($size $bflag".(SHOW_IMGSIZE?", {$ow}x{$oh}":"").") $imgsrc";
                        }else{
                                if (!$resno)
                                        $dat .= "<div class=\"grid\" ".(CLICK_REPLY?"onclick=\"if (!boxclicked) window.location='".PHP_SELF."?res=$no';boxclicked=0;\"":"").">";
                        }
                        // 討論串所有回應生成
                        if(!$resno){
                                $s = count($treeline) - RE_DEF;
                                if($s<1){ $s = 1; }
                                elseif($s > 1){
                                        $alert .= "<font color=\"#707070\">有回應 ".($s - 1)." 篇被省略。要閱讀所有回應請按下回應連結。</font><br>\n";
                                }
                                $RES_start = $s; // 分頁開始回應指標
                                $RES_end = count($treeline); // 分頁結束回應指標
                        }else{ // 回應模式
                                $RES_start = 1; // 分頁開始回應指標
                                $RES_end = count($treeline); // 分頁結束回應指標

                                if(RE_PAGE_DEF > 0){ // RE_PAGE_DEF有設定 (開啟分頁)
                                        $countresALL = count($treeline) - 1; // 總回應數
                                        if($countresALL > 0){ // 有回應才做分頁動作
                                                if($page=="RE_PAGE_MAX" && is_string($page)){ // 特殊值:最末頁
                                                        $page = intval($countresALL/RE_PAGE_DEF); // 最末頁資料指標位置
                                                        if(!($countresALL % RE_PAGE_DEF)) $page--; // 如果回應數和一頁顯示取餘數=0,則-1
                                                        $RES_end = $countresALL + 1; // 分頁結束回應指標
                                                }elseif($page=="all" && is_string($page)){ // 特殊值:全部
                                                        $page=0;
                                                        $RES_end = $countresALL + 1; // 分頁結束回應指標
                                                }else{
                                                        if($page < 0){ $page = 0; } // 負數要求惡搞合理化
                                                        if($page * RE_PAGE_DEF >= $countresALL){ error("對不起,您所要求的頁數並不存在"); } // 超過最大筆數,顯示錯誤
                                                        $RES_end = ($page + 1) * RE_PAGE_DEF + 1; // 分頁結束回應指標
                                                }
                                                $RES_start = $page * RE_PAGE_DEF + 1; // 分頁開始回應指標
                                        }else{ // 沒有回應的情況只允許page = 0 或負數(惡搞合理化)
                                                if($page > 0){ error("對不起,您所要求的頁數並不存在"); }
                                        }
                                }
                        }
                        // 快要被刪除的提示
                        if($lineindex[$no]-1 >= LOG_MAX*0.95){
                                $alert .= "<font color=\"#f00000\"><b>這篇已經很舊了,不久後就會刪除。</b></font><br>\n";
                        }
                        // 預測刪除過大檔
                        if(STORAGE_LIMIT && $BEKILL_SENSE){
                                if($link_BEKILL[$lineindex[$no]-1]=="DEL" && $lineindex[$no] != 1){
                                        $alert .= "<font color=\"#f00000\"><b>這篇因附加檔案容量限制,附加檔案不久後就會刪除。</b></font><br>\n";
                                }
                        }
                        // 被標記為禁止回應
                        if(strpos($url, '_THREADSTOP_')!==FALSE){
                                $alert .= "<font color=\"#f00000\"><b>這篇討論串已被管理者標記為禁止回應。</b></font><br>\n";
                        }
                        $tmprno=$no;
                        // 討論串主文章生成
                        if (!$resno){
                                $dat .= "<input type=checkbox name=\"$no\" value=delete onclick=\"boxclicked=1;\"><font size=\"+1\"><span class='Ctitle'><b>$sub</b></span></font>\n";
                                $dat.="姓名: <span class='Cname'><b>$name</b></span> [$now] <a name=\"$no\"></a><a class=\"quote\" href=\"#".$no."\">No.</a><a class=\"quote\" href=\"".PHP_SELF."?res=$tmprno#q".$no."\">$no</a> [<a href=\"".PHP_SELF."?res=$no\">回應</a>]";
                                if ($imgsrc) $dat.="<br>";
                                $dat .= $fil.(NO_GALLERY?"":"<div class=\"spacer\">&nbsp;</div>$alert");
                                $com = preg_replace("/(&gt;){1,2}(No\.){0,1}(\d+)/si", "<a class=\"quote\" href=\"".PHP_SELF."?res=$no#\\3\">&gt;&gt;\\3</a>", $com);
                                $com .= NO_GALLERY?"<br>$alert":"";
                                $dat .= "\n<blockquote>$com</blockquote>";
                        }else{
                                $dat .= "<input type=checkbox name=\"$no\" value=delete><font size=\"+1\"><span class='Ctitle'><b>$sub</b></span></font>\n";
                                $dat .= "姓名: <span class='Cname'><b>$name</b></span> [$now] <a name=\"$no\"></a><a name=\"1\"></a><a class=\"quote\" href=\"#".$no."\">No.</a><a class=\"quote\" href=\"javascript:quote('".$no."');\">$no</a> <br>\n";
                                $dat .= $fil."<br>".$alert;
                                $com = preg_replace("/(&gt;){1,2}(No\.){0,1}(\d+)/si", "<a class=\"quote\" href=\"#\\3\">&gt;&gt;\\3</a>", $com);
                                $dat .= "\n<blockquote>$com</blockquote>";
                        }

                        for($k = $RES_start; $k < $RES_end; $k++){
                                if($k<0 || $k>count($treeline)-1) continue;
                                $disptree = $treeline[$k];
                                $j = $lineindex[$disptree] - 1;
                                if($line[$j]==""){ continue; }
                                list($no,$now,$name,$email,$sub,$com,$url,$host,$pwd,$ext,$w,$h,$time,$chk) = explode(",", $line[$j]);
                                if(CLEAR_SAGE_AGE) $email=preg_replace("/^(s){0,1}age( *)/i","",trim($email)); // E-mail和本文自動作成連結
                                if($email){ $name = "<a href=\"mailto:$email\">$name</a>"; }
                                if(AUTO_LINK){ $com = auto_link($com); }
                                $com = quoteLight($com);

                                // 附加檔案名稱
                                $img = $path.$time.$ext;
                                $src = IMG_DIR.$time.$ext;
                                // 輸出<img>標籤
                                $imgsrc = "";
                                if($ext && is_file($img)){
                                        if(SHOW_IMGSIZE) list($ow,$oh) = GetImageSize($img);
                                        $size = filesize($img);// 在<img>標籤內的alt屬性顯示檔案大小
                                        $bflag=($size>=1024)?"KB":"Bytes";
                                        $size = ($size>=1024) ? (int)($size/1024) : $size;
                                        if($w && $h){// 有長寬屬性
                                                if(@is_file(THUMB_DIR.$time.'s.jpg')){
                                                        $imgsrc = "<small>[預覽]</small><br><a href=\"".IMG_URL_PREFIX.$src."\" target=_blank><img src='".THUMB_URL_PREFIX.THUMB_DIR.$time.'s.jpg'."' border=0 align='left' width=$w height=$h hspace=20 alt=\"$size $bflag\"></a>";
                                                }elseif($ext==".swf"){ // swf檔案僅留連結就好
                                                        $imgsrc = "";
                                                }else{
                                                        $imgsrc = "<a href=\"".IMG_URL_PREFIX.$src."\" target=_blank><img src='nothumb.png' border=0 align='left' width=200 height=150 hspace=20 alt=\"$size $bflag\" ".(HOVER_SHOWIMG?"onmouseover=\"ChangeImg(this,'".IMG_URL_PREFIX."$src',$w,$h)\"":"")."></a>";
                                                }
                                        }else{// 沒有長寬屬性
                                                $imgsrc = "<a href=\"".IMG_URL_PREFIX.$src."\" target=_blank><img src='nothumb.png' border=0 width=200 height=150 align='left' hspace=20 alt=\"$size $bflag\" ".(HOVER_SHOWIMG?"onmouseover=\"ChangeImg(this,'".IMG_URL_PREFIX."$src')\"":"")."></a>";
                                        }
                                        $imgsrc = "<br> &nbsp;檔名:<a href=\"".IMGLINK_URL_PREFIX."$src\" target=_blank>$time$ext</a>-($size $bflag".(SHOW_IMGSIZE?", {$ow}x{$oh}":"").") $imgsrc";
                                }
                                // 討論串回應生成
                                $dat .= "<table border=0><tr><td ".LONGSTR_NOWRAP." align=right valign=top>…</td><td class='Cre_bg' ".LONGSTR_NOWRAP." id=\"r".$no."\">\n";
                                $dat .= "<input type=checkbox name=\"$no\" value=delete><font size=\"+1\"><small><a name=\"".($k+1)."\"></a>#".($k+1)."&nbsp;</small><span class='Ctitle'><b>$sub</b></span></font> \n";
                                $dat .= "名稱: <span class='Cname'><b>$name</b></span> [$now] <a name=\"$no\"></a><a class=\"quote\" href=\"#".$no."\">No.</a><a class=\"quote\" href=\"".($resno?"javascript:quote('".$no."');":PHP_SELF."?res=$tmprno#q".$no)."\">$no</a>&nbsp;";
                                $r_page=0;if(RE_PAGE_DEF > 0 && preg_match("/(&gt;){1,2}(No\.){0,1}(\d+)/si",$com,$re_no)) {$r_page=floor((array_search($re_no[3],$treeline)-1)/RE_PAGE_DEF); if($r_page==-1)$r_page=0;}
                                $com = preg_replace("/(&gt;){1,2}(No\.){0,1}(\d+)/si", "<a class=\"quote\" href=\"".PHP_SELF."?res=$tmprno".(RE_PAGE_DEF > 0?"&amp;page=$r_page":"")."#\\3\">&gt;&gt;\\3</a>", $com);
                                $dat .= "$imgsrc\n<blockquote>$com</blockquote>";
                                // 預測刪除過大檔
                                if(STORAGE_LIMIT && $BEKILL_SENSE){
                                        if($link_BEKILL[$j]=="DEL" && $j != 0){
                                                $dat .= "<font color=\"#f00000\"><b>這篇因附加檔案容量限制,附加檔案不久後就會刪除。</b></font><br>\n";
                                        }
                                }
                                $dat .= "</td></tr></table>\n";
                        }
                        if (!$resno) {
                                $dat .="</div>";
                        }
                        if ($resno) $dat .= "<div class=\"spacer\"></div></div><hr>\n";
                        clearstatcache(); // 刪除STAT暫存檔
                        $p++;
                        if($resno){ break; } // 為回應模式時僅輸出單一討論串
                }

if(!$resno) $dat .= '</div>';
$dat .= '<br clear="left"><table align="right"><tr><td nowrap="nowrap" align="center">
<input type=hidden name=mode value=usrdel>【刪除文章】[<input type=checkbox name=onlyimgdel id="onlyimgdel" value=on><label for="onlyimgdel">僅刪除附加檔案</label>]<br>
刪除用密碼: <input type=password name=pwd size=8 maxlength=8 value="">
<input type=submit value=" 刪除 "><script type="text/javascript">l();</script></td></tr></table></form>'
;

                $prev = ($resno) ? (($page-1) * RE_PAGE_DEF) : ($st - PAGE_DEF);
                $next = ($resno) ? (($page+1) * RE_PAGE_DEF) : ($st + PAGE_DEF);
                // 換頁判斷
                if($resno){ // 回應分頁
                        if(RE_PAGE_DEF > 0){ // 回應分頁開啟
                                $dat .= "<table align='left' class=\"navi\"><tr>";
                                if($prev >= 0){
                                         $dat .= "<td><form action=\"".PHP_SELF."?res=$resno&amp;page=".$prev/RE_PAGE_DEF."\" method=post><input type=submit value=\"上一頁\"></form></td><td>";
                                }else{ $dat .= "<td nowrap>第一頁</td><td>"; }
                                if($countresALL==0){ // 無回應
                                        $dat .= "[<b>0</b>] ";
                                }else{
                                        $AllRes=isset($_GET['page']) && $_GET['page']=="all";
                                        for($i = 0; $i < $countresALL ; $i += RE_PAGE_DEF){
                                                if($page==$i/RE_PAGE_DEF && !$AllRes){ $dat .= "[<b>".$i/RE_PAGE_DEF."</b>] "; }
                                                else{
                                                        $dat .= "[<a href=\"".PHP_SELF."?res=$resno&amp;page=".$i/RE_PAGE_DEF."\">".$i/RE_PAGE_DEF."</a>] ";
                                                }
                                        }
                                        $dat .= $AllRes?"<span style='white-space: nowrap;'>[<b>全部</b>]</span> ":"<span style='white-space: nowrap;'>[<a href=\"".PHP_SELF."?res=$resno&amp;page=all\">全部</a>]</span> ";
                                }
                                $dat .= "</td>";
                                if($countresALL > $next && !$AllRes){
                                         $dat .= "<td><form action=\"".PHP_SELF."?res=$resno&amp;page=".$next/RE_PAGE_DEF."\" method=post><input type=submit value=\"下一頁\"></form></td><td>";
                                }else{ $dat .= "<td nowrap>最後一頁</td>"; }
                                $dat .= "</tr></table><br clear='all'>\n";
                        }
                }else{ // 一般分頁
                        $dat .= "<table align='left' class=\"navi\"><tr>";
                        if($prev >= 0){
                                if($prev==0){
                                        $dat .= "<td><form action=\"".PHP_SELF."\" method='get'>";
                                        if (HTM_HREF_PREFIX) $dat .= "<input type=hidden name=\"".PHP_SELF2."\">";
                                }else{
                                        if((STATIC_HTML_UNTIL != -1) && (($prev/PAGE_DEF) > STATIC_HTML_UNTIL)){ $dat .= "<td><form action=\"".PHP_SELF."?page=".$prev/PAGE_DEF."\" method=post>"; } // 直接用php生成
                                        else { $dat .= "<td><form action=\"".HTM_HREF_PREFIX.$prev/PAGE_DEF.PHP_EXT."\" method='get'>";
                                        if (HTM_HREF_PREFIX) $dat .= "<input type=hidden name=\"".$prev/PAGE_DEF.PHP_EXT."\">"; }
                                }
                                $dat .= "<input type=submit value=\"上一頁\">";
                                $dat .= "</form></td>";
                        }else{ $dat.="<td nowrap>第一頁</td>"; }
                                $dat.="<td>";
                                for($i = 0; $i < $counttree ; $i += PAGE_DEF){
                                        if($st==$i){ $dat .= "[<b>".($i/PAGE_DEF)."</b>] "; }
                                        else{
                                                if($i==0){ $dat .= "[<a href=\"".PHP_SELF."?\">0</a>] "; }
                                                elseif((STATIC_HTML_UNTIL != -1) && (($i/PAGE_DEF) > STATIC_HTML_UNTIL)){ $dat .= "[<a href=\"".PHP_SELF."?page=".$i/PAGE_DEF."\">".$i/PAGE_DEF."</a>] "; } // 直接用php生成
                                                else{ $dat .= "[<a href=\"".HTM_HREF_PREFIX.($i/PAGE_DEF).PHP_EXT."?\">".($i/PAGE_DEF)."</a>] "; }
                                        }
                                }

                                $dat .= "</td>";
                                if($p >= PAGE_DEF && $counttree > $next){
                                        if((STATIC_HTML_UNTIL != -1) && (($next/PAGE_DEF) > STATIC_HTML_UNTIL)){ $dat .= "<td><form action=\"".PHP_SELF."?page=".$next/PAGE_DEF."\" method=post>"; }
                                        else { $dat .= "<td><form action=\"".HTM_HREF_PREFIX.$next/PAGE_DEF.PHP_EXT."\" method='get'>";
                                        if (HTM_HREF_PREFIX) $dat .= "<input type=hidden name=\"".$next/PAGE_DEF.PHP_EXT."\">"; }
                                        $dat .= "<input type=submit value=\"下一頁\">";
                                        $dat .= "</form></td>";
                                }else{ $dat .= "<td nowrap>最後一頁</td>"; }
                                $dat .= "</tr></table><br clear=all>\n";
                        }

                foot($dat);
                if(!$page){ // 非使用php輸出方式,而是靜態生成
                        if($resno){ echo $dat; break; }
                        if($cpage==0){ $logfilename = PHP_SELF2; }
                        else{ $logfilename = $cpage/PAGE_DEF.PHP_EXT; }
                        $fp = fopen($logfilename, "w");
                        set_file_buffer($fp, 0);
                        rewind($fp);
                        fputs($fp, $dat);
                        fclose($fp);
                        chmod($logfilename,0666);
                }else{ // php輸出
                        print $dat;
                        break; // 只執行一次迴圈,即印出一頁內容
                }
                if((STATIC_HTML_UNTIL != -1) && STATIC_HTML_UNTIL==($cpage/PAGE_DEF)){ break; } // 生成靜態頁面數目限制
        }
        if(!$resno && is_file(($cpage/PAGE_DEF+1).PHP_EXT)){ unlink(($cpage/PAGE_DEF+1).PHP_EXT); }
}

/* 輸出頁尾文字 */
function foot(&$dat){
        $dat.='
<center>
<small><!-- GazouBBS v3.0 --><!-- 雙葉改0.8 --><!-- Picmicat! --><!-- Festival -->
- <a href="http://php.s3.to" target="_top">GazouBBS</a> + <a href="http://www.2chan.net/" target="_top">futaba</a> + <a href="http://pixmicat.openfoundry.org/" target="_blank">Pixmicat!</a> / Festival by <a href="http://scrappedblog.blogspot.com/" target="_blank">Roytam1</a> -
</small>
</center>
</body></html>'
;
}

/* 網址自動連結 */
function auto_link($proto){
        return preg_replace('/(https?|ftp|news)(:\/\/[\w\+\$\;\?\.\{\}%,!#~*\/:@&=_-]+)/u', '<a href="$1$2" rel="_blank">$1$2</a>', $proto);
}

/* 引用標註 */
function quoteLight($comment){
        return preg_replace('/(^|<br\s*\/>)\s*((?:&gt;|>).*?)(?=<br\s*\/>|$)/u', '$1<span style="color: '.RE_COL.';">$2</span>', $comment);
}

/* 輸出錯誤畫面 */
function error($mes,$dest='',$nohead=0){
        global $upfile_name,$path;
        if(is_file($dest)){ unlink($dest); }
        if(!$nohead) head($dat);
        echo $dat;
        echo "<br><br><hr size=1><br><br>
<center><font color='red' size='5'><b>$mes<br><br><a href=\""
.PHP_SELF."?\">回到版面</a> <a href=\"javascript:history.back();\">回上頁</a></b></font></center>
<br><br><hr size='1'>"
;
        die("</body></html>");
}

/* 判斷是否採用Proxy連線 */
function proxy_connect($port){
        $a = ""; $b = "";
        $fp = @fsockopen($_SERVER["REMOTE_ADDR"], $port,$a,$b,2);
        if(!$fp){ return 0; }else{ return 1; }
}

/* 寫入記錄檔 */
function regist($name,$email,$sub,$com,$url,$pwd,$upfile,$upfile_name,$upfile_status,$resto){
        global $path,$BAD_STRING,$BAD_FILEMD5,$BAD_IPADDR,$admin;
        $dest="";$mes="";$up_incomplete=0;
        $pwdc = isset($_COOKIE["pwdc"]) ? $_COOKIE["pwdc"] : "";

        if($_SERVER["REQUEST_METHOD"] != "POST"){ error("請使用此版提供的表單來上傳",$dest); }

        if($url) error("Spam assertion failed.",$dest);

        // 時間
        $time = time();
        $tim = $time.substr(microtime(),2,3);

        // 判斷上傳狀態
        switch ($upfile_status){
                case 1:
                        error("上傳失敗<br>上傳的附加檔案容量超過PHP內定值");
                        break;
                case 2:
                        error("上傳失敗<br>上傳的附加檔案容量超過上傳容量限制");
                        break;
                case 3:
                        error("上傳失敗<br>上傳的附加檔案不完整,請回版面再重試");
                        break;
                case 6:
                        error("上傳失敗<br>上傳的暫存資料夾設定錯誤,請通報系統管理員");
                        break;
                case 0: // 上傳正常
                case 4: // 無上傳
                default:
        }

        // 上傳附加檔案之處理
        if($upfile && file_exists($upfile)){
                $dest = $path.$tim.'.tmp';
                move_uploaded_file($upfile, $dest);
                //↑上面如果發生錯誤,請改用↓這行
                //copy($upfile, $dest);
                if(!is_file($dest)) error("上傳失敗<br>伺服器有可能禁止上傳、沒有權限,或不支援此格式",$dest);

                // 判斷上傳附加檔案途中是否有中斷
                $HTTPupsize_TOTAL = $_SERVER['CONTENT_LENGTH'];
                $HTTPupsize_HEADER = 0;
                list(,$boundary) = explode("=",$_SERVER['CONTENT_TYPE']);
                foreach ($_POST as $header => $value) {
                        $HTTPupsize_HEADER += strlen("--".$boundary."\r\n");
                        $HTTPupsize_HEADER += strlen("Content-Disposition: form-data; name=\"$header\"\r\n\r\n".(get_magic_quotes_gpc()?stripslashes($value):$value)."\r\n");
                }
                $HTTPupsize_HEADER += strlen("--".$boundary."\r\n");
                $HTTPupsize_HEADER += strlen("Content-Disposition: form-data; name=\"upfile\"; filename=\"".($_POST['upfile_path']?(get_magic_quotes_gpc()?stripslashes($_POST['upfile_path']):$_POST['upfile_path']):$_FILES["upfile"]["name"])."\"\r\nContent-Type: ".$_FILES["upfile"]["type"]."\r\n\r\n");
                $HTTPupsize_HEADER += strlen("\r\n--".$boundary."--\r\n");

                $HTTPupsize_FILE = filesize($dest);

                $HTTPupsize_DIFF = $HTTPupsize_TOTAL  - $HTTPupsize_FILE - $HTTPupsize_HEADER;
                // ↓下行為偵錯用/偵測HTTP_UPLOAD_DIFF值
                //error('$HTTPupsize_TOTAL:'.$HTTPupsize_TOTAL."<br>\n".'$HTTPupsize_FILE:'.$HTTPupsize_FILE."<br>\n".'$HTTPupsize_HEADER:'.$HTTPupsize_HEADER."<br>\n".'HTTP_UPLOAD_DIFF:'.$HTTPupsize_DIFF,$dest);
                // HTTP上傳位元組差值差異太大,超過正常值:上傳附加檔案不完全
                if($HTTPupsize_DIFF > HTTP_UPLOAD_DIFF){
                        if (KILL_INCOMPLETE_UPLOAD) {
                        unlink($dest);
                        exit();
                        } else {
                                $up_incomplete=1;
                        }
                }
                //------------------------------------------------------------

                $upfile_name = CleanStr($upfile_name);
                $size = @getimagesize($dest);

                if(!is_array($size)) error("上傳失敗<br>不接受圖片以外的檔案",$dest);
                $chk = md5_of_file($dest);
                foreach($BAD_FILEMD5 as $value){
                        if(preg_match("/^$value/",$chk)){
                                error("上傳失敗<br>此附加檔案被管理員列為禁止上傳",$dest); // 拒絕上傳圖像
                        }
                }
                chmod($dest,0666);
                $W = $size[0];
                $H = $size[1];

                switch ($size[2]) { // 判斷上傳附加檔案之格式
                        case 1 : $ext = ".gif";break;
                        case 2 : $ext = ".jpg";break;
                        case 3 : $ext = ".png";break;
                        case 4 : $ext = ".swf";break;
                        case 5 : $ext = ".psd";break;
                        case 6 : $ext = ".bmp";break;
                        case 13 : $ext = ".swf";break;
                        default : $ext = ".xxx"; error("附加檔案為系統不支援的格式",$dest);
                }

                if($resto){ // 計算回應之預覽圖尺寸
                        if($W > MAX_RW || $H > MAX_RH){
                                $W2 = MAX_RW / $W;
                                $H2 = MAX_RH / $H;
                                ($W2 < $H2) ? $key = $W2 : $key = $H2;
                                $W = ceil($W * $key);
                                $H = ceil($H * $key);
                        }
                }else{ // 計算本文之預覽圖尺寸
                        if($W > MAX_W || $H > MAX_H){
                                $W2 = MAX_W / $W;
                                $H2 = MAX_H / $H;
                                ($W2 < $H2) ? $key = $W2 : $key = $H2;
                                $W = ceil($W * $key);
                                $H = ceil($H * $key);
                        }
                }
                $mes = "附加檔案 $upfile_name 上傳完畢<br>";
        }

        foreach($BAD_STRING as $value){
                if(strpos($com, $value)!==false || strpos($sub ,$value)!==false || strpos($name, $value)!==false || strpos($email, $value)!==false){
                        error("發出的文章中有被管理員列為限制的字句,送出失敗",$dest);
                }
        }

        // 檢查表單內容
        if(!$name || preg_match("/^[ | |]*$/",$name)){ $name=""; }
        if(!$com || preg_match("/^[ | |\t]*$/",$com)){ $com=""; }
        if(!$sub || preg_match("/^[ | |]*$/",$sub)){ $sub=""; }

        if(!$com && $upfile_status==4){ error("在沒有附加檔案的情況下,請寫入內文",$dest); }

        $name = str_replace("管理",'"管理"',$name);
        $name = str_replace("刪除",'"刪除"',$name);

        if(strlen($com) > COMM_MAX && $admin!=ADMIN_PASS) error("內文過長",$dest);
        if(strlen($name) > 100) error("名稱過長",$dest);
        if(strlen($email) > 100) error("E-mail過長",$dest);
        if(strlen($sub) > 100) error("標題過長",$dest);
        if(strlen($resto) > 10) error("欲回應的文章編號可能有誤",$dest);
        // if(strlen($url) > 10) error("錯誤發生",$dest); // 預留功能

        // 取得主機位置名稱
        $host = gethostbyaddr($_SERVER["REMOTE_ADDR"]);

        foreach($BAD_IPADDR as $value){ // 拒絕黑名單
                if(preg_match("/$value$/i",$host)){ error("您所使用的連線已被拒絕",$dest);}
        }

        if(EXTIPQ && strpos($name,"fusianasan")===false && strpos($name,"mokorikomo")===false) externalIPQuery($_SERVER["REMOTE_ADDR"],$dest);
        // 判斷是否以Proxy來要求
        if(preg_match("/^(mail|ns|dns|ftp|prox|pc)/i",$host) || preg_match("/^[^\.]\.[^\.]$/i",$host)){ $pxck = "on"; }
        if(preg_match('/(ne\.jp|ad\.jp|bbtec\.net|aol\.com|uu\.ne|asahi-net\.or\.jp|rim\.or\.jp)$/i',$host)){ $pxck = "off"; }
        else{ $pxck = "on"; }

        if($pxck=="on" && PROXY_CHECK){
                if(proxy_connect('80') == 1){
                        error("本版關閉使用公開Proxy寫入",$dest);
                }elseif(proxy_connect('8080') == 1){
                        error("本版關閉使用公開Proxy寫入",$dest);
                }
        }

        // 時間和密碼的樣式
        srand((double)microtime()*1000000);
        if($pwd==""){
                if($pwdc==""){
                        $pwd = rand(); $pwd = substr($pwd,0,8);
                }else{
                        $pwd = $pwdc;
                }
        }

        $c_pass = $pwd;
        $pass = ($pwd) ? substr(md5($pwd),2,8) : "*";
        $youbi = array('日','一','二','三','四','五','六');
        $yd = $youbi[gmdate("w", $time+TIME_ZONE*60*60)] ;
        $now = gmdate("y/m/d",$time+TIME_ZONE*60*60)."(".(string)$yd.")".gmdate("H:i",$time+TIME_ZONE*60*60);

        if(DISP_ID){ // 顯示ID
                if($email && DISP_ID==1){
                        $now .= " ID:???";
                }else{
                        $now .= " ID:".substr(crypt(md5($_SERVER["REMOTE_ADDR"].IDSEED.gmdate("Ymd", $time+TIME_ZONE*60*60)),'id'),-8);
                }
        }
        // 文字修整
        $email = CleanStr($email); $email = str_replace("\r\n","",$email);
        $sub = CleanStr($sub); $sub = str_replace("\r\n","",$sub);
        $url = CleanStr($url); $url = str_replace("\r\n","",$url);
        $resto = CleanStr($resto); $resto = str_replace("\r\n","",$resto);
        $com = CleanStr($com);
        // 換行字元統一
        $com = str_replace("\r\n","\n",$com);
        $com = str_replace("\r","\n",$com);
        // 去除連續空白
        $com = preg_replace("/\n(( | )*\n){3,}/","\n",$com);
        if(!BR_CHECK || substr_count($com,"\n") < BR_CHECK){
                $com = str_replace("\n",'<br/>',$com);          // 換行字元用<br />代替
        }
        $com = str_replace("\n"," ", $com);     // 若還有\n換行字元則取消換行

        $name = str_replace("◆","◇",$name);// 防止トリップ偽造
        $name = str_replace(CAP_CHAR,"☆",$name); // 防止キャップ偽造
        $name = str_replace("\r\n","",$name);
        $name = CleanStr($name);
        $tripped_name = ""; // 給キャップ(Cap)機能讀取之Trip樣式
                if(preg_match("/(#|#)(.*)/",$name,$regs)){ // 使用トリップ(Trip)機能 (ex:無名#abcd)
                $cap = $regs[2];
                $cap = strtr($cap,array("&amp;"=>"&","&#44;"=>","));
                $name = preg_replace("/(#|#)(.*)/","",$name);
                $salt = substr($cap."H.",1,2);
                $salt = preg_replace("/[^\.-z]/",".",$salt);
                $salt = strtr($salt,":;<=>?@[\\]^_`","ABCDEFGabcdef");
                $tripped_name = trim(preg_replace("/( *)(!uptime|!power|!dama|!omikuji)( *)/","",$name))."◆".substr(crypt($cap,$salt),-10);
                $name .= "<span class='nor'>◆".substr(crypt($cap,$salt),-10)."</span>";
        }
        if(strpos($name,"!dama")!==false) dama($name);
        if(strpos($name,"!omikuji")!==false) omikuji($name);
        if(strpos($name,"!uptime")!==false) uptime($name);
        if(strpos($name,"!power")!==false) power($name);
        if(strpos($name,"fusianasan")!==false) $name=str_replace("fusianasan","<span class='nor'>".$host."</span>",$name);
        if(strpos($name,"mokorikomo")!==false) $name=str_replace("mokorikomo","<span class='nor'>".$_SERVER['REMOTE_ADDR']."</span>",$name);

        if(preg_match("/(.*)(#|#)(.*)/",$email,$aregs) && CAP_ENABLE){ // 使用キャップ(Cap)機能
                $acap_name = ($tripped_name) ? preg_replace("/◆.{10}/","",$tripped_name) : $name; // 識別名稱
                $acap_pwd = $aregs[3];
                $acap_pwd = strtr($acap_pwd,array("&amp;"=>"&","&#44;"=>","));

                $aCapList= @file(CAPFILE);
                array_unshift($aCapList,CAP_NAME."<>".crypt(CAP_PASS)."<>".CAP_COLOR."<>".CAP_SUFFIX."<>");


                for($c=0;$c<count($aCapList);$c++){
                        list($szUName,$szUPass,$szCColor,$szCName) = explode("<>", $aCapList[$c]);
                        if($acap_name==$szUName && crypt($acap_pwd,$szUPass)==$szUPass){
                                $name = "<font color='$szCColor'>$name ".CAP_CHAR."$szCName</font>";
                                $email = $aregs[1];
                                break;
                        }
                }
                if(strpos($name,CAP_CHAR)===false) error("Cap無效");

        }
        if(ALLOW_NONAME && !$name){ $name = "無名氏"; }
        elseif(!$name) { error("您沒有填寫名稱",$dest); }

        // 管理員投稿名稱特別色
        if($admin==ADMIN_PASS){ $name = "<span class='Cname_admin'>".$name."</span>"; }
        if(!$com){ $com = "無內文"; }
        if(!$sub){ $sub = "無標題"; }

        // 上傳附加檔案不完全的提示
        if ($up_incomplete) { $com .= "<br><br><font color='#ff0000'><b>*注意:檔案不完全上傳 (T:$HTTPupsize_TOTAL F:$HTTPupsize_FILE D:$HTTPupsize_DIFF)</b></font>"; }

        // 讀取記錄檔
        $fp = fopen(LOGFILE,"r+");
        flock($fp, 2);
        rewind($fp);
        $buf = @fread($fp,filesize(LOGFILE));
        if($buf=='') { error("讀取記錄檔時發生錯誤",$dest); }
        $line = explode("\n",$buf);
        $countline = count($line);
        for($i = 0; $i < $countline; $i++){
                if($line[$i] != ""){
                        list($artno,) = explode(",", rtrim($line[$i]));  // 作成逆轉換標籤
                        $lineindex[$artno] = $i + 1;
                        $line[$i] .= "\n";
                }
        }

        // 連續投稿判斷
        $imax = $countline > RENZOKU_C ? RENZOKU_C : $countline - 1;
        for($i = 0;$i < $imax;$i++){
                list($lastno,,$lname,,,$lcom,,$lhost,$lpwd,,,,$ltime,) = explode(",", $line[$i]);
                if(strlen($ltime) > 10){ $ltime = substr($ltime,0,-3); }
                if($host==$lhost || substr(md5($pwd),2,8)==$lpwd || substr(md5($pwdc),2,8)==$lpwd){ $pchk=1; }else{ $pchk=0; }
                if(RENZOKU && $pchk && $time - $ltime < RENZOKU){ error("連續投稿請稍候一段時間",$dest); }
                if(RENZOKU && $pchk && $time - $ltime < RENZOKU2 && $upfile_name){ error("連續投稿請稍候一段時間",$dest); }
                if(RENZOKU && $pchk && $com == $lcom && !$upfile_name){ error("連續投稿請稍候一段時間",$dest); }
        }

        // 檔案上傳處理
        if($dest && file_exists($dest)){
                $imax = $countline > SAMEFILE_C ? SAMEFILE_C : $countline - 1;
                for($i = 0;$i < $imax;$i++){ // 檢查重複的附加檔案
                        @list(,,,,,,,,,$extp,,,$timep,$chkp,) = explode(",", $line[$i]);
                        if($chkp==$chk && file_exists($path.$timep.$extp)){
                                error("上傳失敗<br>已經有相同的附加檔案",$dest);
                        }
                }
        }

        // 記錄檔行數已達上限:刪除過舊檔
        if($countline >= LOG_MAX){
                for($d = $countline - 1; $d >= LOG_MAX - 1; $d--){
                        @list($dno,,,,,,,,,$dext,,,$dtime,) = explode(",", $line[$d]);
                        if(is_file($path.$dtime.$dext)){ unlink($path.$dtime.$dext); }
                        if(is_file(THUMB_DIR.$dtime.'s.jpg')){ unlink(THUMB_DIR.$dtime.'s.jpg'); }
                        $line[$d] = "";
                        treedel($dno);
                }
        }

        // 判斷欲回應的文章是不是剛剛被刪掉了
        if($resto){
                if(isset($lineindex[$resto])){ // 欲回應的討論串是否存在
                        if($line[$lineindex[$resto]-1]==""){ // 被回應的討論串存在且已被刪空
                                // 提前更新投稿文字記錄檔:剛剛刪除的動作要回存
                                ftruncate($fp,0);
                                set_file_buffer($fp, 0);
                                rewind($fp);
                                fputs($fp, implode('', $line));
                                fclose($fp);

                                updatelog();
                                error("此討論串因為過舊已被刪除!",$dest);
                        }else{ // 檢查是否討論串被設為禁止回應 (順便取出原討論串的貼文時間)
                                list(,,,$r_eml,,,$chkurl,,,,,,$chktime,) = explode(",", $line[$lineindex[$resto]-1]);
                                if(strlen($chktime) > 10){ $chktime = substr($chktime,0,-3); } // 拿掉微秒(後面三個字元)
                                if(strstr($chkurl, '_THREADSTOP_')){
                                        error("這篇討論串已被管理者標記為禁止回應!",$dest);
                                }
                        }
                }else{ // 不存在
                        error("無此討論串!",$dest);
                }
        }

        list($lastno,) = explode(",", $line[0]);
        $no = $lastno + 1;
        isset($ext) ? 0 : $ext = "";
        isset($W) ? 0 : $W = "";
        isset($H) ? 0 : $H = "";
        isset($chk) ? 0 : $chk = "";
        $newline = "$no,$now,$name,$email,$sub,$com,$url,$host,$pass,$ext,$W,$H,$tim,$chk,\n";
        $newline .= implode('', $line);
        ftruncate($fp,0);
        set_file_buffer($fp, 0);
        rewind($fp);
        fputs($fp, $newline);

        // 樹狀結構記錄檔更新
        $newline = '';
        $tp = fopen(TREEFILE,"r+");
        set_file_buffer($tp, 0);
        rewind($tp);
        $buf = @fread($tp,filesize(TREEFILE));
        if($buf==''){ error("更新樹狀結構記錄檔時發生錯誤",$dest); }
        $treeline = explode("\n",$buf);
        $counttree = count($treeline);
        for($i = 0; $i < $counttree; $i++){
                if($treeline[$i] != ""){
                        $treeline[$i] .= "\n";
                        $j = explode(",", rtrim($treeline[$i]));
                        if($lineindex[$j[0]]==0){ $line[$i] = ''; }
                }
        }
        if($resto){
                for($i = 0; $i < $counttree; $i++){
                        $rtno = explode(",", rtrim($treeline[$i]));
                        if($rtno[0]==$resto){
                                $treeline[$i] = rtrim($treeline[$i]).','.$no."\n";
                                $j = explode(",", rtrim($treeline[$i]));
                                if(((MAX_RES && count($j)>MAX_RES)||preg_match('/^sage/i',ltrim($r_eml)))||(MAX_AGE_TIME && (($time - $chktime) >= (MAX_AGE_TIME * 60 * 60))) && (!preg_match('/^age/i',ltrim($email)))){ if(!preg_match('/^sage/i',ltrim($email))) $email = 'sage '.$email; }
                                if(!preg_match('/^sage/i',ltrim($email))){
                                        $newline = $treeline[$i];
                                        $treeline[$i] = '';
                                }
                                break;
                        }
                }
        }

        if(!$resto){ $newline="$no\n"; }
        $newline .= implode('', $treeline);
        ftruncate($tp,0);
        set_file_buffer($tp, 0);
        rewind($tp);
        fputs($tp, $newline);
        fclose($tp);
        fclose($fp);

        // 附加檔案容量限制功能啟動:刪除過大檔
        if(STORAGE_LIMIT){
                $tmp_line = file(LOGFILE);
                $tmp_total_size = (int)total_size(); // 取得目前附加檔案使用量
                if($tmp_total_size >= STORAGE_MAX){
                        for($x = count($tmp_line) - 1; $tmp_total_size >= STORAGE_MAX; $x--){
                                list(,,,,,,,,,$dext,,,$dtime,) = explode(",", $tmp_line[$x]);
                                if(is_file($path.$dtime.$dext)){ $tmp_total_size -= filesize($path.$dtime.$dext)/1024; unlink($path.$dtime.$dext); }
                                if(is_file(THUMB_DIR.$dtime.'s.jpg')){ $tmp_total_size -= filesize(THUMB_DIR.$dtime.'s.jpg')/1024; unlink(THUMB_DIR.$dtime.'s.jpg'); }
                        }
                }
                unset($tmp_line);
        }

        // Cookies儲存:密碼與E-mail部分
        setcookie ("pwdc", $c_pass,time()+7*24*3600);  /* 期限是一週 */
        $c_email = $email;
        setcookie ("emailc", $c_email,time()+7*24*3600);  /* 期限是一週 */

        if($dest&&file_exists($dest)){
                rename($dest,$path.$tim.$ext);
                if(USE_THUMB){
                        if(USE_REPNG2JPEG){ thumb_repng($path,$tim,$ext,$resto); } // 使用repng2jpeg外部程式
                        else{ thumb($path,$tim,$ext,$resto); } // 使用GD
                }
        }

        total_size(true); // 刪除舊快取
        if(AUTO_ZOMBIECHECK && $countline >= LOG_MAX) check_zombie(1);
        updatelog();

        echo "<html><head><META HTTP-EQUIV=\"Content-type\" CONTENT=\"text/html; charset=utf-8\"><META HTTP-EQUIV=\"refresh\" content=\"1;URL=".(isset($_SERVER['HTTP_REFERER'])?$_SERVER['HTTP_REFERER']:PHP_SELF)."\"></head>";
        echo "<body>$mes 畫面正在切換</body></html>";
}

/* 生成預覽圖:需要開啟GD模組 */
function thumb($path,$tim,$ext,$resto){
        if(!function_exists("ImageCreate")||!function_exists("ImageCreateFromJPEG")){ return; }
        $fname = $path.$tim.$ext;
        $thumb_dir = THUMB_DIR; // 預覽圖儲存目錄位置
        if($resto){ // 生成回應之預覽圖
                $width = MAX_RW; // 預覽圖寬
                $height = MAX_RH; // 預覽圖高
        }else{ // 生成本文之預覽圖
                $width = MAX_W; // 預覽圖寬
                $height = MAX_H; // 預覽圖高
        }

        // 取得原附加圖檔之長寬及類型
        $size = GetImageSize($fname);
        switch ($size[2]) {
                case 1 : // GIF圖像
                        if(function_exists("ImageCreateFromGIF")){
                                $im_in = @ImageCreateFromGIF($fname);
                                if($im_in){ break; }
                        }
                        if(!is_executable(realpath("./gif2png"))||!function_exists("ImageCreateFromPNG")){ return; }
                        // 某些版本GD不支援GIF讀寫,使用gif2png外部程式把gif轉換成png再轉成jpg
                        @exec(realpath("./gif2png")." $fname",$a);
                        if(!file_exists($path.$tim.'.png')){ return; }
                        $im_in = @ImageCreateFromPNG($path.$tim.'.png');
                        unlink($path.$tim.'.png');
                        if(!$im_in){ return; }
                        break;
                case 2 : // JPEG圖像
                        $im_in = @ImageCreateFromJPEG($fname);
                        if(!$im_in){ return; }
                        break;
                case 3 : // PNG圖像
                        if(!function_exists("ImageCreateFromPNG")){ return; }
                        $im_in = @ImageCreateFromPNG($fname);
                        if(!$im_in){ return; }
                        break;
                default : return;
        }
        // 計算預覽圖大小
        if ($size[0] > $width || $size[1] > $height) {
                $key_w = $width / $size[0];
                $key_h = $height / $size[1];
                ($key_w < $key_h) ? $keys = $key_w : $keys = $key_h;
                $out_w = ceil($size[0] * $keys) + 1;
                $out_h = ceil($size[1] * $keys) + 1;
        } else {
                $out_w = $size[0];
                $out_h = $size[1];
        }
        // 生成預覽圖圖像
        if(function_exists("ImageCreateTrueColor") && get_gd_ver()=="2"){ // 給GD 2.x版使用
                $im_out = ImageCreateTrueColor($out_w, $out_h);
                ImageCopyResampled($im_out, $im_in, 0, 0, 0, 0, $out_w, $out_h, $size[0], $size[1]); // 重取樣並縮小,品質佳
        }else{ // 給GD 1.x版使用
                $im_out = ImageCreate($out_w, $out_h);
                ImageCopyResized($im_out, $im_in, 0, 0, 0, 0, $out_w, $out_h, $size[0], $size[1]); // 僅能使用重設大小
        }
        // 儲存預覽圖
        ImageJPEG($im_out, $thumb_dir.$tim.'s.jpg',THUMB_Q);
        chmod($thumb_dir.$tim.'s.jpg',0666);
        // 刪除暫存之圖檔
        ImageDestroy($im_in);
        ImageDestroy($im_out);
}

/* 得知目前伺服器採用之GD模組版本 */
function get_gd_ver($isRAW=''){
        if(function_exists("gd_info")){ // 現有版本
                $gdver = gd_info();
                $phpinfo = $gdver["GD Version"];
        }else{ // PHP 4.3.0以下用
                ob_start();
                phpinfo(8);
                $phpinfo = ob_get_contents();
                ob_end_clean();
                $phpinfo = strip_tags($phpinfo);
                $phpinfo = stristr($phpinfo,"gd version");
                $phpinfo = stristr($phpinfo,"version");
        }
        if(!$isRAW){ // 僅擷取主版本號
                $end = strpos($phpinfo,".");
                $phpinfo = substr($phpinfo,0,$end);
                $length = strlen($phpinfo) - 1;
                $phpinfo = substr($phpinfo,$length);
        }
        return $phpinfo;
}

/* 計算附加檔案之MD5檢查碼 */
function md5_of_file($inFile) {
        if(file_exists($inFile)){ // 檢查目標檔案是否存在
                if(function_exists('md5_file')){ // 現有版本
                        return md5_file($inFile);
                }else{ // PHP 4.2.0以下用
                        $fd = fopen($inFile, 'r');
                        $fileContents = fread($fd, filesize($inFile));
                        fclose($fd);
                        return md5($fileContents);
                }
        }else{ return false; }
}

/* 樹狀結構刪除 */
function treedel($delno){
        $fp = fopen(TREEFILE,"r+");
        set_file_buffer($fp, 0);
        flock($fp, 2);
        rewind($fp);
        $buf = @fread($fp,filesize(TREEFILE));
        if($buf==''){ error("更新樹狀結構記錄檔時發生錯誤"); }
        $line = explode("\n",$buf);
        $countline = count($line);
        if($countline > 2){
                for($i = 0; $i < $countline; $i++){ if($line[$i] != ""){ $line[$i] .= "\n"; }; }
                for($i = 0; $i < $countline; $i++){
                        $treeline = explode(",", rtrim($line[$i]));
                        $counttreeline = count($treeline);
                        for($j = 0; $j < $counttreeline; $j++){
                                if($treeline[$j] == $delno){
                                        $treeline[$j] = '';
                                        if($j==0){ $line[$i] = ''; }
                                        else{
                                                $line[$i] = implode(',', $treeline);
                                                $line[$i] = str_replace(",,",",",$line[$i]);
                                                $line[$i] = preg_replace("/,$/","",$line[$i]);
                                                $line[$i] .= "\n";
                                        }
                                        break 2;
                                }
                        }
                }
                ftruncate($fp,0);
                set_file_buffer($fp, 0);
                rewind($fp);
                fputs($fp, implode('', $line));
        }
        fclose($fp);
}

/* 文字修整 */
function CleanStr($str){
        global $admin;
        $str = trim($str); // 去除前後多於空白
        if (get_magic_quotes_gpc()) {// "\"斜線符號去除
                $str = stripslashes($str);
        }
        if($admin != ADMIN_PASS){ // 管理員可以使用HTML標籤
                $str = preg_replace("/&amp;(#[0-9]+|[a-z]+);/i", "&$1;", htmlspecialchars($str)); // 非管理員:HTML標籤禁用
        }
        return str_replace(",", "&#44;", $str); // ","逗號用參照碼方式取代
}

/* 使用者刪除 */
function usrdel($no,$pwd){
        global $path, $onlyimgdel;
        $pwdc = isset($_COOKIE["pwdc"]) ? $_COOKIE["pwdc"] : "";
        $host = gethostbyaddr($_SERVER["REMOTE_ADDR"]);
        $delno = array("dummy");
        reset($_POST);
        while ($item = each($_POST))
                if($item[1]=='delete') array_push($delno,$item[0]);
        if($no) $delno=array_merge($delno,explode(',',$no));
        if($pwd=="" && $pwdc != ""){ $pwd = $pwdc; }
        $fp = fopen(LOGFILE,"r+");
        set_file_buffer($fp, 0);
        flock($fp, 2);
        rewind($fp);
        $buf = @fread($fp,filesize(LOGFILE));
        if($buf==''){ error("刪除發生錯誤"); }
        $line = explode("\n",$buf);
        $countline = count($line);
        for($i = 0; $i < $countline; $i++){ if($line[$i]!=""){ $line[$i] .= "\n"; }; }
        $flag = FALSE;
        for($i = 0; $i < $countline-1; $i++){
                list($dno,,,,,,,$dhost,$pass,$dext,,,$dtim,) = explode(",", $line[$i]);
                if(array_search($dno,$delno) && (substr(md5($pwd),2,8) == $pass || $dhost == $host||ADMIN_PASS==$pwd)){
                        $flag = TRUE;
                        if(!$onlyimgdel){
                                $line[$i] = ""; // 密碼比對符合,此文章刪除
                                treedel($dno);
                        }
                        if(is_file($path.$dtim.$dext)) unlink($path.$dtim.$dext); // 刪除附加檔案
                        if(is_file(THUMB_DIR.$dtim.'s.jpg')) unlink(THUMB_DIR.$dtim.'s.jpg'); // 刪除預覽圖檔案
                }
        }
        if($flag){ // 更新投稿文字記錄檔
                ftruncate($fp,0);
                set_file_buffer($fp, 0);
                rewind($fp);
                fputs($fp, implode('', $line));
                total_size(true); // 刪除舊快取
        }
        fclose($fp);
        if(!$flag) error("無此文章或是密碼錯誤");
}

/* 管理員密碼認證 */
function valid($pass){
        global $res;
        if($pass && $pass != ADMIN_PASS) error("密碼錯誤");

        head($dat);
        echo $dat;
        echo "[<a href=\"".PHP_SELF."?\">回到版面</a>]\n";
        echo "[<a href=\"".PHP_SELF."?mode=remake\">更新文章</a>]\n";
        echo "[<a href=\"mod_cap.php\">Cap事務所</a>]\n";
        echo "<table width='100%'><tr><th bgcolor=\"#E08000\">\n";
        echo "<font color=\"#FFFFFF\">管理模式</font>\n";
        echo "</th></tr></table>\n";
        echo "<form action=\"".PHP_SELF."\" method=POST>\n";
        // 登錄用表單
        if(!$pass){
                echo "<center>";
                if($res) echo "<input type=\"hidden\" name=\"res\" value=\"$res\">";
                echo <<<__VALID_EOF__
<input type="radio" name="admin" value="del" checked>管理文章
<input type="radio" name="admin" value="zombie">刪除無主孤文
<input type="radio" name="admin" value="post">管理員投稿
<input type="hidden" name="mode" value="admin"><br />
<input type="password" name="pass" size="8">
<input type="submit" value=" 認證 "></center></form>
__VALID_EOF__;
                die("</body></html>");
        }
}

/* 管理文章模式 */
function admindel($pass){
        global $path,$onlyimgdel;
        $page = isset($_POST["page"]) ? $_POST["page"] : "1";
        $delno = array("dummy"); $thsno = array("dummy");
        $delflag = isset($_POST["delete"]); // 是否有「刪除」勾選
        $thsflag = isset($_POST["stop"]); // 是否有「停止」勾選

        if($delflag || $thsflag){ // 無論如何都有檔案操作,開啟檔案
                $fp = fopen(LOGFILE,"r+");
                set_file_buffer($fp, 0);
                flock($fp, 2);
                rewind($fp);
                $buf = @fread($fp,filesize(LOGFILE));
                if($buf==''){ error("檔案操作發生錯誤"); }
                $line = explode("\n",$buf);
                $countline = count($line);
                for($i = 0; $i < $countline; $i++){ if($line[$i]!=""){ $line[$i] .= "\n"; }; }
                $find = FALSE;
        }
        // 刪除文章區塊
        if($delflag){
                $delno = array_merge($delno, $_POST["delete"]);
                for($i = 0; $i < $countline - 1; $i++){
                        list($no,$now,$name,$email,$sub,$com,$url,$host,$pw,$ext,$w,$h,$time,$chk) = explode(",", $line[$i]);
                        if(array_search($no,$delno)){ // 僅刪除附加檔案
                                if(is_file($path.$time.$ext)){ unlink($path.$time.$ext); } // 刪除附加檔案
                                if(is_file(THUMB_DIR.$time.'s.jpg')){ unlink(THUMB_DIR.$time.'s.jpg'); } // 刪除預覽圖
                                if($onlyimgdel!="on"){ // 不是僅刪除附加檔案
                                        $find = TRUE;
                                        $line[$i] = "";
                                        treedel($no);
                                }
                        }
                }
                total_size(true); // 刪除舊快取
        }
        // 討論串停止區塊
        if($thsflag){
                $thsno = array_merge($thsno, $_POST["stop"]);
                for($p = 0; $p < $countline - 1; $p++){
                        if(@!$line[$p]) continue;
                        list($no,$now,$name,$email,$sub,$com,$url,$host,$pw,$ext,$w,$h,$time,$chk) = explode(",", $line[$p]);
                        if(array_search($no,$thsno)){ // 被選取到修改
                                $find = TRUE;
                                if(stristr($url, '_THREADSTOP_')){
                                        $url = str_replace("_THREADSTOP_","",$url); // 移除禁止回應標記
                                }else{
                                        $url .= "_THREADSTOP_"; // 加上禁止回應標記
                                }
                                $line[$p] = "$no,$now,$name,$email,$sub,$com,$url,$host,$pw,$ext,$w,$h,$time,$chk,\n"; // 寫回記錄
                        }
                }
        }
        if($delflag || $thsflag){ // 無論如何都有檔案操作,回寫檔案
                if($find){ // 更新投稿文字記錄檔
                        ftruncate($fp,0);
                        set_file_buffer($fp, 0);
                        rewind($fp);
                        fputs($fp, implode('', $line));
                }
                fclose($fp);
        }
        // 取出討論串首篇之No. (是否顯示停止勾選欄)
        $ttree = file(TREEFILE);
        $tno = array('dummy'); // 所有討論串首篇之No.陣列
        $tcounttree = count($ttree);
        for($x = 0; $x < $tcounttree; $x++) {
                list($tartno,) = explode(",", rtrim($ttree[$x]));
                array_push($tno, $tartno);
        }

        // 印出刪除表格
        echo <<< _N_EOT_
<script type="text/javascript">
function ChangePage(page){
        document.forms[0].page.value = page;
        document.forms[0].submit();
}
</script>
<input type=hidden name=mode value=admin>
<input type=hidden name=admin value=del>
<input type=hidden name=pass value="$pass">
<input type=hidden name=page value="$page">
<ul><li>想刪除文章,請勾選該文章前之「刪除」核取框之後按下執行按鈕</li><li>只想刪除文章的附加檔案,請先勾選「僅刪除附加檔案」再按照一般刪文方式</li><li>想停止/繼續討論串,請勾選該文章前之「停止」核取框之後按下執行按鈕</li><li>勾選後換頁亦相當於執行,請慎用此功能</li><li>管理文章完畢,記得順手按下「更新文章」以更新靜態快取</li></ul>
<p><input type=submit value=" 執行 ">
<input type=reset value=" 重置 ">
[<input type=checkbox name=onlyimgdel id=onlyimgdel value=on><label for=onlyimgdel>僅刪除附加檔案</label>]</p>
<center><table class="navi">
<tr bgcolor="#6080f6"><th>停止</th><th>刪除</th><th>投稿日</th><th>標題</th>
<th>名稱</th><th>內文</th><th>主機位置名稱</th><th>附加檔案 (Bytes)[預覽圖重作]<br>MD5 檢查碼</th>
</tr>
_N_EOT_;
        $line = file(LOGFILE);

        $p = 0;
        for($j = (($page-1) * ADMIN_PAGE_DEF); $j < ($page * ADMIN_PAGE_DEF); $j++){
                if(@!$line[$j]) continue; // 避免出現Undefined offset錯誤
                $p++;
                list($no,$now,$name,$email,$sub,$com,$url,$host,$pw,$ext,$w,$h,$time,$chk) = explode(",",$line[$j]);
                // 套用輸出格式
                $now = preg_replace('/.{2}\/(.{5})\(.+?\)(.{5}).*/', '$1 $2', $now);
                $name = strip_tags($name); // 去除HTML標籤
                if(strlen($name) > 10){ $name = substr($name,0,8)."..."; }
                if(strlen($sub) > 10){ $sub = substr($sub,0,8)."..."; }
                if($email){ $name="<a href=\"mailto:$email\">$name</a>"; }

                $com = str_replace("<br />"," ",$com);
                if(strlen($com) > 30){ $com = substr($com,0,30)."..."; }
                if(array_search($no,$tno)){ // 為討論串首篇
                        $THstop = "<input type=\"checkbox\" name=\"stop[]\" value=\"$no\">".((strpos($url,"_THREADSTOP_")!==FALSE)?"停":"");
                }else{
                        $THstop = "--";
                }
                // 從記錄檔抽出計算附加檔案使用量
                if($ext && is_file($path.$time.$ext)){
                        $rethumb_link = "<a href=\"".PHP_SELF."?mode=rethumb&amp;no=$no\" target=\"rethumb\">重作</a>";
                        $clip = "<a href=\"".IMG_DIR.$time.$ext."\" target='_blank'>".$time.$ext."</a><br>";
                        $size = filesize($path.$time.$ext);
                        $chk= substr($chk,0,10);
                }else{
                        $rethumb_link = "--";
                        $clip = "--";
                        $size = 0;
                        $chk= "--";
                }
                $bg = ($p % 2) ? "d6d6f6" : "f6f6f6"; // 背景顏色

                echo "<tr bgcolor=\"#$bg\"><th>$THstop</th><th><input type=checkbox name=\"delete[]\" value=\"$no\">$no</th>";
                echo "<td><small>$now</small></td><td>$sub</td>";
                echo "<td><b>$name</b></td><td><small>$com</small></td>";
                echo "<td>$host</td><td align=\"center\">$clip ($size)[$rethumb_link]<br>$chk</td></tr>\n";
                if($j == count($line) - 1){ break; } // 即將超過log檔陣列範圍(即已到達檔案EOF),跳出迴圈
        }
        echo "</table></center><br><input type=submit value=\" 執行 \">";
        echo "<input type=reset value=\" 重置 \"></form>";

        $all = (int)total_size();
        echo "<br>【 附加檔案使用容量總計 : <b>$all</b> KB 】<hr>";

        $countline = count($line); // 目前總筆數
        $page_max = (int)($countline / ADMIN_PAGE_DEF); if($countline % ADMIN_PAGE_DEF){ $page_max++; } // 總頁數
        echo "<table align='left' class='navi'><tr>";
        if($page > 1){
                echo "<td><input type=\"button\" value=\"上一頁\" onclick=\"ChangePage(".($page-1).");\"></td>";
        }else{
                echo "<td nowrap>第一頁</td>";
        }
        echo "<td>";
        for($i = 1; $i <= $page_max; $i++){
                if($i == $page){ echo "[<b>".$i."</b>] "; }
                else{
                        echo "[<a href=\"javascript:ChangePage(".$i.");\">".$i."</a>] ";
                }
        }
        echo "</td>";
        if($page < $page_max){
                echo "<td><input type=\"button\" value=\"下一頁\" onclick=\"ChangePage(".($page+1).");\"></td>";
        }else{
                echo "<td nowrap>最後一頁</td>";
        }
        echo "</tr></table><br clear='all'>\n";
        die("</body></html>");
}
/* 檢查無主孤文 */
function check_zombie($silent=0){
        global $path;
        $delno = array("dummy");

        $tree=explode(",",str_replace("\n",",",implode('', file(TREEFILE))));

        $fp = fopen(LOGFILE,"r+");
        set_file_buffer($fp, 0);
        flock($fp, 2);
        rewind($fp);
        $buf = @fread($fp,filesize(LOGFILE));
        if($buf==''){ error("刪除發生錯誤",'',1); }
        $line = explode("\n",$buf);
        $countline = count($line);
        for($i = 0; $i < $countline; $i++){ if($line[$i]!=""){ $line[$i] .= "\n"; }; }
        $flag = FALSE;
        $countline = count($line) - 1;
        $zcnt=0;
        for($i = 0; $i < $countline; $i++){
                list($dno,,,,,,,,,$dext,,,$dtim,) = explode(",", $line[$i]);
                if (array_search($dno,$tree)===false) {
                        $zcnt++;
                        $flag = TRUE;
                        $line[$i] = ""; // 此文章刪除
                        if(is_file($path.$dtim.$dext)) unlink($path.$dtim.$dext); // 刪除附加檔案
                        if(is_file(THUMB_DIR.$dtim.'s.jpg')) unlink(THUMB_DIR.$dtim.'s.jpg'); // 刪除預覽圖檔案
                }
        }
        if($flag){ // 更新投稿文字記錄檔
                ftruncate($fp,0);
                set_file_buffer($fp, 0);
                rewind($fp);
                fputs($fp, implode('', $line));
        }
        fclose($fp);
        total_size(true);
        if(!$silent) error("已刪除的無主孤文總數: $zcnt",'',1);
}

/* 程式首次執行之初始化 */
function init(){
        $err = "";
        $chkfile = array(LOGFILE,TREEFILE,CAPFILE);
        if(!is_writable(realpath("./"))){ error("根目錄沒有寫入權限,請修改權限<br>"); }
        foreach($chkfile as $value){
                if(!file_exists(realpath($value))){
                        $fp = fopen($value, "w");
                        set_file_buffer($fp, 0);
                        if($value==LOGFILE){ fputs($fp,"1,05/01/01(六) 00:00 ID:00000000,無名氏,,無標題,無內文,,,,,,,,\n"); }
                        if($value==TREEFILE){ fputs($fp,"1\n"); }
                        if($value==CAPFILE){ fputs($fp,""); }
                        fclose($fp);
                        if(file_exists(realpath($value))){ @chmod($value,0666); }
                }
                if(!is_writable(realpath($value))){ $err .= "檔案:".$value."無法寫入<br>"; }
                if(!is_readable(realpath($value))){ $err .= "檔案:".$value."無法讀取<br>"; }
        }
        @mkdir(IMG_DIR,0777);@chmod(IMG_DIR,0777);
        if(!is_dir(realpath(IMG_DIR))){ $err .= "找不到".IMG_DIR."這個目錄<br>"; }
        if(!is_writable(realpath(IMG_DIR))){ $err .= "目錄:".IMG_DIR."無法寫入<br>"; }
        if(!is_readable(realpath(IMG_DIR))){ $err .= "目錄:".IMG_DIR."無法讀取<br>"; }
        if(USE_THUMB){
                @mkdir(THUMB_DIR,0777);@chmod(THUMB_DIR,0777);
                if(!is_dir(realpath(THUMB_DIR))){ $err .= "找不到".THUMB_DIR."這個目錄<br>"; }
                if(!is_writable(realpath(THUMB_DIR))){ $err .= "目錄:".THUMB_DIR."無法寫入<br>"; }
                if(!is_readable(realpath(THUMB_DIR))){ $err .= "目錄:".THUMB_DIR."無法讀取<br>"; }
        }
        if($err){ error($err); }
}

/* 計算目前附加檔案使用容量 (單位:KB) */
function total_size($isupdate=false){
        global $path;
        $size = 0;$all = 0;
        if($isupdate){ // 刪除舊快取
                if(file_exists(SIZECACHE)) unlink(SIZECACHE);
                return false;
        }
        if(!file_exists(SIZECACHE)){ // 無快取,新增
                $line = file(LOGFILE);
                for($k = 0; $k < count($line); $k++){
                        if(@!$line[$k]) continue; // 避免出現Undefined offset錯誤
                        list(,,,,,,,,,$ext,,,$time,) = explode(",",$line[$k]);
                        // 從記錄檔抽出計算附加檔案使用量
                        if($ext && is_file($path.$time.$ext)){
                                $size = filesize($path.$time.$ext);
                                $all += $size; // 附加檔案合計計算
                        }
                        if(is_file(THUMB_DIR.$time.'s.jpg')){
                        $size = filesize(THUMB_DIR.$time.'s.jpg');
                        $all += $size; // 預覽圖合計計算
                        }
                }
                $sp = fopen(SIZECACHE, "w");
                set_file_buffer($sp, 0);
                rewind($sp);
                flock($sp, LOCK_EX); // 暫時鎖定檔案為寫入中
                fputs($sp, $all); // 寫入目前使用容量值
                flock($sp, LOCK_UN); // 解鎖
                fclose($sp);
                @chmod(SIZECACHE,0666);
        }else{ // 使用快取
                $sp = file(SIZECACHE);
                $all = $sp[0];
                unset($sp);
        }
        return (int)($all / 1024);
}

/* 顯示系統各項資訊 */
function showstatus(){
        $line = file(LOGFILE); $countline = count($line); // 計算投稿文字記錄檔目前資料筆數
        $trline = file(TREEFILE); $countree = count($trline); // 計算樹狀結構記錄檔目前資料筆數
        unset($line); unset($trline); // 刪除檔案暫存指標
        $tmp_total_size = (int)total_size(); // 附加檔案使用量總大小
        $tmp_log_ratio = ((int)$countline / LOG_MAX); // 記錄檔使用量
        $tmp_ts_ratio = ($tmp_total_size / STORAGE_MAX); // 附加檔案使用量

        // 決定「記錄檔使用量」提示文字顏色
        if($tmp_log_ratio < 0.3 ){
                $clrflag_log = '#235CFF';
        }elseif($tmp_log_ratio < 0.5 ){
                $clrflag_log = '#0CCE0C';
        }elseif($tmp_log_ratio < 0.7 ){
                $clrflag_log = '#F28612';
        }elseif($tmp_log_ratio < 0.9 ){
                $clrflag_log = '#F200D3';
        }else{
                $clrflag_log = '#F2004A';
        }

        // 決定「附加檔案使用量」提示文字顏色
        if($tmp_ts_ratio < 0.3 ){
                $clrflag_sl = '#235CFF';
        }elseif($tmp_ts_ratio < 0.5 ){
                $clrflag_sl = '#0CCE0C';
        }elseif($tmp_ts_ratio < 0.7 ){
                $clrflag_sl = '#F28612';
        }elseif($tmp_ts_ratio < 0.9 ){
                $clrflag_sl = '#F200D3';
        }else{
                $clrflag_sl = '#F2004A';
        }

        // 判斷預覽圖產生方式及是否能正常作用
        $thumb_type = (USE_REPNG2JPEG) ? 'repng2jpeg' : 'GD';
        $thumb_IsAvailable = '<FONT color="red">功能失常</FONT>';
        // 檢驗是否能支援GD模組
        $func_gd = (!function_exists('ImageCreate')||!function_exists('ImageCreateFromJPEG')) ? '<FONT color="red">未開啟</FONT>' : '<FONT color="blue">已開啟</FONT>';
        // 檢驗是否開啟使用repng2jpeg及是否能正常使用
        $func_repng2jpeg = '<FONT color="red">未開啟使用</FONT>';
        if(USE_REPNG2JPEG){
                $tmp_reobj = new repng2jpeg();
                if($tmp_reobj->Is_available()){ $func_repng2jpeg = '<FONT color="blue">已能使用</FONT>'; $thumb_IsAvailable = '<FONT color="blue">功能正常</FONT>'; }
                else { $func_repng2jpeg = '<FONT color="red">未能使用</FONT>'; }
                unset($tmp_reobj);
        }else{ // 檢驗GD模組是否能正常作用
                if(function_exists('ImageJPEG')) { $thumb_IsAvailable = '<FONT color="blue">功能正常</FONT>'; }
        }
        // 檢驗md5_file函式是否存在
        $func_md5_file = (function_exists('md5_file')) ? '<FONT color="blue">可支援</FONT>' : '<FONT color="red">不支援</FONT>';

        $dat = "";
        head($dat);
        $dat .= "[<a href=\"".PHP_SELF."?\">回到版面</a>]\n
<table width='100%'><tr><th bgcolor='#E08000'>\n
<font color='#FFFFFF'>系統資訊</font>\n
</th></tr></table>"
;

        $dat .= '
<P><CENTER>
<TABLE class="navi" WIDTH="600" style="text-align:left;">
<TR><TD align="center" class="navi" colspan="3">基本設定</TD></TR>
<TR><TD WIDTH="240">程式版本</TD><TD colspan="2"> '
.FUTABA_VER.' </TD></TR>
<TR><TD>一頁顯示幾篇討論串</TD><TD colspan="2"> '
.PAGE_DEF.' 篇</TD></TR>
<TR><TD>唯讀模式</TD><TD colspan=2> '
.READONLY.' (是:1 否:0)</TD></TR>
<TR><TD>一篇討論串最多顯示之回應筆數</TD><TD colspan="2"> '
.RE_DEF.' 筆</TD></TR>
<TR><TD>回應模式一頁顯示幾筆回應內容</TD><TD colspan="2"> '
.RE_PAGE_DEF.' 筆 (全部顯示:0)</TD></TR>
<TR><TD>回應筆數超過多少則不自動推文</TD><TD colspan="2"> '
.MAX_RES.' 筆</TD></TR>
<TR><TD>討論串可接受推文的時間範圍</TD><TD colspan="2"> '
.MAX_AGE_TIME.' 小時 (關閉:0)</TD></TR>
<TR><TD>URL文字自動作成超連結</TD><TD colspan="2"> '
.AUTO_LINK.' (是:1 否:0)</TD></TR>
<TR><TD>內文接受Bytes數 (中文字為2Bytes)</TD><TD colspan="2"> '
.COMM_MAX.' Bytes</TD></TR>
<TR><TD>接受匿名發送</TD><TD colspan="2"> '
.ALLOW_NONAME.' (是:1 否:0)</TD></TR>
<TR><TD>使用預覽圖機能</TD><TD colspan="2"> '
.USE_THUMB.' (使用:1 不使用:0)</TD></TR>';
        if(USE_THUMB){ $dat .= '<TR><TD>└ 預覽圖產生方式</TD><TD colspan="2"> 使用'.$thumb_type.' ('.$thumb_IsAvailable.')</TD></TR>'."\n"; }
        $dat .= '
<TR><TD>限制Proxy寫入</TD><TD colspan="2"> '
.PROXY_CHECK.' (是:1 否:0)</TD></TR>
<TR><TD>自動刪除無主孤文</TD><TD colspan="2"> '
.AUTO_ZOMBIECHECK.' (是:1 否:0)</TD></TR>
<TR><TD>キャップ (Cap) 機能</TD><TD colspan="2"> '
.CAP_ENABLE.' (是:1 否:0)</TD></TR>
<TR><TD>顯示ID</TD><TD colspan="2"> '
.DISP_ID.' (強制顯示:2 選擇性顯示:1 永遠不顯示:0)</TD></TR>
<TR><TD>文字換行行數上限</TD><TD colspan="2"> '
.BR_CHECK.' 行 (不限:0)</TD></TR>
<TR><TD>時區設定</TD><TD colspan="2"> GMT '
.TIME_ZONE.'</TD></TR>
<TR><TD>目前總討論串篇數</TD><TD  colspan="2"> '
.$countree.' 篇</TD></TR>
<TR><TD align="center" colspan="3" class="navi">記錄檔使用量</TD></TR>
<TR align="center"><TD>最大筆數</TD><TD>'
.LOG_MAX.'</TD><TD ROWSPAN=2>使用率<br><FONT color="'.$clrflag_log.'">'.substr(($tmp_log_ratio * 100), 0, 6).'</FONT> %<table width="100%" cellspacing="0" style="border:2px solid '.BORDER_COLOR.';"><tr><td width="'.substr(($tmp_log_ratio * 100), 0, 6).'%" bgcolor="'.$clrflag_log.'" style="height:5px;"></td><td width="'.(100-substr(($tmp_log_ratio * 100), 0, 6)).'%"></td></tr></table></TR>
<TR align="center"><TD>目前筆數</TD><TD><FONT color="'
.$clrflag_log.'">'.$countline.'</FONT></TD></TR>
<TR><TD align="center" colspan="3" class="navi">附加檔案容量限制功能:'
.STORAGE_LIMIT.' (啟動:1 關閉:0)</TD></TR>';

        if(STORAGE_LIMIT){
                $dat .= '
<TR align="center"><TD>上限大小</TD><TD>'
.STORAGE_MAX.' KB</TD><TD ROWSPAN="2">使用率<br><FONT color="'.$clrflag_sl.'">'.substr(($tmp_ts_ratio * 100), 0, 6).'</FONT> %<table width="100%" cellspacing="0" style="border:2px solid '.BORDER_COLOR.';"><tr><td width="'.substr(($tmp_ts_ratio * 100), 0, 6).'%" bgcolor="'.$clrflag_sl.'" style="height:5px;"></td><td width="'.(100-substr(($tmp_ts_ratio * 100), 0, 6)).'%"></td></tr></table></td></tr>
<TR align="center"><TD>目前容量</TD><TD><FONT color="'
.$clrflag_sl.'">'.$tmp_total_size.' KB</FONT></TD></TR>';
        }else{
                $dat .= '
<TR align="center"><TD>目前容量</TD><TD>'
.$tmp_total_size.' KB</TD><TD>使用率<br><FONT COLOR="GREEN">無上限</FONT></td></tr>';
        }

        $dat .= '
<TR><TD align="center" colspan="3" class="navi">伺服器支援情報</TD></TR>
<TR align="center"><TD colspan="2">GD函式庫 '
.get_gd_ver(true).'</TD><TD>'.$func_gd.'</TD></TR>
<TR align="center"><TD colspan="2">repng2jpeg外部程式</TD><TD>'
.$func_repng2jpeg.'</TD></TR>
<TR align="center"><TD colspan="2">md5_file函式</TD><TD>'
.$func_md5_file.'</TD></TR>
</TABLE></CENTER><BR><BR><HR>'
;

        foot($dat);

        echo $dat;
        exit();
}

/* Catalog 模式 */
function showcatalog(){
        global $path;
        $page=0;$pagenavi='';
        extract($_GET);
        $dat = "";
        $dat .= '<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd">
<html><head>
<META HTTP-EQUIV="Content-type" CONTENT="text/html; charset=utf-8">
<META HTTP-EQUIV="pragma" CONTENT="no-cache">
<META HTTP-EQUIV="expires" CONTENT="Thu, 1 Jan 1970 00:00:00 GMT">
<title>'
.TITLE.'</title>
<style type="text/css">
<!--
div.pic {
        float:left;
        position: relative;
        margin: 10px 5px;
        padding: 0;
        width:'
.MAX_RW.'px;
        height:'
.MAX_RH.'px;
}
div.pic img {
        display: block;
        position: relative;
        margin-left: auto;
        margin-right: auto;
        padding: 4px;
        background-color: #fff;
        border: 1px solid #a9a9a9;
}
div.spacer {background:none;float:left;padding: 4px;}
div.others {clear:both;}
small,.small { font-size:10pt }
-->
</style>
</head>
<body text="#800000" link="#0000EE" vlink="#0000EE">
<div class="small" style="text-align:right;">
[<a href="'
.HOME.'" target="_top">回首頁</a>]
'
.TOP_LINKS.'
[<a href="'
.PHP_SELF.'?mode=cata">Catalog</a>]
[<a href="'
.PHP_SELF.'?mode=list">主題列表</a>]
[<a href="'
.PHP_SELF.'?mode=search">搜尋</a>]
[<a href="'
.PHP_SELF.'?mode=status">系統資訊</a>]
[<a href="'
.PHP_SELF.'?mode=admin">管理區</a>]
[<a href="'
.REFRESH_HREF.'?">重新整理</a>]
<br /></div>
<center><font size=5><b><span style="font-size:20pt;" class="Ptitle">'
.TITLE.'</span></b></font></center>
<table width="100%"><tr><th bgcolor="#E08000">
<font color="#FFFFFF">Catalog</font>
</th></tr></table>
<div class="others"></div>
'
;

        $line = file(LOGFILE);
        $countline = count($line);
        $x = 0;
        $image_cnt = 0;
        $psta = CATALOG_AMOUNT * $page + 1;
        $pend = CATALOG_AMOUNT * ($page+1);
                        while($x < $countline) {
                                list($no,,,,,,,,,$ext,$w,$h,$time,) = explode(",", $line[$x]);
                                // 附加檔案名稱
                                $img = $path.$time.$ext;
                                $src = IMG_DIR.$time.$ext;
                                // 輸出<img>標籤
                                $imgsrc = "";
                                $x++;
                                if($ext && is_file($img) && $ext!=".swf"){
                                        $image_cnt++;
                                        if($image_cnt < $psta || $image_cnt > $pend) continue;
                                        if($w && $h){// 有長寬屬性
                                                if($w > MAX_RW || $h > MAX_RH){
                                                        $W2 = MAX_RW / $w;
                                                        $H2 = MAX_RH / $h;
                                                        ($W2 < $H2) ? $tkey = $W2 : $tkey = $H2;
                                                        $w = ceil($w * $tkey);
                                                        $h = ceil($h * $tkey);
                                                }
                                                if(@is_file(THUMB_DIR.$time.'s.jpg')){
                                                        $imgsrc = "<a href=\"".$src."\" target=_blank title=\"No.$no\"><img src=\"".THUMB_DIR.$time.'s.jpg'."\" width=\"$w\" height=\"$h\" /></a>";
                                                }elseif($ext==".swf"){ // swf檔案僅留連結就好
                                                        $imgsrc = "";
                                                        continue;
                                                }else{
                                                        $imgsrc = "<a href=\"".$src."\" target=_blank title=\"No.$no\"><img src=\"".$src."\" width=\"$w\" height=\"$h\" /></a>";
                                                }
                                        }else{// 沒有長寬屬性
                                                $imgsrc = "<a href=\"".$src."\" target=_blank title=\"No.$no\"><img src=\"".$src."\" /></a>";
                                        }
                                        $dat.="<div class=\"pic\">$imgsrc</div><div class=\"spacer\"></div>";
                                }
                        }
                        $page_cnt = ceil($image_cnt / CATALOG_AMOUNT);
                        for($x = 0; $x < $page_cnt; $x++)
                                $pagenavi.=($x==$page?"<b>[$x]</b> ":"<a href=\"".PHP_SELF."?mode=cata&amp;page=$x\">[$x]</a> ");
        $dat.="<div class=\"others\">".($page>0?"<a href=\"".PHP_SELF."?mode=cata&amp;page=".($page-1)."\">&lt;&lt;上一頁</a> ":"第一頁")."&nbsp;".(($page+1)*CATALOG_AMOUNT>$image_cnt?"最後一頁":"<a href=\"".PHP_SELF."?mode=cata&amp;page=".($page+1)."\">下一頁&gt;&gt;</a>")."&emsp;<small>".$pagenavi."</small></div>";
        $dat.='<form action="'.PHP_SELF.'" method="POST"><table align="right"><tr><td><input type="hidden" name="mode" value="usrdel">【刪除文章】[<input type="checkbox" name="onlyimgdel" id="onlyimgdel" value="on"><label for="onlyimgdel">僅刪除附加檔案</label>]</td></tr>
<tr><td>文章編號: <input type="text" name="no" size="20" value=""><br>
刪除用密碼: <input type="password" name="pwd" size="8" maxlength="8" value="">
<input type="submit" value=" 刪除 "></td></tr></table></form><br clear="all">'
;
        foot($dat);

        echo $dat;
        exit();
}

/* 輸出討論串列表 */
function showlist(){
        global $path, $page; $p = 0; $resno=0;

        $tree = file(TREEFILE);
        $find = false;

        $line = file(LOGFILE);
        $countline = count($line);
        for($i = 0; $i < $countline; $i++){
                list($no,) = explode(",", $line[$i]);
                $lineindex[$no] = $i + 1; // 作成逆轉換標籤
        }
        // 附加檔案容量限制功能啟動:預測即將被刪除之檔 (預設為95%的上限即啟動預測)
        $tmp_total_size = (int)total_size(); // 取得目前附加檔案使用量
        $tmp_STORAGE_MAX = ($tmp_total_size >= STORAGE_MAX) ? STORAGE_MAX : STORAGE_MAX * 0.95; // 預估上限值,如果發生一開始就超過上限就直接用上限取代
        $BEKILL_SENSE = FALSE;
        if(STORAGE_LIMIT && ($tmp_total_size >= $tmp_STORAGE_MAX)){ // 超過預估上限值 (或直接超過上限)
                $BEKILL_SENSE = TRUE; // 預測標記打開
                $link_BEKILL = range(0, count($line) - 1); // 預測標記陣列

                if($tmp_total_size >= $tmp_STORAGE_MAX){
                        for($x = count($line) - 1; $tmp_total_size >= $tmp_STORAGE_MAX; $x--){
                                list(,,,,,,,,,$dext,,,$dtime,) = explode(",", $line[$x]);
                                if(is_file($path.$dtime.$dext)){ $tmp_total_size -= filesize($path.$dtime.$dext)/1024; $link_BEKILL[$x] = "DEL"; } // 標記刪除
                                if(is_file(THUMB_DIR.$dtime.'s.jpg')){ $tmp_total_size -= filesize(THUMB_DIR.$dtime.'s.jpg')/1024; }
                        }
                }
        }

        $counttree = count($tree);
        $dat = '';$tmprno=0;
        head($dat);
        form($dat,$resno);
        $dat .= '<form action="'.PHP_SELF.'" method=POST><div class="spacer">&nbsp;</div><table align="center" width="100%" class="navi"><tr class="List_hdr"><th>&nbsp;</th><th>編號</th><th width="50%">標題</th><th>發文者</th><th>回覆數</th><th>日期/ID</th></tr>';
        $st = $page * (PAGE_DEF * 2);
   
        for($i = $st; $i < $st + (PAGE_DEF * 2); $i++){
                $fil=''; $alert='';
                if(empty($tree[$i])){ continue; }
                $treeline = explode(",", rtrim($tree[$i]));
                $disptree = $treeline[0];
                $j = $lineindex[$disptree] - 1; // 在$j陣列搜尋該本文
                if(empty($line[$j])){ continue; }   // 在$j之範圍外
                list($no,$now,$name,$email,$sub,$com,$url,$host,$pwd,$ext,$w,$h,$time,$chk) = explode(",", $line[$j]);
                // 討論串所有回應生成
                $postes = (int) (count($treeline)-1);
                // 強制不推文
                if($postes>MAX_RES||preg_match('/^sage/i',$email)){
                        $alert .= "<b>§</b>";
                }
                // E-mail和本文自動作成連結
                if(CLEAR_SAGE_AGE) $email=preg_replace("/^(s){0,1}age( *)/i","",trim($email)); // E-mail和本文自動作成連結
                if($email){ $name = "<a href=\"mailto:$email\">$name</a>"; }

                $dat .= "<tr bgcolor=\"".(($i - $st)%2==0?LIST_ROW_COLOR1:LIST_ROW_COLOR2)."\"><td>";
                // 快要被刪除的提示
                if($lineindex[$no]-1 >= LOG_MAX*0.95){
                        $alert .= "<b>×</b>";
                }
                // 預測刪除過大檔
                if(STORAGE_LIMIT && $BEKILL_SENSE){
                        if($link_BEKILL[$lineindex[$no]-1]=="DEL" && $lineindex[$no] != 1){
                                $alert .= "<b>※</b>";
                        }
                }
                // 被標記為禁止回應
                if(strstr($url, '_THREADSTOP_')){
                        $alert .= "<b>Ø</b>";
                }
                // 強制不推文
                $tmprno=$no;
                // 討論串主文章生成
                $dat .= "<input type='checkbox' name=\"$no\" value='delete'></td><td><a href=\"".PHP_SELF."?res=$tmprno#q".$no."\">$no</a></td><td>$alert<a href=\"".PHP_SELF."?res=$no\"><font size=\"+1\"><span class='Ctitle'><b>$sub</b></span></font></a></td>";
                $dat.="<td><span class='Cname'><b>$name</b></span></td><td>$postes</td><td>$now</td></tr>";
        }
$dat .= '</table><br clear="left"><table align="right"><tr><td nowrap="nowrap" align="center">
<input type="hidden" name="mode" value="usrdel">【刪除文章】[<input type="checkbox" name="onlyimgdel" id="onlyimgdel" value="on"><label for="onlyimgdel">僅刪除附加檔案</label>]<br>
刪除用密碼: <input type="password" name="pwd" size="8" maxlength="8" value="">
<input type="submit" value=" 刪除 "></td></tr></table></form><table align="right" class="navi"><tr><td><b>圖例</b></td>
        <td>§</td><td>強制不推文</td>
        <td>×</td><td>文章快要被刪除</td></tr>
        <tr><td></td><td>Ø</td><td>禁止回應</td>
        <td>※</td><td>預測刪除附件</td></tr>
        </table>'
;

        $prev = $st - (PAGE_DEF * 2);
        $next = $st + (PAGE_DEF * 2);
        // 換頁判斷
        $dat .= "<table align='left' class=\"navi\"><tr>";
        if($prev >= 0){
                $dat .= "<td><form action=\"".PHP_SELF."\" method='get'>";
                $dat .= "<input type=hidden name=\"mode\" value=\"list\">";
                $dat .= "<input type=hidden name=\"page\" value=\"".($prev?(($st/(PAGE_DEF * 2))-1):0)."\">";
                $dat .= "<input type=submit value=\"上一頁\">";
                $dat .= "</form></td>";
        }else{ $dat.="<td nowrap>第一頁</td>"; }

        $dat.="<td>";

        for($i = 0; $i < count($tree) ; $i += (PAGE_DEF * 2)){
                if($st==$i){ $dat .= "[<b>".($i/(PAGE_DEF * 2))."</b>] "; }
                else{
                        if($i==0){ $dat .= "[<a href=\"".PHP_SELF."?mode=list\">0</a>] "; }
                        else{ $dat .= "[<a href=\"".PHP_SELF."?mode=list&amp;page=".($i/(PAGE_DEF * 2))."\">".($i/(PAGE_DEF * 2))."</a>] "; }
                }
        }

        $dat .= "</td>";
        if(count($tree) > $next){
                $dat .= "<td><form action=\"".PHP_SELF."\" method='get'>";
                $dat .= "<input type=hidden name=\"mode\" value=\"list\">";
                $dat .= "<input type=hidden name=\"page\" value=\"".(($st/(PAGE_DEF * 2))+1)."\">";
                $dat .= "<input type=submit value=\"下一頁\">";
                $dat .= "</form></td>";
        }else{ $dat .= "<td nowrap>最後一頁</td>"; }

        $dat .= "</tr></table><br clear=all>\n";
        foot($dat);
        echo $dat;
        exit();
}

/* logoogle搜尋 */
function logoogle(){
        global $keyword;
        if(!isset($keyword)||$keyword=='') {
                $dat = '';
                head($dat);
                $dat .= "[<a href=\"".PHP_SELF."?\">回到版面</a>]\n";
                $dat .= "<table width='100%' align='center'><tr><th bgcolor='#e04000'>\n";
                $dat .= "<font color='#FFFFFF'>搜尋模式</font>\n";
                $dat .= "</th></tr></table>\n";

                $dat.="<form action=\"".PHP_SELF."\" method=\"GET\">
利用關鍵字從畫像留言板的紀錄中搜尋。<br>
<small>(關鍵字可使用「半形空白」來區別、進行複數條件的搜尋。)</small><br />
<input name=\"mode\" type=\"hidden\" value=\"search\">
<input name=\"keyword\" type=\"text\" size=\"80\">
<input type=\"submit\" value=\"搜尋\">
</form><br /><hr>"
;
                foot($dat);
                echo $dat;
                exit();
        }else{
                //スペース区切りの複数単語でand検索
                $keyword = preg_replace('/( | )+/', ' ', $keyword);
                $keyword = preg_replace('/(^ | $)+/', '', $keyword);
                $keyword = explode(' ', $keyword);

                //ログを読み込む
                $trees = file(TREEFILE);
                $logs = file(LOGFILE);

                $ret = array();
                foreach($trees as $l) {
                        $ret[] = explode(',', rtrim($l));
                }

                $trees = $ret;

                unset($ret);
                $ret = array();
                foreach($logs as $l) {
                        $line = explode(',', rtrim($l));
                        $ret[$line[0]] = $line;
                }

                $logs = $ret;
                unset($ret);

                $hits = array();

                // 記事を検索する
                foreach($trees as $thread) {
                        foreach($thread as $no) {
                                $res = $logs[$no];
                                $found = 0;
                                foreach($keyword as $w) {
                                        foreach(array(0,2,3,4,5) as $idx) {//"$no,$now,$name,$email,$sub,$com,$url,$host,$pass,$ext,$W,$H,$tim,$chk,\n";
                                                if(strpos($res[$idx], $w) !== FALSE) {
                                                        $found++;
                                                        break;
                                                }
                                        }
                                }
                                if( $found==count($keyword) ) {
                                        $hits[] = array('no' => $no, 'thread' => $thread[0]);
                                }
                        }
                }

                $resultlist = "";
                foreach($hits as $h) {
                        $thread = $logs[$h['thread']];
                        $res = $logs[$h['no']];
                        $resultlist .= "<tr><td><a href=\"".PHP_SELF."?res=$thread[0]\">討論串$thread[0]</a> ";
                        $resultlist .= "<font size=\"+1\"><span class='Ctitle'><b>{$res[4]}</b></span></font>\n";
                        $resultlist .= "姓名: <span class='Cname'><b>{$res[2]}</b></span> [{$res[1]}] No.{$res[0]} <br>\n";
                        $resultlist .= "\n<blockquote>{$res[5]}</blockquote></td></tr><tr><td><hr></td></tr>";
                }

                foreach($keyword as $w) {
                        $resultlist = str_replace($w, "<strong>$w</strong>", $resultlist);
                }
                $resultlist = str_replace("</strong>\"","\"",str_replace("?res=<strong>","?res=", $resultlist));

                $resultlist = $resultlist ? $resultlist : "<tr><td>找不到符合關鍵字的留言。</td></tr><tr align=\"center\"><td><a href=\"javascript:history.back()\">[回上一頁]</a></td></tr></td></tr>";

                $dat='';
                head($dat);
                $dat .= "[<a href=\"".PHP_SELF."?\">回到版面</a>]\n";
                $dat .= "<table width='100%' align='center'><tr><th bgcolor='#e04000'>\n";
                $dat .= "<font color='#FFFFFF'>搜尋結果</font>\n";
                $dat .= "</th></tr></table><br>\n";

                $dat.="<table width=\"100%\">
$resultlist
</table>
<div class=\"small\" style=\"text-align:right;\">powered by + にじうら +</div>
</body></html>"
;
                echo $dat;
                exit();
        }
}

/* 重新生成縮圖 */
function rethumb(){
        global $path;
        $no = "";
        reset($_GET);
        while ($item = each($_GET)){
                if($item[0]=='no'){ $$item[0] = $item[1]; }
        }
        if(isset($no)){
                $line = file(LOGFILE);
                $countline = count($line);
                $is_exist = false; // 是否找的到
                $no_position = 0; // No.對應的log檔筆數位置

                for($i = 0;$i < $countline;$i++){
                        list($artno,) = explode(",",rtrim($line[$i]));
                        if($artno==$no){ $is_exist = true; $no_position = $i; break; } // 搜尋此編號文章是否存在
                }
                if($is_exist){ // 存在,進行縮圖
                        $tree = file(TREEFILE);
                        $counttree = count($tree);
                        $is_head = false; // 是否為討論串開頭

                        for($j = 0;$j < $counttree;$j++){
                                list($artno,) = explode(",",rtrim($tree[$j]));
                                if($artno==$no){ $is_head = true; break; } // 搜尋此編號是否是討論串開頭
                        }

                        list(,,,,,,,,,$pext,,,$ptime,) = explode(",",$line[$no_position]);
                        if(!file_exists($path.$ptime.$pext)||empty($pext)){ return false; }
                        if(USE_REPNG2JPEG){ // 使用repng2jpeg外部程式
                                thumb_repng($path,$ptime,$pext,!$is_head);
                        }else{ // 使用GD
                                thumb($path,$ptime,$pext,!$is_head);
                        }
                        echo "<html><head><META HTTP-EQUIV=\"Content-type\" CONTENT=\"text/html; charset=utf-8\"></head><body>$ptime$pext 已重新生成縮圖</body></html>";
                }
        }
}
function externalIPQuery($addr,$dest='') {
        global $IP_WHITELIST;
        $flg=0;$cnt=0;
        if(EXTIPQ && $addr != "127.0.0.1") {
                $rev = implode('.', array_reverse(explode('.', $addr)));
                $queries = array( 'list.dsbl.org','bbx.2ch.net','dnsbl.ahbl.org','niku.2ch.net','virus.rbl.jp','relays.ordb.org','ircbl.ahbl.org','tor.ahbl.org' );
                foreach ( $queries as $query ) {
                        $qres=gethostbyname($rev.'.'.$query);
                        if($rev.'.'.$query!=$qres){ $flg=1; break; }
                        $cnt++;
                        if($cnt>=EXTIPQ) break;
                }
        }
        //白名單
        if($flg) foreach($IP_WHITELIST as $wip) if(strpos($addr,$wip)!==false) {$flg=0;break;}
        if($flg) error("您所使用的連線已被拒絕",$dest);
}
/* おまけ */
function uptime(&$name) {
        $loadavg='';
        if(strtoupper(substr(PHP_OS, 0, 3))!='WIN') {
                preg_match_all('/\d\.\d\d/',exec('uptime',$t1,$t2),$loadavg);
                $loadavg=$loadavg[0][2];
        }
        $name=str_replace("!uptime",$loadavg?"<span class='nor'>(LA:".$loadavg.")</span>":"",$name);
        unset($t1);unset($t2);
}
function power(&$name) {
        $name=str_replace("!power","<span class='nor'>(Lv:".mt_rand(1,999).")</span>",$name);
}
function dama(&$name) {
        $name=str_replace("!dama",(gmdate("j",time()+TIME_ZONE*60*60)==1?"<span class='nor'>【".(int)(mt_rand(0,1000)*(mt_rand(100,1000)/100)*1.1)."円】</span>":""),$name);
}
function omikuji(&$name) {
        $omikuji = array('大吉','中吉','吉','小吉','末吉','凶','大凶','豚','ぴょん吉','だん吉','神','女神');
        $omi_v=mt_rand(0,8510);
        switch($omi_v){
        case ($omi_v<2000):
                $omi_v=0;
                break;
        case ($omi_v>=2000 && $omi_v<3500):
                $omi_v=1;
                break;
        case ($omi_v>=3500 && $omi_v<4500):
                $omi_v=2;
                break;
        case ($omi_v>=4500 && $omi_v<5500):
                $omi_v=3;
                break;
        case ($omi_v>=5500 && $omi_v<6000):
                $omi_v=4;
                break;
        case ($omi_v>=6000 && $omi_v<6500):
                $omi_v=5;
                break;
        case ($omi_v>=6500 && $omi_v<7000):
                $omi_v=6;
                break;
        case ($omi_v>=7000 && $omi_v<7500):
                $omi_v=7;
                break;
        case ($omi_v>=7500 && $omi_v<8000):
                $omi_v=8;
                break;
        case ($omi_v>=8000 && $omi_v<8500):
                $omi_v=9;
                break;
        case ($omi_v>=8500 && $omi_v<8505):
                $omi_v=10;
                break;
        case ($omi_v>=8505 && $omi_v<=8510):
                $omi_v=11;
                break;
        }
        $name=str_replace("!omikuji","<span class='nor'>【".$omikuji[$omi_v]."】</span>",$name);
}

/*-----------程式各項功能主要判斷-------------*/
$path = realpath("./").'/'.IMG_DIR;

init();         //←■■程式環境初始化,跑過一次後可以註解此行■■
$iniv = array('mode','nick','mail','title','content','pwd','upfile','upfile_name','upfile_status','resto','pass','res','post','no','url');
foreach($iniv as $iniva){
        if(!isset($$iniva)){ $$iniva = ""; }
}
switch($mode){
        case 'regist':
                if (!READONLY||$admin==ADMIN_PASS) regist($nick,$mail,$title,$content,$url,$pwd,$upfile,$upfile_name,$upfile_status,$resto);
                else error("唯讀模式下不能寫入新文章");
                break;
        case 'admin':
                valid($pass);
                if($admin=="del"){ admindel($pass); }
                if($admin=="zombie"){ check_zombie(); }
                if($admin=="post"){
                        echo "</form>";
                        form($post,$res,1);
                        echo $post;
                        die("</body></html>");
                }
                break;
        case 'cata':
                showcatalog();
                break;
        case 'search':
                logoogle();
                break;
        case 'list':
                showlist();
                break;
        case 'status':
                showstatus();
                break;
        case 'rethumb':
                rethumb();
                exit();
                break;
        case 'usrdel':
                usrdel($no,$pwd);
        case 'remake':
                updatelog();
                echo "<META HTTP-EQUIV=\"refresh\" content=\"0;URL=".PHP_SELF2."?".time().substr(microtime(),2,3)."\">";
                break;
        default:
                if($res){
                        updatelog($res,(isset($page)?$page=="all"?"all":intval($page):"RE_PAGE_MAX")); // 當分頁值>0實行分頁 (若無值則預設最末頁)
                }elseif(isset($page)&&intval($page) > 0){ // 取整數數值大於0
                        updatelog(0,intval($page)); // 以php顯示某頁內容印出
                }else{
                        if(!file_exists(PHP_SELF2)) updatelog();
                        echo "<META HTTP-EQUIV=\"refresh\" content=\"0;URL=".HTM_HREF_PREFIX.PHP_SELF2."\">";
                }
}
?>