#!/usr/bin/perl
#
# Parishcouncil.net / Parish Websites Ltd © 2008
#
#####################################################################################
# Options & Settings
my $scriptname = 'gallery.pl';
my $database = 'gallery.csv';
my $token = '@#@#@';
my $image_dir = '../gallery/images';
my $template_list = '../gallery/gallery_view.php';
my $template_view = '../gallery/viewtemplate.html';
my $template_slide = '../gallery/slide_view.php';
my $template_admin = '../gallery/admin_view.php';
my $template_error = '../gallery/template.html';
my $image_url = '../gallery/images';
# Admin Setting & Options
my $maxfilesize = 400000;
my $login = 'djalsjdasdos90d09730947203';
my $password = 'aslhdoiahsdoasdh9001273';
# Look & Feel Options
my $thumbsperpage = 100;
my $thumbsperrow = 100;
my $thumbsperadminpage = 6;
my $viewtarget = "_new";
my $slidetarget = "_new";
my $tablebackground = "#F5EAE8";
my $dateformat = "EU"; # otherwise, set to "US"
my $server_timezone_offset = 0;
my $slideselectorcolour = "#BFDCB3";
my $entryselectorcolour = "#BFDCB3";
my $slidetime = 7;
my $persistentslideselector = 0;
# thumbnail default size
my $thumb_x_pxsize = '150';
my $thumb_y_pxsize = '150';
# default action
my $default_action = 'list';
# STRING TABLE
my %WORDS =
(
E_TEMPLATE => "Error : template file could not be loaded",
E_NOTAUTHORISED => "You seem not to be authorised to perform this action",
LOGIN => "Login Name",
PASSWORD => "Password",
SUBMIT => "Submit",
DELGALWARNING => "Warning ! Deleting a gallery will remove ALL pictures associated with it.
If you're not sure, press the back button above. Otherwise, select the gallery your want to delete and press the button below:",
DELETEGALLERY => "Delete Gallery",
RENAMEGALLERY => "Rename a Gallery",
E_DBOPEN => "Cannot open database",
GALPICK => "Show this Gallery",
PREVPAGE => "previous page",
NEXTPAGE => "next page",
NEWENTRY => "New Entry",
GALVIEW => "Normal Gallery View",
EDIT => "Edit",
DELETE => "Delete",
REMOVEDENTRY => "Removed entry",
ADDEDENTRY => "Added entry",
CHANGEDENTRY => "Changed entry",
WITHTITLE => "with title",
BACKTOADMIN => "Back to Admin Console",
E_FILETYPE => "Wrong file type",
CANTSAVE => "Can't save",
FILETOOBIG => "File is too big, maximum size is",
UPLOADFAILED => "File upload failed",
E_SAVETHUMB => "Error saving thumb file",
NOTFOUND => "Erroneous request : you might have specified an ID not belonging to this gallery",
NEWGALLERYNAME => "New Gallery Name",
NOGALLERYSPEC => "You did not specify a gallery name",
RENAMEDGALLERY => "Renamed Gallery",
TITLE => "Title",
DESCRIPTIVETEXT => "Descriptive Text",
FILE => "File",
GALLERY => "Gallery",
NEWGALLERY => "New Gallery",
NEWGALLERYNAME => "New Gallery Name",
GENPPF => "General Purpose Field",
VISIBLE => "Visible",
RECREATETHUMBS => "Recreate Thumbnail Images",
THUMBSREGENERATED => "Thumbnail images have been regenerated",
NEEDGD => "You need GD to be installed to perform this function",
REMOVED => "Removed",
CREATED => "Created",
INVALIDDATEFORMAT => "Invalid Date Format Specified !",
TOUCHTIME => "Touch Date/Time Field",
ORDERBY => "Order by",
ORDER => "Order",
REORDER => "Reorder Entries",
ALL => "Show All Galleries",
TIME => "Date/Time",
DATABASEREORDERED => "The database has been reordered",
APPINFO => "Application Info",
NOGALLERY => "No gallery specified"
);
####### END OF OPTIONS SECTION
#####################################################################################
#####################################################################################
#####################################################################################
# Startup
my $use_GD; # set to 0 to fully disable use of GD
my $GDinstalled;
BEGIN {
$GDinstalled = eval { require GD };
if ($GDinstalled != 0) {
$use_GD = 1;
}
else {$use_GD = 0;}
}
use CGI qw/:standard/;
use CGI::Carp qw(fatalsToBrowser);
use strict;
print "Content-type: text/html\n\n";
my $template = $template_list;
# Parse Request
my $raction;
if (defined(param('action'))) {
$raction = param('action');
}
else
{ $raction = $default_action;
}
my $rID = param('ID');
my $rhash = param('hash');
my $rlogin = param('login');
my $rpassword = param('password');
my $rpage = param('page');
my $rcat = param('cat');
my $rnohl = param('nohl');
my $slideset = param('slideset');
my $order_by = param("order_by");
my $order = param("order");
if (!defined($rnohl)) { $rnohl = 0;}
my $hash = crypt($password,$login);
my $galleries;
# Read Template
my $header = ""; my $footer = "";
my $tpage = ""; my $tlist = "";
sub SetTemplate {
(my $temp, my $ext) = @_;
if (!open(TEMPLATE, "< $temp")) { print "$WORDS{E_TEMPLATE} ($temp)"; exit(1); }
my @templ = ;
close (TEMPLATE);
my $tmpl_cont = join('', @templ);
if ($ext)
{
$tmpl_cont =~ s/\[\[LIST\]\](.*?)\[\[\/LIST\]\]/$token/s;
$tlist = $1;
$tpage = $tmpl_cont;
}
else
{
my $token_len = length($token);
my $tmpl_len = length($tmpl_cont);
my $forpos = index($tmpl_cont, $token);
$header = substr($tmpl_cont, 0, $forpos);
$footer = substr($tmpl_cont, $forpos+$token_len , $tmpl_len - $forpos -1);
}
}
# Error function
sub Error {
(my $message) = @_;
SetTemplate($template_error, 0);
print $header; print $message; print $footer;
exit(1);
}
# Action !
my $er = "";
my $erform = "";
my @data = ();
if ($raction eq 'list') {
ListThumbs();
}
if ($raction eq 'info') {
Info();
}
if ($raction eq 'admin') {
CheckPass();
AdminConsole();
}
if ($raction eq 'delete') {
CheckPass();
DeleteEntry();
}
if ($raction eq 'edit') {
CheckPass();
InputForm($rID);
}
if ($raction eq 'new') {
CheckPass();
InputForm(undef);
}
if ($raction eq 'newentry') {
CheckPass();
NewEntry();
}
if ($raction eq 'editentry') {
CheckPass();
EditEntry();
}
if ($raction eq 'rengal') {
CheckPass();
RenGal();
}
if ($raction eq 'rengalok') {
CheckPass();
RenGalOk();
}
if ($raction eq 'remakethumbs') {
CheckPass();
RecreateThumbs();
}
if ($raction eq 'reorder') {
CheckPass();
ReOrder();
}
if ($raction eq 'delgal') {
DelGalLogin();
}
if ($raction eq 'view') {
ViewPicture(0);
}
if ($raction eq 'slide') {
ViewPicture(1);
}
if ($raction eq 'delgalcheck') {
if (($rlogin eq $login) && ($rpassword eq $password))
{
$er = "hash=".$hash;
DeleteGallery();
}
else
{
Error($WORDS{E_NOTAUTHORISED});
}
}
# Auth Check
sub CheckPass {
if ((($rlogin eq $login) && ($rpassword eq $password)) || ($rhash eq $hash)) {
$er = "hash=".$hash;
$erform =<
EOF
} else { GetLogin();
exit(0); }
}
# Login Page
sub GetLogin
{
SetTemplate($template_admin, 0);
print $header;
print <
Checking authorisation...
EOF
print $footer;
}
sub DelGalLogin
{
BuildDB('all', 1);
SetTemplate($template_admin, 0);
print $header;
print <
$WORDS{DELGALWARNING}
EOF
print $footer;
}
# Build Database
sub BuildDB {
(my $gal, my $ignoreview) = @_;
open(DB, "< $database") or Error("$WORDS{E_DBOPEN} $database
");
my @dbase = ;
close (DB);
my $entry; my @gals;
foreach $entry(@dbase) {chomp($entry);}
my @cols = split(/\|/, $dbase[0]);
my $numcols = @cols;
my $numentries = @dbase;
my $cnt1; my $cnt2;
for ($cnt1 = 1 ; $cnt1 < $numentries ; $cnt1++)
{
my %row;
my @vals = split(/\|/, $dbase[$cnt1]);
for ($cnt2 = 0 ; $cnt2 < $numcols ; $cnt2++)
{
$row{$cols[$cnt2]} = $vals[$cnt2];
}
# put in data array if applicable
push(@gals, $row{'Gallery'});
if ($gal eq 'all')
{
if ($ignoreview == 1) { push (@data, \%row); }
else { push (@data, \%row) if ($row{View} == 1) ;}
}
else
{
if ($row{'Gallery'} eq $gal)
{
if ($ignoreview == 1) { push (@data, \%row); }
else { push (@data, \%row) if ($row{View} == 1) ;}
}
}
}
@gals = sort(@gals);
my $prevgal = '_nonesuch_';
my @ugals = grep($_ ne $prevgal && (($prevgal) = $_), @gals);
my $gal = "";
foreach $gal(@ugals)
{
$galleries .= "";
}
}
sub OrderDB {
(my $order_by, my $order) = @_;
if (($order eq '123') || ($order eq '321'))
{ @data = sort { $a->{$order_by} <=> $b->{$order_by}} @data;
} else {@data = sort { uc($a->{$order_by}) cmp uc($b->{$order_by}) } @data;}
if (($order eq 'cba') || ($order eq '321')) { @data = reverse @data;}
}
# List Thumbs Page
sub ListThumbs {
my $isprevious = 0;
my $isnext = 0;
my $output = "";
my $setslideselector = 0;
my $ista = 0; my $isli = 0; my $insli = 0; my $ipsli = 0;
my $np = 0; my $pp = 0; my $npo = ""; my $npoform = "";
my $output = "";
my $slidestart = "ID=1";
my %PAGE;
my $galOK = 0;
# look at params
my $gallery = "";
if (($rcat eq "") || (!defined($rcat)))
{
$galOK = 1;
$rcat = 'all';
$gallery = "";
}
if (($rpage eq "") || !defined($rpage)) { $rpage = 0;}
# build and filter db
BuildDB($rcat, 0);
SetTemplate($template_list, 1);
my $numentries = @data;
if (defined($order_by) && defined($order)) {
OrderDB($order_by, $order);
$npo="&order_by=$order_by&order=$order";
$npoform =<
EOF
}
# find out the page, ev the slide and possible next and prev slides
my $pagecount = -1;
if ((defined($rID)) && ($rID != 0))
{
my $goon = 1;
$setslideselector = 1;
my $i;
for ($i = 0; (($i<$numentries)&&($goon)); $i++)
{
if (($i % $thumbsperpage) == 0)
{
$ista = $i; $pagecount++;
}
my $entry = $data[$i];
if ($rID == $entry->{'ID'})
{
$goon = 0;
$slidestart = "ID=$rID";
$isli = $i;
$ipsli = $i-1;
if (defined($data[$i+1])) { $insli = $i+1; }
else { $insli = 0; }
}
}
$rpage = $pagecount;
}
else
{
$ista = $rpage * $thumbsperpage;
$slidestart = "ID=".$data[$ista]->{ID};
if ($slideset)
{
$setslideselector = 1;
$rID = $data[$ista]->{ID};
$ipsli = $ista-1;
if (defined($data[$ista+1])) { $insli = $ista+1; }
else { $insli = 0; }
}
$pagecount = $rpage;
}
if (defined($data[(($pagecount + 1) * $thumbsperpage)]) )
{
$isnext = 1; $np = $pagecount + 1;
}
if ( (defined($data[(($pagecount * $thumbsperpage)-1)])) && ((($pagecount * $thumbsperpage)-1)>0))
{
$isprevious = 1; $pp = $pagecount - 1;
}
if ($isprevious)
{
$PAGE{PP} = "gallery2.php?action=list$npo&cat=$rcat&page=$pp&slideset=$setslideselector&nohl=$rnohl";
}
if ($isnext)
{
$PAGE{NP} = "gallery2.php?action=list$npo&cat=$rcat&page=$np&slideset=$setslideselector&nohl=$rnohl";
}
my $prevslide = $data[$ipsli]->{ID};
my $nextslide = $data[$insli]->{ID};
$PAGE{NS} = "gallery/$scriptname?action=list$npo&cat=$rcat&ID=$nextslide";
$PAGE{PS} = "gallery/$scriptname?action=list$npo&cat=$rcat&ID=$prevslide";
$PAGE{TP} = int $numentries / $thumbsperpage;
if ($numentries % $thumbsperpage != 0) { $PAGE{TP}++;}
# draw gallery selection box and slide start link
$PAGE{SS} = "gallery/$scriptname?action=slide$npo&cat=$rcat&$slidestart";
$PAGE{GS} = <
$gallery
$galleries
EOF
$PAGE{PO} = <
EOF
$tpage =~ s/\[\[\s*GS\s*\]\]/$PAGE{GS}/is;
$tpage =~ s/\[\[\s*PO\s*\]\]/$PAGE{PO}/is;
my $report_page = $rpage + 1;
$tpage =~ s/\[\[\s*PN\s*\]\]/$report_page/gs;
$tpage =~ s/\[\[\s*TP\s*\]\]/$PAGE{TP}/gs;
$tpage =~ s/\[\[\s*SS\s*\]\](.*?)\[\[\s*\/SS\s*\]\]/$1<\/a>/gs;
if ($isnext){$tpage =~ s/\[\[\s*NP\s*\]\](.*?)\[\[\s*\/NP\s*\]\]/$1<\/a>/gs;}
else {$tpage =~ s/\[\[\s*NP\s*\]\](.*?)\[\[\s*\/NP\s*\]\]//gs;}
if ($isprevious){$tpage =~ s/\[\[\s*PP\s*\]\](.*?)\[\[\s*\/PP\s*\]\]/$1<\/a>/gs;}
else {$tpage =~ s/\[\[\s*PP\s*\]\](.*?)\[\[\s*\/PP\s*\]\]//gs;}
if (($setslideselector || $persistentslideselector) && !$rnohl)
{
$tpage =~ s/\[\[\s*NS\s*\]\](.*?)\[\[\s*\/NS\s*\]\]/$1<\/a>/gs;
$tpage =~ s/\[\[\s*PS\s*\]\](.*?)\[\[\s*\/PS\s*\]\]/$1<\/a>/gs;
}
else {
$tpage =~ s/\[\[\s*NS\s*\]\](.*?)\[\[\s*\/NS\s*\]\]//gs;
$tpage =~ s/\[\[\s*PS\s*\]\](.*?)\[\[\s*\/PS\s*\]\]//gs;
}
my $rowcnt = 0;
my $list = <
EOF
my $i;
for ($i = $ista ; (($i == $ista) || (($i % $thumbsperpage) != 0)) ; $i++)
{
my $entry;
if (defined($data[$i]))
{
my $listtemp = $tlist;
$entry = $data[$i];
if ($rowcnt == $thumbsperrow)
{
$list .= '
';
$rowcnt = 0;
}
my $slideselect = "";
if (($rID == $entry->{'ID'}) && !$rnohl) { $slideselect = qq!bgcolor="$slideselectorcolour"!;}
$PAGE{PIC} = <
EOF
}
else {
$PAGE{PIC} .= <
EOF
}
$listtemp = <$listtemp
EOF
my $LocalTime = GetLocalTime($entry->{Time});
$listtemp =~ s/\[\[\s*Time\s*\]\]/$LocalTime/sg;
$listtemp =~ s/\[\[PIC\]\]/$PAGE{PIC}/isg;
$listtemp =~ s/\[\[\s*(.*?)\s*\]\]/$entry->{$1}/sg;
$listtemp .= '';
$list .= $listtemp;
$rowcnt++;
}
}
$list .= '
';
$tpage =~ s/$token/$list/;
print $tpage;
}
# Show Admin Console
sub AdminConsole {
my $isprevious = 0;
my $isnext = 0;
my $output = "";
my $ista = 0;
my $np = 0; my $pp = 0;
my $output = ""; my $galOK; my $gallery;
# look at params
if (($rcat eq "") || (!defined($rcat)))
{
$galOK = 1;
$rcat = 'all';
$gallery = "";
}
if (!defined($rpage)) { $rpage = 0; }
# build and filter db
BuildDB($rcat, 1);
my $numentries = @data;
# find out the page, ev the slide and possible next and prev slides
my $highlight = -1;
my $refID = "";
my $pagecount = -1;
if ((defined($rID)) && ($rID != 0))
{
undef($rpage);
my $goon = 1;
my $i;
for ($i = 0; (($i<$numentries)&&($goon)); $i++)
{
my $entry = $data[$i];
if (($i % $thumbsperadminpage) == 0)
{
$ista = $i; $pagecount++;
}
if ($rID == $entry->{'ID'})
{
$goon = 0; $highlight = $i; $refID = "ID=".$entry->{'ID'};
}
}
}
else
{
$ista = $rpage * $thumbsperadminpage;
my $entry = $data[$ista];
$refID = "ID=".$entry->{'ID'};
$pagecount = $rpage;
}
if (defined($data[(($pagecount + 1) * $thumbsperadminpage)]))
{
$isnext = 1; $np = $pagecount + 1;
}
if ( (defined($data[(($pagecount * $thumbsperadminpage)-1)])) && ((($pagecount * $thumbsperadminpage)-1)>0))
{
$isprevious = 1; $pp = $pagecount - 1;
}
# draw page selector
my $pageselector = "";
if ($isprevious || $isnext) { $pageselector .= '' };
if ($isprevious)
{
$pageselector .= <$WORDS{PREVPAGE}
EOF
}
if ($isnext)
{
if ($isprevious) { $pageselector .= " - ";}
$pageselector.= <$WORDS{NEXTPAGE}
EOF
}
$pageselector .= '
';
# draw admin commands
my $commands = <Add New Photo «
Delete a Gallery «
Rename a Gallery «
Recreate Thumbnail Images «
Reorder Photos «
EOF
my $commandsinarow = <
EOF
SetTemplate($template_admin, 0);
print $header;
$output .= <
EOF
my $i;
for ($i = $ista ; (($i == $ista) || (($i % $thumbsperadminpage) != 0)) ; $i++)
{
my $entry;
if (defined($data[$i]))
{
$entry = $data[$i];
my $view = $entry->{'View'}==1?"yes":"no";
my $color = $i==$highlight?$entryselectorcolour:$tablebackground if (!$rnohl);
my $LocalTime = GetLocalTime($entry->{Time});
$output .= <
$entry->{'ID'} |
$entry->{'Title'} |
$LocalTime |
$entry->{'Image'} |
$entry->{'Image_text'} |
$entry->{'Gallery'} |
$view |
EOF
if ($use_GD) {
$output .= < |
EOF
}
else {
$output .= <
EOF
}
$output .= <$WORDS{EDIT} - $WORDS{DELETE}
EOF
}
}
$output .= <
EOF
my $galleryselector =<
|
$pageselector |
|
$commandsinarow
EOF
print $galleryselector; print $output;
print $footer;
}
# Delete an Entry
sub DeleteEntry {
BuildDB('all', 1);
my $cnt = 1;
my $entry;
SetTemplate($template_admin, 0);
open(DB, "> $database") or Error("$WORDS{E_DBOPEN} $database");
print DB "ID|Title|Time|ImageThumb|Image|Image_text|Gallery|View\n";
print $header;
foreach $entry(@data)
{
if ($entry->{'ID'} == $rID)
{
print "$WORDS{REMOVEDENTRY} $entry->{'ID'}, $WORDS{WITHTITLE} $entry->{'Title'}
";
my $rem1 = $image_dir.'/'.$entry->{'ImageThumb'};
my $rem2 = $image_dir.'/'.$entry->{'Image'};
unlink($rem1) if ($entry->{'ImageThumb'} ne 'none'); unlink($rem2);
}
else
{
print DB "$cnt|$entry->{'Title'}|$entry->{'Time'}|$entry->{'ImageThumb'}|$entry->{'Image'}|$entry->{'Image_text'}|$entry->{'Gallery'}|$entry->{'View'}\n";
$cnt++;
}
}
print <$WORDS{BACKTOADMIN}
EOF
print $footer;
close(DB);
}
sub InputForm {
(my $ID) = @_;
my $destext = "";
my $title = "";
my $file = "";
my $viewable = 1;
my $gallery = "";
my $entry;
BuildDB('all', 1);
SetTemplate($template_admin, 0);
print $header;
my $entry;
foreach $entry(@data)
{
if (($entry->{'ID'} == $ID) && (defined($ID)))
{
$destext = $entry->{'Image_text'};
$destext =~ s/
/\n/g;
$title = $entry->{'Title'};
$viewable = ($entry->{'View'}==1?"checked":"");
$gallery = $entry->{'Gallery'};
$gallery = "";
}
}
print <
EOF
if (defined($ID))
{
print <
$erform
EOF
}
else
{
print <
$erform
EOF
}
print $footer;
}
sub RenGal
{
my $gallery = "";
my $entry;
BuildDB('all', 1);
SetTemplate($template_admin, 0);
print $header;
print <
$erform
EOF
}
sub RenGalOk
{
BuildDB('all', 1);
my $rgallery = param("newgallery");
my $rorgallery = param("gallery");
if ((!defined($rgallery)) || ($rgallery eq "") || ($rgallery eq "all")) {
Error($WORDS{NOGALLERYSPEC});
}
if ((!defined($rorgallery)) || ($rorgallery eq "") || ($rorgallery eq "all")) {
Error($WORDS{NOGALLERYSPEC});
}
SetTemplate($template_admin, 0);
open(DB, "> $database") or Error("$WORDS{E_DBOPEN} $database");
print DB "ID|Title|Time|ImageThumb|Image|Image_text|Gallery|View\n";
print $header;
my $entry;
foreach $entry(@data)
{
if ($entry->{'Gallery'} eq $rorgallery)
{
print DB "$entry->{'ID'}|$entry->{'Title'}|$entry->{'Time'}|$entry->{'ImageThumb'}|$entry->{'Image'}|$entry->{'Image_text'}|$rgallery|$entry->{'View'}\n";
}
else
{
print DB "$entry->{'ID'}|$entry->{'Title'}|$entry->{'Time'}|$entry->{'ImageThumb'}|$entry->{'Image'}|$entry->{'Image_text'}|$entry->{'Gallery'}|$entry->{'View'}\n";
}
}
print <$WORDS{RENAMEDGALLERY}, $rorgallery => $rgallery
$WORDS{BACKTOADMIN}
EOF
print $footer;
close(DB);
}
# Make a new entry
sub NewEntry {
my $thumbfile; my $rgallery;
my $rtitle = param('imagetitle');
if ($rtitle eq "") {
Error("No Title Specified");
}
my $rtext = param('imagetext');
$rtext=~s/\n/
/g; $rtext=~s/\r//g; $rtext=~s/\|/I/g;
my $rfile = param('upload');
if (param('NewGallery') eq "ON")
{
$rgallery = param('NewGalleryName');
}
else
{
$rgallery = param('gallery');
if ($rgallery eq "") {
Error($WORDS{NOGALLERYSPEC});
}
}
my $rviewable = param('viewable');
if ($rviewable != 1) { $rviewable = 0;}
(my $origfilename, my $newfilename) = saveit($rfile);
chomp($origfilename); chomp($newfilename);
if (!defined($origfilename))
{
Error($WORDS{UPLOADFAILED});
}
# make a thumbnail here
if ($use_GD) {
$thumbfile = CreateThumbnail($newfilename);
}
else
{
$thumbfile = 'none';
}
# end thumbnail making
my $lastID = 0;
my $newID = 0;
BuildDB('all', 1);
if (@data > 0)
{
@data = reverse(@data);
$lastID = $data[0]->{'ID'};
@data = reverse(@data);
$newID = $lastID + 1;
}
else
{
$newID = 1;
}
SetTemplate($template_admin, 0);
my $Time = time();
open(DB, "> $database") or Error("$WORDS{E_DBOPEN} $database");
print DB "ID|Title|Time|ImageThumb|Image|Image_text|Gallery|View\n";
my $entry;
foreach $entry(@data)
{
print DB "$entry->{'ID'}|$entry->{'Title'}|$entry->{'Time'}|$entry->{'ImageThumb'}|$entry->{'Image'}|$entry->{'Image_text'}|$entry->{'Gallery'}|$entry->{'View'}\n";
}
print DB "$newID|$rtitle|$Time|$thumbfile|$newfilename|$rtext|$rgallery|$rviewable\n";
close(DB);
print $header;
print <$WORDS{BACKTOADMIN}
EOF
print $footer;
}
# Save a File
sub saveit
{
(my $reqfile) = @_;
my $buffer;
if (($reqfile eq '') || (!defined($reqfile)))
{
return (undef, undef);
}
my $file=$reqfile;
$file =~ /([^\\\/]+)$/i;
my $ext = $1;
if (!($ext =~ /jpg|jpeg|gif|png/i)) {
print Error("$WORDS{E_FILETYPE}");
}
my $found=0;
my $tmp_size =0;
my $bytesread = 0;
my $extra = "";
$file =~ /([^\/\\]+)$/i;
my $fn = $1;
my $origfn = $fn;
my $UFPath = $image_dir.'/'."UPL_".$fn;
while((-e $UFPath) || ($UFPath eq ""))
{ $fn = "1".$fn;
$UFPath = $image_dir.'/'."UPL_".$fn;
}
$UFPath =~m/([^\\\/]*\.\w*\Z)/i;
my $filename = $1;
if (!(open(FILE,"> $UFPath"))) { Error("$WORDS{CANTSAVE} $UFPath"); }
binmode FILE;
while ($bytesread=read($file,$buffer,1024)) {
print FILE $buffer;
$tmp_size+=1024;
if($maxfilesize && $maxfilesize<$tmp_size)
{
close FILE; unlink ($UFPath);
Error("$WORDS{FILETOOBIG} $maxfilesize bytes");
}
}
close(FILE);
return ($origfn, $filename);
}
# Edit an existing entry
sub EditEntry {
my $rtitle = param('imagetitle');
my $rtext = param('imagetext');
$rtext=~s/\n/
/g; $rtext=~s/\r//g; $rtext=~s/\|/I/g;
my $rfile = param('upload');
my $rID = param('ID');
my $touchtime = param('touchtime');
my $leavefile = 1;
my $newfilename = "";
my $origfilename = "";
my $thumbfile;
my $rgallery;
if (param('NewGallery') eq "ON")
{
$rgallery = param('NewGalleryName');
}
else
{
$rgallery = param('gallery');
}
my $rviewable = param('viewable');
if ($rviewable != 1) { $rviewable = 0;}
if ( !( ($rfile eq "") || (!defined($rfile)) ) )
{
($origfilename, $newfilename) = saveit($rfile);
chomp($origfilename); chomp($newfilename);
if ((!defined($origfilename)) || $origfilename eq "")
{
Error($WORDS{UPLOADFAILED});
}
$leavefile = 0;
# make a thumbnail here
if ($use_GD) {
$thumbfile = CreateThumbnail($newfilename);
}
else
{
$thumbfile = 'none';
}
# end thumbnail making
}
else
{
$leavefile = 1;
}
BuildDB('all', 1);
open(DB, "> $database") or Error("$WORDS{E_DBOPEN} $database");
print DB "ID|Title|Time|ImageThumb|Image|Image_text|Gallery|View\n";
my $entry;
my $Time = time();
my $imgfile;
foreach $entry(@data)
{
if ($entry->{'ID'} == $rID)
{
my $Time;
if ($touchtime) {
$Time=time();
} else {$Time = $entry->{'Time'};}
if ($leavefile)
{
print DB "$entry->{'ID'}|$rtitle|$Time|$entry->{'ImageThumb'}|$entry->{'Image'}|$rtext|$rgallery|$rviewable\n";
}
else
{
print DB "$entry->{'ID'}|$rtitle|$Time|$thumbfile|$newfilename|$rtext|$rgallery|$rviewable\n";
my $rem1 = $image_dir.'/'.$entry->{'ImageThumb'};
my $rem2 = $image_dir.'/'.$entry->{'Image'};
unlink($rem1) if ($entry->{'ImageThumb'} ne 'none'); unlink($rem2);
}
}
else
{
print DB "$entry->{'ID'}|$entry->{'Title'}|$entry->{'Time'}|$entry->{'ImageThumb'}|$entry->{'Image'}|$entry->{'Image_text'}|$entry->{'Gallery'}|$entry->{'View'}\n";
}
}
close(DB);
SetTemplate($template_admin, 0);
print $header;
print <$WORDS{BACKTOADMIN}
EOF
print $footer;
}
sub CreateThumbnail
{
(my $file) = @_;
my $srcimage = GD::Image->new($image_dir.'/'.$file);
(my $srcW,my $srcH) = $srcimage->getBounds();
my $wdiff = $srcW - $thumb_x_pxsize;
my $hdiff = $srcH - $thumb_y_pxsize;
my $newH; my $newW; my $aspect;
if ($wdiff > $hdiff) {
$newW = $srcW - $wdiff;
$aspect = ($newW/$srcW);
$newH = int($srcH * $aspect);
} else {
$newH = $srcH - $hdiff;
$aspect = ($newH/$srcH);
$newW = int($srcW * $aspect);
}
my $newimage = new GD::Image($newW,$newH);
$newimage->copyResized($srcimage,0,0,0,0,$newW,$newH,$srcW,$srcH);
$file =~ m/(\w+)\.(\w+)$/;
my $fn = $1;
my $ext = $2;
my $thfn = $image_dir.'/'.$fn.'_thumb.jpg';
if (!(open(THFILE, "> $thfn"))) { Error($WORDS{E_SAVETHUMB});}
binmode THFILE;
print THFILE $newimage->jpeg;
return ($fn.'_thumb.jpg');
}
sub DeleteGallery
{
BuildDB('all', 1);
my $cnt = 1;
open(DB, "> $database") or Error("$WORDS{E_DBOPEN} $database");
print DB "ID|Title|Time|ImageThumb|Image|Image_text|Gallery|View\n";
SetTemplate($template_admin, 0);
print $header;
my $entry;
foreach $entry(@data)
{
if ($entry->{'Gallery'} eq $rcat)
{
print "$WORDS{REMOVEDENTRY} $entry->{'ID'}, $WORDS{WITHTITLE} $entry->{'Title'}
";
my $rem1 = $image_dir.'/'.$entry->{'ImageThumb'};
my $rem2 = $image_dir.'/'.$entry->{'Image'};
unlink($rem1) if ($entry->{'ImageThumb'} ne 'none'); unlink($rem2);
}
else
{
print DB "$cnt|$entry->{'Title'}|$entry->{'Time'}|$entry->{'ImageThumb'}|$entry->{'Image'}|$entry->{'Image_text'}|$entry->{'Gallery'}|$entry->{'View'}\n";
$cnt++;
}
}
print <$WORDS{BACKTOADMIN}
EOF
print $footer;
close(DB);
}
sub ViewPicture
{
(my $slide) = @_;
my $act; my $npo = "";
if ($slide) { $act = "slide"; } else {$act = "view";}
if ((!defined($rcat)) || ($rcat eq "")) { $rcat = "all"; }
BuildDB($rcat, 0);
if (defined($order_by) && defined($order)) {
OrderDB($order_by, $order);
$npo="&order_by=$order_by&order=$order";
}
if ((!defined($rID)) || ($rID eq "")) { $rID = $data[0]->{ID}; }
if ($slide) { SetTemplate($template_slide, 1); }
else { SetTemplate($template_view, 1); }
my $numentries = @data;
my $output = "";
my $nextID = 1; my $prevID = 1;
my %PAGE;
my $refreshclause = "";
my $correctentry = "";
# find out the page, ev the slide and possible next and prev slides
my $goon = 1; my $i;
for ($i = 0; (($i<$numentries)&&($goon)); $i++)
{
my $entry = $data[$i];
if ($rID == $entry->{'ID'})
{
$goon = 0;
$correctentry = $entry;
$prevID = $data[$i-1]->{ID};
if (defined($data[$i+1])) { $nextID = $data[$i+1]->{ID};}
else { $nextID = $data[0]->{ID}; }
$refreshclause = <
EOF
$PAGE{PS} = "javascript:window.close();";
$PAGE{NP} = "$scriptname?action=$act$npo&cat=$rcat&ID=$nextID";
$PAGE{PP} = "$scriptname?action=$act$npo&cat=$rcat&ID=$prevID";
$PAGE{PIC} = <
EOF
}
}
if ($goon == 1)
{
Error("$WORDS{NOTFOUND} (ID : $rID, Gallery : $rcat)");
}
else
{
my $LocalTime = GetLocalTime($correctentry->{Time});
$tpage =~ s/\[\[\s*Time\s*\]\]/$LocalTime/sg;
if ($slide)
{
$tpage =~ s//$refreshclause/i;
$tpage =~ s/\[\[\s*PS\s*\]\](.*?)\[\[\s*\/PS\s*\]\]/$1<\/a>/gs;
}
$tpage =~ s/\[\[PIC\]\]/$PAGE{PIC}/is;
$tpage =~ s/\[\[\s*NP\s*\]\](.*?)\[\[\s*\/NP\s*\]\]/$1<\/a>/gs;
$tpage =~ s/\[\[\s*PP\s*\]\](.*?)\[\[\s*\/PP\s*\]\]/$1<\/a>/gs;
# only translate field names as last ones.
$tpage =~ s/\[\[\s*(.*?)\s*\]\]/$correctentry->{$1}/gs;
print $tpage;
}
}
sub RecreateThumbs
{
BuildDB('all', 1);
my $cnt = 1;
my $thumbfile;
if ($use_GD)
{
if ((!param("xsize")) || (!param("ysize")))
{
SetTemplate($template_admin, 0);
print $header;
print <
$erform
EOF
print $footer;
exit(0);
}
else
{
$thumb_x_pxsize = param("xsize");
$thumb_y_pxsize = param("ysize");
}
}
open(DB, "> $database") or Error("$WORDS{E_DBOPEN} $database");
print DB "ID|Title|Time|ImageThumb|Image|Image_text|Gallery|View\n";
SetTemplate($template_admin, 0);
print $header; my $entry;
foreach $entry(@data)
{
if ($entry->{'ImageThumb'} ne 'none')
{
my $rem = $image_dir.'/'.$entry->{'ImageThumb'};
print "$WORDS{REMOVED} $entry->{'ImageThumb'}
";
unlink($rem);
}
if ($use_GD) {
$thumbfile = CreateThumbnail($entry->{'Image'});
print "$WORDS{CREATED} $thumbfile
";
}
else
{
$thumbfile = 'none';
}
print DB "$entry->{'ID'}|$entry->{'Title'}|$entry->{'Time'}|$thumbfile|$entry->{'Image'}|$entry->{'Image_text'}|$entry->{'Gallery'}|$entry->{'View'}\n";
}
print <$WORDS{THUMBSREGENERATED}
$WORDS{BACKTOADMIN}
EOF
print $footer;
close(DB);
}
sub GetLocalTime {
(my $tist) = @_;
$tist += $server_timezone_offset*3600;
(undef,my $min,my $hour,my $mday,my $mon,my $year,undef,undef,undef) = localtime($tist);
$year += 1900;
$mon += 1;
if ($dateformat eq "EU") {
return sprintf("%02d-%02d-%d, %02d:%02d", $mday, $mon, $year, $hour, $min);
}
if ($dateformat eq "US") {
return sprintf("%02d-%02d-%d, %02d:%02d", $mon, $mday, $year, $hour, $min);
}
Error($WORDS{INVALIDDATEFORMAT});
}
sub ReOrder {
if ((!param("order_by")) || (!param("order")))
{
SetTemplate($template_admin, 0);
print $header;
print <
$WORDS{ORDERBY} |
|
$WORDS{ORDER} |
|
$erform
EOF
print $footer;
exit(0);
}
BuildDB('all', 1);
OrderDB($order_by, $order);
my $cnt = 1;
my $thumbfile;
open(DB, "> $database") or Error("$WORDS{E_DBOPEN} $database");
print DB "ID|Title|Time|ImageThumb|Image|Image_text|Gallery|View\n";
SetTemplate($template_admin, 0);
print $header; my $entry;
foreach $entry(@data)
{
print DB "$cnt|$entry->{'Title'}|$entry->{'Time'}|$entry->{'ImageThumb'}|$entry->{'Image'}|$entry->{'Image_text'}|$entry->{'Gallery'}|$entry->{'View'}\n";
$cnt++;
}
print <$WORDS{DATABASEREORDERED}
$WORDS{BACKTOADMIN}
EOF
print $footer;
close(DB);
}
sub Info
{
SetTemplate($template_admin, 0);
print $header;
print <Diagnostic info
EOF
## Script Version
print <
Gallery Version |
Parishcouncil.net Gallery Script v2.0 |
EOF
## GD
print <
Script Integrity and Efficiency Test |
EOF
if ($use_GD) {
print <Script running normally
EOF
}
else { print <Script NOT running normally
EOF
}
## END GD
## Home Page
print <
Copyright |
© All rights reserved: www.parishcouncil.net l Parish Websites Ltd |
EOF
##
print "
";
print $footer;
}
#####################################################################################
# © Parishcouncil.net / Parish Websites Ltd
#####################################################################################