#!/usr/bin/perl -w
###############################################################################
##                                                                           ##
##   G A L L E R Y . V 3 . C G I                                             ##
##                                                                           ##
## ------------------------------------------------------------------------- ##
##                                                                           ##
##  Job ......: Handles my individual dia show / gallery system.             ##
##                                                                           ##
## ------------------------------------------------------------------------- ##
##                                                                           ##
##  Copyright (C) 2003  Daniel Scheibli                                      ##
##                                                                           ##
##  This program is free software; you can redistribute it and/or modify it  ##
##  under the terms of the GNU General Public License as published by the    ##
##  Free Software Foundation; either version 2 of the License, or (at your   ##
##  option) any later version.                                               ##
##                                                                           ##
##  This program is distributed in the hope that it will be useful, but      ##
##  WITHOUT ANY WARRANTY; without even the implied warranty of               ##
##  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            ##
##  GNU General Public License for more details.                             ##
##                                                                           ##
##  You should have received a copy of the GNU General Public License along  ##
##  with this program; if not, write to the Free Software Foundation, Inc.,  ##
##  59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.                 ##
##                                                                           ##
## ------------------------------------------------------------------------- ##
##                                                                           ##
##  Remark ...: <none>                                                       ##
##                                                                           ##
## ------------------------------------------------------------------------- ##
##                                                                           ##
##  Author ....: Daniel Scheibli <daniel@scheibli.com>                       ##
##  Date ......: 2003-05-31                                                  ##
##  Changes ...: ----- gallery.v3.cgi V00.99/R004 -------------------------- ##
##               2018-01-01                                                  ##
##                o Bugfix: Check if parameters are set before converting    ##
##                  them to lower/upper case.                                ##
##               ----- gallery.v3.cgi V00.99/R003 -------------------------- ##
##               2004-10-10                                                  ##
##               - Added extra links for Home and Gallery to the             ##
##                 different screens.                                        ##
##               - Removed the Icon attribute, so that the browser           ##
##                 shows now no extra icon for the homepage.                 ##
##               2004-08-29                                                  ##
##               - Ajusted the settings to fit v3 of the homepage.           ##
##               ----- gallery.v2.cgi V00.99/R001 -------------------------- ##
##               <none>                                                      ##
##                                                                           ##
###############################################################################



##### Presettings
#------------------------------------------------------------------------------
use strict;
#- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --
use CGI qw( :standard );
use IO::File;
#------------------------------------------------------------------------------
sub TRUE    { 1 }
sub FALSE   { 0 }
sub NULL    { undef }   ##### DANGER: Never change this!!!
sub OK      { 0 }
sub WARNING { 2 }
sub ERROR   { 4 }
#------------------------------------------------------------------------------
sub Action_ListCategories();
sub Action_ListThumbnails();
sub Action_ShowPicture();
sub Error($);
sub Strip(@);
#------------------------------------------------------------------------------
my $sSettingUrlTokenBase    = "/";
my $sSettingUrlTokenThis    = "cgi-bin/gallery.v3.cgi?";
### my $sSettingUrlTokenIcon    = "scheibli.ico";
my $sSettingUrlTokenPixel   = "images/pixel.gif";
my $sSettingUrlTokenPicture = "gallery/bestof/";
#my $sSettingIndexFile       = "/home/xca1019/public_html/www.scheibli.com/gallery/bestof/index.lst";
my $sSettingIndexFile       = "/var/www/www.scheibli.com/ROOT/gallery/bestof/index.lst";
#- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --
my $sParamAction   = param( "ACTION" );
my $sParamCategory = param( "CATEGORY" );
my $sParamPicture  = param( "PICTURE" );
#- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --
my $oIndexFile = new IO::File;
my @aIndexFile = ();
my %hIndexFileCategory = ();
#- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --
my $sCallRc;
my $sFoundIndex;
my(@aDummy, %hDummy, $sDummy);
my $I;
#------------------------------------------------------------------------------



# Process expected arguments
if (defined($sParamAction)) {
	$sParamAction = uc($sParamAction);
}
if (defined($sParamPicture)) {
	$sParamPicture = lc($sParamPicture);
}


