# FILE: src-board-subs-5
#-------------------------------------------------------------------------------
# This script is copyright (c) 1998 by DiscusWare, LLC, all rights reserved.
# Its use is subject to the license agreement that can be found at the following
# URL:  http://www.chem.hope.edu/discus/license
#-------------------------------------------------------------------------------

#---SEPARATOR---#
#REQ:extract_colorsonly

sub preview_admin_message {
	local ($message_source, $message_formatted, $username, $referer, $action, $mtitle) = @_;
	&header;
	print "<HTML><HEAD><TITLE>Preview of $mtitle</TITLE>\n";
	print "<SCRIPT LANGUAGE=\"JavaScript\">\n";
	print "<!--\n";
	print "function setStatus(msg) {\n";
	print "  window.status=msg\n";
	print "  return true\n";
	print "}\n";
	print "//-->\n";
	print "</SCRIPT></HEAD>\n";
	($bgcolor, $text, $link, $vlink, $alink, $face, $size, $img) = &extract_colorsonly;
	print "<BODY BGCOLOR=\"ffffff\" TEXT=\"000000\" LINK=\"$link\" ";
	print "VLINK=\"$vlink\" onLoad=\"window.defaultStatus='Preview of $mtitle'\">$fs\n";
	print "<FONT SIZE=3><CENTER><B>Preview of $mtitle</B></CENTER></FONT>\n<HR>\n";
	if ($mtitle eq "About Message" || $mtitle eq "Announcement") {
		local (@array) = ("$topic_number:$topic_name");
		foreach $key (sort by_number keys(%level_number)) {
			push (@array, "$level_number{$key}:$level_name{$key}");
		}
		print "<B><A HREF=\"$cgiurlm?username=$username&action=mgr_1";
		print "&HTTP_REFERER=$page_referer\" onMouseOver=\"return setStatus('";
		print "Return to topic selection screen')\"><FONT COLOR=#0000ff>Page Manager</FONT></A>:\n";
		foreach $line (@array) {
			($number,$name) = split(/:/, $line, 2);
			print "<A HREF=\"$cgiurlm?username=$username&action=page_editor";
			print "&HTTP_REFERER=//$topic_number/$number.$ext\" onMouseOver=\"return ";
			$str = &JavaScript_prepare($name);
			print "setStatus('Return to editing $str')\">";
			print "<FONT COLOR=#0000ff>$name</FONT>";
			print "</A>: \n";
		}
	} elsif ($mtitle eq "Main Message" || $mtitle eq "Title Message" || $mtitle eq "Topic Description") {
		print "<B><A HREF=\"$cgiurlm?username=$username&cmd=board_mgr\" onMouseOver=\"";
		print "return setStatus('Return to Board Manager')\"><FONT COLOR=#0000ff>Board Manager</FONT></A>:\n";
	} elsif ($mtitle eq "Welcome Message") {
		print "<B><A HREF=\"$cgiurlm?username=$username&cmd=options_mgr\" onMouseOver=\"";
		print "return setStatus('Return to Options Manager')\"><FONT COLOR=#0000ff>Options Manager</FONT></A>: ";
		print "<A HREF=\"$cgiurlm?username=$username&cmd=reg_configurator\" onMouseOver=\"";
		print "return setStatus('Return to Self Registration Configurator')\"><FONT COLOR=#0000ff>Self Registration Configurator</FONT></A>: ";
	}
	print "Preview of $mtitle</B>\n";
	print "<HR><P>\n";
	print "A preview of your message appears below.  If you used any ";
	print "formatting tags in your message, please check to see that your ";
	print "formatting is displayed correctly in the preview.<P>\n";
	print "<TABLE BORDER=1 WIDTH=100% HEIGHT=40%>\n";
	print "<TR><TD VALIGN=TOP BGCOLOR=\"$bgcolor\" BACKGROUND=\"$img\"><FONT COLOR=\"$text\" FACE=\"$face\" SIZE=\"$size\">$message_formatted</FONT>";
	print "</TD></TR></TABLE><P>\n";
	print "<HR><P><H3>Revise $mtitle</H3>\n";
	print "<TABLE BGCOLOR=ffffcc BORDER=1 WIDTH=100%><TR><TD>";
	print "<FORM ACTION=\"$cgiurl1\" METHOD=POST>\n" if ($mtitle eq "About Message" || $mtitle eq "Announcement");
	print "<FORM ACTION=\"$cgiurl2\" METHOD=POST>\n" if ($mtitle eq "Main Message" || $mtitle eq "Topic Description" || $mtitle eq "Title Message");
	print "<FORM ACTION=\"$cgiurl\" METHOD=POST>\n" if ($mtitle eq "Welcome Message");
	print "<TABLE><TR><TD><TEXTAREA NAME=message ROWS=6 COLS=60 WRAP=VIRTUAL>";
	print "$message_source</TEXTAREA></TD></TR></TABLE><P>\n\n";
	print "<input type=hidden name=\"action\" value=\"$action\">\n";
	print "<input type=hidden name=\"username\" value=\"$username\">\n";
	print "<input type=submit name=submit value=\"Refresh Preview\">\n";
	print "<input type=submit name=submit value=\"Save Message\">\n" if $message_formatted !~ /<H3>FORMATTING/i;
	print "<input type=hidden name=\"HTTP_REFERER\" value=\"$referer\">\n" if $referer;
	print "</TD></TR></TABLE></FORM></BODY></HTML>\n";
	exit(0);
}

#---SEPARATOR---#

