###############################################################################
#
# パラメータを常にEUC変換するCGIクラス
#
###############################################################################
package CGI2;
use CGI;
use CGI::Session;
use vars qw(@ISA);
use strict;
@ISA = qw(CGI);

#==============================================================================
# コンストラクタ
#==============================================================================
sub new {
	my $class = shift;
	$ENV{PATH_INFO} =~ s/^$ENV{SCRIPT_NAME}//;
	my $self  = CGI->new();
	
	return bless $self,$class;
}

#==============================================================================
# タイムアウトしているセッションを破棄します
#==============================================================================
sub remove_session {
	my $self = shift;
	my $wiki = shift;
	
	my $dir   = $wiki->config('session_dir');
	my $limit = $wiki->config('session_limit');
	
	opendir(SESSION_DIR,$dir) or die "$!: $dir";
	my $timeout = time() - (60 * $limit);
	while(my $entry = readdir(SESSION_DIR)){
		if($entry =~ /^cgisess_/){
			my @status = stat("$dir/$entry");
			if($status[9] < $timeout){
				unlink("$dir/$entry");
			}
		}
	}
	closedir(SESSION_DIR);
}

#==============================================================================
# CGI::Sessionオブジェクトを取得
#==============================================================================
sub get_session {
	my $self  = shift;
	my $wiki  = shift;
	my $start = shift;
	
	# セッション開始フラグが立っておらず、CookieにセッションIDが
	# 存在しない場合はセッションを生成しない
	if(!defined($self->{session_cache})){
		if((not defined $start or $start!=1) && $self->cookie(-name=>'CGISESSID') eq ""){
			return undef;
		}
		my $dir   = $wiki->config('session_dir');
		my $limit = $wiki->config('session_limit');
		my $path  = &Util::cookie_path($wiki);
		my $session = CGI::Session->new("driver:File",$self,{Directory=>$dir});
		my $cookie  = CGI::Cookie->new(-name=>'CGISESSID',-value=>$session->id(),-expires=>"+${limit}m",-path=>$path);
		print "Set-Cookie: ".$cookie->as_string()."\n";
		$self->{session_cache} = $session;
		return $session;
		
	} else {
		return $self->{session_cache};
	}
}

#==============================================================================
# パラメータを取得または設定
#==============================================================================
sub param {
	my $self  = shift;
	my $name  = shift;
	my $value = shift;
	
	# 必ずEUCへの変換を行う
	if(Util::handyphone()){
		if(defined($name)) {
			#my @array = map {&Jcode::convert(\$_, "euc")} $self->CGI::param($name,$value);
			#return @array;
			my @values = $self->CGI::param($name,$value);
			my @array = ();
			foreach my $value (@values){
				&Jcode::convert(\$value,"euc");
				push(@array,$value);
			}
			if($#array==0){
				return $array[0];
			} elsif($#array!=-1){
				return @array;
			} else {
				return undef;
			}
		} else {
			return map { &Jcode::convert(\$_, "euc") } $self->CGI::param();
		}
	} else {
		if(defined($name)) {
			return $self->CGI::param($name, $value);
		} else {
			return $self->CGI::param();
		}
	}
}

#==============================================================================
# 現在のページに遷移するためのURLを取得します。
#==============================================================================
sub get_url {
	my $self  = shift;
	my $url   = $self->url();
	my $query = "";
	foreach my $param ($self->param()){
		if($query eq ""){
			$query = "?";
		} else {
			$query .= "&";
		}
		$query .= &Util::url_encode($param);
		$query .= "=";
		$query .= &Util::url_encode($self->param($param));
	}
	return $url.$query;
}

#==============================================================================
# 終了時に呼び出されます。
#==============================================================================
sub finalize {
	my $self = shift;
	undef($self->{session_cache}->{_SESSION_OBJ});
	undef($self->{session_cache});
}

1;