# Print the stream header
printf("Content-type: text/html\n\n"); 
printf("<HTML>\n");
printf(" <HEADER>\n");
printf('  <META NAME="author" CONTENT="Daniel Scheibli">'."\n");
printf('  <META NAME="robots" CONTENT="index,follow">'."\n");
printf("  <TITLE>Daniel P. Scheibli: Gallery - Best Of</TITLE>\n");
### printf('  <LINK REL="SHORTCUT ICON" HREF="'.$sSettingUrlTokenBase.$sSettingUrlTokenIcon.'">'."\n");
printf('  <STYLE TYPE="text/css">'."\n");
printf("   <!--\n");
printf("   A:link    { color: #0042FF; text-decoration: none;}\n");
printf("   A:visited { color: #0042FF; text-decoration: none;}\n");
printf("   A:active  { color: #0042FF; text-decoration: none;}\n");
printf("   A:hover   { color: #0042FF; text-decoration: none;}\n");
printf("   -->\n");
printf("  </STYLE>\n");
printf(" </HEADER>\n");
#braun#light#printf(' <BODY BGCOLOR="#232323" TEXT="#ffd363" LINK="#0042FF" ALINK="#0042FF" VLINK="#0042FF" LEFTMARGIN="0" TOPMARGIN="0" RIGHTMARGIN="0" MARGINHEIGHT="0" MARGINWIDTH="0" BOTTOMMARGIN="0">'."\n" );
#orange#dark#printf(' <BODY BGCOLOR="#232323" TEXT="#b35900" LINK="#0042FF" ALINK="#0042FF" VLINK="#0042FF" LEFTMARGIN="0" TOPMARGIN="0" RIGHTMARGIN="0" MARGINHEIGHT="0" MARGINWIDTH="0" BOTTOMMARGIN="0">'."\n" );
#orange#light#printf(' <BODY BGCOLOR="#232323" TEXT="#FD9F02" LINK="#0042FF" ALINK="#0042FF" VLINK="#0042FF" LEFTMARGIN="0" TOPMARGIN="0" RIGHTMARGIN="0" MARGINHEIGHT="0" MARGINWIDTH="0" BOTTOMMARGIN="0">'."\n" );
#gray#dark#printf(' <BODY BGCOLOR="#232323" TEXT="#484848" LINK="#0042FF" ALINK="#0042FF" VLINK="#0042FF" LEFTMARGIN="0" TOPMARGIN="0" RIGHTMARGIN="0" MARGINHEIGHT="0" MARGINWIDTH="0" BOTTOMMARGIN="0">'."\n" );
#gray#light#printf(' <BODY BGCOLOR="#232323" TEXT="#969696" LINK="#0042FF" ALINK="#0042FF" VLINK="#0042FF" LEFTMARGIN="0" TOPMARGIN="0" RIGHTMARGIN="0" MARGINHEIGHT="0" MARGINWIDTH="0" BOTTOMMARGIN="0">'."\n" );
printf(' <BODY BGCOLOR="#232323" TEXT="#969696" LINK="#0042FF" ALINK="#0042FF" VLINK="#0042FF" LEFTMARGIN="0" TOPMARGIN="0" RIGHTMARGIN="0" MARGINHEIGHT="0" MARGINWIDTH="0" BOTTOMMARGIN="0">'."\n");


# Read and process the index file
$sCallRc = OK;
$oIndexFile->open($sSettingIndexFile, O_RDONLY) or $sCallRc = ERROR;
##### On error,...
if ($sCallRc != OK) {
    Error( "Failed while opening the index file!" );
}

while (defined($sDummy = $oIndexFile->getline())) {
 chomp( $sDummy );
 $sDummy = Strip( $sDummy );
 if( index( $sDummy, '#' ) == 0 )
 { next; }
 @aDummy = split( ":", $sDummy ); 
 push( @aIndexFile, {
                     "Thumbnail.Name"   => $aDummy[0],
                     "Thumbnail.Scale"  => $aDummy[1],		     
                     "Picture.Name"     => $aDummy[2],
                     "Picture.Scale"    => $aDummy[3],
                     "Picture.Size"     => $aDummy[4],
                     "Picture.Category" => $aDummy[5]
                    } );
 if( !exists( $hIndexFileCategory{$aDummy[5]} ) )
 { $hIndexFileCategory{$aDummy[5]} = 1; }
 else
 { $hIndexFileCategory{$aDummy[5]} ++; }
}

