#!/usr/local/bin/perl
##############################################################################
# サイトマップCGI Ver1.4
# Copyright(C) futomi 2001 -2002
# http://www.futomi.com/
###############################################################################
require './config.cgi';
use strict;
use CGI;
my $q = new CGI;
$| = 1;
my $IMAGE_DIR = &config::IMAGE_DIR;
my @DIRECTORYINDEX = &config::DIRECTORYINDEX;
my $HERE_STR = &config::HERE_STR;
my $TARGET = &config::TARGET;
my $CUSTOMIZE = &config::CUSTOMIZE;
my $SITEMAP_FILE = &config::SITEMAP_FILE;

my $COPYRIGHT = '<a href="http://www.futomi.com/">futomi\'s CGI Cafe</a>';
my $IMG_WIDTH = "17";
my $IMG_HEIGHT = "17";
my %IMAGE_LIST = (
	'h'	=>	"<img src=\"$IMAGE_DIR/folder_o.gif\" width=\"$IMG_WIDTH\" height=\"$IMG_HEIGHT\" border=\"0\">",
	'd'	=>	"<img src=\"$IMAGE_DIR/folder_o.gif\" width=\"$IMG_WIDTH\" height=\"$IMG_HEIGHT\" border=\"0\">",
	'f'	=>	"<img src=\"$IMAGE_DIR/file.gif\" width=\"$IMG_WIDTH\" height=\"$IMG_HEIGHT\" border=\"0\">",
	'-'	=>	"<img src=\"$IMAGE_DIR/line3.gif\" width=\"$IMG_WIDTH\" height=\"$IMG_HEIGHT\" border=\"0\">",
	'|'	=>	"<img src=\"$IMAGE_DIR/line2.gif\" width=\"$IMG_WIDTH\" height=\"$IMG_HEIGHT\" border=\"0\">",
	'+'	=>	"<img src=\"$IMAGE_DIR/line1.gif\" width=\"$IMG_WIDTH\" height=\"$IMG_HEIGHT\" border=\"0\">",
	' '	=>	"<img src=\"$IMAGE_DIR/blank.gif\" width=\"$IMG_WIDTH\" height=\"$IMG_HEIGHT\" border=\"0\">"
);
my $TABLE_WIDTH = "475";


my $target_attr;
if($TARGET ne '') {
	$target_attr = " target=\"$TARGET\"";
}

my $ReferedUrl = &CutDirectoryIndex($ENV{'HTTP_REFERER'});