sub change_about_message {
	local ($file, $source, $formatted) = @_;
	local (@file, $messageflag, $line, $source_esc, $topic, $page);
	if ($file =~ m|/(\d+)/(\d+)\.$ext|) {
		($topic, $page) = ($1, $2);
	} else {
		&error_message("Change About Message Error", "Could not open requested file");
	}
	&lock("$message_dir/$topic/$page.$ext");
	local ($head, $color, $lm, $ann, $ann_src, $sublist, $about, $about_src, $message, $message_src) = &get_page($topic, $page);
	&set_page($topic, $page, $head, $color, $lm, $ann, $ann_src, $sublist, $formatted, &escape($source), $message, $message_src);
	&unlock("$message_dir/$topic/$page.$ext");
}

#---SEPARATOR---#
#REQ:recurse

sub remove_page {
	local ($topic_number, $parent, $page_number) = @_;
	local ($pn, @pn, @lines, $line, $filename, $filenumber, @ps);
	@pn = split(/,/, $page_number);
	foreach $pn (@pn) {
		$pn =~ s/^0//g;
	}
	&lock("$message_dir/$topic_number/$parent.$ext");
	local ($head, $color, $lm, $ann, $ann_src, $sublist, $about, $about_src, $message, $message_src) = &get_page($topic_number, $parent);
	@lines = split(/\n/, $sublist);
	foreach $line (@lines) {
		$filenumber = "-NONE-";
		$filenumber = $1 if $line =~ m|<!-Top: (\d+)-!>|;
		$filenumber = $1 if $line =~ m|<!-URL: (\d+)-!>|;
		if (grep(/^$filenumber$/, @pn)) {
			$line = "";
			push (@ps, $filenumber);			
		}
	}
	$sublist = join("\n", grep(/\S/, @lines));
	&set_page($topic_number, $parent, $head, $color, $lm, $ann, $ann_src, $sublist, $about, $about_src, $message, $message_src);
	&unlock("$message_dir/$topic_number/$parent.$ext");
	foreach $filenumber (@ps) {
		&recurse ($topic_number, $filenumber, "delete");
	}
}

#---SEPARATOR---#
#REQ:get_date_time
#REQ:manage_images
#REQ:manage_attachments
#REQ:reapply_webtags