close( $oIndexFile );



##### Do the output based on the wished action
#------------------------------------------------------------------------------
if( defined($sParamAction) && ($sParamAction eq "LIST_CATEGORIES") )
{ Action_ListCategories(); }
#------------------------------------------------------------------------------
elsif( defined($sParamAction) && ($sParamAction eq "LIST_THUMBNAILS") )
{ Action_ListThumbnails(); }
#------------------------------------------------------------------------------
elsif( defined($sParamAction) && ($sParamAction eq "SHOW_PICTURE") )
{ Action_ShowPicture(); }
#------------------------------------------------------------------------------
else
{ Error( "Unknown action requested!" ); }
#------------------------------------------------------------------------------



##### Print the stream footer
#------------------------------------------------------------------------------
printf( " </BODY>\n" );
printf( "</HTML>" );
exit( 0 );
#------------------------------------------------------------------------------





###############################################################################
##                                                                           ##
##   A C T I O N _ L I S T C A T E G O R I E S ()                            ##
##                                                                           ##
###############################################################################
sub Action_ListCategories()
{
 ##### Presettings
 #-----------------------------------------------------------------------------
 srand();
 #-----------------------------------------------------------------------------



 ##### Generate the page output
 #-----------------------------------------------------------------------------
 $hDummy{"COLS"}       = 3;
 $hDummy{"INDEX"}      = -1;
 $hDummy{"CATEGORIES"} = 0; 
 #- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 foreach( sort(keys %hIndexFileCategory) )
 { $hDummy{"CATEGORIES"} ++; }
 #- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 printf( '<TABLE BORDER="0" WIDTH="100%%" HEIGHT="100%%"><TR><TD><CENTER><BR>'."\n" );
 printf( '<TABLE BORDER="0" CELLSPACING="8" CELLPADDING="0">'."\n" );
 printf( "\n" );
 #- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 printf( '<TR>'."\n" );
#gray#dark# printf( ' <TD ALIGN="LEFT" COLSPAN="2"><FONT COLOR="#484848">Categories</FONT></TD>'."\n" );
#gray#light# printf( ' <TD ALIGN="LEFT" COLSPAN="2"><FONT COLOR="#969696">Categories</FONT></TD>'."\n" ); 
 printf( ' <TD ALIGN="LEFT" COLSPAN="2">' );
 printf( '<A HREF="/">Home</A>&#160;&#160;/&#160;&#160;' );
 printf( '<A HREF="/gallery/">Gallery</A>&#160;&#160;/&#160;&#160;' ); 
 printf( 'Categories</TD>'."\n" );  
 printf( ' <TD ALIGN="RIGHT">%s</TD>'."\n", $hDummy{"CATEGORIES"} );
 printf( '</TR>'."\n" );
 printf( '<TR>'."\n" ); 
 printf( ' <TD BGCOLOR="#484848" COLSPAN="3"><IMG SRC="%s" HEIGHT="1"></TD>'."\n",
         $sSettingUrlTokenBase.$sSettingUrlTokenPixel ); 
 printf( '</TR>'."\n" );
 printf( '<TR>'."\n" ); 
 printf( ' <TD COLSPAN="3"><IMG SRC="%s" HEIGHT="1"></TD>'."\n",
         $sSettingUrlTokenBase.$sSettingUrlTokenPixel ); 
 printf( '</TR>'."\n" );
 #- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -	  
 foreach( sort(keys %hIndexFileCategory) )
 {
  $sParamCategory = $_;
  @aDummy = ();
  $hDummy{"INDEX"} ++;

  if( ($hDummy{"INDEX"} % $hDummy{"COLS"}) == 0 )
  { printf( "<TR>\n" ); }

  for( $I = 0; $I < scalar@aIndexFile; $I ++ )
  {
   if( $aIndexFile[$I]->{"Picture.Category"} ne $sParamCategory )
   { next; }
   push( @aDummy, $I );
  }
  $sDummy = rand( scalar@aDummy );
  $sDummy = $aDummy[$sDummy];

  printf( ' <TD ALIGN="CENTER" VALIGN="MIDDLE">' ); 
  @aDummy = split( "x", $aIndexFile[$sDummy]->{"Thumbnail.Scale"} );
#  printf( '<A HREF="%sACTION=show_picture&PICTURE=%s"><IMG SRC="%s" WIDTH="%s" HEIGHT="%s" BORDER=0></A><BR>',
#          $sSettingUrlTokenBase.$sSettingUrlTokenThis,
#	  $aIndexFile[$sDummy]->{"Picture.Name"},
#          $sSettingUrlTokenBase.$sSettingUrlTokenPicture.$aIndexFile[$sDummy]->{"Thumbnail.Name"},
#          $aDummy[0], $aDummy[1] );
  printf( '<A HREF="%sACTION=list_thumbnails&CATEGORY=%s"><IMG SRC="%s" WIDTH="%s" HEIGHT="%s" BORDER=0></A><BR>',
          $sSettingUrlTokenBase.$sSettingUrlTokenThis,
          $sParamCategory, 
          $sSettingUrlTokenBase.$sSettingUrlTokenPicture.$aIndexFile[$sDummy]->{"Thumbnail.Name"},
          $aDummy[0], $aDummy[1] );
  printf( '<A HREF="%sACTION=list_thumbnails&CATEGORY=%s"><FONT SIZE="-1">%s</FONT></A>',
          $sSettingUrlTokenBase.$sSettingUrlTokenThis,
          $sParamCategory, 
          $sParamCategory );
  printf( '<FONT SIZE="-1">&#160;&#160;/&#160;&#160</FONT>' );
  printf( '<A HREF="%sACTION=list_thumbnails&CATEGORY=%s"><FONT SIZE="-1">%s</FONT></A>',
          $sSettingUrlTokenBase.$sSettingUrlTokenThis,
          $sParamCategory, 
          $hIndexFileCategory{$sParamCategory} );
  printf( "</TD>\n" ); 

  if( (($hDummy{"INDEX"} +1 ) == $hDummy{"CATEGORIES"}) ||
      (($hDummy{"INDEX"} % $hDummy{"COLS"}) == ($hDummy{"COLS"} - 1)) )
  { printf( "</TR>\n" ); }
 } 
 #- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -	 
 printf( "\n" );
 printf( "</TABLE>\n" );
 printf( "<BR></CENTER></TD></TR></TABLE>\n");
 #----------------------------------------------------------------------------- 
}





