<?php
/*
 * 色んなものを一括フリーズするプラグイン
 * $Id: freeze2.inc.php,v 0.90 2004/11/26 09:03:37 +0900 okkez Exp $
 *                     ,v 0.91 2010/05/26 00:50:00 +0900 k.Yamasaki 
 * ライセンス
 * GPL
 */
require_once(PLUGIN_DIR.'attach.inc.php');
require_once(PLUGIN_DIR.'freeze.inc.php');

function plugin_freeze2_action()
{
    global $_attach_messages,$_freeze2_messages;
    global $vars,$script;
    require_once(PLUGIN_DIR.'freeze2.lng.php');
    //ページとバックアップ用正規表現
    $pattern = array('/^<ul>/m',
                     '/(<li>)(<a href=.*>)(.*)(<\/a>.*<\/li>$)/m',
                     '/^<\/ul>/m');
    $replace = array("<form method=\"post\" action=\"$script?cmd=freeze2\"><ul>",
                     '\\1<input type="checkbox" name="page[]" value="\\3"/>\\2\\3\\4',
                     '</ul><div><input type="hidden" name="mode" value="confirm"/><input type="hidden" name="dir" value="'.$vars['dir'].'"/><input type="submit" value="'.$_freeze2_messages['btn_concern'].'"/></div></form>');
    //添付ファイル用正規表現
    $pattern2 = '/(<li>)(<a href.*)(file.*)(" title.*>)(.*)(<\/a>)/m';
    $replace2 = '\\1<input type="checkbox" name="page[]" value="\\3"/>\\2\\3\\4\\5\\6';
    //変数の初期化
    $mode = isset($vars['mode']) ? $vars['mode'] : NULL;
    $status = array(0 => $_freeze2_messages['title_freeze_error'],
                    1 => $_freeze2_messages['btn_freeze']);
    if(!isset($mode)){
        //最初のページ
        $body  = "<form method='post' action=\"$script?cmd=freeze2\"><div>";
        $body .= '<select name="dir" size="1">';
        $body .= '<option value="DATA">wiki</option>';
        $body .= '<option value="UPLOAD">attach</option></select></div>';
        $body .= "<div><input type=\"password\" name=\"pass\" size=\"12\"/>\n";
        $body .= "<input type=\"hidden\" name=\"mode\" value=\"select\"/>\n";
        $body .= "<input type=\"submit\" value=\"{$_freeze2_messages['btn_search']}\" /></div></form>";
        $body .= "<p>{$_freeze2_messages['msg_freeze2_body_start']}</p>";
        return array('msg'=>$_freeze2_messages['title_freeze2'],'body'=>$body);
    }elseif(isset($mode) && $mode === 'select'){
        if(isset($vars['pass']) && pkwk_login($vars['pass'])) {
            //認証が通ったらそれぞれページ名やファイル名の一覧を表示する
            $vars['pass'] = '';//認証が終わったのでパスを消去
            if(isset($vars['dir']) && $vars['dir']==="DATA") {
                //ページ
                $body = preg_replace($pattern,$replace,page_list(exclude_freezed_pages(get_existpages(DATA_DIR))));
                $body .= $_freeze2_messages['msg_freeze2_check'];
                return array('msg'=>$_freeze2_messages['title_list'],'body'=>$body);
            }
            elseif(isset($vars['dir']) && $vars['dir']==="UPLOAD"){
                //添付ファイル
                $body = "\n<form method=\"post\" action=\"$script?cmd=freeze2\"><div>";
                $retval = attach_list();
                $body .= preg_replace($pattern2,$replace2,$retval['body']);
                $body .= "<input type=\"hidden\" name=\"mode\" value=\"confirm\"/>\n<input type=\"hidden\" name=\"dir\" value=\"{$vars['dir']}\"/>\n";
                $body .= "<input type=\"submit\" value=\"{$_freeze2_messages['btn_concern']}\"/></div>\n</form>";
                $body .= $_freeze2_messages['msg_freeze2_check'];
                return array('msg'=>$retval['msg'],'body'=>$body);
            }
        }
        elseif(isset($vars['pass']) && !pkwk_login($vars['pass'])){
            //認証エラー
            return array('msg' => $_freeze2_messages['title_freeze_error'],'body'=>$_freeze2_messages['msg_auth_error']);
        }
    }elseif(isset($mode) && $mode === 'confirm'){
        //確認画面+もう一回認証要求？
        if(array_key_exists('page',$vars) and $vars['page'] != ''){
            $i=0;
            $body = "<form method=\"post\" action=\"$script?cmd=freeze2\">\n<ul>\n";
            switch($vars['dir']){
              case 'DATA' :
                foreach($vars['page'] as $page){
                    $s_page = htmlspecialchars($page,ENT_QUOTES);
                    $body .= "<li><input type=\"hidden\" name=\"page[$i]\" value=\"$s_page\"/>$s_page<br/></li>\n";
                    $i++;
                }
                break;
              case 'UPLOAD' :
                foreach($vars['page'] as $page){
                    $s_page = htmlspecialchars($page,ENT_QUOTES);
                    $temp = split("=|&amp;",$s_page);
                    $file = rawurldecode($temp[1]);
                    $refer = rawurldecode($temp[3]);
                    $age = isset($temp[5])? rawurldecode($temp[5]) : 0 ;
                    $body .= "<li><input type=\"hidden\" name=\"page[$i]\" value=\"$s_page\"/>$refer/$file";
                    $body .= "<input type=\"hidden\" name=\"refer_a[$i]\" value=\"$refer\"/>";
                    $body .= "<input type=\"hidden\" name=\"file_a[$i]\" value=\"$file\"/>";
                    $body .= "<input type=\"hidden\" name=\"age_a[$i]\" value=\"$age\"/></li>\n";
                    $i++;
                }
                break;
              default :
                return array('msg' => $_freeze2_messages['title_freeze_error'],'body'=>$_freeze2_messages['msg_fatal_error']);
                break;
            }
            $body .= "</ul>\n<div><input type=\"password\" name=\"pass\" size=\"12\"/>\n";
            $body .= '<input type="hidden" name="mode" value="delete"/><input type="hidden" name="dir" value="'.$vars['dir'].'"/>';
            $body .= "<input type=\"submit\" value=\"{$_freeze2_messages['btn_freeze']}\"/>\n</div></form>\n";
            $body .= "<p>{$_freeze2_messages['msg_freeze2_auth']}</p>";
            return array('msg'=>$_freeze2_messages['title_select_list'],'body'=>$body);
        }else{
            //選択がなければエラーメッセージを表示する
            $error_msg = "<p>{$_freeze2_messages['msg_freeze2_error']}</p><p><a href=\"$script?cmd=freeze2\">".$_freeze2_messages['msg_back_word']."</a></p>";
            return array('msg'=>$_freeze2_messages['title_freeze_error'] ,'body'=>$error_msg);
        }
    }elseif(isset($mode) && $mode === 'delete'){
        //凍結
        if(isset($vars['pass']) && pkwk_login($vars['pass'])) {
            switch($vars['dir']){
              case 'DATA':
                $mes = 'page';
                foreach($vars['page'] as $page) {
                    $s_page = htmlspecialchars($page, ENT_QUOTES);
                    if(is_page($s_page) && !is_freeze($s_page)){
                        $flag[$s_page] = true;
                        $postdata = get_source($page);
                        array_unshift($postdata, "#freeze\n");
                        $postdata = join('', $postdata);
                        file_write(DATA_DIR,$page, $postdata, TRUE);
                    }else{
                        $flag[$s_page] = false;
                    }
                }
                break;
              case 'UPLOAD':
                $mes = 'attach';
                $size = count($vars['file_a']);
                for($i=0;$i<$size;$i++){
                    foreach (array('refer', 'file', 'age') as $var) {
                        $vars[$var] = isset($vars[$var.'_a'][$i]) ? $vars[$var.'_a'][$i] : '';
                    }
                    $result = attach_freeze(TRUE);
                    //それぞれのファイルについて成功|失敗のフラグを立てる
                    switch($result['msg']){
                      case $_attach_messages['msg_freezed']:
                        $flag["{$vars['refer']}/{$vars['file']}"] = true;
                        break;
                      case $_attach_messages['err_notfound'] || $_attach_messages['err_noparm']:
                        $flag["{$vars['refer']}/{$vars['file']}"] = false;
                        break;
                      default:
                        $flag["{$vars['refer']}/{$vars['file']}"] = false;
                        break;
                    }
                }
                break;
            }
            if(in_array(false,$flag)){
                //凍結失敗したものが一つでもある
                foreach($flag as $key=>$value){
                    $body .= "$key =&gt; {$status[$value]}<br/>\n";
                }
                $body .= "<p>{$_freeze2_messages['msg_freeze_error']}</p>";
                return array('msg' => $_freeze2_messages['title_freeze_error'],'body'=>$body);
            }else{
                //凍結成功
                foreach($flag as $key=>$value){
                    $body .= "$key<br/>\n";
                }
                $body .= "<p>{$_freeze2_messages['msg_freeze_success']}</p>";
                return array('msg' => $_freeze2_messages['title_freeze_'.$mes] ,'body' => $body);
            }
        }
        elseif(isset($vars['pass']) && !pkwk_login($vars['pass'])){
            //認証エラー
            return array('msg' => $_freeze2_messages['title_freeze_error'],'body'=>$_freeze2_messages['msg_auth_error']);
        }
    }
}

function exclude_freezed_pages($pages )
{
        $aryret = array();

        foreach($pages as $page) {
                if (!is_freeze($page)) {
                        $aryret[] = $page;
                }
        }

        return $aryret;
}
?>