############################################################################
# Digitalt fotoalbum-program (fil 1 av 7)                                  #
# Version 3 av Anders Hultman 2002.                                        #
#                                                                          #
# Programmet låter dig ha flera separata fotoalbum med samma layout.       #
# Ett fotoalbum består av en s.k. album-fil som innehåller URL:ar och      #
# bildtexter till alla bilder. Alla album-filer ska ligga i samma          #
# directory på den server som album-systemet är installerat på.            #
# Bildfilerna kan ligga på vilken server som helst, men om de ligger på    #
# samma server så kan man få HTML-koderna WIDTH och HEIGHT angivna         #
# automatiskt. För detta krävs dessutom att Image::Size är installerat.    #
#                                                                          #
# Varje album kan visas i tre olika visningslägen:                         #
#   -- en bild i taget genom scriptet album-en                             #
#   -- alla bilder på en sida genom scriptet album-al                      #
#   -- med klickbara miniatyrbilder i en spalt till vänster genom          #
#      scriptet album-fr (för detta krävs att ImageMagick är installerat.  #
# Dessutom finns scripten                                                  #
#   -- album-leta som söker i bildtexter, albumtitlar och filnamn          #
#   -- album-lista som visar alla album med rubrik eller filnamn           #
#   -- album-bt som låter besökarna föreslå nya eller bättre bildtexter    #
#                                                                          #
# En album-fil har ändelsen .album och är en textfil med albumets rubrik   #
# på första raden (till exempel "Semester 1996") och adresser och          #
# bildtexter för varje bild på följande rader. Se filen exempel.album för  #
# detaljer hur album-filerna ska vara uppställda.                          #
#                                                                          #
# Om bilderna ligger på en annan server så måste URL:arna vara             #
# fullständiga (börja på http://). Ligger bilderna på samma server går     #
# det även att använda länkar som börjar på / (t.ex. /bilder/bild.jpeg).   #
# Om alla ens bilder ligger i en speciell bild-mapp (och i undermappar     #
# till den) kan man även ange sökvägar relativt den mappen. De ska då inte #
# börja på / (t.ex. bild.jpeg)                                             #
#                                                                          #
# Om du vill ha en gemensam bildtext för alla bilder så skriver du den på  #
# sista raden i album-filen, med ett #-tecken före. Det går bara att ha    #
# en rad, men den kan i gengäld vara hur lång som helst.                   #
#                                                                          #
# Om du installerar album-programmet så att det får URL:arna               #
#   http://din.server/cgi-bin/album-en (för en-i-taget-visning)            #
#   http://din.server/cgi-bin/album-al (för alla-på-en-gång-visning)       #
#   http://din.server/cgi-bin/album-fr (för visning med miniatyrbilder)    #
# och om din album-fil heter                                               #
#   semester-1996.album                                                    #
# så kommer URL:arna till ditt albums olika visningslägen att bli          #
#   http://din.server/cgi-bin/album-en/semester-1996                       #
#   http://din.server/cgi-bin/album-al/semester-1996                       #
#   http://din.server/cgi-bin/album-fr/semester-1996                       #
# Notera bruket av "falska kataloger" och att ändelsen .album inte         #
# skrivs ut.                                                               #
#                                                                          #
# För att gå till en viss bild (till exempel bild nr 17) blir URL:arna:    #
#   -- i en-i-taget-läge:                                                  #
#      http://din.server/cgi-bin/album-en/semester-1996?17                 #
#      http://din.server/cgi-bin/album-en/semester-1996?bild=17            #
#   -- i alla-på-en-sida-läge:                                             #
#      http://din.server/cgi-bin/album-al/semester-1996#17                 #
#   -- i miniatyrbilds-läge:                                               #
#      http://din.server/cgi-bin/album-fr/semester-1996?17                 #
#                                                                          #
# Normalt sett så kommer bild nummer 1 att visas om man anger URL:en till  #
# en-i-taget-läget utan någon speciell bild angiven. Om man istället vill  #
# ha ett "omslag" eller titelsida till sitt album så lägger man en         #
# manuellt skapad HTML-fil med samma namn som album-filen, men med         #
# ändelsen .html istället för .album, i samma directory som album-filen.   #
# Denna HTML-sida kommer då att visas istället för bild nummer 1. Bild     #
# nummer 1 kan nås som vanligt genom att ange ?1 enligt exemplet ovan.     #
# Omslagssidan kan designas helt fritt och kan till exempel ha en vackert  #
# skriven rubrik, utdrag ur albumet eller en textberättelse om vad albumet #
# innehåller samt länkar till de olika visningslägena. Var noga med hur    #
# adresserna till bilder skrivs, eftersom webbläsaren uppfattar det som    #
# att omslagssidan ligger i en "mapp" med namn /cgi-bin/album-en/ och inte #
# i det directory där den fysiskt ligger.                                  #
#                                                                          #
# Om du t.ex. byter namn på ett album och vill eftersända dina besökare    #
# till den nya adressen så skriver du fullständig URL (börjar på http://)  #
# med ett @-tecken framför på första raden i album-filen. Resten av filen  #
# kommer inte att läsas och kan vara tom.                                  #
#                                                                          #
############################################################################
# Konfigurering                                                            #
#                                                                          #
# Här fyller du i URI:erna till scripten. Ändra dessa så att de            #
# de stämmer överens med vad du kallat filerna på din server. URI:erna     #
# ska vara den del av URL:arna ovan som kommer efter datornamnet men före  #
# namnet på det enskilda albumet. Avsluta inte med /                       #

