#!/usr/bin/perl
#!/usr/bin/perl
#!/usr/bin/perl
##########################################################
## Castle Links						##
## Created: 06/17/1999					##
##########################################################
# By: Castellum.net					##
# WebSite: www.castellum.net				##
##########################################################
##########################################################
# (C)Copyright 1999 Castellum.net, All rights reserved	##
##########################################################
# DISCLAIMER:						##
# THIS PROGRAM IS PROVIDED WITHOUT WARRANTIES OF ANY    ##
# KIND, WHETHER EXPRESSED OR IMPLIED.   THIS PROGRAM IS ##
# PROVIDED WIThOUT WARRANTIES AS TO PERFORMANCE, OR  	##
# MERCHANTABILITY OF THIS PROGRAM.			##
# TERMS OF USE:						##
# THIS SCRIPT MAY BE MODIFIED, BUT NOT REDISTRIBUTED IN	##
# ANY WAY, SHAPE, OR FORM.  IN ANY CASE, COPYRIGHT AND  ##
# SCRIPT INFORMATION MUST BE KEPT IN PLACE		##
##########################################################

require "global.pl";
require "admin_setup.pl";

&InitGlobalVariables;
&LoadSetup;
&GetQueryString;
$at_dir = $setup{'admin_template_directory'};



if ($query{'action'} eq "login"){
&Login;
}elsif($query{'action'} eq ""){
&PrintTemplate("$at_dir/login.htm");
}else{
&VerifyLogin;
}

if ($query{'action'} eq "main"){
&PrintMain;
}elsif ($query{'action'} eq "MnuBackup"){
&PrintTemplate("$at_dir/_admin_backup.htm");
}elsif ($query{'action'} eq "MnuChangeAdminInfo"){
&PrintTemplate("$at_dir/_admin_change_admin_info.htm");
}elsif ($query{'action'} eq "MnuCategoryManagement"){
&MnuCategoryManagement;
}elsif ($query{'action'} eq "MnuLinkManagement"){
&PrintTemplate("$at_dir/_admin_mnulinkmanagement.htm");
}elsif ($query{'action'} eq "MnuSystemSetup"){
&MnuSystemSetup;
}elsif ($query{'action'} eq "MnuScriptSetup"){
&MnuScriptSetup;
}elsif ($query{'action'} eq "MnuEmailOptions"){
&PrintTemplate("$at_dir/_admin_mnuemail_options.htm");
}elsif ($query{'action'} eq "DoChangeAdminInfo"){
&DoChangeAdminInfo;
}elsif($query{'action'} eq "DoPerformBackup"){
&DoPerformBackup;
}elsif($query{'action'} eq "DoRestoreBackup"){
&DoRestoreBackup;
}elsif($query{'action'} eq "DoDeleteBackup"){
&DoDeleteBackup;
}elsif($query{'action'} eq "DoDisplayAllLinks"){
&DoDisplayLinks("all","_admin_display_links.htm");
}elsif($query{'action'} eq "DoDisplaySearchLinks"){
&DoDisplayLinks("search","_admin_display_links.htm");
}elsif($query{'action'} eq "DoDisplayCategoryLinks"){
&DoDisplayLinks("category","_admin_display_links.htm");
}elsif($query{'action'} eq "DoLinkMoveOrDelete"){
&DoLinkMoveOrDelete;
}elsif($query{'action'} eq "ViewAddLink"){
&PrintTemplate("$at_dir/_admin_add_link.htm");
}elsif($query{'action'} eq "DoAddLink"){
&DoAddLink;
}elsif($query{'action'} eq "ViewEditLink"){
&ViewEditLink;
}elsif($query{'action'} eq "DoEditLink"){
&DoEditLink;
}elsif($query{'action'} eq "DoAddCategory"){
&DoAddCategory;
}elsif($query{'action'} eq "ViewEditCategory"){
&ViewEditCategory;
}elsif($query{'action'} eq "ViewDeleteCategory"){
&ViewDeleteCategory;
}elsif($query{'action'} eq "DoEditCategory"){
&DoEditCategory;
}elsif($query{'action'} eq "DoDeleteCategory"){
&DoDeleteCategory;
}elsif($query{'action'} eq "PrintSizeWarning"){
&PrintSizeWarning;
}elsif($query{'action'} eq "DoCleanup"){
&DoCleanUp;
}elsif($query{'action'} eq "MnuMaintenance"){
&PrintTemplate("$at_dir/_admin_maintenance.htm");
}elsif($query{'action'} eq "DoReCount"){
&DoReCount;
}elsif($query{'action'} eq "DoSystemSettings"){
&DoSystemSettings;
}elsif($query{'action'} eq "DoScriptSettings"){
&DoScriptSettings;
}elsif($query{'action'} eq "PrintEditAdditionEmail"){
&PrintEditAdditionEmail;
}elsif($query{'action'} eq "DoEditAdditionEmail"){
&DoEditAdditionEmail;
}elsif($query{'action'} eq "DoDisplayAllAddresses"){
&DoDisplayLinks("all","_admin_display_addresses.htm");
}elsif($query{'action'} eq "DoDisplaySearchAddresses"){
&DoDisplayLinks("search","_admin_display_addresses.htm");
}elsif($query{'action'} eq "DoDisplayCategoryAddresses"){
&DoDisplayLinks("category","_admin_display_addresses.htm");
}elsif($query{'action'} eq "DoEmailToSelected"){
&DoEmailToSelected;
}elsif($query{'action'} eq "DoEmailAll"){
&DoEmailAll;
}elsif($query{'action'} eq "DoSendEmail"){
&DoSendEmail;
}else{&Error("Invalid Command");}
# After all that, you would think this thing would be usefull :)


