###############################################################################
#
# ページを管理するモジュール
#
###############################################################################
package plugin::admin::AdminPageHandler;
use strict;
#==============================================================================
# コンストラクタ
#==============================================================================
sub new {
	my $class = shift;
	my $self = {};
	
	# フィルタ情報を保存するファイル
	$self->{filter_file} = "filter.dat";
	
	return bless $self,$class;
}

#==============================================================================
# アクションハンドラメソッド
#==============================================================================
sub do_action {
	my $self  = shift;
	my $wiki  = shift;
	my $cgi   = $wiki->get_CGI;
	my $login = $wiki->get_login_info();
	
	if($cgi->param("freeze") ne ""){
		$self->freeze_page($wiki);
		$self->reload($wiki);
		
	} elsif($cgi->param("unfreeze") ne ""){
		$self->unfreeze_page($wiki);
		$self->reload($wiki);
		
	} elsif($cgi->param("delete") ne ""){
		$self->delete_page($wiki);
		$self->reload($wiki);
		
	} elsif($cgi->param("delete_files") ne ""){
		$self->delete_page($wiki);
		$self->delete_files($wiki);
		$self->reload($wiki);
		
	} elsif($cgi->param("show_all") ne ""){
		$self->show_all($wiki);
		$self->reload($wiki);
		
	} elsif($cgi->param("show_user") ne ""){
		$self->show_user($wiki);
		$self->reload($wiki);
		
	} elsif($cgi->param("show_admin") ne ""){
		$self->show_admin($wiki);
		$self->reload($wiki);
		
	}
	return $self->page_list($wiki);
}

#==============================================================================
# ページの削除
#==============================================================================
sub delete_page {
	my $self = shift;
	my $wiki = shift;
	my @pages = $wiki->get_CGI->param("pages");
	foreach(@pages){
		$wiki->save_page($_,"");
	}
}

#==============================================================================
# 添付ファイルの削除
#==============================================================================
sub delete_files {
	my $self = shift;
	my $wiki = shift;
	my @pages = $wiki->get_CGI->param("pages");
	foreach my $pagename (@pages){
		my @files = glob($wiki->config('attach_dir')."/".&Util::url_encode($pagename).".*");
		foreach my $file (@files){
			unlink($file);
		}
	}
}

#==============================================================================
# 全員に公開
#==============================================================================
sub show_all {
	my $self = shift;
	my $wiki = shift;
	my @pages = $wiki->get_CGI->param("pages");
	foreach(@pages){
		$wiki->set_page_level($_,0);
	}
}

#==============================================================================
# ユーザのみ参照可能
#==============================================================================
sub show_user {
	my $self = shift;
	my $wiki = shift;
	my @pages = $wiki->get_CGI->param("pages");
	foreach(@pages){
		$wiki->set_page_level($_,1);
	}
}

#==============================================================================
# 管理者のみ参照可能
#==============================================================================
sub show_admin {
	my $self = shift;
	my $wiki = shift;
	my @pages = $wiki->get_CGI->param("pages");
	foreach(@pages){
		$wiki->set_page_level($_,2);
	}
}

#==============================================================================
# ページの凍結
#==============================================================================
sub freeze_page {
	my $self = shift;
	my $wiki = shift;
	my @freeze_list = $wiki->get_freeze_list;
	my @pages = $wiki->get_CGI->param("pages");
	foreach my $page (@pages){
		my $flag = 1;
		foreach(@freeze_list){
			if($_ eq $page){
				$flag = 0;
				last;
			}
		}
		if($flag){
			$wiki->freeze_page($page);
		}
	}
}

#==============================================================================
# ページの凍結解除
#==============================================================================
sub unfreeze_page {
	my $self = shift;
	my $wiki = shift;
	my @freeze_list = $wiki->get_freeze_list;
	my @pages = $wiki->get_CGI->param("pages");
	foreach my $page (@pages){
		my $flag = 0;
		foreach(@freeze_list){
			if($_ eq $page){
				$flag = 1;
				last;
			}
		}
		if($flag){
			$wiki->un_freeze_page($page);
		}
	}
}

