#!/usr/bin/perl
# #############################################################################
# Author: Vulcho Nedelchev <kumcho@vulcho.com>
# Version: 1.1
# Get latest: http://www.vulcho.com/perl/
# #############################################################################

use CGI;
use CGI::Carp qw(fatalsToBrowser);
use strict;
use DirHandle;

my $q            = new CGI;
my $PAGE         = $q->param('page') || 1;
my $HEADER       = my_header();
my $FOOTER       = my_footer();
my @IMAGES       = images();
my $TOTAL_IMAGES = scalar(@IMAGES);
my $PAGES        = pages(scalar(@IMAGES));
my $MENU         = navigation();
my $BODY         = body();
my $COPYRIGHT    = copyright();

$PAGE = $PAGE !~ /^\d+$/ ? 1 : $PAGE;

sub copyright {
    return "<p><font size=1><b>Vulcho's Gallery, v1.1, coded in Perl</b></font></p>\n";
}
sub main {
    print $q->header;
    print $HEADER;
    print "<b>You are now watching page# $PAGE;</b><br>\n";
    print "<b>Images are $TOTAL_IMAGES placed in $PAGES pages;</b><br><br>\n";
    print $BODY;
    print "<HR size=\"1px\" style=\"color:#35332C\">\n";
    print "<center>$MENU $COPYRIGHT</center>\n";
    print $FOOTER;
}
sub body {
    my @page_images = splice(@IMAGES, ($PAGE-1)*20, 20);
    my $i = 0;
    my $body;
    $body="<table cellspacing=5 cellpadding=5 border=0>";
    for (0..4) {
	my @arr  = splice @page_images, $_, 4;
	my $size = size();
	map { $_ = $q->a({-href=>"$_", -title=>$_, -target=>'_blank'}, $q->img({src=>"thumb_$_", border=>0}).'<br>'.size($_).' bytes' ) } @arr;
	$body.=$q->Tr( $q->td({-valign=>'top'}, \@arr) );
    }
    $body.="<table>\n";
    return $body;
}
sub navigation {
    my $menu;
    my $script = $ENV{SCRIPT_NAME};
    for (1..$PAGES) {
	if ($PAGE == $_) {
	    $menu .= " [$_] ";
	}else{
	    $menu .= " " . $q->a({-href=>"$script?page=$_"}, $_) . " ";
	}
    }
    $menu.="<br>\n";
    if ($PAGE>1) {
	$menu.=$q->a({-href=>"$script?page=".($PAGE-1)}, '&lt;&lt;BACKWARD')." ";
    }else{
	$menu.=' &lt;&lt;BACKWARD ';
    }
    $menu.=' &nbsp; ' . $q->a({-href=>"$script?page=1"}, 'START') . ' &nbsp; ';
    if ($PAGE < $PAGES) {
	$menu.=" ".$q->a({-href=>"$script?page=".($PAGE+1)}, 'FORWARD&gt;&gt;');
    }else{
	$menu.=' FORWARD&gt;&gt; ';
    }
    return $menu;
}
sub pages {
    my $files = shift;
    return(($files%20)?(int($files/20)+1):($files/20));
}
sub my_footer {
    return file('footer.tmpl');
}
sub my_header {
    return file('header.tmpl');
}
sub file {
    open FF, $_[0] or die "Cannot read file $_[0]";
    my @data = <FF>;
    close FF;
    return join '', @data;
}
sub images {
    my $d = new DirHandle ".";
    my @files;
    if (defined $d) {
	while (defined($_ = $d->read)) {
	    next unless m/\.png|\.gif|\.jpg|\.jpeg/i;
	    next if m/^thumb_/i;
	    next if banned($_);
	    thumb($_);
	    push @files, $_;
	}
	undef $d;
    }
    #sort @files;
    return(sort(@files));
}
sub thumb {
    my $image = shift;
    make_thumb($image) unless (-f "thumb_$image");
}
sub make_thumb {
    eval{system("/usr/bin/convert", "-resize", '100x100', $_[0], "thumb_$_[0]") };
    die "$@ kurec" if $@;
}
sub banned {
    my %banned=(
		  'blank.gif' => 1,
		  'spacer.gif' => 1,
		  );
    return exists $banned{$_[0]} ? 1 : undef;
}
sub size {
    my ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,
     $atime,$mtime,$ctime,$blksize,$blocks) = stat($_[0]);
    return $size;
}
main();
exit;