sub move_page {
	local ($old_topic, $page_number, $old_parent, $new_topic, $new_parent) = @_;
	return 1 if ($old_topic == $new_topic && $old_parent == $new_parent);
	&lock("$message_dir/$old_topic/$old_parent.$ext");
	local ($head1, $color1, $lm1, $ann1, $ann_src1, $sublist1, $about1, $about_src1, $message1, $message_src1) = &get_page($old_topic, $old_parent);
	local (@temp, $headstr, $nextkey, $owner, $line, $param, @tomove, $temp, @pn);
	local ($t1, $t2, $t3);
	undef @message_move_move_page;
	@pn = split(/,/, $page_number);
	@temp = split(/\n/, $sublist1);
	foreach $line (@temp) {
		$line =~ m|<!-(\w+): (\d+)-!>|;
		$temp = $2;
		if (grep(/^$temp$/, @pn)) {
			push (@tomove, $line) if ($old_topic != $new_topic || $old_parent != $new_parent);
			$line = "";
		}
	}
	$sublist1 = join("\n", grep(/\S/, @temp));
	&set_page($old_topic, $old_parent, $head1, $color1, $lm1, $ann1, $ann_src1, $sublist1, $about1, $about_src1, $message1, $message_src1);
	&unlock("$message_dir/$old_topic/$old_parent.$ext");
	&lock("$message_dir/$new_topic/$new_parent.$ext");
	local ($head2, $color2, $lm2, $ann2, $ann_src2, $sublist2, $about2, $about_src2, $message2, $message_src2) = &get_page($new_topic, $new_parent);
	if ($new_topic != $old_topic) {
		foreach $line (@tomove) {
			$line =~ s|/messages/$old_topic/(\d+).$ext|/messages/$new_topic/$1.$ext|g;
		}
	}
	$sublist2 .= join("\n", @tomove);
	@temp = split(/\n/, $head2);
	foreach $line (@temp) {
		if ($line =~ m|<!--Topic:|) {
			$headstr .= "$line\n";
		} elsif ($line =~ m|<!--Owner: (.*)-->|) {
			$owner = $1;
		} elsif ($line =~ m|<!--Level (\d+): (\d+)/(.*)-->|) {
			($t1, $t2, $t3) = ($1, $2, $3);
			$headstr .= "$line\n";
			$nextkey = $t1;
		} elsif ($line =~ m|<!--Param: (.*)-->|) {
			$param = $1;
		}
	}
	$nextkey += 1;
	&set_page($new_topic, $new_parent, $head2, $color2, $lm2, $ann2, $ann_src2, $sublist2, $about2, $about_src2, $message2, $message_src2);
	&unlock("$message_dir/$new_topic/$new_parent.$ext");
	foreach $line (@tomove) {
		if ($line =~ m|<!-Top: (\d+)-!>|) {
			&regenerate_pages($headstr, $old_topic, $1, "", $owner, $new_topic, $nextkey, $new_parent);
		}
	}
	if (scalar(@message_move_move_page)) {
		local (@LOG);
		&lock("$admin_dir/log.txt");
		open (LOG, "$admin_dir/log.txt");
		@LOG = <LOG>;
		close (LOG);
		local ($indx, $who, $when, $where, $rest);
		foreach $line (@LOG) {
			($indx, $who, $when, $where, $rest) = split(/;/, $line, 5);
			if (grep(/^$indx$/, @message_move_move_page)) {
				($tpc, $page) = split(/\//, $where);
				$line = join(";", $indx, $who, $when, "$new_topic/$page", $rest);
			}
		}
		open (LOG, ">$admin_dir/log.txt");
		print LOG @LOG;
		close (LOG);
		&unlock("$admin_dir/log.txt");
	}
}

sub regenerate_pages {
	local ($headstr, $topic, $page, $additional, $owner, $new_topic, $nextkey, $parent) = @_;
	&lock("$message_dir/$topic/$page.$ext");
	local ($head1, $color1, $lm1, $ann, $ann_src, $sublist1, $about1, $about_src1, $message1, $message_src1) = &get_page($topic, $page);
	&unlock("$message_dir/$topic/$page.$ext");
	local ($line, @head, $newhead, $me_name, $param, $me_number);
	@head = split(/\n/, $head1);
	foreach $line (@head) {
		if ($line =~ m|<!--Me: (\d+)/(.*)-->|) {
			($me_number, $me_name) = ($1, $2);
		} elsif ($line =~ m|<!--Param: (.*)-->|) {
			$param = $1;
		}
	}
	$newhead = $headstr;
	$newhead .= $additional;
	$newhead .= "<!--Level $nextkey: $page/$me_name-->\n";
	$additional .= "<!--Level $nextkey: $page/$me_name-->\n";
	$nextkey += 1;
	$newhead .= "<!--Me: $page/$me_name-->\n";
	$newhead .= "<!--Parent: $parent-->\n";
	$newhead .= "<!--Owner: $owner-->\n";
	$newhead .= "<!--Param: $param-->\n";
	local ($numb, $exten, @msg);
	&unlock("$message_dir/$topic/$page.$ext");
	@msg = split(/\n/, $sublist1);
	foreach $line (@msg) {
		if ($line =~ m|<!-Top: (\d+)-!>|) {
			$numb = $1;
			if ($new_topic != $topic) {
				$line =~ s|/messages/$topic/(\d+).$ext|/messages/$new_topic/$1.$ext|g;
			}
			&regenerate_pages($headstr, $topic, $numb, $additional, $owner, $new_topic, $nextkey, $me_number);
		}
	}
	$sublist1 = join("\n", @msg);
	$p_temp = $message1;
	while ($p_temp =~ m|<!-Post: (\d+)-!>|) {
		push (@message_move_move_page, $1);
		$p_temp = join("", $`, $');
	}
	undef @files_move;
	@files_move = &manage_images(&unescape($message_src1), $topic, 0, "list");
	@files_move_2 = &manage_attachments(&unescape($message_src1), $topic, 0, "list") if $pro;
	foreach $f (@files_move_2) {
		push (@files_move, $f);
	}
	if (scalar(@files_move) > 0) {
		$topic_number = $new_topic;
		foreach $file_in (@files_move) {
			if ($file_in =~ m|^(.*)/(\d+)/([^/]+)$|) {
				$filename = $3;
				$dest = "$message_dir/$new_topic/$filename" if -e "$message_dir/$new_topic";
				$dest = "$secdir/$new_topic/$filename" if -e "$secdir/$new_topic";
				open (SRC, "$file_in");
				eval 'binmode(SRC);';
				@src = <SRC>;
				close (SRC);
				open (DEST, ">$dest");
				eval 'binmode(DEST);';
				print DEST @src;			
				close (DEST);
				unlink($file_in);
			}
		}
		$message1 = &reapply_webtags($message_src1, $message1);
	}	
	&set_page($new_topic, $page, $newhead, $color1, $lm1, $ann, $ann_src, $sublist1, $about1, $about_src1, $message1, $message_src1);
	if ($new_topic != $topic) {
		unlink ("$secdir/$topic/$page.$ext") if !-e "$html_dir/messages/$topic/$page.$ext";
		unlink ("$html_dir/messages/$topic/$page.$ext") if -e "$html_dir/messages/$topic/$page.$ext";
	}
}

#---SEPARATOR---#
#REQ:determine_addmessage

sub printuntil {
	local ($start, $finish, $topic_number, $title, $flag, $cache) = @_;
	if (!$cache) {
		($template, $addfile) = &determine_addmessage($topic_number);
		@PrintUntil_FILE = split(/\n/, $template);
		if ($flag != 1) {
			($bgcolor, $text, $link, $vlink, $alink, $face, $size, $image) = &ex('extract_colorsonly', 1);
		}
		foreach $line (@PrintUntil_FILE) {
			$line .= "\n";
			while ($line =~ /\$(\w+)/) {
				$this = eval "\$$1";
				$line = $` . $this . $';
			}
		}
	}
	$cpos = 0;
	foreach $line (@PrintUntil_FILE) {
		if ($line =~ m|<!--Start-->|) {
			$cpos = 1;
		} elsif ($line =~ m|<!--Bigtitle-->|) {
			$cpos = 2;
		} elsif ($line =~ m|<!--/Bigtitle-->|) {
			$cpos = 3;
		} elsif ($line =~ m|<!--Navbar-->|) {
			$cpos = 4;
		} elsif ($line =~ m|<!--/Navbar-->|) {
			$cpos = 5;
		} elsif ($line =~ m|<!--Announcement-->|) {
			$cpos = 0;
		} elsif ($line =~ m|<!--/Announcement-->|) {
			$cpos = 5;
		} elsif ($line =~ m|<!--Sublist-->|) {
			$cpos = 6;
		} elsif ($line =~ m|<!--/Sublist-->|) {
			$cpos = 7;
		} elsif ($line =~ m|<!--Create-->|) {
			$cpos = 8;
		} elsif ($line =~ m|<!--/Create-->|) {
			$cpos = 9;
		} elsif ($line =~ m|<!--About-->|) {
			$cpos = 10;
		} elsif ($line =~ m|<!--/About-->|) {
			$cpos = 11;
		} elsif ($line =~ m|<!--Messages-->|) {
			$cpos = 12;
		} elsif ($line =~ m|<!--/Messages-->|) {
			$cpos = 13;
		} elsif ($line =~ m|<!--Add-->|) {
			$cpos = 14;
		} elsif ($line =~ m|<!--/Add-->|) {
			$cpos = 15;
		} elsif ($line =~ m|<!--Message Source|) {
			$cpos = 16;
		} elsif ($line =~ m|-->| && $cpos == 16) {
			$cpos = 17;
		} elsif ($line =~ m|<META|i && $line !~ m|<!-ShowMeta-!>|) {
			# Skip
		} elsif ($line =~ m|^<!-AdminFromHere-!>|) {
			# Skip
		} elsif ($start == $finish && $cpos == $start) {
			print $line if $line =~ /\S/;
		} elsif ($start != $finish && $cpos >= $start && $cpos <= $finish && $cpos % 2 == 1) {
			print $line if $line =~ /\S/;
		}
	}
}

