# Simple Photo Gallery: Web Interface
# (c) 2003--2012 Martin Mares <mj@ucw.cz>

package UCW::Gallery::Web;

use UCW::Gallery qw(%CF);
use UCW::CGI;
use File::Spec;

my $show_img;

my %args = (
	'i'	=> { 'var' => \$show_img, 'check' => '\d+' },
);

our $meta;
our $num_photos;

sub error($) {
	print "<p style='color:red'>Bad luck, the script is broken. Sorry.\n<p>$_[0]\n";
	print "</body></html>\n";
}

sub show_links($$$) {
	my ($prev, $up, $next) = @_;
	print "<p class=parent>";
	print "<span class=back style='width: $CF{'BackW'}px; height: $CF{'BackH'}px'>";
	print "<a href='$prev'><img src='$CF{'BackImg'}' width=$CF{'BackW'} height=$CF{'BackH'} alt='Back'></a>" if $prev ne "";
	print "</span>\n";
	print "<span class=fwd style='width: $CF{'FwdW'}px; height: $CF{'FwdH'}px'>";
	print "<a href='$next'><img src='$CF{'FwdImg'}' width=$CF{'FwdW'} height=$CF{'FwdH'} alt='Forward'></a>" if $next ne "";
	print "</span>\n";
	print "<a href='$up'><img src='$CF{'ParentImg'}' width=$CF{'ParentW'} height=$CF{'ParentH'} alt='Up'></a>\n" if $up ne "";
}

sub html_top() {
	my $title = UCW::CGI::html_escape($CF{"Title"});
	print <<EOF ;
Content-Type: text/html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html><head>
$CF{"HeadExtras"}
<link rel=stylesheet href="$CF{"StyleSheet"}" type="text/css" media=all>
<title>$title</title>
</head><body>
$CF{"TopExtras"}
EOF
	$UCW::CGI::error_hook = \&error;
}

sub html_bot() {
	print "$CF{'BotExtras'}\n</body></html>\n";
}

sub show_img() {
	if ($show_img < 1 || $show_img > $num_photos) {
		print "Status: 404\n";
		html_top();
		print "<h1>No such photo</h1>\n";
		html_bot();
		return;
	}

	my $id = $meta->{sequence}->[$show_img-1];
	my $m = $meta->{photo}->{$id} or die;
	html_top();

	show_links(($show_img > 1 ? ("?i=".($show_img-1)) : ""),
		   "?",
		   ($show_img < $num_photos ? ("?i=".($show_img+1)) : ""));

	my $t = UCW::CGI::html_escape($m->{title});
	my $w = $m->{w};
	my $h = $m->{h};
	print "<h1>$t</h1>\n" if $t ne "";
	my $img = $CF{'PhotoUrlPrefix'} . $id . ".jpg";
	print "<p class=large><img src='$img' width=$w height=$h alt='$t'>\n";

	html_bot();
}

sub show_list() {
	html_top();

	show_links($CF{'BackURL'}, $CF{'ParentURL'}, $CF{'FwdURL'});
	print "<h1>$CF{'Title'}</h1>\n";
	print "<h2>$CF{'SubTitle'}</h2>\n" if defined $CF{'SubTitle'};

	my $thumb_fmt = $CF{'ThumbW'} . "x" . $CF{'ThumbH'};
	my $thumb_meta = $meta->{thumb}->{$thumb_fmt} or die "No thumbnails for format $thumb_fmt found!\n";

	for my $idx (1..$num_photos) {
		my $id = $meta->{sequence}->[$idx-1];
		my $m = $meta->{photo}->{$id} or die;
		my $tm = $thumb_meta->{$id} or die;

		my $annot = UCW::CGI::html_escape($m->{title});
		my $tw = $tm->{w};
		my $th = $tm->{h};
		my $thumb = $CF{'ThumbUrlPrefix'} . "$thumb_fmt/$id.jpg";
		my $side_w = $CF{"ThumbW"} + 2*$CF{"InteriorMargin"};
		my $side_h = $CF{"ThumbH"} + 2*$CF{"InteriorMargin"};
		my $box_w = $CF{"LeftW"} + $side_w + $CF{"RightW"};
		my $box_h = $CF{"TopH"} + $side_h + $CF{"BotH"};
		print "<div class=thf><div class=thumb>\n";
		print "<img src='$CF{'TopImg'}' width=$box_w height=$CF{'TopH'} alt='' class=tt>\n";
		print "<img src='$CF{'LeftImg'}' width=$CF{'LeftW'} height=$side_h alt='' class=tl>\n";
		my $ol = $CF{'LeftW'} + $CF{'InteriorMargin'} + int(($CF{'ThumbW'} - $tw)/2);
		my $ot = $CF{'TopH'} + $CF{'InteriorMargin'} + int(($CF{'ThumbH'} - $th)/2);
		my $tit = ($annot ne "") ? " title=\"$annot\"" : "";
		my $url = ($CF{"ImageSubpages"} ? "?i=$idx" : $orig);
		print "<a href='$url'><img src='$thumb' width=$w height=$h alt='$orig'$tit class=ti style='left: ${ol}px; top: ${ot}px'></a>\n";
		print "<img src='$CF{'RightImg'}' width=$CF{'RightW'} height=$side_h alt='' class=tr>\n";
		print "<img src='$CF{'BotImg'}' width=$box_w height=$CF{'BotH'} alt='' class=tb>\n";
		print "</div>\n";
		print "</div>\n\n";
	}

	html_bot();
}

sub Dispatch() {
	UCW::CGI::parse_args(\%args);
	UCW::Gallery::LoadConfig();
	$meta = UCW::Gallery::ReadMeta(File::Spec->catfile($CF{'CacheDir'}, 'cache.meta'));
	$num_photos = scalar @{$meta->{sequence}};

	if ($show_img ne "") {
		show_img();
	} else {
		show_list();
	}
}

42;