###############################################################################
##                                                                           ##
##   A C T I O N _ L I S T T H U M B N A I L S ()                            ##
##                                                                           ##
###############################################################################
sub Action_ListThumbnails()
{
 ##### Check parameters
 #----------------------------------------------------------------------------- 
 unless( defined($sParamCategory) && ($sParamCategory ne "") )
 { Error( "Category name required!" ); }
 if( !exists($hIndexFileCategory{$sParamCategory}) )
 { Error( "Given category name not found!" ); }
 #-----------------------------------------------------------------------------
 
 
 
 ##### Generate the page output
 #-----------------------------------------------------------------------------
 $hDummy{"COLS"}  = 3;
 $hDummy{"INDEX"} = -1;
 #- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 printf( '<TABLE BORDER="0" WIDTH="100%%" HEIGHT="100%%"><TR><TD><CENTER><BR>'."\n" );
 printf( '<TABLE BORDER="0" CELLSPACING="8" CELLPADDING="0">'."\n" );
 printf( "\n" );
 #- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 printf( '<TR>'."\n" );
#gray#dark# printf( ' <TD ALIGN="LEFT" COLSPAN="2"><A HREF="%sACTION=list_categories">Categories</A>&#160;&#160;/&#160;&#160;<FONT COLOR="#484848">%s</FONT></TD>'."\n",
#gray#light# printf( ' <TD ALIGN="LEFT" COLSPAN="2"><A HREF="%sACTION=list_categories">Categories</A>&#160;&#160;/&#160;&#160;<FONT COLOR="#969696">%s</FONT></TD>'."\n",
 printf( ' <TD ALIGN="LEFT" COLSPAN="2">' );
 printf( ' <A HREF="/">Home</A>&#160;&#160;/&#160;&#160;' );
 printf( '<A HREF="/gallery/">Gallery</A>&#160;&#160;/&#160;&#160;' );	  
 printf( ' <A HREF="%sACTION=list_categories">Categories</A>&#160;&#160;/&#160;&#160;%s</TD>'."\n",
         $sSettingUrlTokenBase.$sSettingUrlTokenThis,
	 $sParamCategory );
 printf( ' <TD ALIGN="RIGHT">%s</TD>'."\n", $hIndexFileCategory{$sParamCategory} );
 printf( '</TR>'."\n" );
 printf( '<TR>'."\n" ); 
 printf( ' <TD BGCOLOR="#484848" COLSPAN="3"><IMG SRC="%s" HEIGHT="1"></TD>'."\n",
         $sSettingUrlTokenBase.$sSettingUrlTokenPixel ); 
 printf( '</TR>'."\n" );
 printf( '<TR>'."\n" ); 
 printf( ' <TD COLSPAN="3"><IMG SRC="%s" HEIGHT="1"></TD>'."\n",
         $sSettingUrlTokenBase.$sSettingUrlTokenPixel ); 
 printf( '</TR>'."\n" );
 #- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 for( $I = 0; $I < scalar@aIndexFile; $I ++ )
 {
  if( $aIndexFile[$I]->{"Picture.Category"} ne $sParamCategory )
  { next; }
  $hDummy{"INDEX"} ++;

  if( ($hDummy{"INDEX"} % $hDummy{"COLS"}) == 0 )
  { printf( "<TR>\n" ); }
 
  printf( ' <TD ALIGN="CENTER" VALIGN="MIDDLE">' ); 
  @aDummy = split( "x", $aIndexFile[$I]->{"Thumbnail.Scale"} );
  printf( '<A HREF="%sACTION=show_picture&PICTURE=%s"><IMG SRC="%s" WIDTH="%s" HEIGHT="%s" BORDER=0></A><BR>',
          $sSettingUrlTokenBase.$sSettingUrlTokenThis,
	  $aIndexFile[$I]->{"Picture.Name"},
          $sSettingUrlTokenBase.$sSettingUrlTokenPicture.$aIndexFile[$I]->{"Thumbnail.Name"},
          $aDummy[0], $aDummy[1] );
  printf( '<A HREF="%sACTION=show_picture&PICTURE=%s"><FONT SIZE="-1">%s</FONT></A>',
          $sSettingUrlTokenBase.$sSettingUrlTokenThis,
	  $aIndexFile[$I]->{"Picture.Name"},
	  ($hDummy{"INDEX"} + 1) );
  printf( '<FONT SIZE="-1">&#160;&#160;/&#160;&#160</FONT>' );
  printf( '<A HREF="%sACTION=show_picture&PICTURE=%s"><FONT SIZE="-1">%s</FONT></A>',
          $sSettingUrlTokenBase.$sSettingUrlTokenThis,
	  $aIndexFile[$I]->{"Picture.Name"},
	  $aIndexFile[$I]->{"Picture.Size"} );
  printf( "</TD>\n" ); 
    
  if( (($hDummy{"INDEX"} +1 ) == $hIndexFileCategory{$sParamCategory}) ||
      (($hDummy{"INDEX"} % $hDummy{"COLS"}) == ($hDummy{"COLS"} - 1)) )
  { printf( "</TR>\n" ); }
 } 
 #- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -	 
 printf( "\n" );
 printf( "</TABLE>\n" );
 printf( "<BR></CENTER></TD></TR></TABLE>\n");
 #----------------------------------------------------------------------------- 
}