$en_uri  = "/cgi-bin/album-en"; 
$al_uri  = "/cgi-bin/album-al"; 
$fr_uri  = "/cgi-bin/album-fr"; 
$bt_uri  = "/cgi-bin/album-bt";

# Här fyller du i sökvägen till det directory på servern där dina          #
# album-filer ligger. Det ska vara en filsystems-sökväg räknad relativ     #
# från albumscriptens plats, eller absolut från filsystemets rot.          #
# Avsluta inte sökvägen med /                                              #

$db_dir  = "../album"; 

# Här fyller du i sökvägen till det directory på servern där de            #
# automatiskt genererade miniatyrbilderna kommer att sparas. Webbserverns  #
# användare måste ha skrivrättighet här. Avsluta inte sökvägen med /       #

$ca_dir  = "/miniatyrbilder";

# Här fyller du i storleken på miniatyrbilderna, räknat i antal pixlar på  #
# långsidan av bilden (kortsidan räknas ut proportionerligt).              #

$small_width = 100;

# Här fyller du i URI:n till det directory på servern där du har de flesta #
# av dina bilder. Det ska vara en sökväg relativt DOCUMENT_ROOT. Detta är  #
# det som kommer att läggas framför ofullständiga bildadresser. Avsluta    #
# inte sökvägen med /                                                      #

$bild_uri = "/bilder";

# Här fyller du i URI:n till din innehållssida. Detta är en del av min     #
# layout och kanske inte används om du anpassar utseendet till din sajt.   #

$toc_url = "/bilder/";

# Här fyller du texten i länken till din innehållssida. Detta är en del    #
# av min layout och kanske inte används om du anpassar utseendet till din  #
# sajt.                                                                    #

$toc_txt = "Mina album";

# Här fyller du i sökvägen till mailservern som album-bt skickar mail      #
# genom. Exemplet här förutsätter qmail. Om du använder sendmail så måste  #
# du ange sendmail -t                                                      #

$mailprog = '/usr/sbin/qmail-inject';

# Här fyller du i adresser och namn som album-bt ska skicka mail till och  #
# från, samt ärenderaden på mailen.                                        #

$To       = 'din.adress@din.server';
$ToName   = 'Ditt namn';
$From     = 'bildtextsystemet@din.server';
$FromName = 'Bildtextsystemet';   
$Subject  = 'Ny bildtext';

# Det var den konfigurering som är nödvändig för att album-systemet ska    #
# fungera. I själva koden finns dock en hel del layout-detaljer            #
# som du kan ändra om du vill.                                             #
#                                                                          #
# OBS!                                                                     #
# Om du inte har Image::Size installerat på din server måste du ta bort de #
# rader som anropar Image::Size (dessa anges i koden). Om du inte har      #
# Image::Magick installerat på din server så kan du inte använda album-fr  #
############################################################################
# Globala konstanter (ändra ej dessa)

