#!/usr/bin/perl
#	↑サーバーの「perl」のパスを指定。
#	駄目なら｢#!/usr/local/bin/perl｣
#	それでも駄目ならサーバー管理者に問い合わせて下さい。

#######################################################
##------------------- RANDUM CGI ---------------------
##   (C)Copyright 2001 by Chama.ne.jp
##       E-mail:master@chama.ne.jp
##       HP:http://www.chama.ne.jp
#######################################################
#---------- ↓初期設定項目 -----------------------------------------------#
#保存ファイルの指定---------------------------------
#管理ＣＧＩ名
$kanri_cgi = 'kanri.cgi';

#基本情報ファイル名
$k_file = 'data/kihon.dat';

#ＣＧＩ名著作権表示ファイル名
$cgi_file = 'data/cgi.dat';

#リンク情報保存ファイル名
$link_file = 'data/link.dat';

#ヘッダー情報ファイル名
$header_file = 'data/header.dat';

#フッター情報ファイル名
$footer_file = 'data/footer.dat';

#---------- ↓プログラム--------------------------------------------------#
require './jcode.pl';

&decode;
#ファイルロック
&o_lock;

#基本ファイルを開く
&k_open;

#ＣＧＩファイルを開く
&cgi_open;

#リンク情報ファイルを開く
&link_open;

#フッターファイルを開く
&footer_open;

#ヘッダーファイルを開く
&header_open;

#ロック解除
&c_lock;

#ランダムに取り出す個数の設定
$prev_max = $rrowsmax * $rcolsmax;
if($prev_max >= $l_cnt){
	$prev_max = $l_cnt;
	$all_flag = 1;
}

while($l_cnt > $l_pcnt){
	@bfprevno = (@bfprevno,$l_pcnt);
	$l_pcnt++;
}

if($all_flag == 1){
	@prevno = @bfprevno;
}else{
	$pushflag = 0;
	while(1 > $pushflag){
		$bfpushno = &randum(@bfprevno);
		#既に登録したNOとチェック
		$return_flag = 0;
		foreach $pushno(@prevno){
			if($pushno == $bfpushno){
				$return_flag = 1;
			}
		}
		if($return_flag == 1){
			$return_cnt++;
		}else{
			@prevno = (@prevno,$bfpushno);
			$return_cnt = 0;
			$push_cnt++;
		}
		if($push_cnt >= $prev_max or return_cnt > 10){
			$pushflag++;
		}
	}
}
#ランダム表示
&prev;