sub PrintMain {
my $warning = "";
my $max_k = 75;
my $all_html = &LoadAdminTemplate("$at_dir/_admin_main.htm");
my @stats = stat("$links_file");
my $size = $stats[6];
$size = $size / 1000;
if ($size > $max_k){
$warning = "Warning: Possible file size problem, click <a href=\"admin.cgi?action=PrintSizeWarning\">here</A> for more information.<BR>";
}
$all_html =~ s/\$warning/$warning/gi;
&PrintStandardHeader;
print $all_html;
exit;
}


sub DoReCount {
&LoadCategories;
&LoadLinks;

foreach $category (@categories){
$counts{"$category"} = "0";
}

foreach $link (@links){
my($ltitle,$ldescription,$lid,$lcat,$ldate,$lurl,$lemail) = split(/\|\|/, $link);

my @category = split(/\//,$lcat);
shift(@category);
while (@category[0] ne ""){
$catup = join("/",@category);
my $temp_num = $counts{"/$catup"};
$counts{"/$catup"} = $temp_num +1;
my $last = pop(@category);
}
}
&WriteCategories;
&Complete("Recount","The category link counts have been updated with accurate numbers.");
}

sub DoSendEmail {
%input = &GetFormInput;
my $from_name = $input{'fromname'};
my $from_email = $input{'fromemail'};
my $subject = $input{'subject'};
my $message = $input{'message'};
my @to = split(/(\r\n|\n)/,$input{'to'});
my %to = ();
foreach $to (@to){
my ($key,$value) = split(/\|/,$to);
$to{"$value"} .= "1";
}
&LoadLinks;
foreach $link (@links){
chomp $link;
my($ltitle,$ldescription,$lid,$lcat,$ldate,$lurl,$lemail) = split(/\|\|/, $link);

if ($to{"$lid"} == 1){
unless ($lemail eq ""){
my $sub = $message;
my $sub2 = $subject;
$sub2 =~ s/\$lid/$lid/gi;
$sub2 =~ s/\$link_name/$ltitle/gi;
$sub2 =~ s/\$link_url/$lurl/gi;
$sub2 =~ s/\$link_description/$ldescription/gi;
$sub2 =~ s/\$link_email/$lemail/gi;
$sub2 =~ s/\$link_category/$lcat/gi;
$sub2 =~ s/\$link_title/$ltitle/gi;

$sub =~ s/\$lid/$lid/gi;
$sub =~ s/\$link_name/$ltitle/gi;
$sub =~ s/\$link_title/$ltitle/gi;
$sub =~ s/\$link_url/$lurl/gi;
$sub =~ s/\$link_description/$ldescription/gi;
$sub =~ s/\$link_email/$lemail/gi;
$sub =~ s/\$link_category/$lcat/gi;
$sub =~ s/\$version/$version/gi;

open(MAIL,"|$setup{'sendmail'} -t");
print MAIL "To: $lemail\n";
print MAIL "From: $from_name <$from_email>\n";
print MAIL "Subject: $sub2\n\n";
print MAIL "$sub\n\n";
close(MAIL);
}
}

}
&Complete("Email Sent", "The email has been sent");
exit;
}

sub DoEditAdditionEmail {
%input = &GetFormInput;
open(EMAIL, ">$setup{'addition_email'}")||&Error("Couldn't open $setup{'addition_email'}: $!");
print EMAIL $input{'name'};
print EMAIL "\n";
print EMAIL $input{'email'};
print EMAIL "\n";
print EMAIL$input{'subject'};
print EMAIL "\n$input{'message'}";
close(EMAIL);
&Complete("Email Updated","The link addition email has been updated to reflect the changes you made");
exit;
}

sub PrintEditAdditionEmail {
my $all_html = &LoadAdminTemplate("$at_dir/_admin_editadd_email.htm");
open(EMAIL, "$setup{'addition_email'}")||&Error("Couldn't open $setup{'addition_email'}: $!");
my $from_name = <EMAIL>;
my $from_email = <EMAIL>;
my $subject = <EMAIL>;
my @lines = <EMAIL>;
close(EMAIL);
$all_html =~ s/\$from_name/$from_name/gi;
$all_html =~ s/\$from_email/$from_email/gi;
$all_html =~ s/\$message/@lines/gi;
$all_html =~ s/\$subject/$subject/gi;
&PrintStandardHeader;
print $all_html;
exit;
}

sub DoEmailAll {
&LoadLinks;
my $email_to = "";

foreach $link (@links){
chomp $link;
my($ltitle,$ldescription,$lid,$lcat,$ldate,$lurl,$lemail) = split(/\|\|/, $link);
if ($lemail ne ""){
$email_to .= "$lemail|$lid\n";
}
}

open(EMAIL, "$setup{'addition_email'}")||&Error("Couldn't open $setup{'addition_email'}: $!");
my $from_name = <EMAIL>;
my $from_email = <EMAIL>;
my @lines = <EMAIL>;
close(EMAIL);

my $all_html = &LoadAdminTemplate("$at_dir/_admin_send_email.htm");
$all_html =~ s/\$from_name/$from_name/gi;
$all_html =~ s/\$from_address/$from_email/gi;
$all_html =~ s/\$email_to/$email_to/gi;
&PrintStandardHeader;
print $all_html;
exit;
}


sub DoEmailToSelected {
%input = &GetFormInput;
&LoadLinks;
my $email_to = "";

foreach $link (@links){
chomp $link;
my($ltitle,$ldescription,$lid,$lcat,$ldate,$lurl,$lemail) = split(/\|\|/, $link);
if ($input{"Perform$lid"} == 1){
if ($lemail ne ""){
$email_to .= "$lemail|$lid\n";
}
}
}

open(EMAIL, "$setup{'addition_email'}")||&Error("Couldn't open $setup{'addition_email'}: $!");
my $from_name = <EMAIL>;
my $from_email = <EMAIL>;
my @lines = <EMAIL>;
close(EMAIL);

my $all_html = &LoadAdminTemplate("$at_dir/_admin_send_email.htm");
$all_html =~ s/\$from_name/$from_name/gi;
$all_html =~ s/\$from_email/$from_email/gi;
$all_html =~ s/\$from_address/$from_email/gi;
$all_html =~ s/\$email_to/$email_to/gi;
&PrintStandardHeader;
print $all_html;
exit;
}


sub DoScriptSettings {
%input = &GetFormInput;

$setup{'link_order'} = $input{'order'};
$setup{'perpage'} = $input{'linksperpage'};

if ($input{'requiredescription'} == 1){$setup{'require_description'} = "1";
}else{$setup{'require_description'} = "0";}
if ($input{'requireunique'} == 1){$setup{'require_unique'} = "1";
}else{$setup{'require_unique'} = "0";}
if ($input{'banhtml'} == 1){$setup{'ban_html'} = "1";
}else{$setup{'ban_html'} = "0";}
if ($input{'requireemail'} == 1){$setup{'require_email'} = "1";
}else{$setup{'require_email'} = "0";}
if ($input{'sendthankyou'} == 1){$setup{'send_thankyou'} = "1";
}else{$setup{'send_thankyou'} = "0";}
if ($input{'sendnotice'} == 1){$setup{'send_notice'} = "1";
}else{$setup{'send_notice'} = "0";}



$setup{'max_title'} = $input{'maxtitle'};
$setup{'max_description'} = $input{'maxdescription'};
$input{'bannedwords'} =~ s/(\r\n|\n)/,/g;
$input{'bannedurls'} =~ s/(\r\n|\n)/\[\]/g;
$setup{'banned_words'} = $input{'bannedwords'};
$setup{'banned_urls'} = $input{'bannedurls'};
$input{'errorcategory'} =~ s/(\r\n|\n)/  /g;
$setup{'error_category'} = $input{'errorcategory'};
$input{'errordescription'} =~ s/(\r\n|\n)/  /g;
$setup{'error_description'} = $input{'errordescription'};
$input{'errortitle'} =~ s/(\r\n|\n)/  /g;
$setup{'error_title'} = $input{'errortitle'};
$input{'errorurl'} =~ s/(\r\n|\n)/  /g;
$setup{'error_url'} = $input{'errorurl'};
$input{'erroremail'} =~ s/(\r\n|\n)/  /g;
$setup{'error_email'} = $input{'erroremail'};
$input{'errorlongtitle'} =~ s/(\r\n|\n)/  /g;
$setup{'error_longtitle'} = $input{'errorlongtitle'};
$input{'errorlongdescription'} =~ s/(\r\n|\n)/  /g;
$setup{'error_longdescription'} = $input{'errorlongdescription'};
$input{'errorbannedurl'} =~ s/(\r\n|\n)/  /g;
$setup{'error_bannedurl'} = $input{'errorbannedurl'};
$input{'errorbannedword'} =~ s/(\r\n|\n)/  /g;
$setup{'error_bannedword'} = $input{'errorbannedword'};
$input{'errorduplicate'} =~ s/(\r\n|\n)/  /g;
$setup{'error_duplicate'} = $input{'errorduplicate'};
$input{'errorinvalidsearch'} =~ s/(\r\n|\n)/  /g;
$setup{'error_invalid_search'} = $input{'errorinvalidsearch'};
$input{'errornoresults'} =~ s/(\r\n|\n)/  /g;
$setup{'error_no_results'} = $input{'errornoresults'};
$input{'errorcategory'} =~ s/(\r\n|\n)/  /g;
$setup{'error_category'} = $input{'errorcategory'};
$input{'errornomorelinks'} =~ s/(\r\n|\n)/  /g;
$setup{'error_nomorelinks'} = $input{'errornomorelinks'};
$input{'errornolinks'} =~ s/(\r\n|\n)/  /g;
$setup{'error_nolinks'} = $input{'errornolinks'};

&WriteSetup;
&Complete("Script Setup","The script settings have been updated");
exit;
}

sub MnuScriptSetup {
my $all_html = &LoadAdminTemplate("$at_dir/_admin_script_setup.htm");
my $banned_words = $setup{'banned_words'};
my $banned_urls = $setup{'banned_urls'};
my $req_description_checked = "";
my $req_unique_checked = "";
my $req_email_checked = "";
my $ban_html_checked = "";
my $send_thankyou_checked = "";
my $send_notice_checked = "";

$banned_words =~ s/,/\n/g;
$banned_urls =~ s/\[\]/\n/g;
my $up_selected = " ";
my $down_selected = " ";
my $alpha_selected = " ";

if ($setup{'link_order'} eq "down"){
$down_selected = "CHECKED";
}elsif ($setup{'link_order'} eq "alpha"){
$alpha_selected = "CHECKED";
}else{
$up_selected = "CHECKED";
}
if ($setup{'require_description'} == 1){$req_description_checked = "CHECKED";}
if ($setup{'require_unique'} == 1){$req_unique_checked = "CHECKED";}
if ($setup{'require_email'} == 1){$req_email_checked = "CHECKED";}
if ($setup{'ban_html'} == 1){$ban_html_checked = "CHECKED";}
if ($setup{'send_thankyou'} == 1){$send_thankyou_checked = "CHECKED";}
if ($setup{'send_notice'} == 1){$send_notice_checked = "CHECKED";}

$all_html =~ s/\$down_selected/$down_selected/gi;
$all_html =~ s/\$up_selected/$up_selected/gi; 
$all_html =~ s/\$alpha_selected/$alpha_selected/gi;
$all_html =~ s/\$links_per_page/$setup{'perpage'}/gi;
$all_html =~ s/\$req_description_checked/$req_description_checked/gi;
$all_html =~ s/\$req_unique_checked/$req_unique_checked/gi;
$all_html =~ s/\$req_email_checked/$req_email_checked/gi;
$all_html =~ s/\$ban_html_checked/$ban_html_checked/gi;
$all_html =~ s/\$send_thankyou_checked/$send_thankyou_checked/gi;
$all_html =~ s/\$send_notice_checked/$send_notice_checked/gi;
$all_html =~ s/\$max_description/$setup{'max_description'}/gi;
$all_html =~ s/\$max_title/$setup{'max_title'}/gi;
$all_html =~ s/\$banned_words/$banned_words/gi;

$all_html =~ s/\$banned_urls/$banned_urls/gi;
$all_html =~ s/\$error_category/$setup{'error_category'}/gi;
$all_html =~ s/\$error_description/$setup{'error_description'}/gi;
$all_html =~ s/\$error_title/$setup{'error_title'}/gi;
$all_html =~ s/\$error_url/$setup{'error_url'}/gi;
$all_html =~ s/\$error_email/$setup{'error_email'}/gi;
$all_html =~ s/\$error_long_title/$setup{'error_longtitle'}/gi;
$all_html =~ s/\$error_long_description/$setup{'error_longdescription'}/gi;
$all_html =~ s/\$error_banned_url/$setup{'error_bannedurl'}/gi;
$all_html =~ s/\$error_banned_word/$setup{'error_bannedword'}/gi;
$all_html =~ s/\$error_duplicate/$setup{'error_duplicate'}/gi;
$all_html =~ s/\$error_invalid_search/$setup{'error_invalid_search'}/gi;
$all_html =~ s/\$error_no_results/$setup{'error_no_results'}/gi;
$all_html =~ s/\$error_no_more_links/$setup{'error_nomorelinks'}/gi;
$all_html =~ s/\$error_no_links/$setup{'error_nolinks'}/gi;

&PrintStandardHeader;
print $all_html;
exit;
}

sub DoSystemSettings {
%input = &GetFormInput;
$input{'referrers'} =~ s/(\r\n|\n)/,/g;
if ($input{'templatedir'} eq ""){&Error("The template directory must reside somewhere");}
if ($input{'atdir'} eq ""){&Error("The admin template directory must reside somewhere");}
if ($input{'backupdir'} eq ""){&Error("The backup directory must reside somewhere");}
if ($input{'linksfile'} eq ""){&Error("The links file must reside somewhere");}
if ($input{'categoryfile'} eq ""){&Error("The category file must reside somewhere");}
if ($input{'disablecheck'} != 1){$input{'disablecheck'} = "0";}
if ($input{'flock'} != 1){$input{'flock'} = "0";}
$setup{'disable_referrer'} = $input{'disablecheck'};
$setup{'flock'} = $input{'flock'};
$setup{'referers'} = $input{'referrers'};
$setup{'template_dir'} = $input{'templatedir'};
$setup{'admin_template_directory'} = $input{'atdir'};
$setup{'backup_dir'} = $input{'backupdir'};
$setup{'links_file'} = $input{'linksfile'};
$setup{'category_file'} = $input{'categoryfile'};
$setup{'sendmail'} = $input{'sendmail'};
$setup{'admin_email'} = $input{'adminemail'};
&WriteSetup;
&Complete("System Setup","Your system settings have been updated to reflect the changes");
exit;

}

sub MnuSystemSetup {
my $all_html = &LoadAdminTemplate("$at_dir/_admin_system_setup.htm");
my $referrers = $setup{'referers'};
my $disable_check = "";
my $flock = "";
$referrers =~ s/,/\n/g;
if ($setup{'disable_referrer'} == 1){$disable_check = "CHECKED";}
if ($setup{'flock'} == 1){$flock = "CHECKED";}

$all_html =~ s/\$referrers/$referrers/gi;
$all_html =~ s/\$disable_checked/$disable_check/gi;
$all_html =~ s/\$flock_checked/$flock/gi;
$all_html =~ s/\$template_dir/$setup{'template_dir'}/gi;
$all_html =~ s/\$at_dir/$at_dir/gi;
$all_html =~ s/\$backup_dir/$setup{'backup_dir'}/gi;
$all_html =~ s/\$links_file/$setup{'links_file'}/gi;
$all_html =~ s/\$category_file/$setup{'category_file'}/gi;
$all_html =~ s/\$sendmail/$setup{'sendmail'}/gi;
$all_html =~ s/\$admin_email/$setup{'admin_email'}/gi;

&PrintStandardHeader;
print $all_html;
exit;
}

sub DoCleanUp {
%input = &GetFormInput;
my $days = $input{'days'};
my $time = time;
$days = $days * 24 * 60 * 60;
$time = $time - $days;

my @display_links = ();
&LoadLinks;
&LoadCategories;
foreach $links (@links){
my($ltitle,$ldescription,$lid,$lcat,$ldate,$lurl,$lemail) = split(/\|\|/, $links);
if ($ldate < $time){
push(@display_links, "Old||$links");
}elsif ($counts{"$lcat"} eq ""){
push (@display_links, "Bad Category||$links");
}
}

my $all_html = &LoadAdminTemplate("$at_dir/_admin_cleanup.htm");

my ($front,$link1,$middle,$link2,$last) = split(/<!--SPLIT-->/,$all_html);
&PrintStandardHeader;
print $front;
my $i = $start;
foreach $link (@display_links){
if ($i2 == 1){
$sub = "$link1$middle";
$i2 = 2;
}else{
$sub = "$link2";
$i2 = 1;
}

my($reason,$ltitle,$ldescription,$lid,$lcat,$ldate,$lurl,$lemail) = split(/\|\|/, $link);
$sub =~ s/\$reason/$reason/gi;
$sub =~ s/\$lid/$lid/gi;
$sub =~ s/\$link_name/$ltitle/gi;
$sub =~ s/\$link_url/$lurl/gi;
$sub =~ s/\$link_description/$ldescription/gi;
$sub =~ s/\$link_email/$lemail/gi;
print $sub;
}
print $last;
exit;

}

sub PrintSizeWarning {
my $max_k = 75;

my $all_html = &LoadAdminTemplate("$at_dir/_admin_size_limit.htm");
my @stats = stat("$links_file");
my $size = $stats[6];
$size = $size / 1000;
$difference = $size - $max_k;

$all_html =~ s/\$max_k/$max_k/gi;
$all_html =~ s/\$current_k/$size/gi;
$all_html =~ s/\$difference/$difference/gi;

&PrintStandardHeader;
print $all_html;
exit;

}


sub DoDeleteCategory {
%input = &GetFormInput;
my $what = $input{'what'};
my $category = $input{'category'};
my $moveto = $input{'moveto'};

&LoadCategories;


unless ($what eq "ignore"){
&LoadLinks;
open(LINKS, ">$setup{'links_file'}")||&Error("Opening $setup{'links_file'}: $!");
if ($setup{'flock'} == 1){flock(LINKS,2);}
foreach $link (@links){
chomp $link;
my($ltitle,$ldescription,$lid,$lcat,$ldate,$lurl,$lemail) = split(/\|\|/, $link);
if ($lcat eq $category){
if ($what eq "move"){
print LINKS "$ltitle||$ldescription||$lid||$moveto||$ldate||$lurl||$lemail\n";

my @category = split(/\//,$category);
shift(@category);
while (@category[0] ne ""){
$catup = join("/",@category);
my $temp_num = $counts{"/$catup"};
$counts{"/$catup"} = $temp_num - 1;
my $last = pop(@category);
}

my @category = split(/\//,$moveto);
shift(@category);
while (@category[0] ne ""){
$catup = join("/",@category);
my $temp_num = $counts{"/$catup"};
$counts{"/$catup"} = $temp_num +1;
my $last = pop(@category);
}

}
}else{
print LINKS "$link\n";
}
}
if ($setup{'flock'} == 1){flock(LINKS,8);}
close(LINKS);
}

$counts{"$category"} = "";
&WriteCategories;

&Complete("Category Deletion","$category has been deleted.");
exit;
}

sub ViewDeleteCategory {
my $category = $query{'category'};
&LoadCategories;
my $all_html = &LoadAdminTemplate("$at_dir/_admin_delete_category.htm");
$all_html =~ s/\$category/$category/gi;
&PrintStandardHeader;
print $all_html;
exit;
}

sub DoAddLink {
&LoadCategories;
%input = &GetFormInput;
my $title = $input{'title'};
my $url = $input{'url'};
my $description = $input{'description'};
my $category = $input{'category'};
my $email = $input{'email'};

if ($counts{"$category"} !~ /^[0-9]+$/){&Error("$setup{'error_category'}");}

if ($title eq ""){&Error("$setup{'error_title'}");}
if ($url !~ /\w*.(\w\w\w|\w\w)/){&Error("$setup{'error_url'}");}
if ($url !~ /^(http|ftp|telnet|https):\/\//i){
$url = "http://$url";
}
$url =~ s/\|//g;
$title =~ s/\|//g;
$description =~ s/\|//g;
$description =~ s/(\r\n|\n)/  /g;


my $salt1 = substr(rand,2,1);
my $salt2 = substr(rand,2,1);
my $random1 = time;
$random1 = rand($random1);
$random1 = crypt($random1,"$salt1$salt2");
$random1 =~ s/\W//g;

my $date = time;

&LoadLinks;


if ($setup{'link_order'} eq "up"){
open(LINKS, ">>$setup{'links_file'}")||&Error("Opening $setup{'links_file'}: $!");
if ($setup{'flock'} == 1){flock(LINKS,2);}
print LINKS "$title||$description||$random1||$category||$date||$url||$email\n";
if ($setup{'flock'} == 1){flock(LINKS,8);}
close(LINKS);
}elsif ($setup{'link_order'} eq "down"){
unshift(@links, "$title||$description||$random1||$category||$date||$url||$email\n");
open(LINKS, ">$setup{'links_file'}")||&Error("Opening $setup{'links_file'}: $!");
if ($setup{'flock'} == 1){flock(LINKS,2);}
foreach $links (@links){
print LINKS "$links";
}
if ($setup{'flock'} == 1){flock(LINKS,8);}
close(LINKS);
}else{
open(LINKS, ">>$setup{'links_file'}")||&Error("Opening $setup{'links_file'}: $!");
if ($setup{'flock'} == 1){flock(LINKS,2);}
print LINKS "$title||$description||$random1||$category||$date||$url||$email\n";
if ($setup{'flock'} == 1){flock(LINKS,8);}
close(LINKS);
}

my @category = split(/\//,$category);
shift(@category);
while (@category[0] ne ""){
$catup = join("/",@category);
my $temp_num = $counts{"/$catup"};
$counts{"/$catup"} = $temp_num +1;
my $last = pop(@category);
}

&WriteCategories;
&Complete("Link Added","<a href=\"$url\">$title</a> was added to $category");
}


sub PrintAdd {
&LoadCategories;
$all_html = &LoadAdminTemplate("$at_dir/_admin_add_link.htm");
$all_html =~ s/<!--CATEGORY OPTIONS-->/$category_options/gi;

&PrintStandardHeader;
print $all_html;
exit;


}

sub ViewEditCategory {
my $category = $query{'category'};
my $all_html = &LoadAdminTemplate("$at_dir/_admin_edit_category.htm");
&LoadCategories;
$all_html =~ s/\$name/$titles{"$category"}/gi;
$all_html =~ s/\$num/$counts{"$category"}/gi;
$all_html =~ s/\$description/$descriptions{"$category"}/gi;
if ($addto{"$category"} == 1){
$all_html =~ s/\$yes_selected/checked/gi;
$all_html =~ s/\$no_selected//gi;
}else{
$all_html =~ s/\$yes_selected//gi;
$all_html =~ s/\$no_selected/checked/gi;
}
$all_html =~ s/\$base_path/$category/gi;
&PrintStandardHeader;
print $all_html;
exit;
}

sub DoEditCategory {
%input = &GetFormInput;
&LoadCategories;
my $realname = $input{'realname'};
my $name = $input{'name'};
my $description = $input{'description'};
my $num = $input{'num'};
my $addto = $input{'addto'};

$name =~ s/\|\|//g;
$name =~ s/\///gi;
$description =~ s/\|\|//g;
$description =~ s/(\r\n|\n)/  /g;

if ($num !~ /^0-9]*$/){$num = $counts{"$realname"};}
if ($name eq ""){&Error("Please enter a name");}

$titles{"$realname"} = $name;
$counts{"$realname"} = $num;
$descriptions{"$realname"} = $description;
&WriteCategories;

&Complete("Edit Category","The category has been updated to reflect your changes.");
exit;
}

sub DoAddCategory {
%input = &GetFormInput;
my $category = $input{'category'};
my $description = $input{'description'};
my $base = $input{'base'};
my $addto = $input{'addto'};

&LoadCategories;
$category =~ s/\|\|//g;
$category =~ s/\///g;
my $title = $category;
if ($base !~ /\/$/){
$category = "$base/$category";
}else{
$category = "$base$category";
}
$description =~ s/\|\|//g;
$description =~ s/(\r\n|\n)/  /g;
if ($category eq ""){&Error("Please enter a category name.");}
if ($counts{"$category"} ne ""){&Error("Category already exists.");}

push(@categories,$category);
$counts{"$category"} = "0";
$titles{"$category"} = "$title";
$addto{"$category"} = "$addto";
$descriptions{"$category"} = "$description";

&WriteCategories;
&Complete("Add Category","The category '$category' has been added.");
exit;
}

sub MnuCategoryManagement{
&LoadCategories;
my $all_html = &LoadAdminTemplate("$at_dir/_admin_mnucategory_management.htm");

#$all_html =~ s/<!--CATEGORY OPTIONS-->/$category_options/gi;
my ($front,$category1,$middle,$category2,$end) = split(/<!--SPLIT-->/,$all_html);
&PrintStandardHeader;
print $front;
my $i = 1;
my $sub = "";
foreach $categories (@categories){
if ($i == 1){
$sub = "$category1$middle";
$i = 2;
}else{
$sub = $category2;
$i = 1;
}
my $encoded_category = &Encode("$categories");
$sub =~ s/\$category_link/$encoded_category/gi;
$sub =~ s/\$category_name/$categories/gi;
$sub =~ s/\$category_description/$descriptions{"$categories"}/gi;
$sub =~ s/\$num/$counts{"$categories"}/gi;
if ($addto{"$categories"} eq "1"){
$sub =~ s/\$addto/YES/gi;
}else{
$sub =~ s/\$addto/NO/gi;
}
print $sub;
}
print $end;

exit;
}

sub DoEditLink {
%input = &GetFormInput;
my $title = $input{'title'};
my $url = $input{'url'};
my $description = $input{'description'};
my $email =$input{'email'};
my $link = $input{'link'};

if ($url !~ /\w*.(\w\w\w|\w\w)/){&Error("$setup{'error_url'}");}
if ($url !~ /^(http|ftp|telnet|https):\/\//i){
$url = "http://$url";
}
$url =~ s/\|//g;
$title =~ s/\|//g;
$email =~ s/\|//g;
$description =~ s/\|//g;
$description =~ s/(\r\n|\n)/  /g;

&LoadLinks;

open(LINKS, ">$setup{'links_file'}")||&Error("Opening $setup{'links_file'}: $!");
if ($setup{'flock'} == 1){flock(LINKS,2);}
foreach $linktmp (@links){
chomp $linktmp;
my($ltitle,$ldescription,$lid,$lcat,$ldate,$lurl,$lemail) = split(/\|\|/, $linktmp);
if ($lid eq $link){
print LINKS "$title||$description||$lid||$lcat||$ldate||$url||$email\n";
}else{
print LINKS "$linktmp\n";
}
}
if ($setup{'flock'} == 1){flock(LINKS,8);}
close(LINKS);

&Complete("Link Update","The link (ID $link) has been updated.");
exit;
}

sub ViewEditLink {
my $link = $query{'link'};
if ($link eq ""){&Error("Invalid Link ID");}
&LoadLinks;
my $title = "";
my $url ="";
my $description ="";
my $email = "";
my $found = 0;
foreach $linktmp (@links){
my($ltitle,$ldescription,$lid,$lcat,$ldate,$lurl,$lemail) = split(/\|\|/, $linktmp);
if ($lid eq $link){
$title = $ltitle;
$url = $lurl;
$description = $ldescription;
$email = $lemail;
$found = 1;
last;
}
}

if ($found != 1){&Error("Invalid Link ID");}
my $all_html = &LoadAdminTemplate("$at_dir/_admin_edit_link.htm");
$all_html =~ s/\$lid/$link/gi;
$all_html =~ s/\$title/$title/gi;
$all_html =~ s/\$url/$url/gi;
$all_html =~ s/\$email/$email/gi;
$all_html =~ s/\$description/$description/gi;
&PrintStandardHeader;
print $all_html;
exit;
}

sub DoLinkMoveOrDelete {
%input = &GetFormInput;
my $link_action = $input{'linkaction'};
&LoadLinks;
&LoadCategories;

if ($link_action eq "move"){
my $new_category = $input{'category'};
open(LINKS, ">$setup{'links_file'}")||&Error("Opening $setup{'links_file'}: $!");
if ($setup{'flock'} == 1){flock(LINKS,2);}
foreach $link (@links){
chomp $link;
my($ltitle,$ldescription,$lid,$lcat,$ldate,$lurl,$lemail) = split(/\|\|/, $link);
if ($input{"Perform$lid"} == 1){

my @category = split(/\//,$lcat);
shift(@category);
while (@category[0] ne ""){
$catup = join("/",@category);
my $temp_num = $counts{"/$catup"};
$counts{"/$catup"} = $temp_num - 1;
my $last = pop(@category);
}

my @category = split(/\//,$new_category);
shift(@category);
while (@category[0] ne ""){
$catup = join("/",@category);
my $temp_num = $counts{"/$catup"};
$counts{"/$catup"} = $temp_num +1;
my $last = pop(@category);
}

print LINKS "$ltitle||$ldescription||$lid||$new_category||$ldate||$lurl||$lemail\n";
}else{
print LINKS "$link\n";
}
}
if ($setup{'flock'} == 1){flock(LINKS,8);}
close(LINKS);
&WriteCategories;
&Complete("Links Moved","The selected links have been moved to the new category.");

}elsif ($link_action eq "delete"){

open(LINKS, ">$setup{'links_file'}")||&Error("Opening $setup{'links_file'}: $!");
if ($setup{'flock'} == 1){flock(LINKS,2);}
foreach $link (@links){
chomp $link;
my($ltitle,$ldescription,$lid,$lcat,$ldate,$lurl,$lemail) = split(/\|\|/, $link);
if ($input{"Perform$lid"} == 1){

my @category = split(/\//,$lcat);
shift(@category);
while (@category[0] ne ""){
$catup = join("/",@category);
my $temp_num = $counts{"/$catup"};
$counts{"/$catup"} = $temp_num - 1;
my $last = pop(@category);
}

}else{
print LINKS "$link\n";
}
}
if ($setup{'flock'} == 1){flock(LINKS,8);}
close(LINKS);
&WriteCategories;
&Complete("Links Deleted","The selected links have been deleted.");

}else{
&Error("Invalid Link Action");
}
exit;
}

sub DoDisplayLinks {
my($display_type,$admin_template) = @_;
my @display_links = ();
&LoadLinks;
&LoadCategories;

if ($display_type eq "all"){
@display_links = @links;
}elsif ($display_type eq "search"){
%input = &GetFormInput;
my $search_terms = $input{'search'};
my @search_terms = split(/ /,$search_terms);
foreach $link (@links){
foreach $term (@search_terms){
if ($link =~ /$term/i){push(@display_links,$link);}
}
}
}elsif ($display_type eq "category"){
%input = &GetFormInput;
my $category = $input{'category'};
foreach $links (@links){
my($ltitle,$ldescription,$lid,$lcat,$ldate,$lurl,$lemail) = split(/\|\|/, $links);
if ($lcat eq $category){
push(@display_links,$links);
}
}
}else{&Error("Invalid Display Type");}

@links = ();

my $all_html = &LoadAdminTemplate("$at_dir/$admin_template");
$all_html =~ s/<!--CATEGORY OPTIONS-->/$category_options/gi;

my ($front,$link1,$middle,$link2,$last) = split(/<!--SPLIT-->/,$all_html);
&PrintStandardHeader;
print $front;
my $i = $start;
foreach $link (@display_links){
if ($i2 == 1){
$sub = "$link1$middle";
$i2 = 2;
}else{
$sub = "$link2";
$i2 = 1;
}

my($ltitle,$ldescription,$lid,$lcat,$ldate,$lurl,$lemail) = split(/\|\|/, $link);
$sub =~ s/\$lid/$lid/gi;
$sub =~ s/\$link_name/$ltitle/gi;
$sub =~ s/\$link_url/$lurl/gi;
$sub =~ s/\$link_email/$lemail/gi;
$sub =~ s/\$link_description/$ldescription/gi;
print $sub;
}
print $last;
exit;
}

sub DoDeleteBackup {
unlink("$setup{'backup_dir'}/links.backup");
unlink("$setup{'backup_dir'}/category.backup");
&Complete("Backup Deletion","Your backup files have been deleted");

}

sub DoRestoreBackup {
open(LINKS, "$setup{'backup_dir'}/links.backup")||&Error("Opening Backup: $!");
if ($setup{'flock'} == 1){flock(LINKS,2);}
my @lines = <LINKS>;
if ($setup{'flock'} == 1){flock(LINKS,8);}
close(LINKS);

open(LINKS, ">$setup{'links_file'}")||&Error("Opening $setup{'links_file'}: $!");
if ($setup{'flock'} == 1){flock(LINKS,2);}
foreach $line (@lines){
print LINKS $line;
}
if ($setup{'flock'} == 1){flock(LINKS,8);}
close(LINKS);

open(CATEGORIES, "$setup{'backup_dir'}/category.backup")||&Error("Opening Backup: $!");
if ($setup{'flock'} == 1){flock(CATEGORIES,2);}
@lines = <CATEGORIES>;
if ($setup{'flock'} == 1){flock(CATEGORIES,8);}
close(CATEGORIES);

open(CATEGORIES, ">$setup{'category_file'}")||&Error("Opening $setup{'category_file'}: $!");
if ($setup{'flock'} == 1){flock(CATEGORYBACKUP,2);}
foreach $line (@lines){
print CATEGORIES $line;
}
if ($setup{'flock'} == 1){flock(CATEGORYBACKUP,8);}
close(CATEGORIES);

&Complete("Restoration","Your links have been restored from the backup");
exit;
}

# If your reading this, you have no life :)

sub DoPerformBackup {
open(LINKS, "$setup{'links_file'}")||&Error("Opening $setup{'links_file'}: $!");
if ($setup{'flock'} == 1){flock(LINKS,2);}
my @lines = <LINKS>;
if ($setup{'flock'} == 1){flock(LINKS,8);}
close(LINKS);

open(LINKSBACKUP, ">$setup{'backup_dir'}/links.backup")||&Error("Opening Backup: $!");
if ($setup{'flock'} == 1){flock(LINKSBACKUP,2);}
foreach $line (@lines){
print LINKSBACKUP $line;
}
if ($setup{'flock'} == 1){flock(LINKSBACKUP,8);}
close(LINKSBACKUP);

open(CATEGORIES, "$setup{'category_file'}")||&Error("Opening $setup{'category_file'}: $!");
if ($setup{'flock'} == 1){flock(CATEGORIES,2);}
@lines = <CATEGORIES>;
if ($setup{'flock'} == 1){flock(CATEGORIES,8);}
close(CATEGORIES);

open(CATEGORYBACKUP, ">$setup{'backup_dir'}/category.backup")||&Error("Opening Backup: $!");
if ($setup{'flock'} == 1){flock(CATEGORYBACKUP,2);}
foreach $line (@lines){
print CATEGORYBACKUP $line;
}
if ($setup{'flock'} == 1){flock(CATEGORYBACKUP,8);}
close(CATEGORYBACKUP);

&Complete("Backup","The backup is complete, both the links & categories have been backed up.");
exit;
}

sub DoChangeAdminInfo {
%input = &GetFormInput;
my $new_username = $input{'newusername'};
my $new_password = $input{'newpassword'};
my $confirm = $input{'confirmpassword'};
if ($new_password ne $confirm){&Error("Passwords don't match");}
my $password = crypt($new_password, substr($new_username,0,2));

open(ADMIN, ">admin_setup.pl")||&Error("Couldn't open admin_setup.pl: $!");
if ($setup{'flock'} == 1){flock(ADMIN,2);}
print ADMIN "\$admin_username = '$new_username';\n";
print ADMIN "\$admin_password = '$password';\n";
print ADMIN "1;\n";
if ($setup{'flock'} == 1){flock(ADMIN,8);}
close(ADMIN);

print "Set-Cookie: info=$new_username\@\@$new_password; EXPIRES=\n";
&Complete("Password Change","Your username and password have been updated to reflect the changes you have made");
exit;
}

sub PrintTemplate {
my($template) = @_;
&LoadCategories;
my $all_html = &LoadAdminTemplate($template);
$all_html =~ s/<!--CATEGORY OPTIONS-->/$category_options/gi;
&PrintStandardHeader;
print $all_html;
exit;
}

sub Complete {
my($what,$message) = @_;
my $all_html = &LoadAdminTemplate("$at_dir/_admin_complete.htm");
$all_html =~ s/\$what/$what/gi;
$all_html =~ s/\$message/$message/gi;
&PrintStandardHeader;
print $all_html;
exit;
}

sub VerifyLogin {
%cookies = ();
my @pairs=split(/; /, $ENV{'HTTP_COOKIE'});
foreach $pair (@pairs) {
my ($name,$value) = split(/=/, $pair);
$cookies{$name} .= $value;
}
($username,$password) = split(/@@/,$cookies{'info'});
if ($username ne $admin_username){&Error("Invalid username/password combo");}
if ($admin_password ne crypt($password, substr($username,0,2))){
&Error("Invalid username/password combo2");
}
return 1;
}


sub Login {
%input = &GetFormInput;
$username = $input{'username'};
$password = $input{'password'};
if ($username ne $admin_username){&Error("Invalid username/password combo");}
if ($admin_password ne crypt($password, substr($username,0,2))){
&Error("Invalid username/password combo");
}
print "Set-Cookie: info=$username\@\@$password; EXPIRES=\n";
&PrintMain;
return 1;
}


sub Error {
my($error) = @_;
open(ERROR, "$at_dir/_admin_error.htm")||&TrueDie("Opening Error Template: $!");
my @template_error = <ERROR>;
close(ERROR);
# Load all of the html into one variable
my $all_html = join("",@template_error);
@template_error = ();
#Substitue the various variables in the html
$all_html =~ s/\$error/$error/gi;
$all_html =~ s/\$version/$version/gi;
&PrintStandardHeader;
print $all_html;
exit;
}


1;