###############################################################################
##                                                                           ##
##   A C T I O N _ S H O W P I C T U R E ()                                  ##
##                                                                           ##
###############################################################################
sub Action_ShowPicture()
{
 ##### Check parameters
 #----------------------------------------------------------------------------- 
 $sFoundIndex = -1;
 $sDummy      = 0;
 #- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 unless( defined($sParamPicture) && ($sParamPicture ne "") )
 { Error( "Picture name required!" ); } 
 for( $I = 0; $I < scalar@aIndexFile; $I ++ )
 {
  if( $aIndexFile[$I]->{"Picture.Name"} eq $sParamPicture )
  { $sFoundIndex = $I; $sDummy ++; }
 }
 #- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 if( $sDummy == 0 )
 { Error( "Given picture name not found!" ); } 
 if( $sDummy > 1 )
 { Error( "Index file contains duplicate entries!" ); }
 #----------------------------------------------------------------------------- 



 ##### Calculate different values
 #----------------------------------------------------------------------------- 
 $sParamCategory = $aIndexFile[$sFoundIndex]->{"Picture.Category"};
 #- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 $hDummy{"NO"}    = 1; 
 $hDummy{"FIRST"} = -1;
 $hDummy{"PREV"}  = -1;
 $hDummy{"NEXT"}  = -1;  
 $hDummy{"LAST"}  = -1;
 #- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 for( $I = 0; $I < $sFoundIndex; $I ++ )
 {
  if( $aIndexFile[$I]->{"Picture.Category"} eq $sParamCategory )
  {
   $hDummy{"NO"} ++;
   if( $hDummy{"FIRST"} == -1 )
   { $hDummy{"FIRST"} = $I; }
   $hDummy{"PREV"} = $I; 
  }
 }
 #- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 for( $I = ($sFoundIndex + 1); $I < scalar@aIndexFile; $I ++ )
 {
  if( $aIndexFile[$I]->{"Picture.Category"} eq $sParamCategory )
  {
   if( $hDummy{"NEXT"} == -1 )
   { $hDummy{"NEXT"} = $I; }
   $hDummy{"LAST"} = $I;    
  }
 }
 #----------------------------------------------------------------------------- 



 ##### Generate the page output
 #-----------------------------------------------------------------------------
 printf( '<TABLE BORDER="0" WIDTH="100%%" HEIGHT="100%%"><TR><TD><CENTER><BR>'."\n" );
 printf( '<TABLE BORDER="0"><TR><TD ALIGN="LEFT">'."\n" );
 printf( "\n" );
 #- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 printf( '<A HREF="/">Home</A>' );
 #- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
 printf( "&#160;&#160;" );
 printf( "/" );
 printf( "&#160;&#160;" ); 
 #- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 printf( '<A HREF="/gallery/">Gallery</A>' );
 #- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
 printf( "&#160;&#160;" );
 printf( "/" );
 printf( "&#160;&#160;" ); 
 #- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 printf( '<A HREF="%sACTION=list_categories">Categories</A>',
         $sSettingUrlTokenBase.$sSettingUrlTokenThis );
 #- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
 printf( "&#160;&#160;" );
 printf( "/" );
 printf( "&#160;&#160;" ); 
 #- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
 printf( '<A HREF="%sACTION=list_thumbnails&CATEGORY=%s">%s</A>',
         $sSettingUrlTokenBase.$sSettingUrlTokenThis,
         $sParamCategory, $sParamCategory );
 #- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 printf( '</TD><TD ALIGN="RIGHT">' );
 #- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
 if( $hDummy{"FIRST"} == -1 )
