# FILE: src-board-subs-106
#-------------------------------------------------------------------------------
# DISCUS VERSION 3.10 COPYRIGHT NOTICE
#
# Discus 3.10 is copyright (c) 2000 by DiscusWare, LLC, all rights reserved.
# The use of Discus is governed by the Discus License Agreement which is
# available from the Discus WWW site at:
#    http://www.discusware.com/discus/license
#
# Pursuant to the Discus License Agreement, this copyright notice may not be
# removed or altered in any way.
#-------------------------------------------------------------------------------
#
# --------------------------------------------------------------------------------
# ATTENTION!  THIS FILE IS PART OF THE DISCUS PRO DISTRIBUTION AND IS COMMERCIAL
# SOFTWARE.  REDISTRIBUTION OF THIS FILE IS STRICTLY PROHIBITED AND WILL RESULT IN
# PROSECUTION TO THE MAXIMUM EXTENT OF THE LAW.  YOU ARE NOT PERMITTED TO REMOVE
# THIS NOTICE UNDER ANY CIRCUMSTANCES.
# --------------------------------------------------------------------------------

#---SEPARATOR---#
#REQ:check_queue

sub queue_mgr_1 {
	my ($username_in, $param) = @_;
	&header;
	print "<HTML><HEAD><TITLE>Queue Manager</TITLE>\n";
	print "<SCRIPT LANGUAGE=\"JavaScript\"> <!-- Hide\n";
	print "function subact(action, number, name1) {\n";
	print "  document.sf.SELECTION.value = action + number;\n";
	print "  if (action == 'refuse') {\n";
	print "    var m = confirm(\"Are you sure you want to refuse \" + name1 + \"?\");\n";
	print "    if (m == true) {\n";
	print "      document.sf.submit();\n";
	print "    }\n";
	print "  } else {\n";
	print "    document.sf.submit()\n";
	print "  }\n";
	print "}\n";
	print "function setStatus(msg) {\n";
	print "  window.status=msg\n";
	print "  return true\n";
	print "}\n";
	print "function markto(num,count,dir) {\n";
	print "  if (count == 1) {\n";
	print "    var c = document.sf.MARK.checked;\n";
	print "    document.sf.MARK.checked = 1-c;\n";
	print "  } else {\n";
	print "    var c = document.sf.MARK[num].checked;\n";
	print "    if (dir==1) {\n";
	print "      for (var i=0; i<=num; i++) {\n";
	print "        document.sf.MARK[i].checked = 1-c;\n";
	print "      }\n";
	print "    }\n";
	print "    if (dir==0) {\n";
	print "      for (var i=num; i<count; i++) {\n";
	print "        document.sf.MARK[i].checked = 1-c;\n";
	print "      }\n";
	print "    }\n";
	print "  }\n";
	print "}\n";
	print "//-->\n";
	print "</SCRIPT></HEAD>\n";
	print '<BODY BGCOLOR="ffffff" TEXT="000000" LINK="0000FF" VLINK="0000FF" ';
	print "onLoad=\"window.defaultStatus = 'Queue Manager'";
	print "; parent.frames[1].location = '$cgiurlm?action=queue_mgr_disp&username=$username_in&number=0'" if $param == 1;
	print "\">$fs\n";
	print "<FONT SIZE=3><CENTER><B>Queue Manager</B></CENTER></FONT>\n";
	print "<HR>\n";
	@q = &check_queue($username_in);
	if (scalar(@q) == 0) {
		print "<FONT COLOR=ff0000><B>There are no messages in your queue</B></FONT>\n";
		print "</BODY></HTML>\n";
		exit(0);
	}
	print "<FORM ACTION=$cgiurl METHOD=POST name=sf>\n";
	print "<INPUT TYPE=HIDDEN NAME=SELECTION VALUE=''>\n";
	print "<INPUT TYPE=HIDDEN NAME=username VALUE=$username_in>\n";
	print "<INPUT TYPE=HIDDEN NAME=action VALUE=queue_action>\n";
	print "<INPUT TYPE=HIDDEN NAME=form VALUE=1>\n";
	print "<TABLE CELLSPACING=0 CELLPADDING=2 BORDER=0>\n";
	$c = "ffffcc";
	print "<TR ALIGN=CENTER BGCOLOR=c0c0c0><TD>&nbsp;</TD><TD><FONT FACE=\"Verdana,Arial\" SIZE=1><B>Date/Time</B></FONT></TD><TD>&nbsp;</TD><TD><FONT FACE=\"Verdana,Arial\" SIZE=1><B>Mark</B></FONT></TD><TD><FONT FACE=\"Verdana,Arial\" SIZE=1><B>App</B></FONT></TD><TD><FONT FACE=\"Verdana,Arial\" SIZE=1><B>Ref</B></FONT></TD><TD BGCOLOR=c0c0c0>&nbsp;</TD><TD><FONT FACE=\"Verdana,Arial\" SIZE=1><B>View</B></FONT></TD><TD BGCOLOR=c0c0c0>&nbsp;</TD><TD ALIGN=LEFT><FONT FACE=\"Verdana,Arial\" SIZE=1><B>Message</B></FONT></TD><TD>&nbsp;</TD></TR>\n";
	$counter = 0; $ctr = 0; $ct = scalar(@q);
	foreach $line (@q) {
		$line =~ s/\s//g;
		($index, $topic, $page, $username, $group, $time, $owner) = split(/\//, $line);
		print "<TR VALIGN=CENTER ALIGN=CENTER BGCOLOR=#$c><TD BGCOLOR=c0c0c0>&nbsp;</TD>";
		$counter += 1;
		if ($c eq "ffffcc") {
			$c = "ffffff";
		} else {
			$c = "ffffcc";
		}
		print "<TD ALIGN=LEFT>$fs", &get_date_time("realshort", $time), "</FONT></TD>";
		print "<TD BGCOLOR=c0c0c0>&nbsp;</TD>\n";
		print "<TD>";
		print "<A HREF=\"#\" onClick=\"markto($ctr, $ct, 1);return false\" onMouseOver=\"return setStatus('Toggle marks at and above this point')\"><IMG SRC=\"$html_url/icons/mark_up.gif\" HEIGHT=12 WIDTH=12 BORDER=0></A>&nbsp;";
		print "<A HREF=\"#\" onClick=\"markto($ctr, $ct, 0);return false\" onMouseOver=\"return setStatus('Toggle marks at and below this point')\"><IMG SRC=\"$html_url/icons/mark_down.gif\" HEIGHT=12 WIDTH=12 BORDER=0></A>&nbsp;";
		$ctr += 1;
		print "<INPUT TYPE=CHECKBOX NAME=MARK VALUE=$index>&nbsp;&nbsp;</TD>";
		print "<TD><A HREF=\"javascript:subact('approve', '$index', 'the post made on ", &get_date_time("long", $time), "')\" onMouseOver=\"return setStatus('Approve this post')\"><IMG SRC=\"$html_url/icons/approve_icon.gif\" HEIGHT=25 WIDTH=25 BORDER=1></A></TD>";
		print "<TD><A HREF=\"javascript:subact('refuse', '$index', 'the post made on ", &get_date_time("long", $time), "')\" onMouseOver=\"return setStatus('Refuse this post')\"><IMG SRC=\"$html_url/icons/refuse_icon.gif\" HEIGHT=25 WIDTH=25 BORDER=1></A></TD>";
		print "<TD BGCOLOR=c0c0c0>&nbsp;</TD>\n";
		print "<TD><A HREF=\"$cgiurlm?username=$username_in&action=queue_mgr_disp&number=$index\" TARGET=\"bottomqueue\" onMouseOver=\"return setStatus('View and/or edit this post')\"><IMG SRC=\"$html_url/icons/view_icon.gif\" HEIGHT=25 WIDTH=25 BORDER=1></A></TD>";
		print "<TD BGCOLOR=c0c0c0>&nbsp;</TD>\n";
		print "<TD ALIGN=LEFT>$fs<FONT SIZE=1>";
		open (FILE, "$admin_dir/queue/$index.txt"); @file = <FILE>; close (FILE);
		($pb) = grep(/^POSTBY: /, @file); $pb =~ s/^(\w+): (.*)/$2/; $pb = &unescape($pb);
		print &remove_html($pb), "<BR>\n";
		($txt) = grep(/^TEXT: /, @file); $txt =~ s/^(\w+): (.*)/$2/; $txt = &unescape($txt);
		$txt = &remove_html($txt); $txt .= " "; $txt =~ m|^(.{0,35})\s|; $txt = $1;
		print "$txt\n";
		print "</FONT></FONT></TD>\n";
		print "<TD BGCOLOR=c0c0c0>&nbsp;</TD>\n";
		print "</TR>\n";
	}
	if ($counter > 1) {
		print "<TR BGCOLOR=#ccccff ALIGN=CENTER>";
		print "<TD BGCOLOR=c0c0c0>&nbsp;</TD>\n";
		print "<TD>&nbsp;</TD>";
		print "<TD BGCOLOR=c0c0c0>&nbsp;</TD>\n";
		print "<TD ALIGN=LEFT>$fs<B>(Marked)</B></TD>";
		print "<TD><A HREF=\"javascript:subact('approve', 'all', 'all marked messages')\" onMouseOver=\"return setStatus('Approve all marked messages')\"><IMG SRC=\"$html_url/icons/approve_icon.gif\" HEIGHT=25 WIDTH=25 BORDER=1></A></TD>";
		print "<TD><A HREF=\"javascript:subact('refuse', 'all', 'all marked messages')\" onMouseOver=\"return setStatus('Refuse all marked messages')\"><IMG SRC=\"$html_url/icons/refuse_icon.gif\" HEIGHT=25 WIDTH=25 BORDER=1></A></TD>";
		print "<TD BGCOLOR=c0c0c0>&nbsp;</TD>\n";
		print "<TD>&nbsp;</TD>";
		print "<TD BGCOLOR=c0c0c0>&nbsp;</TD>\n";
		print "<TD>&nbsp;</TD>";
		print "<TD BGCOLOR=c0c0c0>&nbsp;</TD>\n";
		print "</TR>\n";
	}
	print "<TR BGCOLOR=c0c0c0><TD COLSPAN=11>&nbsp;</TD></TR></TABLE>\n";
	print "</TABLE>\n";
	print "</FONT></BODY></HTML>\n";
	exit(0);
}

#---SEPARATOR---#

sub queue_frames {
	my ($username) = @_;
	&header;
	print "<HTML><HEAD><TITLE>Queue Framesetter</TITLE></HEAD>\n";
	print "<FRAMESET ROWS=50%,50%>\n";
	print "<FRAME NAME=topqueue SRC=\"$cgiurlm?action=queue_mgr_1&username=$username\">\n";
	print "<FRAME NAME=bottomqueue SRC=\"$cgiurlm?action=queue_mgr_disp&username=$username&number=0\">\n";
	print "</FRAMESET></HTML>\n";
	exit(0);
}

#---SEPARATOR---#
#REQ:printuntil
#REQ:get_navbar

sub queue_mgr_disp {
	my ($username, $number, $text_override, $subject_override, $source_override, $reload_js) = @_;
	if ($number == 0) {
		&header;
		print "<HTML><HEAD><TITLE>Blank</TITLE></HEAD>\n";
		print "<BODY BGCOLOR=#ffffff TEXT=#000000 LINK=#0000ff VLINK=#800080";
		print " onLoad=\"parent.frames[0].location=parent.frames[0].location\"" if $reload_js;
		print ">$fs<BR><BR><BR><CENTER><B>This frame will be used\n";
		print "to display messages<BR>that you choose from the frame above.</B></CENTER>\n";
		print "</BODY></HTML>\n";
		exit(0);
	}
	$number =~ s/\D//g;
	if (!-e "$admin_dir/queue/$number.txt") {
		&error_message("Queue open error", "The message you requested is not in the queue.");
	}
	open (QUEUE, "$admin_dir/queue/$number.txt"); @queue = <QUEUE>; close (QUEUE);
	($page) = grep(/^PAGE: /, @queue);
	$page =~ m|(\d+)/(\d+)|;
	($topic, $page) = ($1, $2);
	if (-e "$secdir/$topic") {
		$filename = "$secdir/$topic/$page.$ext";
	} else {
		$filename = "$message_dir/$topic/$page.$ext";
	}
	if (!-e $filename) {
		&error_message("Queue open error", "The page ($filename) onto which this message was scheduled to be posted no longer exists.");
	}
	open (FILE, "$filename"); @filenew = <FILE>; close (FILE);
	&extract($filename);
	$navstr = "<A HREF=\"$message_url/$board_topics_file\" TARGET=\"Admin_Main\" ";
	$navstr .= "onMouseOver=\"return setStatus('Return to $titlej main page')\">$title</A>: ";
	($pre) = &get_navbar($topic_number, $me_number, "post");
	$pre = "<A HREF=\"$message_url/$board_topics_file\" onMouseOver=\"window.status = '$L{NBRETURN} $L{NBMAINPAGE}'; return true\">$title</A>: $pre";
	$nb = $pre;
	($sb) = grep(/^SUBJECT: /, @queue); $sb =~ s/^(\w+): (.*)/$2/; $sb = &unescape($sb);
	$sb = $subject_override if $subject_override;
	if ($sb ne "") {
		$nb .= "$sb: ";
	}
	&header;
	&printuntil(1, 1, 0, "$me_name");
	if ($reload_js) {
		print "<SCRIPT LANGUAGE=\"JavaScript\">\nparent.frames[0].location='$cgiurlm?action=queue_mgr_1&username=$username';\n</SCRIPT>\n";
	}
	print "<TABLE WIDTH=100%><TR>\n";
	print "<TD WIDTH=30 ALIGN=LEFT VALIGN=CENTER><A HREF=\"$cgiurl?action=queue_action&username=$username&SELECTION=approve$number\" onMouseOver=\"return setStatus('Approve this post')\">";
	print "<IMG SRC=\"$html_url/icons/approve_icon.gif\" HEIGHT=25 WIDTH=25></TD>\n";
	print "<TD>";
	print "<CENTER>$fs<FONT SIZE=4><B>";
	print "*Unsaved* " if $source_override;
	print "Queued Message</B></FONT></CENTER>\n";
	print "</TD>\n";
	print "<TD WIDTH=30 ALIGN=RIGHT VALIGN=CENTER><A HREF=\"$cgiurl?action=queue_action&username=$username&SELECTION=refuse$number\" onMouseOver=\"return setStatus('Refuse this post')\" onClick=\"return confirm('Do you really want to refuse this post?')\">";
	print "<IMG SRC=\"$html_url/icons/refuse_icon.gif\" HEIGHT=25 WIDTH=25></TD>\n";
	print "</TR></TABLE>\n";
	print "<HR>\n";
	&printuntil(3, 3, 0, "$me_name", 0, 1);
	print "<STRONG>$nb Queued Message</STRONG><HR>\n";
	&printuntil(5, 11, 0, "", 0, 1);
	($pb) = grep(/^POSTBY: /, @queue); $pb =~ s/^(\w+): (.*)/$2/; $pb = &unescape($pb); $pb =~ s/\s+$//;
	($em) = grep(/^EMAIL: /, @queue); $em =~ s/^(\w+): (.*)/$2/; $em = &unescape($em); $em =~ s/\s+$//;
	($pr) = grep(/^PROFILE: /, @queue); $pr =~ s/^(\w+): (.*)/$2/; $pr = &unescape($pr); $pr =~ s/\s+$//;
	($time) = grep(/^TIME: /, @queue); $time =~ s/^(\w+): (.*)/$2/;
	$pb2 = $L{POSTBY};
	if ($em =~ /\S/) {
		$pb = "<A HREF=mailto:$em>$pb</A>";
	} elsif ($pr =~ /\S/) {
		$pb = "$pr$pb</A>";
	}
	$pb2 =~ s/\%name/$pb/g;
	$datetime = &get_date_time("long", $time);
	$pb2 =~ s/\%date/$datetime/g;
	print $pb2, "<P>\n";
	($text) = grep(/^TEXT: /, @queue); $text =~ s/^(\w+): (.*)/$2/; $text = &unescape($text);
	$text = $text_override if $text_override;
	($src) = grep(/^SOURCE: /, @queue); $src =~ s/^(\w+): (.*)/$2/; $src = &unescape($src);
	$src = $source_override if $source_override;
	$text =~ s|<IMG SRC="$message_url/(\d+)/(\d+)\.(\w+)"|<IMG SRC="$cgiurl\?username=$username&action=show_secure_graphic&HTTP_REFERER=//$topic_number/$me_number.$ext&file=/0/$2.$3"|g;
	while ($text =~ m|<!-Attachment: ([^!]+)-!><CENTER><TABLE BORDER=1><TR><TD><IMG SRC="$html_url/icons/(\w+)_(\w+).gif" ALIGN=LEFT ALT="([^"]+)">(.*)<BR><A HREF="$message_url/(\d+)/[^"]+"><B>([^<]+)</B></A> \(([^>]+)\)</TD></TR></TABLE></CENTER><!-/Attachment-!>|) {
		($file, $icon1, $icon, $type, $descr, $topic, $fakefile, $size) = ($1, $2, $3, $4, $5, $6, $7, $8);
		$text = join("", $`, "<CENTER><TABLE BORDER=1><TR><TD><IMG SRC=\"$html_url/icons/$icon1" . "_$icon.gif\" ALIGN=LEFT>$descr<BR><A HREF=\"$cgiurl?username=$username&action=show_secure_graphic&HTTP_REFERER=//$topic_number/$me_number.$ext&type=$type&file=/0/$file\"><B>$fakefile</B></A> ($size)</TD></TR></TABLE></CENTER>", $');
	}
	print $text;
	&printuntil(13, 13, 0, "", 0, 1);
	print "<FORM ACTION=$cgiurl METHOD=POST>\n";
	print "<INPUT TYPE=HIDDEN NAME=username VALUE=$username>\n";
	print "<INPUT TYPE=HIDDEN NAME=number VALUE=$number>\n";
	print "<INPUT TYPE=HIDDEN NAME=action VALUE=queue_edit>\n";
	print "<HR><H3>Revise ";
	print "Subject and " if $sb;
	print "Message</H3>\n";
	if ($sb) {
		print "<TABLE><TR><TD>$fs", "Subject:</FONT></TD><TD><INPUT TYPE=TEXT NAME=subject SIZE=44 VALUE='";
		print &JavaScript_prepare($sb), "'></TD></TR></TABLE><P>\n";
	}
	print "<TABLE>\n";
	if ($source_override) {
		print "<TR BGCOLOR=#ffcccc><TD><CENTER><B>$fs", "Your changes have not been saved</B></CENTER></TD></TR>\n";
	}
	print "<TR><TD><TEXTAREA NAME=message ROWS=7 COLS=50 WRAP=VIRTUAL>";
	print $src;
	print "</TEXTAREA></TD></TR></TABLE>\n";
	print "<P><INPUT TYPE=SUBMIT NAME=submit VALUE='Preview Changes'>\n";
	print "<INPUT TYPE=SUBMIT NAME=submit VALUE='Save Changes'>\n";
	print "</FORM>\n";
	&printuntil(15, 17, 0, "", 0, 1);
	exit(0);
}

#---SEPARATOR---#
#REQ:webtags
#REQ:compare_source
#REQ:queue_mgr_disp

sub queue_edit {
	my ($username, $number, $submit, $subject, $message, $topic_number) = @_;
	$error = 0;
	($lint, $newsubject) = &webtags($subject, 3, 1);
	$error = 1 if $lint eq "!Error";
	($lint, $newmessage) = &webtags($message, 1, 1);
	$error = 1 if $lint eq "!Error";
	&lock("queue_edit", "$admin_dir/queue/$number.txt");
	open (Q, "$admin_dir/queue/$number.txt"); @q = <Q>; close (Q);
	($src) = grep(/^SOURCE: /, @q); $src =~ s/^(\w+): (.*)/$2/g; $src = &unescape($src); $src =~ s/\s+$//;
	($removed, $added) = &compare_source($src, "", "", "", $message);
	if ($added) {
		$newmessage = "<H3>Editing Error</H3>The following references to images or attachments have been modified:<P><UL>";
		@added = split(/\n/, $added);
		foreach $line (@added) {
			$newmessage .= "<LI>$line\n";
		}
		$newmessage .= "</UL><P>Repair or remove these references, or cancel your editing.";
		$error = 1;
	}
	if ($error == 1 || $submit =~ m|Preview|) {
		&unlock("queue_edit", "$admin_dir/queue/$number.txt");
		&queue_mgr_disp($username, $number, $newmessage, $newsubject, $message, 0);
	}
	@q = grep(!/^SOURCE: /, @q);
	@q = grep(!/^TEXT: /, @q);
	@q = grep(!/^SUBJECT: /, @q);
	push (@q, "TEXT: " . &escape($newmessage) . "\n");
	push (@q, "SOURCE: " . &escape($message) . "\n");
	push (@q, "SUBJECT: " . &escape($newsubject) . "\n") if $newsubject;
	open (Q, ">$admin_dir/queue/$number.txt"); print Q @q; close (Q);
	&unlock("queue_edit", "$admin_dir/queue/$number.txt");
	&queue_mgr_disp($username, $number);
}

#---SEPARATOR---#
#REQ:compare_source
#REQ:webtags
#REQ:email_notification_pro
#REQ:post_message
#REQ:check_queue
#REQ:queue_mgr_disp
#REQ:queue_mgr_1
#REQ:add_page

sub queue_action {
	my ($username, $number, $action, $form, $returnit, $flagged) = @_;
	@q = &check_queue($username);
	if (!grep(/^$number\//, @q)) {
		&error_message("Queue action error", "The message you selected is no longer in your queue.") if !$flagged;
		return -1 if $flagged;
	}
	if ($action eq "refuse" || $action eq "4") {
		open (MESSAGE, "$admin_dir/queue/$number.txt"); @m = <MESSAGE>; close (MESSAGE);
		($src) = grep(/^SOURCE: /, @m); $src =~ s/^(\w+): (.*)/$2/g; $src = &unescape($src);
		($added) = &compare_source("", "", "", "", $src);
		@added = split(/\n/, $added);
		foreach $file (@added) {
			unlink("$admin_dir/queue/$file");
		}
	} else {
		my (@m, $text, $src, $postby, $em, $pr, $un, $gr, $rh, $ra, $sb, $tm, $pg, $topic_number, $me_number);
		open (MESSAGE, "$admin_dir/queue/$number.txt"); @m = <MESSAGE>; close (MESSAGE);
		($text) = grep(/^TEXT: /, @m); $text =~ s/^(\w+): (.*)/$2/g; $text = &unescape($text); $text =~ s/\s+$//;
		($src) = grep(/^SOURCE: /, @m); $src =~ s/^(\w+): (.*)/$2/g; $src = &unescape($src); $src =~ s/\s+$//;
		($postby) = grep(/^POSTBY: /, @m); $postby =~ s/^(\w+): (.*)/$2/g; $postby = &unescape($postby); $postby =~ s/\s+$//;
		($em) = grep(/^EMAIL: /, @m); $em =~ s/^(\w+): (.*)/$2/g; $em = &unescape($em); $em =~ s/\s+$//;
		($pr) = grep(/^PROFILE: /, @m); $pr =~ s/^(\w+): (.*)/$2/g; $pr = &unescape($pr); $pr =~ s/\s+$//;
		($un) = grep(/^USERNAME: /, @m); $un =~ s/^(\w+): (.*)/$2/g; $un = &unescape($un); $un =~ s/\s+$//;
		($gr) = grep(/^GROUP: /, @m); $gr =~ s/^(\w+): (.*)/$2/g; $gr = &unescape($gr); $gr =~ s/\s+$//;
		($rh) = grep(/^RH: /, @m); $rh =~ s/^(\w+): (.*)/$2/g; $rh = &unescape($rh); $rh =~ s/\s+$//;
		($ra) = grep(/^RA: /, @m); $ra =~ s/^(\w+): (.*)/$2/g; $ra = &unescape($ra); $ra =~ s/\s+$//;
		($sb) = grep(/^SUBJECT: /, @m); $sb =~ s/^(\w+): (.*)/$2/g; $sb = &unescape($sb); $sb =~ s/\s+$//;
		($tm) = grep(/^TIME: /, @m); $tm =~ s/^(\w+): (.*)/$2/g; $tm =~ s/\s+$//;
		($pg) = grep(/^PAGE: /, @m); $pg =~ s/^(\w+): (.*)/$2/g; $pg =~ s/\s+$//;
		if ($pg =~ m|(\d+)/(\d+)|) {
			$topic_number = $1; $me_number = $2;
			$dir = "$message_dir/$topic_number" if -e "$message_dir/$topic_number";
			$dir = "$secdir/$topic_number" if -e "$secdir/$topic_number";
			&error_message("Queue approve error", "The requested destination page no longer exists; this message cannot be approved.") if !-e "$dir/$me_number.$ext";
		} else {
			&error_message("Queue approve error", "Queued message does not have valid topic/page info");
		}
		my ($added, @added, $filename, $num, $flag);
		($added) = &compare_source("", "", "", "", $src);
		@added = split(/\n/, $added); $flag = 0;
		foreach $file (@added) {
			$filename = "$message_dir/$topic_number/$file" if -e "$message_dir/$topic_number";
			$filename = "$secdir/$topic_number/$file" if !-e "$message_dir/$topic_number";
			if (-e $filename) {
				($num) = &get_number;
				$file_new = "$num" . "_$file";
				$filename = "$dir/$file_new";
				while ($src =~ m|\\attachment_alreadyuploaded\{$file,|) {
					$src = join("", $`, $file_new, $');
				}
				while ($src =~ m|\\image_alreadyuploaded\{$file,|) {
					$src = join("", $`, $file_new, $');
				}
				while ($src =~ m|\\jpeg_alreadyuploaded\{$file,|) {
					$src = join("", $`, $file_new, $');
				}
				($lint, $text) = &webtags($src, 0, 1);
			}
			open (SRC, "$admin_dir/queue/$file");
			binmode(SRC);
			open (DEST, ">$filename");
			binmode(DEST);
			while (<SRC>) {
				print DEST;
			}
			close (SRC);
			close (DEST);
			chmod (oct($perms0644), "$filename");
			unlink("$admin_dir/queue/$file");
		}
		my ($postindex);
		delete $TPC_TREE{$topic_number};
		($postindex, $text, $me_number) = &post_message($topic_number,$me_number,$src,$text,$postby,$em,$pr,$un,$gr,$tm,$ra,$rh,$sb);
		if (scalar(@added)) {
			&lock("queue_action", "$admin_dir/msg_index/attach-mgr.txt");
			open (ATTACH, ">>$admin_dir/msg_index/attach-mgr.txt");
			foreach $file (@added) {
				print ATTACH "$postindex $file\n";
			}
			close (ATTACH);
			&unlock("queue_action", "$admin_dir/msg_index/attach-mgr.txt");
		}
		&email_notification_pro($topic_number, $me_number, $postby, $text, $un, $gr, 0, $postindex) if $GLOBAL_OPTIONS{'email'};
		delete $TPC_TREE{$topic_number};
	}
	unlink("$admin_dir/queue/$number.txt");
	@q = &check_queue($username);
	&lock("queue_action", "$admin_dir/queue/index.txt");
	open (INDEX, "$admin_dir/queue/index.txt"); @i = <INDEX>; close (INDEX);
	@i = grep(!/^$number\//, @i);
	open (INDEX, ">$admin_dir/queue/index.txt"); print INDEX @i; close (INDEX);
	&unlock("queue_action", "$admin_dir/queue/index.txt");
	$flag = 0;
	return 1 if $returnit;
	foreach $line (@q) {
		if ($line =~ m|^$number/|) {
			$flag = 1;
		} elsif ($flag == 1) {
			$line =~ m|^(\d+)/|;
			&queue_mgr_disp($username, $1, "", "", "", 1) if !$form;
		}
	}
	&queue_mgr_disp($username, 0, "", "", "", 1) if !$form;
	&queue_mgr_1($username, 1);
	exit(0);
}

#---SEPARATOR---#

sub backup_mgr {
	&header;
	eval 'use Compress::Zlib;';
	if ($@) {
		$compress = 0;
	} else {
		$compress = 1;
	}
	print "<!-- Compress::Zlib reports: $@ -->\n";
	print "<HTML><HEAD><TITLE>Backup Manager</TITLE>\n";
	print "<SCRIPT LANGUAGE=\"JavaScript\"> <!-- Hide\n";
	print "function subact(action, number, name1) {\n";
	print "  document.sf.SELECTION.value = action + number;\n";
	print "  if (action == 'delete') {\n";
	print "    var m = confirm(\"Are you sure you want to delete \" + name1 + \"?\");\n";
	print "    if (m == true) {\n";
	print "      document.sf.submit();\n";
	print "    }\n";
	print "  } else {\n";
	print "    document.sf.submit()\n";
	print "  }\n";
	print "}\n";
	print "function setStatus(msg) {\n";
	print "  window.status=msg\n";
	print "  return true\n";
	print "}\n";
	print "function markto(num,count,dir) {\n";
	print "  if (count == 1) {\n";
	print "    var c = document.sf.MARK.checked;\n";
	print "    document.sf.MARK.checked = 1-c;\n";
	print "  } else {\n";
	print "    var c = document.sf.MARK[num].checked;\n";
	print "    if (dir==1) {\n";
	print "      for (var i=0; i<=num; i++) {\n";
	print "        document.sf.MARK[i].checked = 1-c;\n";
	print "      }\n";
	print "    }\n";
	print "    if (dir==0) {\n";
	print "      for (var i=num; i<count; i++) {\n";
	print "        document.sf.MARK[i].checked = 1-c;\n";
	print "      }\n";
	print "    }\n";
	print "  }\n";
	print "}\n";
	print "function recompute() {\n";
	print "  if (document.layout.element1.checked == true && document.layout.element2.checked == true && document.layout.element3.checked == false && document.layout.element4.checked == false && document.layout.element5.checked == false) {\n";
	print "    document.layout.pgtype[0].checked = true;\n";
	print "    return true;\n";
	print "  }\n";
	print "  if (document.layout.element1.checked == true && document.layout.element2.checked == true && document.layout.element3.checked == true && document.layout.element4.checked == true && document.layout.element5.checked == true) {\n";
	print "    document.layout.pgtype[1].checked = true;\n";
	print "    return true;\n";
	print "  }\n";
	print "  document.layout.pgtype[2].checked = true;\n";
	print "  return true;\n";
	print "}\n";
	print "//-->\n";
	print "</SCRIPT></HEAD>\n";
	print '<BODY BGCOLOR="ffffff" TEXT="000000" LINK="0000FF" VLINK="0000FF" ';
	print "onLoad=\"window.defaultStatus = 'Backup Manager'\">$fs\n";
	print "<FONT SIZE=3><CENTER><B>Backup Manager</B></CENTER></FONT>\n";
	print "<HR>\n";
	opendir(DIR, "$admin_dir/backups");
	undef @bu; undef @exps;
	while ($dir = readdir(DIR)) {
		push (@bu, $dir) if ($dir =~ m|\.tar$| || $dir =~ m|\.gz$|);
		push (@exps, $dir) if ($dir =~ m|\-tab.exp$| || $dir =~ m|\-offline.exp$|);
	}
	undef %btime;
	foreach $file (@bu) {
		$filename = "$admin_dir/backups/$file";
		($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime,$blksize,$blocks) = stat ($filename);
		$btime{$file} = $mtime;
	}
	closedir(DIR);
	if (scalar(@bu) || scalar(@exps)) {
		print "<H3>Existing Backups/Exported Files</H3>";
		print "\n";
		print "<FORM NAME=sf ACTION=$cgiurl METHOD=POST>\n";
		print "<INPUT TYPE=HIDDEN NAME=SELECTION VALUE=\"\">\n";
		print "<TABLE CELLSPACING=0 CELLPADDING=2 BORDER=0>\n";
		$c = "ffffcc";
		print "<TR ALIGN=CENTER BGCOLOR=c0c0c0><TD>&nbsp;</TD><TD><FONT FACE=\"Verdana,Arial\" SIZE=1><B>Mark</B></FONT></TD><TD><FONT FACE=\"Verdana,Arial\" SIZE=1><B>Del</B></FONT></TD><TD BGCOLOR=c0c0c0>&nbsp;</TD><TD><FONT FACE=\"Verdana,Arial\" SIZE=1><B>Info</B></FONT></TD><TD><FONT FACE=\"Verdana,Arial\" SIZE=1><B>Open</B></FONT></TD>";
		print "<TD><FONT FACE=\"Verdana,Arial\" SIZE=1><B>Cprs</B></FONT></TD>" if $compress;
		print "<TD><FONT FACE=\"Verdana,Arial\" SIZE=1><B>Dnld</B></FONT></TD><TD BGCOLOR=c0c0c0>&nbsp;</TD><TD ALIGN=LEFT><FONT FACE=\"Verdana,Arial\" SIZE=1><B>Backup File Name</B> <I>(most recent listed first)</I></FONT></TD><TD>&nbsp;</TD></TR>\n";
		$counter = 0; $ctr = 0; $ct = scalar(@bu) + scalar(@exps);
		foreach $thing (sort by_mod_time @bu) {
			$filename = "$admin_dir/backups/$thing";
			if ($thing =~ m|^(.*)-(\d+)\.tar|) {
				$thing = "$1.tar" . $';
			}
			print "<TR VALIGN=CENTER ALIGN=CENTER BGCOLOR=#$c><TD BGCOLOR=c0c0c0>&nbsp;</TD>";
			$counter += 1;
			if ($c eq "ffffcc") {
				$c = "ffffff";
			} else {
				$c = "ffffcc";
			}
			print "<TD>";
			print "<A HREF=\"#\" onClick=\"markto($ctr, $ct, 1);return false\" onMouseOver=\"return setStatus('Toggle marks at and above this point')\"><IMG SRC=\"$html_url/icons/mark_up.gif\" HEIGHT=12 WIDTH=12 BORDER=0></A>&nbsp;";
			print "<A HREF=\"#\" onClick=\"markto($ctr, $ct, 0);return false\" onMouseOver=\"return setStatus('Toggle marks at and below this point')\"><IMG SRC=\"$html_url/icons/mark_down.gif\" HEIGHT=12 WIDTH=12 BORDER=0></A>&nbsp;";
			$ctr += 1;
			print "<INPUT TYPE=CHECKBOX NAME=MARK VALUE=$thing>&nbsp;&nbsp;</TD>";
			print "<TD><A HREF=\"javascript:subact('delete', '$thing', '$thing')\" onMouseOver=\"return setStatus('Delete this backup')\"><IMG SRC=\"$html_url/icons/delete_icon.gif\" HEIGHT=25 WIDTH=25 BORDER=1></A></TD>";
			print "<TD BGCOLOR=c0c0c0>&nbsp;</TD>\n";
			print "<TD><A HREF=\"javascript:subact('info', '$thing', '$thing')\" onMouseOver=\"return setStatus('View information about this backup')\"><IMG SRC=\"$html_url/icons/info_icon.gif\" HEIGHT=25 WIDTH=25 BORDER=1></A></TD>" if $thing !~ /\.gz$/;
			print "<TD><A HREF=\"javascript:subact('open', '$thing', '$thing')\" onMouseOver=\"return setStatus('Restore the data from this backup')\"><IMG SRC=\"$html_url/icons/extract_icon.gif\" HEIGHT=25 WIDTH=25 BORDER=1></A></TD>" if $thing !~ /\.gz$/;
			print "<TD>&nbsp;</TD><TD>&nbsp;</TD>\n" if $thing =~ /\.gz$/;;
			print "<TD><A HREF=\"javascript:subact('compress', '$thing', '$thing')\" onMouseOver=\"return setStatus('Compress or uncompress this backup')\"><IMG SRC=\"$html_url/icons/compress_icon.gif\" HEIGHT=25 WIDTH=25 BORDER=1></A></TD>" if $compress;
			print "<TD><A HREF=\"javascript:subact('download', '$thing', '$thing')\" onMouseOver=\"return setStatus('Download this archive to your local machine')\"><IMG SRC=\"$html_url/icons/download_icon.gif\" HEIGHT=25 WIDTH=25 BORDER=1></A></TD>";
			print "<TD BGCOLOR=c0c0c0>&nbsp;</TD>\n";
			print "<TD WIDTH=100% ALIGN=LEFT>$fs";
			print $thing;
			($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime,$blksize,$blocks) = stat ($filename);
			$s = int($size / 1000);
			print " ($s kb)<BR>";
			$t = &get_date_time('short', $ctime);
			print $t;
			print "</TD><TD BGCOLOR=c0c0c0>&nbsp;</TD>";
			print "</TR>\n";
		}
		foreach $thing (@exps) {
			$filename = "$admin_dir/backups/$thing";
			if ($thing =~ m|\-tab.exp|) {
				$thing = $`;
			}
			print "<TR VALIGN=CENTER ALIGN=CENTER BGCOLOR=#$c><TD BGCOLOR=c0c0c0>&nbsp;</TD>";
			$counter += 1;
			if ($c eq "ffffcc") {
				$c = "ffffff";
			} else {
				$c = "ffffcc";
			}
			print "<TD>";
			print "<A HREF=\"#\" onClick=\"markto($ctr, $ct, 1);return false\" onMouseOver=\"return setStatus('Toggle marks at and above this point')\"><IMG SRC=\"$html_url/icons/mark_up.gif\" HEIGHT=12 WIDTH=12 BORDER=0></A>&nbsp;";
			print "<A HREF=\"#\" onClick=\"markto($ctr, $ct, 0);return false\" onMouseOver=\"return setStatus('Toggle marks at and below this point')\"><IMG SRC=\"$html_url/icons/mark_down.gif\" HEIGHT=12 WIDTH=12 BORDER=0></A>&nbsp;";
			$ctr += 1;
			print "<INPUT TYPE=CHECKBOX NAME=MARK VALUE=$thing>&nbsp;&nbsp;</TD>";
			print "<TD><A HREF=\"javascript:subact('delete', '$thing', '$thing')\" onMouseOver=\"return setStatus('Delete this exported file')\"><IMG SRC=\"$html_url/icons/delete_icon.gif\" HEIGHT=25 WIDTH=25 BORDER=1></A></TD>";
			print "<TD BGCOLOR=c0c0c0>&nbsp;</TD>\n";
			print "<TD>&nbsp;</TD>";
			print "<TD>&nbsp;</TD>";
			print "<TD><A HREF=\"javascript:subact('compress', '$thing', '$thing')\" onMouseOver=\"return setStatus('Compress or uncompress this exported file')\"><IMG SRC=\"$html_url/icons/compress_icon.gif\" HEIGHT=25 WIDTH=25 BORDER=1></A></TD>" if $compress;
			print "<TD><A HREF=\"javascript:subact('download', '$thing', '$thing')\" onMouseOver=\"return setStatus('Download this exported file to your local machine')\"><IMG SRC=\"$html_url/icons/download_icon.gif\" HEIGHT=25 WIDTH=25 BORDER=1></A></TD>";
			print "<TD BGCOLOR=c0c0c0>&nbsp;</TD>\n";
			print "<TD WIDTH=100% ALIGN=LEFT>$fs";
			print $thing;
			print " (<B>Tab-delimited export file</B>)" if $filename =~ m|\-tab.exp$|;
			($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime,$blksize,$blocks) = stat ($filename);
			$s = int($size / 1000);
			print " ($s kb)<BR>";
			$t = &get_date_time('short', $ctime);
			print $t;
			print "</TD><TD BGCOLOR=c0c0c0>&nbsp;</TD>";
			print "</TR>\n";
		}
		if ($counter > 1) {
			print "<TR BGCOLOR=#ccccff ALIGN=CENTER>";
			print "<TD BGCOLOR=c0c0c0>&nbsp;</TD>\n";
			print "<TD ALIGN=LEFT><FONT FACE=\"Verdana,Arial\" SIZE=2><B>(Marked)</B></TD>";
			print "<TD><A HREF=\"javascript:subact('delete', '-ALL-', 'all marked backups')\" onMouseOver=\"return setStatus('Delete all marked backup files')\"><IMG SRC=\"$html_url/icons/delete_icon.gif\" HEIGHT=25 WIDTH=25 BORDER=1></A></TD>";
			print "<TD BGCOLOR=c0c0c0>&nbsp;</TD>\n";
			print "<TD>&nbsp;</TD>";
			print "<TD>&nbsp;</TD>";
			print "<TD>&nbsp;</TD>" if $compress;
			print "<TD>&nbsp;</TD>";
			print "<TD BGCOLOR=c0c0c0>&nbsp;</TD>\n";
			print "<TD>&nbsp;</TD>";
			print "<TD BGCOLOR=c0c0c0>&nbsp;</TD>\n";
			print "</TR>\n";
		}
		print "<TR BGCOLOR=c0c0c0><TD COLSPAN=11>&nbsp;</TD></TR></TABLE>\n" if $compress;
		print "<TR BGCOLOR=c0c0c0><TD COLSPAN=10>&nbsp;</TD></TR></TABLE>\n" if !$compress;
		print "<INPUT TYPE=HIDDEN NAME=username VALUE=$superuser>\n";
		print "<INPUT TYPE=HIDDEN NAME=action VALUE=\"bumgr\">\n";
		print "</FORM>\n";
		print "<HR>\n";
	}
	print "<FORM ACTION=$cgiurl METHOD=POST NAME=layout>\n";
	print "<H3>Create New Backup</H3>\n";
	print "<TABLE BGCOLOR=#ffffcc BORDER=1 WIDTH=100%><TR><TD>$fs\n";
	print "To create a backup of the board, fill in the parameters below:<P>\n";
	print "<TABLE>\n";
	print "<TR><TD>$fs", "File Name:</FONT></TD><TD><INPUT TYPE=TEXT NAME=filename SIZE=25 VALUE='Board Backup' MAXLENGTH=25></TD></TR></TABLE><TABLE>\n";
	print "<TR><TD VALIGN=TOP>$fs<U>Backup Type</U>:</FONT></TD><TD>&nbsp;&nbsp;</TD><TD>$fs<U>Files to Back Up</U>:</FONT></TD></TR>";
	print "<TR><TD VALIGN=TOP>$fs\n";
	print "<INPUT TYPE=RADIO NAME=pgtype CHECKED onClick=\"document.layout.element1.checked=true;document.layout.element2.checked=true;document.layout.element3.checked=false;document.layout.element4.checked=false;document.layout.element5.checked=false\"> Minimal Backup<BR>\n";
	print "<INPUT TYPE=RADIO NAME=pgtype onClick=\"document.layout.element1.checked=true;document.layout.element2.checked=true;document.layout.element3.checked=true;document.layout.element4.checked=true;document.layout.element5.checked=true\"> Full Backup<BR>\n";
	print "<INPUT TYPE=RADIO NAME=pgtype> Custom Backup</TD><TD>&nbsp;&nbsp;</TD>\n";
	print "<TD VALIGN=TOP>$fs\n";
	print "<INPUT TYPE=CHECKBOX NAME=element1 VALUE=1 CHECKED onClick=\"recompute()\">Data files (Passwords, Users)<BR>\n";
	print "<INPUT TYPE=CHECKBOX NAME=element2 VALUE=1 CHECKED onClick=\"recompute()\">Message files (Topics, Messages)<BR>\n";
	print "<INPUT TYPE=CHECKBOX NAME=element4 VALUE=1 onClick=\"recompute()\">Program files (CGI Scripts)<BR>\n";
	print "<INPUT TYPE=CHECKBOX NAME=element3 VALUE=1 onClick=\"recompute()\">Static/documentation files<BR>\n";
	print "<INPUT TYPE=CHECKBOX NAME=element5 VALUE=1 onClick=\"recompute()\">Template/configuration files<BR>\n";
	print "</TD></TR></TABLE><P>\n";
	print "<INPUT TYPE=SUBMIT VALUE=\"Create Backup\">\n";
	print "<INPUT TYPE=HIDDEN NAME=action VALUE=\"create_backup\">\n";
	print "<INPUT TYPE=HIDDEN NAME=username VALUE=$superuser>\n";
	print "</TD></TR></TABLE></FORM></BODY></HTML>\n";
	exit(0);
}

sub by_mod_time {
	return $btime{$b} <=> $btime{$a};
}

#---SEPARATOR---#
#REQ:show_gauge

sub create_backup {
	my ($bufilename, $datafiles, $messages, $html, $cgi, $conf) = @_;
	undef @files;
	$tempfile = "$$" . time; $tempfile =~ s/\D//g; $tempfile .= "B";
	open(TEMP, ">$admin_dir/msg_index/$tempfile.TMP") || &error_message("Create Backup Error", "Could not create temporary file in admin_dir/msg_index/$tempfile!");
	$bufilename =~ s/\.(\w+)$//;
	$bufilename =~ s/\s/_/g;
	$bufilename =~ s/\W//g;
	$bufilename = substr($bufilename, 0, 25) if length($bufilename) > 25;
	undef @ff;
	opendir(DIR, "$admin_dir/backups");
	while ($dir = readdir(DIR)) {
		push (@ff, $dir);
	}
	if (-e "$admin_dir/backups/$bufilename.tar" || grep(/^$bufilename/, @ff)) {
		$bufilename = join("", substr($bufilename, 0, 20), "_", substr(time, 4, 5));
	}
	srand(time);
	$secretnum = int(rand(1000)) . $$;
	$secretnum =~ s/\-//g;
	$bufilename .= "-$secretnum";
	$bufilename .= ".tar";
	$bufilename = "$admin_dir/backups/$bufilename";
	print TEMP "# CREATE BACKUP: $bufilename\n";
	push (@files, $admin_dir);
	push (@files, "$admin_dir/discus.conf");
	if ($conf) {
		opendir(ADMIN, "$admin_dir");
		while ($file = readdir(ADMIN)) {
			push (@files, "$admin_dir/$file") if ($file =~ m|\.conf$| && $file ne "discus.conf");
		}
		closedir(ADMIN);
	}
	if ($datafiles) {
		opendir(ADMINDIR, "$admin_dir");
		while ($file = readdir(ADMINDIR)) {
			push (@files, "$admin_dir/$file") if $file =~ m|\.txt$|;
		}
		closedir(ADMINDIR);
		push (@files, "$admin_dir/profiles");
		opendir(ADMINDIR, "$admin_dir/profiles");
		while ($file = readdir(ADMINDIR)) {
			push (@files, "$admin_dir/profiles/$file") if ($file =~ m|\.txt$| || $file =~ m|\.gif$| || $file =~ m|\.jpg$|);
		}
		closedir(ADMINDIR);
		push (@files, "$admin_dir/queue");
		opendir(ADMINDIR, "$admin_dir/queue");
		while ($file = readdir(ADMINDIR)) {
			push (@files, "$admin_dir/queue/$file") if $file =~ m|\w|;
		}
		closedir(ADMINDIR);
		push (@files, "$admin_dir/msg_index");
		opendir(ADMINDIR, "$admin_dir/msg_index");
		while ($file = readdir(ADMINDIR)) {
			push (@files, "$admin_dir/msg_index/$file") if ($file =~ m|\w| && $file !~ m|^\d+$| && $file !~ m|\.TMP$|);
		}
		closedir(ADMINDIR);
		opendir(ADMINDIR, "$admin_dir/msg_index");
		while ($file = readdir(ADMINDIR)) {
			if ($file =~ m|^\d+$|) {
				push (@files, "$admin_dir/msg_index/$file");
				opendir(DIR2, "$admin_dir/msg_index/$file");
				while ($dir2 = readdir(DIR2)) {
					push (@files, "$admin_dir/msg_index/$file/$dir2") if $dir2 =~ m|\w|;
				}
				closedir(DIR2);
			}
		}
		closedir(ADMINDIR);
	}
	if ($html) {
		push (@files, $html_dir);
		opendir(HTML, "$html_dir");
		while ($file = readdir(HTML)) {
			push (@files, "$html_dir/$file") if $file =~ m|\.html$|;
		}
		closedir(HTML);
		push (@files, "$html_dir/clipart");
		opendir(HTML, "$html_dir/clipart");
		while ($file = readdir(HTML)) {
			push (@files, "$html_dir/clipart/$file") if $file =~ m|\.gif$|;
		}
		closedir(HTML);
		push (@files, "$html_dir/icons");
		opendir(HTML, "$html_dir/icons");
		while ($file = readdir(HTML)) {
			push (@files, "$html_dir/icons/$file") if $file =~ m|\.gif$|;
		}
		closedir(HTML);
	}
	if ($messages) {
		push (@files, "$message_dir");
		push (@files, "$message_dir/$board_topics_file");
		opendir(MESSAGES, "$message_dir");
		while ($md = readdir(MESSAGES)) {
			if ($md =~ m|^(\d+)$|) {
				opendir(SUBDIR, "$message_dir/$md");
				while ($sf = readdir(SUBDIR)) {
					push (@files, "$message_dir/$md/$sf") if $sf !~ m|^\.+$|;
				}
				closedir(SUBDIR);
			}
		}
		closedir(MESSAGES);
		push (@files, "$secdir");
		opendir(MESSAGES, "$secdir");
		while ($md = readdir(MESSAGES)) {
			if ($md =~ m|^(\d+)$|) {
				opendir(SUBDIR, "$secdir/$md");
				while ($sf = readdir(SUBDIR)) {
					push (@files, "$secdir/$md/$sf") if $sf !~ m|^\.+$|;
				}
				closedir(SUBDIR);
			}
		}
		closedir(MESSAGES);
	}
	if ($cgi) {
		push (@files, $script_dir);
		opendir(CGI, "$script_dir");
		while ($file = readdir(CGI)) {
			push (@files, "$script_dir/$file") if $file =~ m|\.$cgi_extension$|;
		}
		closedir(CGI);
		opendir(SRC, "$admin_dir/source");
		while ($file = readdir(SRC)) {
			push (@files, "$admin_dir/source/$file") if $file =~ m|^src-board-subs|;
		}
		closedir(SRC);
	}
	print TEMP join("\n", @files);
	close (TEMP);
	$total = scalar(@files);
	&show_gauge("Create Board Backup", "Estimating Time to back up $total file(s)", 0, "$cgiurl?sofar=0&username=$superuser&total=$total&action=create_backup_a&tempfile=$tempfile");
}

#---SEPARATOR---#
#REQ:restore_action
#REQ:compress_uncompress
#REQ:open_archive_interface

sub bumgr {
	undef %D;
	opendir(DIR, "$admin_dir/backups");
	while ($dir = readdir(DIR)) {
		if ($dir =~ m|^(.*)-(\d+)\.(.*)$|) {
			$D{"$1.$3"} = $dir;
		} elsif ($dir =~ m|^(.*)-tab\.exp$|) {
			$D{"$1"} = $dir;
		} else {
			$D{$dir} = $dir;
		}
	}
	if ($FORM{'SELECTION'} eq "delete-ALL-") {
		@filelist = split(/,/, $FORM{'MARK'});
		foreach $file (@filelist) {
			if ($file =~ m|^([\w\.\-]+)$|) {
				unlink ("$admin_dir/backups/$D{$file}") if -e "$admin_dir/backups/$D{$file}";
			}
		}
	} elsif ($FORM{'SELECTION'} =~ /^delete([\w\.\-]+)/) {
		$file = $1;
		if ($file =~ m|^([\w\.\-]+)$|) {
			unlink ("$admin_dir/backups/$D{$file}") if -e "$admin_dir/backups/$D{$file}";
		}
	} elsif ($FORM{'SELECTION'} =~ m|^info([\w\.\-]+)|) {
		$file = $1;
		$filenew = "$admin_dir/backups/$D{$file}";
		if (!-e $filenew) {
			&error_message("Backup/Restore Error", "Requested file does not exist");
		}
		&restore_action($filenew, "$file", 1);
	} elsif ($FORM{'SELECTION'} =~ m|^compress([\w\.\-]+)|) {
		$file = $1;
		$filenew = "$admin_dir/backups/$D{$file}";
		if (!-e $filenew) {
			&error_message("Compress Error", "Requested file does not exist");
		}
		&compress_uncompress($filenew);
	} elsif ($FORM{'SELECTION'} =~ m|^download([\w\.\-]+)|) {
		$file = $1;
		$filenew = "$admin_dir/backups/$D{$file}";
		if (!-e $filenew) {
			&error_message("Download Error", "Requested file does not exist");
		}
		print "Content-type: application/x-gunzip\n" if $file =~ m|\.gz$|;
		print "Content-type: application/x-tar\n" if $file =~ m|\.tar$|;
		print "Content-type: text/plain\n" if $filenew =~ m|-tab\.exp$|;
		print "Content-type: application/x-tar\n" if $file =~ m|-offline\.exp$|;
		$file =~ s/\.exp$/\.tar/ if $file =~ m|-offline\.exp$|;
		print "Content-disposition: inline; filename=$file\n\n";
		open (FILE, "$filenew");
		binmode(FILE);
		binmode(STDOUT);
		while (<FILE>) {
			print STDOUT;
		}
		close (FILE);
		exit(0);
	} elsif ($FORM{'SELECTION'} =~ m|^open([\w\.\-]+)|) {
		$file = $1;
		$filenew = "$admin_dir/backups/$D{$file}";
		if (!-e $filenew) {
			&error_message("Open Error", "Requested file does not exist");
		}
		&open_archive_interface($filenew, $file);
		exit(0);
	} else {
		&error_message("Backup Manager Error", "Received unrecognized command or selection: <B>$FORM{'SELECTION'}</B> is not a valid operation.  Please report this error to DiscusWare, LLC Support");
	}
}

#---SEPARATOR---#

sub restore_action {
	my ($tarfile, $filenew, $action) = @_;
	&read_tar($tarfile, $action);
	return "" if ($action == 2 || $action == 3);
	if ($action == 1) {
		&header;
		print "<HTML><HEAD><TITLE>Backup File Information</TITLE></HEAD>\n";
		print '<BODY BGCOLOR="ffffff" TEXT="000000" LINK="0000FF" VLINK="0000FF" ';
		print "onLoad=\"window.defaultStatus = 'Backup File Information'\">$fs\n";
		print "<FONT SIZE=3><CENTER><B>Backup File Information</B></CENTER></FONT>\n";
		print "<HR>\n";
		print "<B><A HREF=\"$cgiurlm?username=$superuser&cmd=backup_mgr\" onMouseOver=\"";
		print "window.status = 'Return to the Backup Manager'; return true\">";
		print "Backup Manager</A>: Backup File Information</B><HR>\n<P>\n";
		print "<TABLE BGCOLOR=#ffffcc BORDER=1 WIDTH=100%><TR><TD>$fs";
		print "The backup file <B>$filenew</B> has the following properties:<P>\n";
		print "<TABLE>\n";
		print "<TR><TD>$fs", "File size:</TD><TD>$fs<B>";
		($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime,$blksize,$blocks) = stat($tarfile);
		$l = $size;
		$l /= 1000; $l = int($l);
		print "$l kb</B></TD></TR>\n";
		print "<TR><TD>$fs", "File created:</TD><TD>$fs<B>";
		print &get_date_time('short', $ctime);
		print "</B></TD></TR>\n";
		print "<TR><TD>$fs", "File encoding:</TD><TD>$fs<B>";
		print "Unix tar format" if $tarfile =~ m|\.tar$|;
		print "Unix g-zipped format" if $tarfile =~ m|\.gz$|;
		print "</B></TD></TR>\n";
		print "<TR><TD>$fs", "File is compressed:</TD><TD>$fs<B>";
		print "No" if $tarfile =~ m|\.tar$|;
		print "Yes" if $tarfile =~ m|\.gz$|;
		print "</B></TD></TR>\n";
		if ($tarfile !~ m|\.gz$|) {
			print "<TR><TD>$fs", "Number of files in archive:</TD><TD>$fs<B>", scalar(keys(%content)), "</B></TD></TR>\n";
			print "<TR><TD>$fs", "<FONT COLOR=red>Archive has errors</FONT>:</TD><TD>$fs<B>";
			print "Yes" if $error_flag;
			print "No" if !$error_flag;
			print "</B></TD></TR>\n";
			print "<TR><TD>$fs", "<FONT COLOR=red>Number of errors in archive</FONT>:</TD><TD>$fs<B>";
			print $errors;
			print "</B></TD></TR>\n";
			print "<TR><TD>$fs", "Contains discus.conf data:</TD><TD>$fs<B>";
			print "Yes" if grep(/\/discus.conf$/, keys(%content));
			print "No" if !grep(/\/discus.conf$/, keys(%content));
			print "</B></TD></TR>\n";
			print "<TR><TD>$fs", "Contains Discus password files:</TD><TD>$fs<B>";
			print "Yes" if grep(/\/passwd.txt$/, keys(%content));
			print "No" if !grep(/\/passwd.txt$/, keys(%content));
			print "</B></TD></TR>\n";
			print "<TR><TD>$fs", "Contains&nbsp;Discus&nbsp;message&nbsp;files:</TD><TD>$fs<B>";
			print "Yes" if grep(/\/$board_topics_file$/, keys(%content));
			print "No" if !grep(/\/$board_topics_file$/, keys(%content));
			print "</B></TD></TR>\n";
			print "<TR><TD VALIGN=TOP>$fs", "Summary:</TD><TD>$fs";
			if (grep(/\/discus.conf$/, keys(%content)) && grep(/\/passwd.txt$/, keys(%content)) && grep(/\/$board_topics_file$/, keys(%content))) {
				print "Discus can restore files from this backup file to your board.  You may ";
				print "also download this file to your local machine and extract individual files ";
				print "using an ordinary zip program.";
			} else {
				print "Due to missing component(s), Discus cannot automatically restore files from this backup ";
				print "file to your board.  You can  select individual ";
				print "files from this archive through the &quot;Open&quot; interface. ";
				print "You also can download this file to your local machine and ";
				print "extract individual files using an ordinary zip program.\n";
			}
			print "</TD></TR>\n";
		} else {
			print "<TR><TD VALIGN=TOP>$fs", "Summary:</TD><TD>$fs";
			print "This file is compressed, so it is impossible to determine any information about the\n";
			print "contents without first uncompressing the file.\n";
		}
		print "</TABLE>\n";
		print "</TD></TR></TABLE>\n";
		exit(0);
	}

}

sub read_tar {
	my ($file, $flag) = @_;
	undef %content; undef %type; undef %mode;
	$errors = 0;
	open(FILE, $file) || &error_message("Read File Error", "Could not open backup file ($file)");
	binmode(FILE);
	read(FILE, $header, 512);
	while (length($header) == 512) {
		($file, $mode, $f, $f, $size, $f, $chksum, $type, $f, $f, $f, $f, $f, $f, $f, $prefix) = unpack("A100 A8 A8 A8 A12 A12 A8 A1 A100 A6 A2 A32 A32 A8 A8 A155",$header);
		$file = join("/", $prefix, $file) if $prefix ne "";
		$prefix = "";
		($mode, $size, $chksum) = (oct($mode), oct($size), oct($chksum));
		$type = 5 if ($name =~ /\/$/ && $type == 0);
		last if $header eq "\0" x 512;
		substr($header, 148, 8) = "        ";
		if (unpack("%16C*", $header) != $chksum) {
			$error_flag = 1;
			$errors += 1;
		}
		if (read(FILE, $content, $size) != $size) {
			close (FILE);
			return 0;
			$error_flag = 1;
		}
		$d = $size % 512;
		read(FILE,$foo,512-$d) if $d != 0;
		$content{$file} = 1;
		$content{$file} = $content if $file =~ m|discus\.conf|;
		read (FILE, $header, 512);
	}
	close (FILE);
}

#---SEPARATOR---#

sub compress_uncompress {
	my ($file) = @_;
	eval 'use Compress::Zlib;';
	if ($@) {
		undef $!;
		&error_message("Compression Error", "This machine does not support compression/uncompression of files.  The Perl libraries required for this operation have not been installed on this server.  Contact the server administrator and tell them to install the Compress::Zlib module.<P><B>This is not a problem with the Discus program.  Please do not contact Discus regarding this error.</B>");
	}
	if ($file !~ m|\.gz$|) {
		$tmp = $/; undef $/;
		open (FILE, "$file") || &error_message("Compression Error", "Could not open source file");
		binmode(FILE);
		$content = <FILE>;
		close (FILE);
		$/ = $tmp;
		$compressed = Compress::Zlib::gzopen("$file.gz", "wb") || &error_message("Compression Error", "Could not write target file");
		$compressed->gzwrite($content);
		$compressed->gzclose;
		if (-f "$file.gz") {
			unlink($file);
		}
	} else {
		$tmp = $/; undef $/;
		$compressed = Compress::Zlib::gzopen("$file", "rb") || &error_message("Compression Error", "Could not read source file");
		$content = "";
		while ($compressed->gzread($buffer)) {
			$content .= $buffer;
		}
		$compressed->gzclose;
		$filename = $file; $filename =~ s/\.gz$//;
		open (TAR, ">$filename");
		binmode(TAR);
		print TAR $content;
		close (TAR);
		if (-f "$filename") {
			unlink ($file);
		}
	}
}

#---SEPARATOR---#
#REQ:restore_action

sub open_archive_interface {
	my ($filename, $file) = @_;
	&header;
	print "<HTML><HEAD><TITLE>Open File</TITLE>\n";
	print "</HEAD>\n";
	print '<BODY BGCOLOR="ffffff" TEXT="000000" LINK="0000FF" VLINK="0000FF" ';
	print "onLoad=\"window.defaultStatus = 'Open File - \u$file'\">$fs\n";
	print "<FONT SIZE=3><CENTER><B>\u$file</B></CENTER></FONT>\n";
	print "<HR>\n";
	print "<B><A HREF=\"$cgiurlm?cmd=backup_mgr&username=$superuser\" onMouseOver=\"window.status = 'Return to Backup Manager'; return true\">Backup Manager</A>:\n";
	print "Open \u$file</B><HR>\n";
	print "<P><FORM ACTION=$cgiurl METHOD=POST>\n";
	print "<INPUT TYPE=HIDDEN NAME=username VALUE=$superuser>\n";
	print "<INPUT TYPE=HIDDEN NAME=action VALUE=auto_restore>\n";
	print "<INPUT TYPE=HIDDEN NAME=file VALUE=$file>\n";
	&restore_action($filenew, $file, 2);
	if (($fnkey) = grep(/\/discus\.conf$/, keys(%content))) {
		$dc_content = $content{$fnkey};
		foreach $line (split(/\n/, $dc_content)) {
			if ($line =~ m|^(\w+)=(.*)|) {
				$DC{$1} = $2; $DC{$1} =~ s/\r//g;
			}
		}
		$ad_d = $DC{'admin_dir'};
		$ht_d = $DC{'html_dir'};
		$sc_d = $DC{'script_dir'};
	} else {
		$dc_content = "";
	}
	if ($error_flag) {
		print "<H3>Backup Archive Has Errors</H3>\n";
		print "The requested file has errors and cannot be used to automatically restore this board.\n";
		print "However, you can still download this file through your browser and attempt to manipulate\n";
		print "or repair it on your local machine.\n";
	} else {
		if (grep(/^$ad_d\/discus.conf$/, keys(%content)) && grep(/^$ad_d\/passwd.txt$/, keys(%content)) && grep(/^$ht_d\/messages\/$board_topics_file$/, keys(%content))) {
			print "<H3>Automatic File Restoration</H3>\n";
			print "<TABLE BGCOLOR=#ffffcc WIDTH=100% BORDER=1><TR><TD>$fs\n";
			print "This archive contains message files and the associated log files.  You can restore\n";
			print "your entire board from this archive with the click of one button.\n";
			print "<P><FONT COLOR=#ff0000><B>Warning!</B></FONT>  All message files and log files will be overwritten from this\n";
			print "backup if you choose to proceed with Automatic File Restoration.  All new information since the time of this\n";
			print "backup will be lost forever if you proceed.<P>\n";
			print "<INPUT TYPE=SUBMIT VALUE='Restore All Files' onClick=\"return confirm('Are you sure you want to overwrite all of the files on your board with the files from this backup?')\">\n";
			print "</TD></TR></TABLE>\n";
			print "<P><HR>\n";
		}
		print "</FORM>\n";
		print "<P><FORM ACTION=$cgiurl METHOD=POST>\n";
		print "<INPUT TYPE=HIDDEN NAME=username VALUE=$superuser>\n";
		print "<INPUT TYPE=HIDDEN NAME=action VALUE=manual_restore>\n";
		print "<INPUT TYPE=HIDDEN NAME=file VALUE=$file>\n";
		print "<H3>Manual File Restoration</H3>\n";
		print "<TABLE BGCOLOR=#ffffcc WIDTH=100% BORDER=1><TR><TD>$fs\n";
		print "<B>Select Files:</B><P>\n";
		print "The following files are in the selected archive.  You need to select one or more\n";
		print "files from this list to restore (you can select multiple files by holding down\n";
		print "the SHIFT or CTRL key while selecting items).<P><FONT SIZE=1>\n";
		print "<SELECT NAME=selection SIZE=15 MULTIPLE>\n";
		if ($dc_content ne "") {
			foreach $key (sort keys(%content)) {
				next if $type{$key} == 5;
				if ($key =~ m|^$ad_d|) {
					print "<OPTION VALUE=$key>[Admin dir]$'\n";
				} elsif ($key =~ m|^$ht_d|) {
					print "<OPTION VALUE=$key>[HTML dir]$'\n";
				} elsif ($key =~ m|^$sc_d|) {
					print "<OPTION VALUE=$key>[Script dir]$'\n";
				} else {
					print "<OPTION>$key\n";
				}
			}
		} else {
			foreach $key (sort keys(%content)) {
				next if $type{$key} == 5;
				print "<OPTION>$key\n";
			}
		}
		print "</SELECT>\n";
		print "</FONT><P><B>Select an action to perform:</B><P>\n";
		print "<UL>\n";
		print "<INPUT TYPE=RADIO NAME=perform VALUE=rest1 CHECKED> Restore these files to your board, overwriting damaged files only<BR>\n";
		print "<INPUT TYPE=RADIO NAME=perform VALUE=rest2> Restore these files to your board, overwriting all files<BR>\n";
		print "</UL>\n";
		print "<INPUT TYPE=SUBMIT VALUE='Perform Selected Action'>\n";
		print "</TD></TR></TABLE>\n";
	}
	print "</BODY></HTML>\n";
	exit(0);
}

#---SEPARATOR---#
#REQ:restore_action

sub manual_restore {
	my ($file, $perform, $selection) = @_;
	undef %D;
	opendir(DIR, "$admin_dir/backups");
	while ($dir = readdir(DIR)) {
		if ($dir =~ m|^(.*)-(\d+)\.(.*)$|) {
			$D{"$1.$3"} = $dir;
		} else {
			$D{$dir} = $dir;
		}
	}
	closedir(DIR);
	if ($D{$file} ne "") {
		$filename = "$admin_dir/backups/$D{$file}";
	} else {
		&error_message("Restore Error", "The selected backup file ($file) could not be found.");
	}
	&restore_action($filename, $file, 3);
	if ($selection eq "*") {
		@filelist = keys(%content);
	} else {
		@filelist = split(/,/, $selection);
	}
	if (($fnkey) = grep(/\/discus\.conf$/, keys(%content))) {
		$dc_content = $content{$fnkey};
		foreach $line (split(/\n/, $dc_content)) {
			$line =~ s/\r//g;
			if ($line =~ m|^(\w+)=(.*)|) {
				$DC{$1} = $2;
			}
		}
		$ad_d = $DC{'admin_dir'};
		$ht_d = $DC{'html_dir'};
		$sc_d = $DC{'script_dir'};
	}
	undef %dest;
	foreach $file_n (@filelist) {
		next if ($file_n =~ m|^$ad_d/discus.conf|);
		next if ($file_n =~ m|^$ad_d\\discus.conf|);
		if ($file_n =~ m|^$ad_d|) {
			$dest = "$admin_dir$'";
			$dest{$file_n} = $dest;
		} elsif ($file_n =~ m|^$ht_d/messages/|) {
			$dest = "$message_dir/$'";
			$dest{$file_n} = $dest;
		} else {
			next if $file_n eq "$ad_d/discus.conf";
			next if ($file_n eq "$ht_d/messages" || $file_n eq "$ht_d/messages/");
			$file_n =~ m|(.*)/(.*)|; $df = $2;
			push (@errors, "<B>$df</B> is not a Discus data file, so skipping");
			$file_n = "";
		}
	}
	undef @result; undef @skip;
	open(FILE, "$filename") || &error_message("Read File Error", "Could not open backup file ($filename)");
	binmode(FILE);
	read(FILE, $header, 512);
	while (length($header) == 512) {
		($file, $mode, $f, $f, $size, $f, $chksum, $type, $f, $f, $f, $f, $f, $f, $f, $prefix) = unpack("A100 A8 A8 A8 A12 A12 A8 A1 A100 A6 A2 A32 A32 A8 A8 A155",$header);
		$file = join("/", $prefix, $file) if $prefix ne "";
		$prefix = "";
		($mode, $size, $chksum) = (oct($mode), oct($size), oct($chksum));
		$type = 5 if ($name =~ /\/$/ && $type == 0);
		last if $header eq "\0" x 512;
		substr($header, 148, 8) = "        ";
		if (unpack("%16C*", $header) != $chksum) {
			$error_flag = 1;
			$errors += 1;
		}
		if (read(FILE, $content, $size) != $size) {
			close (FILE);
			return 0;
			$error_flag = 1;
		}
		$d = $size % 512;
		read(FILE,$foo,512-$d) if $d != 0;
		if ($dest{$file} ne "") {
			$dest = $dest{$file};
			($dir, $file_n) = ($dest{$file} =~ m|(.*)/(.*)|);
			if (!-d $dir) {
				unlink($dir);
				mkdir($dir, oct($perms0777));
				chmod (oct($perms0777), $dir);
			}
			if ($perform eq "rest2" || ($perform eq "rest1" && (!-e $dest || (stat($dest))[7] == 0))) {
				if (open (DEST, ">$dest{$file}")) {
					binmode(DEST);
					print DEST $content;
					close (DEST);
					chmod($mode, $dest{$file});
					$dest{$file} =~ m|(.*)/(.*)|; $df = $2;
					push (@result, "$df successfully restored");
				} else {
					$dest{$file} =~ m|(.*)/(.*)|; $df = $2;
					push (@errors, "Could not restore $dest{$file} -- System says: <B>$!</B>");
				}
			} else {
				$dest{$file} =~ m|(.*)/(.*)|; $df = $2;
				push (@skip, "$df appeared OK, so not restored");
			}
		}
		read (FILE, $header, 512);
	}
	close (FILE);
	&header;
	print "<HTML><HEAD><TITLE>Backup/Restore Report</TITLE>\n";
	print "</HEAD>\n";
	print '<BODY BGCOLOR="ffffff" TEXT="000000" LINK="0000FF" VLINK="0000FF" ';
	print "onLoad=\"window.defaultStatus = 'Backup/Restore Report'\">$fs\n";
	print "<FONT SIZE=3><CENTER><B>Backup/Restore Report</B></CENTER></FONT>\n";
	print "<HR>\n";
	print "<B><A HREF=$cgiurlm?cmd=backup_mgr&username=$superuser onMouseOver=\"window.status = 'Return to Backup Manager'; return true\">Backup Manager</A>:\n";
	print "Backup/Restore Report</B><HR>\n";
	if (scalar(@skip)) {
		print "<P><B><FONT COLOR=#0000aa>Files Not Restored</FONT></B>:<P>\n";
		foreach $line (@skip) {
			print "<LI>$line\n";
		}
	}
	if (scalar(@result)) {
		print "<P><B><FONT COLOR=#00aa00>Successful File Restores</FONT></B>:<P>\n";
		foreach $line (@result) {
			print "<LI>$line\n";
		}
	}
	if (scalar(@errors)) {
		print "<P><B><FONT COLOR=#ff0000>Errors and Explanations</FONT></B>:<P>\n";
		foreach $line (@errors) {
			print "<LI>$line\n";
		}
	}
	if (scalar(@filelist) == 0) {
		print "<P><B><FONT COLOR=#ff0000>You did not select any files from the list on the previous form!</FONT></B><P>\n";
		print "<A HREF=javascript:history.back()>Click here to return to the form</A>\n";
	}
	print "</BODY></HTML>\n";
	exit(0);
}

sub extract_files {
	@filelist = @_;
	foreach $file (@filelist) {
		($sourcefile, $destfile) = split(/\|/, $file);
		if ($type{$sourcefile} == 0 && $mode{$sourcefile} != 0) {
			open (FILEOUT, ">$destfile");
			binmode(FILEOUT);
			print FILEOUT $content{$sourcefile};
			close (FILEOUT);
			chmod ($mode{$sourcefile}, $destfile);
		} elsif ($type{$sourcefile} == 5 && $mode{$sourcefile} != 0) {
			if (!-e $destfile) {
				mkdir ($destfile, $mode{$sourcefile});
			}
			chmod ($mode{$sourcefile}, $destfile);
		}
	}
}

#---SEPARATOR---#
#REQ:show_gauge
#REQ:restore_action

sub backup_creator {
	my ($tempfile, $total, $sofar) = @_;
	$tempfile =~ s/\W//g; $bufile = ""; $tempfileold = $tempfile;
	if ($tempfile =~ m|B(\d+)$|) {
		$o = 1 + $1; $tempfile = $`; $tempfilenew = "$tempfile" . "B$o";
	} else {
		$o = 1; $tempfilenew = "$tempfile" . "1";
	}
	$timebegin = time; $ctr = 0; $reif = $GLOBAL_OPTIONS{'reindex_factor'}; $notdone = 0;
	$reif = 15 if $GLOBAL_OPTIONS{'reindex_factor'} == 0;
	if ($FORM{'verify'} == 1) {
		if (open(TEMP, "$admin_dir/msg_index/$tempfileold.TMP")) {
			while ($line = <TEMP>) {
				if ($line =~ m|^# CREATE BACKUP: (.*)|) {
					$bufile = $1; $bufile =~ s/\s*$//; last;
				}
			}
			close (TEMP);
			&restore_action("$bufile", "", 2);
			&header;
			print "<HTML><HEAD><TITLE>Backup Status</TITLE></HEAD>\n";
			print "<BODY BGCOLOR=#ffffff TEXT=#000000 LINK=#0000ff VLINK=#0000ff>$fs";
			print "<CENTER><FONT SIZE=3><B>Backup Status</B></FONT></CENTER><HR>\n";
			if ($error_flag) {
				print "There was a problem in creating this backup.<P>\n";
				print "* There is an error with the file itself; it does not meet the proper checksumming\n";
				print "requirements.  The archive file is corrupted and can probably not be opened.\n";
				print "Please delete this backup file and try creating another.<P>\n";
			} else {
				print "The archive was created successfully and appears to be valid!  There are $FORM{'total'} files in the archive.<P>\n";
			}
			print "<HR>\n";
			print "<CENTER><A HREF=$cgiurlm?cmd=backup_mgr&username=$superuser>Return to Backup Manager</A></CENTER></FONT><P>\n";
			print "</BODY></HTML>\n";
			unlink("$admin_dir/msg_index/$tempfileold.TMP");
			exit(0);
		} else {
			&error_message("Verify Error", "Temporary file could not be opened; archive could not be verified!");
		}
	}
	if (open(TEMP, "$admin_dir/msg_index/$tempfileold.TMP")) {
		$flag = 0;
		open (TEMPOUT, ">$admin_dir/msg_index/$tempfilenew.TMP");
		while ($line = <TEMP>) {
			if ($flag) {
				print TEMPOUT $line;
				$notdone = 1;
				next;
			}
			if ($line =~ m|^# CREATE BACKUP: (.*)|) {
				$bufile = $1; $bufile =~ s/\s*$//;
				print TEMPOUT $line;
				open (BUFILE, ">>$bufile") || &error_message("Error", "Could not append backup file");
				binmode(BUFILE);
				next;
			}
			chomp $line; $file = $line;
			($filetype, $content, $mode, $uid, $gid, $mtime) = &tar_format_file($file);
			print BUFILE &format_tar_entry($file, $filetype, $content, $mode, $uid, $gid, $mtime);
			$ctr += 1; $sofar += 1;
			if ($ctr % $reif == 1) {
				$flag = 1 if (time > (2+$timebegin));
			}
		}
		close (TEMP);
		close (TEMPOUT);
	} else {
		&error_message("Create Backup Error", "Temporary file ($tempfile.TMP) could not be opened!");
	}
	close (BUFILE);
	unlink("$admin_dir/msg_index/$tempfileold.TMP");
	if ($notdone) {
		&show_gauge("Create Backup", "Creating backup - $sofar of $total files added", $sofar/$total, "$cgiurl?action=create_backup_a&username=$superuser&sofar=$sofar&total=$total&tempfile=$tempfilenew");
	}
	&show_gauge("Create Backup", "Verifying Integrity of Backup", 1, "$cgiurl?action=create_backup_a&username=$superuser&total=$total&tempfile=$tempfilenew&verify=1");
}

sub tar_format_file {
	my ($file) = @_;
	my ($tempslash, $content);
	$tempslash = $/; undef $/;
	if (($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime,$blksize,$blocks) = stat($file)) {
		$content = "";
		if (-f $file) {
			$filetype = 0;
			if (open (FILE, "$file")) {
				binmode(FILE);
				$content = <FILE>;
				close (FILE);
			} else {
				$content = "";
				next;
			}
		} elsif (-d $file) {
			$filetype = 5;
			$content = "";
		}
	} else {
		&log_error("src-board-subs-106", "backup_creator", "Could not stat file $file: $!");
	}
	$/ = $tempslash;
	return ($filetype, $content, $mode, $uid, $gid, $mtime);
}

sub format_tar_entry {
	my ($file, $filetype, $content, $mode, $uid, $gid, $mtime) = @_;
	my ($pos, $prefix, $str, $size);
	if (length($file) > 99) {
		$pos = index ($file, "/", (length($file) - 100));
		return "" if $pos == -1;
		$prefix = substr($file, 0, $pos);
		$file = substr($file, $pos+1);
		substr($prefix, 0, -155) = "" if length($prefix) > 154;
	} else {
		$prefix = "";
	}
	$str = pack("a100a8a8a8a12a12a8a1a100", $file, sprintf("%6o ",$mode), sprintf("%6o ",$uid), sprintf("%6o ",$gid), sprintf("%11o ",length($content)), sprintf("%11o ",$mtime), "        ", $filetype, "");
	$str .= pack("a6", "ustar\0");
	$str .= '00';
	$str .= pack("a32a32a8a8a155","unknown", "unknown", sprintf("%6o ", 0), sprintf("%6o ", 0), $prefix);
	substr($str,148,6) = sprintf("%6o", unpack("%16C*",$str));
	substr($str,154,1) = "\0";
	$str .= "\0" x (512-length($str));
	$str .= $content;
	$size = length($content);
	if ($size > 0) {
		$str .= "\0" x (512 - ($size % 512)) unless $size % 512 ==0;
	}
	return $str;
}

# END - FILE IS CORRECTLY UPLOADED #