if($CUSTOMIZE) {
	my $FileSize = -s $SITEMAP_FILE;
	open(FILE, "$SITEMAP_FILE") || &ErrorPrint("Can't open $SITEMAP_FILE");
	my $Data;
	sysread(FILE, $Data, $FileSize);
	close(FILE);

	my @index_list = @DIRECTORYINDEX;
	push(@index_list, '');
	push(@index_list, '/');
	my $index;
	for $index (@index_list) {
		$Data =~ s|<a\s+href=\"($ReferedUrl$index)\"([^>]*)\>([^<]+)</a>|<a href=\"$1\"$2>$3</a> $HERE_STR|g;
	}

	print $q->header(-type=>'text/html; charset=Shift_JIS');
	print "$Data\n";
} else {
	my %pages = ();
	my $column = 0;
	open(DATA, "./site.dat") || &ErrorPrint("データファイルの読込に失敗しました。 : $!");
	while(<DATA>) {
		chop;
		unless(/^\[([^\]]+)\]([^,]+)\,(.*)$/) {next;}
		my $code = $1;
		my $title = $2;
		my $url = $3;
		$pages{$code} = [$title, $url];
		my @code_parts = split(/-/, $code);
		my $parts_num = scalar @code_parts;
		if($parts_num > $column) {$column = $parts_num;}
	}
	close(DATA);
	$column += 2;

	&PrintHeader;
	print "<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\" width=\"$TABLE_WIDTH\">\n";

	my @ordered_codes = sort keys %pages;
	my $code;
	for $code (@ordered_codes) {
		my($image1, $image2);
		my @code_parts = split(/\-/, $code);
		my $depth = scalar @code_parts;
		my $c_num = 0;
		if($depth > 1) {
			my $code_tmp = "$code_parts[0]";
			for(my $i=1;$i<$depth;$i++) {
				$code_tmp .= "-$code_parts[$i]";
				my $next_exist_flag = &NextExistCheck($code_tmp, \@ordered_codes);

				if($i == $depth - 1) {
					if($next_exist_flag) {
						$image1 .= "  <td width=\"$IMG_WIDTH\">$IMAGE_LIST{'+'}</td>\n";
					} else {
						$image1 .= "  <td width=\"$IMG_WIDTH\">$IMAGE_LIST{'-'}</td>\n";
					}
				} else {
					if($next_exist_flag) {
						$image1 .= "  <td width=\"$IMG_WIDTH\">$IMAGE_LIST{'|'}</td>\n";
					} else {
						$image1 .= "  <td width=\"$IMG_WIDTH\">$IMAGE_LIST{' '}</td>\n";
					}
				}
				$c_num ++;
			}
		}

		if(scalar grep(/^$code/, @ordered_codes) > 1) {
			if($pages{$code}->[1]) {
				$image2 = "  <td width=\"$IMG_WIDTH\"><a href=\"$pages{$code}->[1]\"$target_attr>$IMAGE_LIST{'h'}</a></td>";
			} else {
				$image2 = "  <td width=\"$IMG_WIDTH\">$IMAGE_LIST{'h'}</td>";
			}
		} else {
			if($pages{$code}->[1]) {
				$image2 = "  <td width=\"$IMG_WIDTH\"><a href=\"$pages{$code}->[1]\"$target_attr>$IMAGE_LIST{'f'}</a></td>";
			} else {
				$image2 = "  <td width=\"$IMG_WIDTH\">$IMAGE_LIST{'f'}</td>";
			}
		}
		$c_num += 2;

		print "<tr>\n";
		print "$image1";
		print "$image2\n";
		my $colspan = "";
		my $rest_column = $column - $c_num;
		if($rest_column > 1) {
			$colspan = " colspan=\"$rest_column\"";
		}
		my $title_width = $TABLE_WIDTH - ($c_num * $IMG_WIDTH);
		if($pages{$code}->[1]) {
			print "  <td$colspan width=\"$title_width\" nowrap>&nbsp;<a href=\"$pages{$code}->[1]\"$target_attr>$pages{$code}->[0]</a>";
		} else {
			print "  <td$colspan width=\"$title_width\" nowrap>&nbsp;$pages{$code}->[0]";
		}
		my $url_tmp = &CutDirectoryIndex($pages{$code}->[1]);
		if($ReferedUrl) {
			if($url_tmp eq $ReferedUrl) {
				print "$HERE_STR";
			}
		}
		print "</td>\n";
		print "</tr>\n";
	}
	print "</table>\n";
	&PrintFooter;
}
exit;





sub CutDirectoryIndex {
	my($url) = @_;
	my $key;
	for $key (@DIRECTORYINDEX) {
		$url =~ s/$key$//;
	}
	return $url;
}

sub NextExistCheck {
	my($code, $codes_ref) = @_;
	my @parts = split(/-/, $code);
	my $part_num = scalar @parts;
	my $last_part = pop @parts;
	$last_part =~ s/^0*//;
	my $code2 = join("-", @parts);

	my $key;
	my $flag = 0;
	for $key (@$codes_ref) {
		unless($key =~ /^$code2/) {next;}
		my @key_parts = split(/-/, $key);
		my $part = $key_parts[$part_num - 1];
		$part =~ s/^0*//;
		if($part > $last_part) {
			return 1;
		}
	}
	return 0;
}

sub ErrorPrint {
	my($message) = @_;
	print $q->header(-type=>'text/html; charset=Shift_JIS'),
	$q->start_html(-title=>'futomi\'s CGI Cafe - SiteMap - Error!', -BGCOLOR=>'white'),
	$q->center($message),
	$q->end_html;
	exit;
}


sub PrintHeader {
	my $temp_file = './header.temp';
	my $data = &ReadTemplate($temp_file);
	print $q->header(-type=>'text/html; charset=Shift_JIS');
	print "$data\n";
}

sub PrintFooter {
	my $temp_file = './footer.temp';
	my $data = &ReadTemplate($temp_file);
	unless($data =~ /futomi/) {
		if($data =~ /<\/body>/) {
			$data =~ s/<\/body>/$COPYRIGHT\n<\/body>/;
		} else {
			$data .= "\n<p>$COPYRIGHT</p>";
		}
	}
	print "$data\n";
}

sub ReadTemplate {
	my($file) = @_;
	unless(-e $file) {
		&ErrorPrint("テンプレートファイル $file がありません。: $!");
	}
	my $size = -s $file;
	if(!open(FILE, "$file")) {
		&ErrorPrint("テンプレートファイル <tt>$file</tt> をオープンできませんでした。 : $!");
		exit;
	}
	binmode(FILE);
	my $html;
	sysread(FILE, $html, $size);
	close(FILE);
	return $html;
}