#gray#dark# { printf( '<FONT COLOR="#484848">|&lt;</FONT>' ); }
 { printf( '<FONT COLOR="#969696">|&lt;</FONT>' ); } 
 else
 {
  printf( '<A HREF="%sACTION=show_picture&PICTURE=%s">|&lt;</A>',
          $sSettingUrlTokenBase.$sSettingUrlTokenThis,
	  $aIndexFile[$hDummy{"FIRST"}]->{"Picture.Name"} );
 }
 #- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
 printf( "&#160;&#160;" );
 #- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
 if( $hDummy{"PREV"} == -1 )
#gray#dark# { printf( '<FONT COLOR="#484848">&lt;</FONT>' ); }
 { printf( '<FONT COLOR="#969696">&lt;</FONT>' ); } 
 else
 {
  printf( '<A HREF="%sACTION=show_picture&PICTURE=%s">&lt;</A>',
          $sSettingUrlTokenBase.$sSettingUrlTokenThis,
	  $aIndexFile[$hDummy{"PREV"}]->{"Picture.Name"} );
 }
 #- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
 printf( "&#160;&#160;&#160;" );
 printf( "%i / %i", $hDummy{"NO"}, $hIndexFileCategory{$sParamCategory} );
 printf( "&#160;&#160;" );
 #- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
 if( $hDummy{"NEXT"} == -1 )