#---SEPARATOR---#

sub remove_swearing {
	local ($message_in, $code, $star_flag) = @_;
	if (open(CUSS, "$admin_dir/cuss.txt")) {
		@cuss = <CUSS>;
		close (CUSS);
		@cuss = grep(!/^#/, @cuss);
		foreach $line (@cuss) {
			$line =~ s/\s//g;
			next if length($line) == 0;
			if ($line =~ m|!|) {
				$line = $';
				$line =~ tr/a-zA-Z/b-zaB-ZA/;
			}
			$stars = "\\char{149}" x length($line);
			$stars = join("", "\\red{", $stars, "}") if $code != 3;
			$stars = "&#149;" x length($line) if $star_flag;
			$message_in =~ s/\b$line\b/$stars/gi;
		}
	}
	return $message_in;
}

#---SEPARATOR---#

sub access_mgr_2 {
	local ($topic, $username) = @_;
	local (@read, @post, $rl, $pl);
	&extract("//$topic/$topic.$ext");
	open (SECURITY, "$admin_dir/posting.txt"); @post = <SECURITY>; close (SECURITY);
	($pl) = grep(/^$topic:/, @post);
	open (SECURITY, "$admin_dir/postoptions.txt"); @options = <SECURITY>; close (SECURITY);
	($ps) = grep(/^$topic:/, @options);
	open (GROUPS, "$admin_dir/groups.txt"); @grp = <GROUPS>; close (GROUPS);
	foreach $grp (@grp) {
		$grp =~ m|^(\w+):|; $grp = $1;
	}
	&header;
	print "<HTML><HEAD><TITLE>Access Manager</TITLE>\n";
	print "<SCRIPT LANGUAGE=\"JavaScript\"> <!-- Hide\n";
	print "function setStatus(msg) {\n";
	print "  window.status=msg\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 = 'Access Editor: ";
	print &JavaScript_prepare($topic_name);
	print "'\">$fs\n";
	print "<FONT SIZE=3><CENTER><B>Access Editor: $topic_name</B></CENTER></FONT>\n";
	print "<HR><B><A HREF=$cgiurlm?action=access_mgr_1&username=$username onMouseOver=\"return setStatus('Return to topic selection screen')\">Access Manager</A>:\n";
	print "Access Editor</B>\n";
	print "<HR><H3>Posting Privileges</H3>";
	print "<FORM ACTION=\"$cgiurl\" METHOD=POST NAME=\"POSTFORM\">\n";
	print "<TABLE BGCOLOR=#ffffcc BORDER=1 WIDTH=100%><TR><TD>\n";
	($topic, $ip, $usrgrp, $modgrp, $pass) = split(/:/, $pl);
	@usrgrp = split(/,/, $usrgrp); @modgrp = split(/,/, $modgrp);
	@ip = split(/,/, $ip);
	print "$fs\n";
	print "<INPUT TYPE=HIDDEN NAME=topic VALUE=$topic_number>\n";
	print "<INPUT TYPE=HIDDEN NAME=username VALUE=$username>\n";
	print "<INPUT TYPE=HIDDEN NAME=action VALUE=access_edit_simple>\n";
	print "<INPUT TYPE=HIDDEN NAME=interface VALUE=simple>\n";
	print "<B>Unrestricted:</B><BR>\n";		
	print "&nbsp;&nbsp;<INPUT TYPE=CHECKBOX NAME=\"publicbox\" VALUE=on ";
	print "CHECKED " if grep(/^~$/, @ip);
	print " onClick=\"if (document.forms[0].publicbox.checked) { document.forms[0].modgroup.checked = 0; document.forms[0].usergroup.checked = 0; document.forms[0].modall.checked = 0; document.forms[0].userall.checked = 0; }\"> Public Posting (anyone at all)";
	print "<P>\n";
	print "<B>Restricted to:</B><BR>\n";
	print "&nbsp;&nbsp;<INPUT TYPE=CHECKBOX NAME=modgroup VALUE=on ";
	print "CHECKED" if grep(/^$owner$/, @modgrp);
	print "CHECKED" if grep(/^~$/, @modgrp);
	print " onClick=\"document.forms[0].publicbox.checked = 0;\"";
	print "> Moderators in this group (\u$owner)";
	print "<BR>\n";
	print "&nbsp;&nbsp;<INPUT TYPE=CHECKBOX NAME=usergroup VALUE=on ";
	print "CHECKED" if grep(/^$owner$/, @usrgrp);
	print "CHECKED" if grep(/^~$/, @usrgrp);
	print " onClick=\"document.forms[0].publicbox.checked = 0;\"";
	print "> Users in this group (\u$owner)";
	print "<BR>\n";
	print "&nbsp;&nbsp;<INPUT TYPE=CHECKBOX NAME=modall VALUE=on ";
	print "CHECKED" if grep(/^~$/, @modgrp);
	print " onClick=\"document.forms[0].publicbox.checked = 0;\"";
	print "> Moderators in every group";
	print "<BR>\n";
	print "&nbsp;&nbsp;<INPUT TYPE=CHECKBOX NAME=userall VALUE=on ";
	print "CHECKED" if grep(/^~$/, @usrgrp);
	print " onClick=\"document.forms[0].publicbox.checked = 0;\"";
	print "> Users in every group";
	$ps =~ s/\s*$//;
	print "<P>\n";
	($topicnumb, $anon, $stamp, $emaild) = split(/:/, $ps);
	print "<INPUT TYPE=CHECKBOX NAME=anondisable VALUE=1 ";
	print "CHECKED" if $anon == 1;
	print "> Disable anonymous posts\n";
	print "<BR>\n";
	print "<INPUT TYPE=CHECKBOX NAME=emaildisable VALUE=1 ";
	print "CHECKED" if $emaild == 1;
	print "> Disable e-mail link on posts\n";
	print "<BR>\n";
	print "<INPUT TYPE=CHECKBOX NAME=stampdisable VALUE=1 ";
	print "CHECKED" if $stamp == 1;
	print "> Disable full name on posts\n";
	print "<P><INPUT TYPE=SUBMIT VALUE='Save'>\n";
	print "<INPUT TYPE=SUBMIT name=kill VALUE='Disable All Posting'>\n";
	print "</TD></TR></TABLE>\n";
	print "</FORM>\n";
	print "</BODY></HTML>\n";		
}

#---SEPARATOR---#

sub send_email_message {
	local ($addresses, $subject_line, $text_out, $footer, $topic_number, $me_number) = @_;
	
	if ($GLOBAL_OPTIONS{'options_used'}) {
		if ($GLOBAL_OPTIONS{'capable'} eq "0") {
			return 0;
		}
		if ($GLOBAL_OPTIONS{'capable'} eq "" && $GLOBAL_OPTIONS{'email'} == 0) {
			return 0;
		}
	}	
	
	# Important note:  Each address in '$addresses' was checked in the calling
	# subroutine to meet the following pattern:
	#    m|^([\w\-\+\.]+)\@([\w\-\+\.]+)$|
	
	undef %email;
	
	# The following code checks for an "email.txt" file in your source directory
	# and if it exists, it uses it.  We use this in our demonstration service,
	# although it is unlikely that anyone else would need to use this.
	
	if (open(CFG, "$admin_dir/source/email.txt")) {
		@cfg = <CFG>;
		close (CFG);
	} elsif (open (CFG, "$admin_dir/email.txt")) {
		@cfg = <CFG>;
		close (CFG);
	} else {
		return 0;
	}
	foreach $line (@cfg) {
		if ($line =~ m|^(\w+)=(.*)|) {
			$o = $1; $t = $2;
			$t = &unescape($t) if $t !~ /\s/;
			$email{$o} = $t;
		}
	}
	$command = $email{'command_line'};
	$input = $email{'input_stream'};
	$command =~ s/\$SUBJECT/$subject_line/g;
	$input =~ s/\$SUBJECT/$subject_line/g;
	$command =~ s/\$REPLYTO/$reply_to/g;
	$input =~ s/\$REPLYTO/$reply_to/g;
	if ($email{'1message'} == 1) {
		@addresses = split(/,/, $addresses);
		foreach $line (@addresses) {
			($email, $user, $pass) = split(/\|\|/, $line);
			$line = $email;
		}
		$addresses = join(",", @addresses);	
		$command =~ s/\$BCC/$addresses/g;
		$input =~ s/\$BCC/$addresses/g;
		if ($email{'tempfile'} == 0) {
			open (MAIL, $command);
		} else {
			$pid = $$; $pid =~ s/\D//g; $time = time;
			$tempfile = "$message_dir/$time-$pid.tmp";
			open (MAIL, ">$tempfile");
		}			
		print MAIL $input;
		print MAIL "\n";
		print MAIL $text_out;
		print MAIL $footer if $footer;
		close (MAIL);
		if ($email{'tempfile'} == 1) {
			$command =~ s%^\|\s*%%;
			$pr = $email{'mail_program'};
			if ($command =~ m|$pr|) {
				$stuff = $';
				$command = $pr;
			} else {
				$stuff = "";
			}
			if ($^O eq "MSWin32") {
				$mail_prog = $pr;
				$mail_prog =~ s/\//\\/g;
				$tempfile =~ s/\//\\/g;
				$stuff =~ s/'/"/g;
				$stuff =~ s/^\s*//;
				if ($mail_prog =~ m|(.*)\\|) {
					$cwd = $1;
				} else {
					$cwd = ".";
				}
				eval '
					use Win32::Process;
					use Win32;
					Win32::Process::Create($ProcessObj, $mail_prog, "$mail_prog $tempfile $stuff", 0, DETACHED_PROCESS, $cwd) || &error_message("Windows Process Creation Error", Win32::FormatMessage(Win32::GetLastError()));
					$ProcessObj->Wait(INFINITE);
				';
			} else {
				system("$command_line", "$tempfile", "$stuff");
			}
			unlink ($tempfile);
		}
	} else {
		@addresses = split(/,/, $addresses);
		foreach $address (@addresses) {
			($email, $user, $pass) = split(/\|\|/, $address);
			$address = $email;
			$command_temp = $command;
			$input_temp = $input;
			$command_temp =~ s/\$TO/$address/g;
			$input_temp =~ s/\$TO/$address/g;
			if ($email{'tempfile'} == 0) {
				open (MAIL, $command_temp);
			} else {
				$command_temp =~ s%^\|\s*%%;
				$pid = $$; $pid =~ s/\D//g; $time = time;
				$tempfile = "$message_dir/$time-$pid.tmp";
				open (MAIL, ">$tempfile");
			}			
			print MAIL $input_temp;
			print MAIL "\n";
			print MAIL $text_out;
			print MAIL $footer if $footer;
			if ($reply_by_email) {
				print MAIL " ***||$user||", crypt($pass, "cookie"), "||$topic_number||$me_number||***\n\n";
				print MAIL "$L{BPR_GOTOLINK}\n";
				print MAIL "$script_url/show.$cgi_extension?$topic/$page\n\n";
			}
			close (MAIL);
			if ($email{'tempfile'} == 1) {
				$pr = $email{'mail_program'};
				if ($command_temp =~ m|$pr|) {
					$stuff = $';
					$command_temp = $pr;
				} else {
					$stuff = "";
				}
				if ($^O eq "MSWin32") {
					$mail_prog = $pr;
					$mail_prog =~ s/\//\\/g;
					$tempfile =~ s/\//\\/g;
					$stuff =~ s/'/"/g;
					$stuff =~ s/^\s*//;
					if ($mail_prog =~ m|(.*)\\|) {
						$cwd = $1;
					} else {
						$cwd = ".";
					}
					eval '
						use Win32::Process;
						use Win32;
						Win32::Process::Create($ProcessObj, $mail_prog, "$mail_prog $tempfile $stuff", 0, DETACHED_PROCESS, $cwd) || &error_message("Windows Process Creation Error", Win32::FormatMessage(Win32::GetLastError()));
						$ProcessObj->Wait(INFINITE);
					';
				} else {
					system("$command_line", "$tempfile", "$stuff");
				}
				unlink ($tempfile);
			}
		}	
	}
}


#---SEPARATOR---#

sub change_announce_message {
	local ($file, $source, $formatted) = @_;
	local (@file, $messageflag, $line, $source_esc, $topic, $page);
	if ($file =~ m|/(\d+)/(\d+)\.$ext|) {
		($topic, $page) = ($1, $2);
	} else {
		&error_message("Change Announcement Error", "Could not open requested file", 0, 1);
	}
	&lock("$message_dir/$topic/$page.$ext");
	local ($head, $color, $lm, $ann, $ann_src, $sublist, $about, $about_src, $message, $message_src) = &get_page($topic, $page);
	&set_page($topic, $page, $head, $color, $lm, $formatted, &escape($source), $sublist, $about, $about_src, $message, $message_src);
	&unlock("$message_dir/$topic/$page.$ext");
}

#---SEPARATOR---#

sub manage_images {
	local ($source_in, $topic_number, $queue, $action) = @_;
	local (@file);
	while ($source_in =~ m|\\image_alreadyuploaded\{(\d+)|) {
		push (@file, "$1.gif");
		$source_in = join("", $`, $');
	}
	while ($source_in =~ m|\\jpeg_alreadyuploaded\{(\d+)|) {
		push (@file, "$1.jpg");
		$source_in = join("", $`, $');
	}
	if ($queue != 0) {
		$dir = "";
	} else {
		if (-e "$message_dir/$topic_number") {
			$dir = "$message_dir/$topic_number";
		} else {
			$dir = "$secdir/$topic_number";
		}
	}
	if ($action eq "delete") {
		foreach $line (@file) {
			(unlink("$dir/$line"));
		}
	} elsif ($action eq "list") {
		foreach $line (@file) {
			$line = "$dir/$line";
		}
		return @file;
	}
}

#---SEPARATOR---#
#REQ:webtags

sub reapply_webtags {
	local ($text, $message) = @_;
	local (%source);
	$flag = 0;
	@lines = split(/\n/, $text);
	foreach $line (@lines) {
		if ($line =~ m|<!-Source: (\d+)-!>|) {
			$flag = $1;
		} elsif ($line =~ m|<!-/Source: $flag-!>|) {
			$flag = 0;
		} elsif ($flag) {
			$source{$flag} .= $line;
		}
	}
	foreach $key (keys(%source)) {
		$u = &unescape($source{$key});
		if ($u =~ m|\\image_alreadyuploaded| || $u =~ m|\\jpeg_alreadyuploaded| || $u =~ m|attachment_alreadyuploaded|) {
			($lint, $message_var_replace) = &webtags($u, 0, 1);
			@lines = split(/\n/, $message);
			$ctr = 0; $flag = 0;
			foreach $line (@lines) {
				$ctr += 1;
				if ($line =~ m|<!-/Post: $key-!>|) {
					$flag = ($ctr - 1);
					last;
				}
			}
			if ($flag) {
				$lines[$flag-1] = $message_var_replace;
			}
			$message = join("\n", @lines);
		}
	}
	return $message;
}

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

sub profile_editor_screen {
	local ($file, $username, $group, $username_editing, $action_url, $action, $editflag) = @_;
	$file =~ tr/A-Z/a-z/;
	$IS_MODERATOR = 0;
	open (FILE, "$admin_dir/$file.txt"); @file = <FILE>; close (FILE);
	if ($file eq "passwd") {
		($uline) = grep(/^$username:/, @file);
		$IS_MODERATOR = 1;
	} else {	
		@u = grep(/^$username:/, @file);
		($uline) = grep(/:$group\s*$/, @u);
	}
	chop ($uline) if $uline =~ m|\n$|;
	if ($uline eq "") {	
		&error_message("Edit Profile Error", "Could not find entry for $username in file $file!");
	}
	($username, $password, $email, $fullname, $editing, $email_notify, $lastcheck, $group) = split(/:/, $uline);
	@emt = split(/,/, $email_notify);
	foreach $l (@emt) {
		if ($l =~ m|^(\d+)/|) {
			$l = $1;
		}
	}
	&header;
	&printuntil(1, 1, 0, $L{PROFEDIT_TITLE});
	print "<FONT SIZE=3><CENTER><B>$L{PROFEDIT_TITLE}";
	print ": \u$username" if $editing;
	print "</B></CENTER></FONT>\n";
	print "<HR>\n";
	if ($editflag == 1) {
		print "<B><A HREF=\"$cgiurlm?username=$username_editing&cmd=user_mgr\" ";
		print "onMouseOver=\"return setStatus('Return to User Manager group selection screen')\">";
		print "User Manager</A>:\n";
		print "<A HREF=\"$cgiurlm?username=$username_editing&cmd=user_mgr_2&group=$group\" ";
		print "onMouseOver=\"return setStatus('Return to editing users in \u$group')\">";
		print "Edit \u$group</A>:\n";
		print "Edit \u$username</B><HR>\n";
	} elsif ($editflag == 2) {
		print "<B><A HREF=\"$cgiurlm?username=$username_editing&cmd=moderator_mgr\" ";
		print "onMouseOver=\"return setStatus('Return to Moderator Manager')\">";
		print "Moderator Manager</A>:\n";
		print "Edit \u$username</B><HR>\n";
	}
	print "<H4>$L{PROFEDIT_INFO}</H4>\n";
	print "<FORM ACTION=$action_url METHOD=POST>\n";
	print "<INPUT TYPE=HIDDEN NAME=action VALUE=$action>\n";
	print "<INPUT TYPE=HIDDEN NAME=action2 VALUE=infosave>\n";
	print "<INPUT TYPE=HIDDEN NAME=username VALUE=$username_editing>\n";
	print "<INPUT TYPE=HIDDEN NAME=username_edit VALUE=$username>\n";
	print "<INPUT TYPE=HIDDEN NAME=group VALUE=$group>\n";
	print "<INPUT TYPE=HIDDEN NAME=password VALUE=\"$FORM{'password'}\">\n";
	print "<TABLE WIDTH=100% BORDER=1><TR><TD>\n";
	print "<TABLE>\n";
	print "<TR><TD>$fs<B>$L{PROFEDIT_YOURUSERNAME}</B></FONT><TD><TD>$fs<B>\u$username</B></FONT></TD></TR>\n";
	print "<TR><TD>$fs<B>$L{PROFEDIT_YOURFULLNAME}</B></FONT><TD><TD><INPUT TYPE=TEXT NAME=profile_fullname SIZE=35 VALUE=\"$fullname\" MAXLENGTH=40></TD></TR>\n";
	print "<TR><TD>$fs<B>$L{PROFEDIT_YOUREMAIL}</B></FONT><TD><TD><INPUT TYPE=TEXT NAME=profile_email SIZE=35 VALUE=\"$email\" MAXLENGTH=40></TD></TR>\n";
	print "</TABLE><P>$fs<INPUT TYPE=SUBMIT VALUE=\"$L{PROFEDIT_SAVEINFO}\"></FONT>\n";
	print "</TD></TR></TABLE></FORM>\n";
	if ($GLOBAL_OPTIONS{'email'}) {
		print "<HR>\n";
		print "<H4>$L{PROFEDIT_EMAILNOTIFY}</H4>\n";
		print "<FORM ACTION=$action_url METHOD=POST>\n";
		print "<INPUT TYPE=HIDDEN NAME=username VALUE=$username_editing>\n";
		print "<INPUT TYPE=HIDDEN NAME=username_edit VALUE=$username>\n";
		print "<INPUT TYPE=HIDDEN NAME=action VALUE=$action>\n";
		print "<INPUT TYPE=HIDDEN NAME=action2 VALUE=notifysave>\n";
		print "<INPUT TYPE=HIDDEN NAME=group VALUE=$group>\n";
		print "<INPUT TYPE=HIDDEN NAME=password VALUE=\"$FORM{'password'}\">\n";
		print "<TABLE WIDTH=100% BORDER=1><TR><TD>$fs\n";
		print "$L{PROFEDIT_CHOOSETOPICS}\n<P><UL>";
		open (TOP, "$message_dir/board-topics.html"); @top = <TOP>; close (TOP);
		@topics = grep(/^<!-Top:/, @top);
		foreach $t (@topics) {
			if ($t =~ m|<!-Top: (\d+)-!>|) {
				$o = $1;
				&extract("//$o/$o.$ext");
				print "<INPUT TYPE=CHECKBOX NAME=notify_$o VALUE=1";
				print " CHECKED" if grep(/^$o$/, @emt);
				print "> $topic_name<BR>\n";
			}
		}
		print "</UL><P>$L{PROFEDIT_MYPOSTS}\n<P><UL>\n";
		print "<INPUT TYPE=CHECKBOX NAME=notify_0 VALUE=1";
		print " CHECKED" if grep(/^0$/, @emt);
		print "> $L{PROFEDIT_MYPOSTSBOX}<P></UL>\n";
		print "<P><INPUT TYPE=SUBMIT VALUE=\"$L{PROFEDIT_SAVEINFO}\"></FONT></TD></TR></TABLE></FORM>\n";
	}
	if ($GLOBAL_OPTIONS{'pwchange'} ne "0" || $editflag || $IS_MODERATOR) {
		print "<HR>\n";
		print "<H4>$L{PROFEDIT_CHANGEPASSWORD}</H4>\n";
		print "<FORM ACTION=$action_url METHOD=POST>\n";
		print "<INPUT TYPE=HIDDEN NAME=username VALUE=$username_editing>\n";
		print "<INPUT TYPE=HIDDEN NAME=username_edit VALUE=$username>\n";
		print "<INPUT TYPE=HIDDEN NAME=action VALUE=$action>\n";
		print "<INPUT TYPE=HIDDEN NAME=group VALUE=$group>\n";
		print "<INPUT TYPE=HIDDEN NAME=action2 VALUE=changepass>\n";
		print "<INPUT TYPE=HIDDEN NAME=password VALUE=\"$FORM{'password'}\">\n";
		print "<TABLE WIDTH=100% BORDER=1><TR><TD>$fs\n";
		print "$L{PROFEDIT_CHANGEPASSWORD_INSTR}<P>";
		print "<TABLE><TR><TD>$fs<B>$L{PROFEDIT_NEWPASS}</B></FONT></TD><TD><INPUT TYPE=PASSWORD NAME=pass_1 SIZE=15></TD></TR>\n";
		print "<TR><TD>$fs<B>$L{PROFEDIT_VERIFY}</B></FONT></TD><TD><INPUT TYPE=PASSWORD NAME=pass_2 SIZE=15></TD></TR>\n";
		print "</TABLE>\n";
		print "<P><INPUT TYPE=SUBMIT VALUE=\"$L{PROFEDIT_SAVEBUTTON}\">\n";
		print "</TD></TR></TABLE>";
		print "</FORM>\n";
	}
	if ($editflag) {
		print "<HR>\n";
		print "<H4>Editing Privileges</H4>\n";
		print "<FORM ACTION=$action_url METHOD=POST>\n";
		print "<INPUT TYPE=HIDDEN NAME=username VALUE=$username_editing>\n";
		print "<INPUT TYPE=HIDDEN NAME=username_edit VALUE=$username>\n";
		print "<INPUT TYPE=HIDDEN NAME=action VALUE=$action>\n";
		print "<INPUT TYPE=HIDDEN NAME=action2 VALUE=editpriv>\n";
		print "<INPUT TYPE=HIDDEN NAME=group VALUE=$group>\n";
		print "<TABLE WIDTH=100% BORDER=1><TR><TD>$fs\n";
		print "Choose whether this person is able to edit his or her own profile.<P>\n";
		print "<UL>\n";
		print "<INPUT TYPE=RADIO NAME=editing VALUE=1";
		print " CHECKED" if $editing == 1;
		print "> Editing is <FONT COLOR=00aa00><B>enabled</B></FONT><BR>\n";
		print "<INPUT TYPE=RADIO NAME=editing VALUE=0";
		print " CHECKED" if $editing == 0;
		print "> Editing is <FONT COLOR=ff0000><B>disabled</B></FONT><BR>\n";
		print "</UL><P>\n";
		print "<INPUT TYPE=SUBMIT VALUE=\"Save Editing Setting\">\n";	
		print "</TD></TR></TABLE></FORM>\n";
	}
	&ex('printuntil', 3, 17, 0, "", 0, 1);
	exit(0);
}

#---SEPARATOR---#

sub verify_owner {
	local ($owner, $username) = @_;
	$username =~ tr/A-Z/a-z/;
	local (@group_data, $group, $usernames, @username, $groupname);
	open (GROUP, "$admin_dir/groups.txt") || &error_message("File Error", "Cannot open group file (groups.txt)!");
	@group_data = <GROUP>;
	close (GROUP);
	foreach $group (@group_data) {
		chop ($group) if $group =~ /\n$/;
		($groupname, $usernames) = split(/:/, $group);
		if ($groupname eq $owner) {
			@username = split(/,/, $usernames);
			if (grep (/^$username$/, @username)) {
				return 1;
			} else {
				return 0;
			}
		}
	}
	return 0;
}

#---SEPARATOR---#

sub profanity_editor {
	&header;
	print "<HTML><HEAD><TITLE>Profanity List Editor</TITLE>\n";
	print '<BODY BGCOLOR="ffffff" TEXT="000000" LINK="0000FF" VLINK="0000FF" ';
	print "onLoad=\"window.defaultStatus = 'Profanity List Editor'\">$fs\n";
	print "<FONT SIZE=3><CENTER><B>Profanity List Editor</B></CENTER></FONT>\n";
	print "<HR>\n";
	print "<B><A HREF=\"$cgiurlm?cmd=options_mgr&username=$superuser\" onMouseOver=\"";
	print "window.status = 'Return to the Options Manager'; return true\">Options Manager";
	print "</A>: Profanity List Editor</B>\n<HR>\n";	
	print "<FORM ACTION=$cgiurl METHOD=POST>\n";
	print "<INPUT NAME=action TYPE=HIDDEN VALUE=cuss_save>\n";
	print "<INPUT NAME=username TYPE=HIDDEN VALUE=$superuser>\n";
	print "<TABLE BGCOLOR=#ffffcc BORDER=1 WIDTH=100%><TR><TD>$fs";
	print "Using the box below, enter profanity/cuss words that are to be blocked out.\n";
	print "<B>Enter one word per line</B>.<P>\n";
	print "<TEXTAREA NAME=cusswords COLS=20 ROWS=6>";
	open (CUSS, "$admin_dir/cuss.txt"); @cuss = <CUSS>; close (CUSS);
	undef @word;
	foreach $line (@cuss) {
		if ($line =~ m|^!(.*)|) {
			$word = $1;
			$word =~ tr/a-zA-Z/b-zaB-ZA/;
			push (@word, $word);
		}
	}
	foreach $line (sort(@word)) {
		print "$line\n";
	}
	print "</TEXTAREA><P>\n";
	print "$fs<INPUT TYPE=SUBMIT VALUE=\"Save List\"></TD></TR></TABLE>\n";
	print "</FORM></BODY></HTML>\n";
	exit(0);
}

#---SEPARATOR---#

sub cuss_save {
	local ($words) = @_;
	&lock("$admin_dir/cuss.txt");
	@words = split(/\n/, $words);
	@words = grep(/\S/, @words);
	undef @cuss;
	foreach $word (@words) {
		$word =~ tr/b-zaB-ZA/a-zA-Z/;
		$word =~ s/^\s+//; $word =~ s/\s+$//;
		push (@cuss, "!$word\n");
	}
	open (CUSS, ">$admin_dir/cuss.txt"); print CUSS @cuss; close (CUSS);
	&unlock("$admin_dir/cuss.txt");
}