#==============================================================================
# ページ一覧
#==============================================================================
sub page_list {
	my $self = shift;
	my $wiki = shift;
	my $cgi  = $wiki->get_CGI();
	
	my @freeze_list = $wiki->get_freeze_list();
	my @pages       = $wiki->get_page_list();
	my $level_list  = $wiki->get_page_level();
	my $filter = $cgi->param("filter");
	my $filterType = $cgi->param("filterType");
	
	if($filterType ne "AND" && $filterType ne "OR" && $filterType ne "NOT"){
		$filterType = "AND";
	}
	
	# フィルタを保存。パラメータで指定されていなければ読み込み。
	if(defined($filter)){
		&Util::save_config_text($wiki,$self->{filter_file},"$filterType:$filter");
	} else {
		$filter = &Util::load_config_text($wiki,$self->{filter_file});
		my $index = index($filter,":");
		if($index > 0){
			$filterType = substr($filter,0,$index);
			$filter = substr($filter,$index+1);
		}
	}
	
	my $buf = "<h2>ページ一覧</h2>\n".
	          "<form action=\"".$wiki->create_url()."\" method=\"POST\">\n".
	          "  <p>\n".
	          "    フィルタ\n".
	          "    <input type=\"text\" name=\"filter\" size=\"30\" value=\"".Util::escapeHTML($filter)."\">\n".
	          "    <input type=\"radio\" name=\"filterType\" value=\"AND\"".($filterType eq "AND" ? " checked" : "").">AND\n".
	          "    <input type=\"radio\" name=\"filterType\" value=\"OR\"".($filterType eq "OR" ? " checked" : "").">OR\n".
	          "    <input type=\"radio\" name=\"filterType\" value=\"NOT\"".($filterType eq "NOT" ? " checked" : "").">NOT\n".
	          "    <input type=\"submit\" value=\"再表示\">\n".
	          "  </p>\n".
	          "  <table>\n".
	          "  <tr>\n".
	          "    <th><br></th>\n".
	          "    <th>状態</th>\n".
	          "    <th>参照</th>\n".
	          "    <th width=\"200\">ページ名</th>\n".
	          "    <th>最終更新日時</th>\n".
	          "  </tr>\n";
	
	foreach my $page (@pages){
		if($filter ne ""){
			my @dim = split(/\s+/,$filter);
			my $flag = 0;
			foreach my $word (split(/\s+/,$filter)){
				if(index($page,$word) >= 0){
					if($filterType eq "NOT"){
						$flag = 0;
						last;
					}
					$flag = 1;
				} else {
					if($filterType eq "AND"){
						$flag = 0;
						last;
					} elsif($filterType eq "NOT"){
						$flag = 1;
					}
				}
			}
			if($flag==0){
				next;
			}
		}
		$buf .= "  <tr>\n".
		        "    <td><input type=\"checkbox\" name=\"pages\" value=\"".&Util::escapeHTML($page)."\"></td>\n";
		
		# 凍結されているか調べる
		my $is_freeze = 0;
		foreach(@freeze_list){
			if($_ eq $page){
				$is_freeze = 1;
				last;
			}
		}
		if($is_freeze){
			$buf .= "    <td align=\"center\">凍結</td>\n";
		} else {
			$buf .= "    <td><br></td>\n";
		}
		
		# 参照レベルを調べる
		if(!defined($level_list->{$page}) || $level_list->{$page}==0){
			$buf .= "    <td>公開</td>\n";
		} elsif($level_list->{$page}==1){
			$buf .= "    <td>ユーザ</td>\n";
		} elsif($level_list->{$page}==2){
			$buf .= "    <td>管理者</td>\n";
		}
		
		$buf .= "    <td><a href=\"".$wiki->create_page_url($page)."\">".&Util::escapeHTML($page)."</a></td>\n".
		        "    <td>".&Util::format_date($wiki->get_last_modified($page))."</td>\n".
		        "  </tr>\n";
	}
	
	$buf .= "  </table>\n".
	        "  <br>\n".
	        "  <input type=\"hidden\" name=\"action\" value=\"ADMINPAGE\">\n".
	        "  <h3>ページの凍結</h3>\n".
	        "  <p>チェックしたページを凍結します。凍結したページはログイン時のみ編集となります。</p>\n".
	        "  <input type=\"submit\" name=\"freeze\" value=\" 凍 結 \">\n".
	        "  <input type=\"submit\" name=\"unfreeze\" value=\"凍結解除\">\n".
	        "  <h3>ページの削除</h3>\n".
	        "  <p>チェックしたページを削除します。</p>\n".
	        "  <input type=\"submit\" name=\"delete\" value=\" 削 除 \">\n".
	        "  <input type=\"submit\" name=\"delete_files\" value=\"添付ファイルも削除\">\n".
	        "  <h3>参照権限の設定</h3>\n".
	        "  <p>チェックしたページの参照権限を設定します。</p>\n".
	        "  <input type=\"submit\" name=\"show_all\"   value=\" 公 開 \">\n".
	        "  <input type=\"submit\" name=\"show_user\"  value=\"ユーザのみ\">\n".
	        "  <input type=\"submit\" name=\"show_admin\" value=\"管理者のみ\">\n".
	        "</form>\n";
	
	$wiki->set_title("ページの管理");
	return $buf."</ul>\n";
}

#==============================================================================
# ページ一覧をリロード
#==============================================================================
sub reload {
	my $self = shift;
	my $wiki = shift;
	$wiki->redirectURL( $wiki->create_url({ action=>"ADMINPAGE" }) );
}

1;