#gray#dark# { printf( '<FONT COLOR="#484848">&gt;</FONT>' ); }
 { printf( '<FONT COLOR="#969696">&gt;</FONT>' ); } 
 else
 {
  printf( '<A HREF="%sACTION=show_picture&PICTURE=%s">&gt;</A>',
          $sSettingUrlTokenBase.$sSettingUrlTokenThis,
	  $aIndexFile[$hDummy{"NEXT"}]->{"Picture.Name"} );
 }
 #- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
 printf( "&#160;&#160;" );
 #- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
 if( $hDummy{"LAST"} == -1 )
#gray#dark# { printf( '<FONT COLOR="#484848">&gt;|</FONT>' ); }
 { printf( '<FONT COLOR="#969696">&gt;|</FONT>' ); } 
 else
 {
  printf( '<A HREF="%sACTION=show_picture&PICTURE=%s">&gt;|</A>',
          $sSettingUrlTokenBase.$sSettingUrlTokenThis,
	  $aIndexFile[$hDummy{"LAST"}]->{"Picture.Name"} );
 }
 #- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  
 printf( '</TD></TR><TR><TD ALIGN="MIDDLE" COLSPAN="2">' );
 #- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 @aDummy = split( "x", $aIndexFile[$sFoundIndex]->{"Picture.Scale"} );
 $sDummy = sprintf( '<IMG SRC="%s" WIDTH="%s" HEIGHT="%s" BORDER=0></A>',
                    $sSettingUrlTokenBase.$sSettingUrlTokenPicture.$aIndexFile[$sFoundIndex]->{"Picture.Name"},
       	            $aDummy[0], $aDummy[1] );
 printf( "%s\n", $sDummy );
 #- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 printf( '</TD></TR><TR><TD ALIGN="RIGHT" COLSPAN="2">' );
 printf( '<FONT SIZE=-1>Copyright by <A HREF="mailto:daniel@scheibli.com">Daniel P. Scheibli</A></FONT>' );
 #- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 printf( "\n" );
 printf( "</TD></TR></TABLE>\n" );
 printf( "<BR></CENTER></TD></TR></TABLE>\n");
 #----------------------------------------------------------------------------- 
}





###############################################################################
##                                                                           ##
##   E R R O R ()                                                            ##
##                                                                           ##
###############################################################################
sub Error($)
{
 ##### Presettings
 #-----------------------------------------------------------------------------
 my $sMessage = shift;
 #----------------------------------------------------------------------------- 



 ##### Print the stream content and footer
 #----------------------------------------------------------------------------- 
 printf( "<BR><BR>" );
 printf( '<CENTER><FONT COLOR="#FF0000">CGI Error: '.$sMessage.'</FONT></CENTER>' );
 printf( "<BR><BR><BR><BR><BR><BR>" ); 
 printf( "</BODY></HTML>" );
 exit( 0 );
 #----------------------------------------------------------------------------- 
}





###############################################################################
##                                                                           ##
##   S T R I P                                                               ##
##                                                                           ##
###############################################################################
sub Strip(@)
{
 my @aArray = @_;
 foreach(@aArray)
 { s/^\s+//; s/\s+$//; }
 return wantarray ? @aArray : $aArray[0];
}