$al_url  = "$al_uri$ENV{'PATH_INFO'}";
$en_url  = "$en_uri$ENV{'PATH_INFO'}";
$fr_url  = "$fr_uri$ENV{'PATH_INFO'}";

######################################################################
# Subrutin som öppnar album-filen och sätter globala variabler

sub read_album {
  open(FIL, $db_dir.$ENV{'PATH_INFO'}.".album") || &fel_404($db_dir.$ENV{'PATH_INFO'}.".album");
  @bild = (<FIL>);
  close (FIL);
  chop (@bild);

  $omslag = "$db_dir$ENV{'PATH_INFO'}.html"
     if (-e "$db_dir$ENV{'PATH_INFO'}.html");

  $title = $bild[0];
  $title =~ s/<([^>]|\n)*>//g;

  $antal = @bild;
  $antal--;
  if ($bild[$antal] =~ /^\#/) {
    $bild[$antal] = substr($bild[$antal],1);
    $antal--;
  }

  ### Funktion för eftersändning
  if ($bild[0] =~ /^\@/) {
    # Om första raden är @ och en url så ska man hänvisas dit
    $url = substr($bild[0],1);
    print "Location: $url";
    print "?$ENV{'QUERY_STRING'}" if ($ENV{'QUERY_STRING'});
    print "\n\n";
    exit(0);
  }
}

# $title är för användning som html-title
# $bild[0] är titeln obehandlad
# $bild[1..$antal] är url + bildtext för resp bild
# $bild[$antal+1] är en gemensam bildtext
# $antal är antalet bilder

######################################################################
# Subrutin som returnerar bildens URL och bildtext
# Argument 0 ska vara bildens nummer inom albumet

sub url_text {
  my $url; 
  my $bildtext;
  my $serv;
  if ($bild[$_[0]] =~ /\|/) {
    ($url,$bildtext) = split(/\|/,$bild[$_[0]]);
  } 
  elsif ($bild[$_[0]] =~ / /) {
    $url = substr($bild[$_[0]],0,index($bild[$_[0]]," "));
    $bildtext = substr($bild[$_[0]],index($bild[$_[0]]," ")+1);
  } else {
    $url = $bild[$_[0]];
  }

  if ($url =~ /^http\:\/\//) { $serv = "remote"; }
  elsif ($url =~ /^\//)      { $serv = "local"; }
  else {
    $url = "$bild_uri/$url";
    $serv = "local";  
  }
  ($url,$bildtext,$serv);
}

######################################################################
# Subrutin som visar ett felmeddelande om begärd sida inte finns

sub fel_404 {
  print "Status: 404 Finns inte, syns inte\n";
  print "Content-type: text/html\n\n";
  print "<HTML>\n<head>\n";
  print "<TITLE>404 Finns inte</TITLE>\n";
  print "</HEAD>\n",'<BODY BGCOLOR="#FFFFFF" TEXT="#003300">',"\n";
  print '<table width="100%">',"\n<tr><td>";

# Här hämtar jag in en snutt HTML-kod från filen "logo.include" för
# att visa min logotype och en länk till min förstasida.
# Avkommentera följande rader om du vill ha en liknande funktion.
# open (LOGO,"logo.include");
# print while (<LOGO>);
# close (LOGO);

  print '<td><td align="right">',
        '<a href="',$toc_url,'">',
        "$toc_txt</a><br>\n";
  print '<tr><td valign="top" bgcolor="#CCCCFF" colspan="3"><big><strong>',
        "Efterfrågad sida finns inte</strong></big>\n<tr>\n<td>\n";
  print "<br><br>\n<tt>[HTTP error 404]</tt>\n</table>\n</BODY>\n</HTML>\n";
  exit(0);
}

######################################################################
# Subrutin som läser in formulärdata (GET eller POST)

sub GetCGIinput {
  my $buffer; my @pairs; my $pair; my $name; my $value;
  if ($ENV{'REQUEST_METHOD'} eq "GET") {
    $buffer = $ENV{'QUERY_STRING'};
  }
  elsif ($ENV{'REQUEST_METHOD'} eq "POST") {
    read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
  }
  @pairs = split(/&/, $buffer);
  foreach $pair (@pairs) {
    ($name, $value) = split(/=/, $pair);
    $value =~ tr/+/ /;
    $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
    $FORM{$name} = $value;
  }
}

######################################################################

1;