#サブルーチン--------------------------------------------------------------#
#デコード処理-------------------------------------------------------------
sub decode{
	if ($ENV{'REQUEST_METHOD'} eq "POST") {
		read(STDIN, $buff, $ENV{'CONTENT_LENGTH'});
	} else {
		$buff = $ENV{'QUERY_STRING'};
	}
	@pairs = split(/&/,$buff);
	foreach $pair (@pairs) {
		($name, $value) = split(/=/, $pair);
		$value =~ tr/+/ /;
		$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
		$value =~ s/ /　/g;
		&jcode'convert(*value,'sjis');
		$in{$name} = $value;
	}
	$in_pass = $in{'in_pass'};
	$in_flag = $in{'in_flag'};
}
#基本ファイルのOPEN------------------------------------------------------
sub k_open{
	open KF,"$k_file" or die "$k_file オープン失敗";
		while (<KF>){
			chomp $_;
			$_ =~s/\r//g;
			($mail,$url,$logo,$title,$title_size,$title_color,
			$word_size,$word_color,$table_color,$td_color,$data,
			$bg_file,$pass,$track_color,
			$face_color,$shadow_color,$darkshadow_color,$hightlight_color,
			$dlight_color,$arrow_color,$title_on,$i_url,$i_logo,$i_bg_file,
			$rcolsmax,$rrowsmax,$imgheighton,$imgheight,$comalt) = split(/<>/,$_);
		}
	close KF;
}
#CGI情報ファイルのOPEN-------------------------------------------------------
sub cgi_open{
	open CGIIN,"$cgi_file" or die "$cgi_file オープン失敗";
		while (<CGIIN>){
			$_ =~ s/[\r\n\t\f]//g;;
			$copyright = $_;
		}
	close CGIIN;
	$copyright2 = $copyright;
	$copyright2 =~ s/&copy;/\(c\)/g;
	$copyright2 =~ s/<\/?$_[^>]*>//ig;
	$copyright2 =~ s/[\r\n\t\f]//g;
}
#リンク情報ファイルのOPEN------------------------------------------------
sub link_open{
	$l_cnt = 0;
	open LINKIN,"$link_file" or die "$link_file オープン失敗";
		while (<LINKIN>){
			$_ =~ s/[\r\n\t\f]//g;;
			($l_no[$l_cnt],$l_img[$l_cnt],$l_url[$l_cnt],$l_com[$l_cnt],
				$l_target[$l_cnt],$l_titletop[$l_cnt],$l_titledown[$l_cnt]) = split(/<>/,$_);
			$l_cnt++;
		}
	close LINKIN;
}
#データファイルのOPEN------------------------------------------------------
sub header_open{
	$f_cnt = 0;
	open FF,"$header_file" or die "$header_file オープン失敗";
		while (<FF>){
			$_ =~ s/[\r\t\f\n]//g;
			@header_data = (@header_data,$_);
		}
	close FF;
}
#データファイルのOPEN------------------------------------------------------
sub footer_open{
	$f_cnt = 0;
	open FF,"$footer_file" or die "$footer_file オープン失敗";
		while (<FF>){
			$_ =~ s/[\r\t\f\n]//g;
			@footer_data = (@footer_data,$_);
		}
	close FF;
}
#ランダム計数の発生-----------------------------------------
sub randum{
	local @data = @_;
	local $cnt = @data;
	srand(time ^ ($$ + ($$ << 15)));
	local $no = int(rand($cnt));
	return($data[$no]);
}
#ランダム表示--------------------------------------------------------
sub prev{
	&top;
	foreach $header_(@header_data){
		print $header_;
		print "<br>\n";
	}
	print "<table border=\"0\" width=\"90%\" cellpadding=\"1\" cellspacing=\"1\" bgcolor=\"$table_color\">\n";
	$td_cnt = 0;
	$tr_cnt = 0;
	$tr_flag = 1;
	#表示するだけ表示する
	foreach $p_no(@prevno){
		if($tr_flag == 1){
			print "<tr bgcolor=\"$td_color\">\n";
			$tr_flag = 0;
		}
		print "<td align=\"center\" valign=\"top\">\n";
		print "<font size=\"$word_size\" color=\"$word_color\">\n";
		if($l_titletop[$p_no]){
			print $l_titletop[$p_no],"<br>\n";
		}
		print "<A href=\"$l_url[$p_no]\" target=\"$l_target[$p_no]\">";
		if($comalt == 1){
			$l_com[$p_no] =~ s/<br>/\n/g;
			print "<img src=\"$l_img[$p_no]\" border=\"0\" alt=\"$l_com[$p_no]\"";
		}else{
			print "<img src=\"$l_img[$p_no]\" border=\"0\" alt=\"$l_no[$p_no]\"";
		}
		if($imgheighton = 1 && $imgheight > 0){
			print " height=\"$imgheight\"";
		}
		print ">";
		print "</A>\n";
		if($l_titledown[$p_no]){
			print "<br>\n";
			print $l_titledown[$p_no];
		}
		unless($comalt == 1){
			print "<br>\n";
			print $l_com[$p_no];
		}
		$td_cnt++;
		print "</font>\n";
		print "</td>\n";
		if($td_cnt >= $rcolsmax){
			print "</tr>\n";
			$tr_flag = 1;
			$td_cnt = 0;
		}
	}
	if($tr_flag == 0){
		#表示する枠が残っていたら空で表示する。
		while($rcolsmax > $td_cnt){
	 		print "<td align=\"center\">\n";
			print "　\n";
			print "</td>\n";
			$td_cnt++;
		}
		print "</tr>\n";
	}
	print "</table>\n";
	foreach $footer_(@footer_data){
		print $footer_;
		print "<br>\n";
	}
	&last;
}
#HTMLprintサブルーチン---------------------------------------------------
sub top{
	print "Content-type:text/html\n\n";
	print "<html><head><title>$title</title>\n";
	print "<STYLE type=text/css>\n";
	print '<!--',"\n";
	print 'body {scrollbar-Track-Color:',$track_color,';',"\n";
	print 'scrollbar-Face-Color:',$face_color,';',"\n";
	print 'scrollbar-Shadow-Color:',$shadow_color,';',"\n";
	print 'scrollbar-DarkShadow-Color:',$darkshadow_color,';',"\n";
	print 'scrollbar-Highlight-Color:',$hightlight_color,';',"\n";
	print 'scrollbar-3dLight-Color:',$dlight_color,';',"\n";
	print 'scrollbar-Arrow-Color:',$arrow_color,';',"\n";
	print 'margin-top : 0px\;',"\n";
	print 'margin-left : 0px\;',"\n";
	print 'margin-right : 0px\;',"\n";
	print 'margin-bottom : 0px;border-width : 0px 0px 0px 0px;}',"\n";
	print 'INPUT{',"\n";
	print 'color : blown;border-width : 1px 1px 1px 1px;border-style : solid solid solid solid;border-color : navy navy navy navy;}',"\n";
	print '-->',"\n";
	print "</STYLE>\n";
	print "</head>\n";
	if($bg_file){
		print "<body background=$bg_file>\n";
	}else{
		print "<body bgcolor=$bg_color>\n";
	}
	print "<center>\n";
	print "<font size=$word_size color=$word_color>\n";
	if($logo){
		print "<IMG src=$logo>\n";
		print "<br>\n";
	}
	unless($title_on == 2){
		print "<table border=\"0\" cellpadding=\"0\" cellspacing=\"1\" bgcolor=\"$table_color\">\n";
		print "<tbody>\n";
		print "<tr bgcolor=\"$td_color\">\n";
		print "<td align=center>\n";
		print "<font size=$title_size color=$title_color>\n";
		print "$title\n";
		print "</font>\n";
		print "</td>\n";
		print "</tr>\n";
		print "</tbody>\n";
		print "</table>\n";
	}
}
sub last{
	print "</center>";
	print "<div align=\"right\">\n";
	print "<font size=\"$word_size\" color=\"$word_color\">\n";
	print $copyright;
	print "</font>\n";
	print "</div>\n";
	print "</body></html>\n";
	exit;
}
#データロック------------------------------------------------
sub o_lock{
	open(LOCK,">data.lock");
	flock(LOCK,2);
}
#ロック解除--------------------------------------------------
sub c_lock{
	close(LOCK);
}