# FILE: src-board-subs-101
#-------------------------------------------------------------------------------
# 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---#

sub show_secure_image {
	my ($file, $content) = @_;
	if ($file =~ m|^/(\d+)/(\d+)\.(\w+)| && $content eq "") {
		$tn = $1; $gn = $2; $ex = $3;
		if ($tn == 0) {
			$filename = "$admin_dir/queue/$gn.$ex";
		} else {
			$filename = "$secdir/$tn/$gn.$ex";
		}
		if (-e "$filename") {
			print "Content-type: image/gif\n" if $ex eq "gif";
			print "Content-type: image/jpeg\n" if $ex eq "jpg";
			print "Content-disposition: inline; filename=$gn.$ex\n\n";
			open (FILE, $filename);
			binmode(FILE);
			binmode(STDOUT);
			@file = <FILE>;
			close (FILE);
			print @file;
		} else {
			&error_message("Invalid Image", "The referenced image is invalid");
		}
	} elsif ($file =~ m|^/(\d+)/([\w\-\.]+)| && $content ne "") {
		$tn = $1; $fn = $2;
		if ($tn == 0) {
			$filename = "$admin_dir/queue/$fn";
		} else {
			$filename = "$secdir/$tn/$fn";
		}
		if (-e "$filename") {
			print "Content-type: $content\n";
			print "Content-disposition: inline; filename=$fn\n\n";
			open (FILE, $filename);
			binmode(FILE);
			binmode(STDOUT);
			@file = <FILE>;
			close (FILE);
			print @file;
		} else {
			&error_message("Invalid Attachment", "The referenced attachment is invalid");
		}
	} else {
		&error_message("Invalid File Name", "The referenced file is invalid ($content)");
	}
}

#---SEPARATOR---#

sub check_queue_status {
	my ($topic_number, $poster_type) = @_;
	my ($tn, %q, $i, $t);
	open (QUEUE, "$admin_dir/queue.txt"); @queue = <QUEUE>; close (QUEUE);
	($tn) = grep(/^$topic_number:/, @queue);
	if ($tn eq "") {
		return 0;
	} else {
		$tn =~ m|^$topic_number:(\d+):(\d+):(\d+):(\d+)|;
		($q{0}, $q{1}, $q{2}, $q{3}) = ($1, $2, $3, $4);
		$t = $poster_type;
		for ($i = 3; $i >= 0; $i--) {
			$ti = 1; for ($q = 0; $q < $i; $q++) { $ti *= 2; }
			if (($t - $ti) >= 0) {
				$t -= $ti;
				if ($q{$i} == 0) {
					return 0;
				}
			}
		}
		return 1;
	}
}

#---SEPARATOR---#
#REQ:get_number

sub send_message_to_queue {
	my ($topic_number, $me_number, $message_hold, $newmessage, $fullname, $username, $group, $subject, $email, $profile) = @_;
	&extract("//$topic_number/$me_number.$ext");
	$num = &get_number;
	$ctr = 0;
	$message_hold = " $message_hold";
	while ($message_hold =~ /([^\\])\\image\{([^\}]*)\}/) {
		$ch = $1; $tag = $2;
		++$ctr;
		$tag =~ s/\\//g; $tag =~ s/\{//g; $tag =~ s/\}//g;
		$message_hold = $` . "$ch\\image_notuploaded{$ctr,$tag}" . $';
	}
	if ($L{IMAGE_TAG_NAME} ne "image" && $L{IMAGE_TAG_NAME} ne "") {
		$trep = $L{IMAGE_TAG_NAME};
		while ($message_hold =~ /([^\\])\\$trep\{([^\}]*)\}/) {
			$ch = $1; $tag = $2;
			$tag =~ s/\\//g; $tag =~ s/\{//g; $tag =~ s/\}//g;
			++$ctr;
			$message_hold = $` . "$ch\\image_notuploaded{$ctr,$tag}" . $';
		}
	}
	if ($pro) {
		while ($message_hold =~ /([^\\])\\attach\{([^\}]*)\}/) {
			$ch = $1; $tag = $2;
			++$ctr;
			$tag =~ s/\\//g; $tag =~ s/\{//g; $tag =~ s/\}//g;
			$message_hold = $` . "$ch\\attachment_notuploaded{$ctr,$tag}" . $';
		}
		if ($L{ATTACH_TAG_NAME} ne "attach" && $L{ATTACH_TAG_NAME} ne "") {
			$trep = $L{ATTACH_TAG_NAME};
			while ($message_hold =~ /([^\\])\\$trep\{([^\}]*)\}/) {
				$ch = $1; $tag = $2;
				$tag =~ s/\\//g; $tag =~ s/\{//g; $tag =~ s/\}//g;
				++$ctr;
				$message_hold = $` . "$ch\\attachment_notuploaded{$ctr,$tag}" . $';
			}
		}
	}
	&lock("send_message_to_queue", "$admin_dir/queue/$num.txt");
	if (open(FILE, ">$admin_dir/queue/$num.txt")) {
		$message_hold =~ s/^\s+//; $message_hold =~ s/\s+$//;
		print FILE "PAGE: $topic_number/$me_number\n";
		print FILE "SOURCE: ", &escape($message_hold), "\n";
		print FILE "TEXT: ", &escape($newmessage), "\n";
		print FILE "POSTBY: ", &escape($fullname), "\n";
		print FILE "USERNAME: $username\n";
		print FILE "GROUP: $group\n";
		print FILE "TIME: ", time, "\n";
		print FILE "EMAIL: ", &escape($email), "\n";
		print FILE "PROFILE: ", &escape($profile), "\n";
		print FILE "SUBJECT: ", &escape($subject), "\n" if $subject;
		print FILE "RA: ", &escape($ENV{'REMOTE_ADDR'}), "\n";
		print FILE "RH: ", &escape($ENV{'REMOTE_HOST'}), "\n";
		close (FILE);
		&unlock("send_message_to_queue", "$admin_dir/queue/$num.txt");
		&lock("send_message_to_queue", "$admin_dir/queue/index.txt");
		open (INDEX, ">>$admin_dir/queue/index.txt");
		print INDEX "$num/$topic_number/$me_number/$username/$group/", time, "/$owner\n";
		close (INDEX);
		&unlock("send_message_to_queue", "$admin_dir/queue/index.txt");
		chmod (oct($perms0666), "$admin_dir/queue/$num.txt");
		return ($num, &unescape($message_hold));
	} else {
		&unlock("send_message_to_queue", "$admin_dir/queue/$num.txt");
		&error_message("File Write Error", "Could not create queued message file in $admin_dir/queue/$num.txt");
	}
}

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

sub queue_submitted {
	my ($topic_number, $page_number, $append, $doappend) = @_;
	$append = "" if $doappend eq "";
	&header;
	&printuntil(1, 1, 0, "$L{MQ_TITLE}");
	print "<FONT SIZE=4><CENTER><B>$L{MQ_TITLE}</B></CENTER></FONT><HR>\n";
	print $L{MQ_DESCRIPTION};
	print "<P>\n";
	$t = $L{MQ_LEAVE};
	&extract("//$topic_number/$page_number.$ext");
	$t =~ s|\%aopen|<A HREF="$message_url/$topic_number/$page_number.$ext">|g if (-e "$message_dir/$topic_number" && !$append);
	$t =~ s|\%aopen|<A HREF="$script_url/board-auth.$cgi_extension\?file=/$topic_number/$page_number.$ext">|g if (!-e "$message_dir/$topic_number" && !$append);
	$t =~ s|\%aopen|<A HREF="$script_url/board-admin-menuonly.$cgi_extension$append">|g if $append;
	$t =~ s|\%aclose|</A>|g;
	$t =~ s|\%pagename|$me_name|g;
	print $t;
	&printuntil(3, 17, 0, "", 0, 1);
	exit(0);
}

#---SEPARATOR---#

sub check_queue {
	my ($username) = @_;
	open (GROUP, "$admin_dir/groups.txt");
	@group = <GROUP>;
	close (GROUP);
	undef @gr;
	foreach $line (@group) {
		($gn, $u) = split(/:/, $line); $u =~ s/\s//g;
		@u = split(/,/, $u);
		push (@gr, $gn) if grep(/^$username$/, @u);
	}
	undef @ret;
	if (open(QUEUE, "$admin_dir/queue/index.txt")) {
		@queue = <QUEUE>;
		close (QUEUE);
		foreach $line (@queue) {
			$line =~ s/\s//g;
			($index, $topic, $page, $username, $group, $time, $owner) = split(/\//, $line);
			push (@ret, $line) if grep(/^$owner$/, @gr);
		}
	}
	return @ret;
}

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

sub register_1 {
	&header;
	&printuntil(1, 1, 0, $L{REGISTER_TITLE});
	print "<CENTER><FONT SIZE=+1><B>$L{REGISTER_TITLE}</B></FONT></CENTER><HR>\n";
	&_get_group_info;
	if ($tpc == 0) {
		$l = $L{REGISTER_NOTOPICS};
		$l =~ s/\%aopen/<A HREF="$script_url\/board-contact.$cgi_extension">/g;
		$l =~ s/\%aclose/<\/A>/g;
		print $l;
		&printuntil(3, 17, 0, $L{REGISTER_TITLE});
		exit(0);
	}
	open (SELFREG, "$admin_dir/selfreg.txt");
	@selfreg = <SELFREG>;
	close (SELFREG);
	undef %S;
	foreach $line (sort(@selfreg)) {
		$line =~ s/\n$//;
		if ($line =~ m|^S:(.*)|) {
			$x = $1;
			($var, $param) = split(/-/, $x);
			$S{$var} = &unescape($param);
		} elsif ($line =~ m|^W:(.*)|) {
			$x = $1;
			($var, $param) = split(/-/, $x);
			$W{$var} = &unescape($param);
		}
	}
	if ($W{'message'} ne "") {
		print "<P>$W{'message'}\n";
	} else {
		print $L{REGISTER_1_INSTR};
	}
	print "<FORM ACTION=\"$script_url/board-profile.$cgi_extension\" METHOD=POST>\n";
	print "<P>\n";
	print "<TABLE>\n";
	if ($S{'tl'} != 0) {
		print "<TR><TD VALIGN=TOP><FONT FACE=\"$face\" SIZE=$size>$L{REGISTER_1A_INSTR}</FONT></TD>\n";
		print "<TD VALIGN=TOP><FONT FACE=\"$face\" SIZE=$size>\n";
		foreach $line (@top) {
			if ($line =~ m|<!-Top: (\d+)-!>|) {
				$o = $1;
				if ($array{$o}) {
					if (!$S{'hide'} || -e "$message_dir/$o") {
						print "<INPUT TYPE=";
						print "CHECKBOX" if !$S{'oneonly'};
						print "RADIO" if $S{'oneonly'};
						print " NAME=REGFOR VALUE=$o ";
						print "CHECKED" if $S{'chbydef'};
						print "> $name{$o}<BR>\n";
					}
				}
			}
		}
		print "</FONT></TD></TR>\n";
	} else {
		foreach $line (@top) {
			if ($line =~ m|<!-Top: (\d+)-!>|) {
				$o = $1;
				if ($array{$o}) {
					if (!$S{'hide'} || -e "$message_dir/$o") {
						print "<INPUT TYPE=HIDDEN NAME=REGFOR VALUE=$o>\n";
					}
				}
			}
		}
	}
	print "<TR><TD VALIGN=CENTER><FONT FACE=\"$face\" SIZE=$size>$L{REGISTER_1B_INSTR}</FONT></TD>\n";
	print "<TD VALIGN=TOP><INPUT TYPE=TEXT NAME=username SIZE=15 MAXLENGTH=15></TD></TR>\n";
	print "<TR><TD VALIGN=CENTER><FONT FACE=\"$face\" SIZE=$size>$L{PROFEDIT_YOURFULLNAME}</FONT></TD>\n";
	print "<TD VALIGN=TOP><INPUT TYPE=TEXT NAME=fullname SIZE=45 MAXLENGTH=40></TD></TR>\n";
	print "<TR><TD VALIGN=CENTER><FONT FACE=\"$face\" SIZE=$size>$L{PROFEDIT_YOUREMAIL}</FONT></TD>\n";
	print "<TD VALIGN=TOP><INPUT TYPE=TEXT NAME=email SIZE=45 MAXLENGTH=40></TD></TR>\n";
	print "</TABLE>\n";
	print "<INPUT TYPE=HIDDEN NAME=action VALUE=register_2>\n";
	print "<P><INPUT TYPE=SUBMIT VALUE=\"$L{REGISTER_1_BUTTON}\"></FORM>\n";
	&printuntil(3, 17, 0, $L{REGISTER_TITLE});
	exit(0);
}

#---SEPARATOR---#
#REQ:printuntil
#REQ:send_email_message
#REQ:_get_group_info
#REQ:add_user
#REQ:save_profile_information

sub register_2 {
	&header;
	&printuntil(1, 1, 0, $L{REGISTER_TITLE});
	print "<CENTER><FONT SIZE=+1><B>$L{REGISTER_TITLE}</B></FONT></CENTER><HR>\n";
	$newuser = $FORM{'username'};
	$newuser =~ tr/A-Z/a-z/;
	$nu_temp = $newuser;
	while ($nu_temp =~ m|(\W)|) {
		$nu_temp = join("", $`, $');
		$o = ord($1); $m = $1;
		if ($o < 126) {
			print $L{REGISTER_USERNAME_ERROR};
			&register_2_footer;
		}
	}
	if (length($newuser) < 3 || length($newuser) > 15) {
		print $L{REGISTER_USERNAME_ERROR};
		&register_2_footer;
	}
	$email = $FORM{'email'};
	$email = substr($FORM{'email'}, 0, 40) if length($FORM{'email'} > 40);
	&_get_group_info;
	if ($email =~ m|^([\w\.\-\+]+)\@([\w\.\-\+]+)$| || ($GLOBAL_OPTIONS{'require_valid_email'} == 0 && $GLOBAL_OPTIONS{'require_valid_email'} ne "")) {
		$domain = $2; $domain =~ tr/A-Z/a-z/;
		open (ADMIN, "$admin_dir/selfreg.txt"); @admin = <ADMIN>; close (ADMIN);
		foreach $line (@admin) {
			if ($line =~ m|^B:(.*)|) {
				$d = $1;
				if ($d eq $domain || $domain =~ m|$d$|) {
					print $L{REGISTER_DOMAIN_BAN};
					&register_2_footer;
				}
			}
		}
	} else {
		print $L{REGISTER_EMAIL_ERROR};
		&register_2_footer;
	}
	$email_lc = $email; $email_lc =~ tr/A-Z/a-z/;
	$full = $FORM{'fullname'};
	$full = substr($FORM{'fullname'}, 0, 40) if length($FORM{'fullname'} > 40);
	open (USERS, "$admin_dir/users.txt"); @users = <USERS>; close (USERS);
	open (PASSWD, "$admin_dir/passwd.txt"); @passwd = <PASSWD>; close (PASSWD);
	foreach $line (@passwd) {
		push (@users, $line);
	}
	foreach $line (@users) {
		($user, $pass, $email) = split(/:/, $line);
		$email =~ tr/A-Z/a-z/;
		if ($email eq $email_lc && $GLOBAL_OPTIONS{'allow_register_same_email'} == 0) {
			print $L{REGISTER_EMAIL_TAKEN};
			&register_2_footer;
		}
		if ($user eq $newuser) {
			print $L{REGISTER_USERNAME_TAKEN};
			&register_2_footer;
		}
	}
	if ($FORM{'REGFOR'} eq "") {
		print $L{REGISTER_NOTOPICS_SELECTED};
		&register_2_footer;
	}
	@topics = split(/,/, $FORM{'REGFOR'});
	undef @email_user; undef @queue_user; undef @auto_approve;
	foreach $topic (@topics) {
		if ($array{$topic} == 1) {
			push (@email_user, $topic);
		}
		if ($array{$topic} == 2) {
			push (@queue_user, $topic);
		}
		if ($array{$topic} == 3) {
			push (@auto_approve, $topic);
		}
	}
	undef %group_done;
	print $L{"REGISTER_SUCCESS"};
	print "<HR><P>\n";
	srand(time|$$);
	if (scalar(@auto_approve)) {
		$autopass = &initial_password;
		$ts = "";
		$gs = "";
		foreach $topic (@auto_approve) {
			&extract("//$topic/$topic.$ext");
			$ts .= "<LI>" . &remove_html($topic_name) . "\n";
			$group = $group{$topic};
			next if $group_done{$group};
			$gs .= "$group,";
			$newline = &add_user("", $newuser, $autopass, $autopass, $group, $FORM{'email'}, $full);
			&save_profile_information("", "", "", 3, "", "", "", "USERS:$newline");
			$group_done{$group} = 1;
		}
		chop ($gs) if $gs;
		$l = $L{REGISTER_AUTOMATIC};
		$l =~ s/\%topic_list/$ts/g;
		$l =~ s!\%aopen!<A HREF="$script_url/board-profile.$cgi_extension">!g;
		$l =~ s!\%aclose!</A>!g;
		$l =~ s!\%password!$autopass!g;
		print "<P>\n";
		print $l;
		print "<P><HR><P>\n";
		$ts_auto = $ts; $ts_auto =~ s/\n/\n /g; $ts_auto =~ s/<LI>/\* /g;
	}
	if (scalar(@email_user)) {
		$emailpass = &initial_password;
		$ts = "";
		foreach $topic (@email_user) {
			&extract("//$topic/$topic.$ext");
			$ts .= "<LI>" . &remove_html($topic_name) . "\n";
			$group = $group{$topic};
			next if $group_done{$group};
			$newline = &add_user("", $newuser, $emailpass, $emailpass, $group, $FORM{'email'}, $full);
			&save_profile_information("", "", "", 4, "", "", "", "USERS:$newline");
			$group_done{$group} = 1;
		}
		$l = $L{REGISTER_PW_MAILED};
		$l =~ s/\%topic_list/$ts/g;
		$l =~ s!\%aopen!<A HREF="$script_url/board-profile.$cgi_extension">!g;
		$l =~ s!\%aclose!</A>!g;
		print "<P>\n";
		print $l;
		print "<P><HR><P>\n";
		$ts_emailed = $ts; $ts_emailed =~ s/\n/\n /g; $ts_emailed =~ s/<LI>/\* /g;
	}
	if (scalar(@queue_user)) {
		$secretpass = &initial_password;
		$ts = "";
		foreach $topic (@queue_user) {
			&extract("//$topic/$topic.$ext");
			$ts .= "<LI>$topic_name\n";
			$group = $group{$topic};
			next if $group_done{$group};
			$newline = &add_user("", $newuser, $secretpass, $secretpass, $group, $FORM{'email'}, $full);
			&save_profile_information("*Q*", "", "", 3, "", "", "", "USERS:$newline");
			&lock("register_2", "$admin_dir/selfreg.txt");
			open (ADMIN, ">>$admin_dir/selfreg.txt");
			print ADMIN "Q:$newline";
			close (ADMIN);
			&unlock("register_2", "$admin_dir/selfreg.txt");
			$group_done{$group} = 1;
		}
		$l = $L{REGISTER_PW_QUEUE};
		$l =~ s/\%topic_list/$ts/g;
		print "<P>\n";
		print $l;
		print "<P>\n";
		print "<FORM ACTION=$script_url/board-profile.$cgi_extension METHOD=POST NAME=prinfo>\n";
		print "<INPUT TYPE=HIDDEN NAME=username VALUE=\"$newuser\">\n";
		print "<INPUT TYPE=HIDDEN NAME=action VALUE=\"register_info\">\n";
		print "<INPUT TYPE=HIDDEN NAME=group VALUE=\"$group\">\n";
		print "<TABLE WIDTH=100% BORDER=1><TR><TD>$fs\n";
		print "$L{PRED_PERSONALINFO_INSTR}<P>";
		print "<TABLE>\n";
		open (CONFIG, "$admin_dir/profiles/config.txt");
		@config = <CONFIG>;
		close (CONFIG);
		foreach $line (@config) {
			$line =~ s/\n$//;
			($varname, $descr, $shown, $type, $rows, $required) = split(/:/, $line);
			$varname2 = $varname;
			$varname2 = "VAR_" . $varname if $varname !~ /\D/;
			print "<TR>\n";
			print "<TD VALIGN=TOP>$fs";
			print "<B>" if $required;
			print &unescape($descr);
			print "</B>" if $required;
			print ":</FONT></TD><TD>\n";
			if ($rows == 1) {
				print "<INPUT TYPE=TEXT NAME=$varname2 SIZE=40 VALUE='$P{$varname}'>";
			} else {
				print "<TEXTAREA NAME=$varname2 COLS=38 ROWS=$rows WRAP=VIRTUAL>";
				print "$P{$varname}</TEXTAREA>";
			}
			print "</TD></TR>\n";
		}
		foreach $key (sort {$a <=> $b} keys(%V)) {
			$key2 = $key;
			$key2 = "VAR_" . $key if $key !~ /\D/;
			print "<TR><TD ALIGN=CENTER VALIGN=CENTER>";
			print "<INPUT TYPE=CHECKBOX NAME=$key", "_hide VALUE=1";
			print " CHECKED" if $P{$key2 . "_hide"};
			print "></TD>\n";
			print "<TD VALIGN=TOP>$fs";
			print &unescape($V{$key});
			print ":</FONT></TD><TD>\n";
			print "<INPUT TYPE=TEXT NAME=$key2 SIZE=40 VALUE='$P{$key}'>";
			print "</TD></TR>\n";
		}
		print "</TABLE>\n";
		print "<P><INPUT TYPE=SUBMIT VALUE=\"$L{PROFEDIT_SAVEINFO}\">\n";
		print "</TD></TR></TABLE>";
		print "</FORM>\n";
		print "<P><HR><P>\n";
	}
	&printuntil(3, 17, 0, $L{REGISTER_TITLE});

	# This put at the bottom in case e-mail notification fails

	if (scalar(@email_user)) {
		$msg = $L{REGISTER_PW_MAILED_BODY};
		$msg =~ s/\\/\n/g;
		$msg =~ s/\%boardtitle/$title/g;
		$msg =~ s/\%username/$newuser/g;
		$msg =~ s/\%password/$emailpass/g;
		$msg =~ s/\%topiclist/$ts_emailed/g;
		$msg .= "\n\n$html_url\n";
		&send_email_message($FORM{"email"}, $L{REGISTER_PW_MAILED_SUBJECT}, $msg);
	}
	if (scalar(@auto_approve)) {
		if ($L{REGISTER_PW_MAILED_BODY_AUTO} ne "") {
			$msg = $L{REGISTER_PW_MAILED_BODY_AUTO};
		} else {
			$msg = $L{REGISTER_PW_MAILED_BODY};
		}
		$msg =~ s/\\/\n/g;
		$msg =~ s/\%boardtitle/$title/g;
		$msg =~ s/\%username/$newuser/g;
		$msg =~ s/\%password/$autopass/g;
		$msg =~ s/\%topiclist/$ts_auto/g;
		$msg .= "\n\n$html_url\n";
		&send_email_message($FORM{"email"}, $L{REGISTER_PW_MAILED_SUBJECT}, $msg);
	}

	exit(0);
}

sub register_2_footer {
	&printuntil(3, 17, 0, $L{REGISTER_TITLE});
	exit(0);
}

sub initial_password {
	$l = 4 + int(rand(4));
	$lw = "";
	for ($i = 1; $i <= $l; $i++) {
		$letter = int(rand(36)) + 1;
		if ($letter > 26) {
			$letter -= 26;
			$lw .= $letter;
		} else {
			$letter += 64;
			$lw .= pack("c", $letter);
		}
	}
	$lw =~ tr/A-Z/a-z/;
	$lw =~ tr/il1/9a3/;
	return $lw;
}

#---SEPARATOR---#

sub _get_group_info {
	open (TOP, "$message_dir/$board_topics_file"); @top = <TOP>; close (TOP);
	@top = grep(/^<!-Top:/, @top);
	undef %group;
	foreach $line (@top) {
		if ($line =~ m|<!-Top: (\d+)-!>|) {
			$o = $1;
			&extract("//$o/$o.$ext");
			$group{$o} = $owner;
			$name{$o} = $me_name;
		}
	}
	open (ADMIN, "$admin_dir/selfreg.txt"); @admin = <ADMIN>; close (ADMIN);
	$tpc = 0;
	undef %array;
	foreach $line (@admin) {
		if ($line =~ m|^\-:(\w+):(\d+)|) {
			$g = $1; $p = $2;
			if ($p > 0) {
				foreach $line (@top) {
					if ($line =~ m|<!-Top: (\d+)-!>|) {
						$o = $1;
						if ($group{$o} eq $g) {
							$array{$o} = $p;
							$tpc += 1;
						}
					}
				}
			}
		}
	}
}

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

sub register_thanks {
	&header;
	&printuntil(1, 1, 0, $L{REGISTER_TITLE});
	print "<CENTER><FONT SIZE=+1><B>$L{REGISTER_TITLE}</B></FONT></CENTER><HR>\n";
	$l = $L{REGISTER_THANKS};
	$l =~ s!\%aopen!<A HREF="$message_url/$board_topics_file">!g;
	$l =~ s!\%aclose!</A>!g;
	print $l;
	&printuntil(3, 17, 0, $L{REGISTER_TITLE});
	exit(0);
}

#---SEPARATOR---#

sub user_selfreg_config {
	my ($username, $group) = @_;
	return 0 if $GLOBAL_OPTIONS{'allow_selfreg'} == 0;
	open (SELFREG, "$admin_dir/selfreg.txt");
	@selfreg = <SELFREG>;
	close (SELFREG);
	($gline) = grep(/^\-:$group:/, @selfreg);
	chop $gline if $gline =~ m|\n$|;
	($foo, $groupname, $param) = split(/:/, $gline);
	print "<HR>\n";
	print "<H3>User Self-Registration</H3>\n";
	print "<FORM ACTION=\"$cgiurl3\" METHOD=POST>\n";
	print "<INPUT TYPE=HIDDEN NAME=username VALUE=$username>\n";
	print "<INPUT TYPE=HIDDEN NAME=action VALUE=selfreg>\n";
	print "<INPUT TYPE=HIDDEN NAME=group VALUE=$group>\n";
	print "<TABLE BORDER=1 BGCOLOR=ffffcc WIDTH=100%><TR><TD>$fs";
	print "<INPUT TYPE=RADIO NAME=selfreg VALUE=0";
	print " CHECKED" if $param == 0;
	print "> Disabled<BR>\n";
	print "<INPUT TYPE=RADIO NAME=selfreg VALUE=2";
	print " CHECKED" if $param == 2;
	print "> Queue applications<BR>\n";
	if ($GLOBAL_OPTIONS{'capable'} ne "0") {
		print "<INPUT TYPE=RADIO NAME=selfreg VALUE=1";
		print " CHECKED" if $param == 1;
		print "> Automatic (e-mail verification -- password sent via e-mail)<BR>\n";
	} else {
		print "[N/A] Automatic (e-mail verification -- password sent via e-mail)<BR>\n";
	}
	print "<INPUT TYPE=RADIO NAME=selfreg VALUE=3";
	print " CHECKED" if $param == 3;
	print "> Automatic (no e-mail verification -- password displayed immediately)\n";
	print "<P><INPUT TYPE=SUBMIT VALUE=\"Save Settings\">\n";
	print "</TD></TR></TABLE></FORM>\n";
}

#---SEPARATOR---#

sub user_selfreg_config_save {
	my ($group, $param) = @_;
	return 0 if ($param ne "0" && $param ne "1" && $param ne "2" && $param ne "3");
	open (GROUP, "$admin_dir/groups.txt");
	@grp = <GROUP>;
	close (GROUP);
	if (!grep(/^$group:/, @grp)) {
		&error_message("Group Error", "Requested group ($group) does not exist!");
	}
	&lock("user_selfreg_config_save", "$admin_dir/selfreg.txt");
	open (SELFREG, "$admin_dir/selfreg.txt");
	@selfreg = <SELFREG>;
	close (SELFREG);
	$flag = 0;
	foreach $line (@selfreg) {
		if ($line =~ m|^\-:$group:|) {
			$line = "-:$group:$param\n";
			$flag = 1;
		}
	}
	if ($flag == 0) {
		push (@selfreg, "-:$group:$param\n");
	}
	open (SELFREG, ">$admin_dir/selfreg.txt");
	print SELFREG @selfreg;
	close (SELFREG);
	&unlock("user_selfreg_config_save", "$admin_dir/selfreg.txt");
}

#---SEPARATOR---#

sub userapp_1 {
	my ($username, $groups, $context) = @_;
	open (SELFREG, "$admin_dir/selfreg.txt");
	@selfreg = <SELFREG>;
	close (SELFREG);
	if ($groups) {
		@groups = split(/,/, $groups);
	} else {
		undef @groups;
		open (GROUP, "$admin_dir/groups.txt");
		my (@group) = <GROUP>;
		close (GROUP);
		foreach $line (@group) {
			chop ($line) if $line =~ /\n/;
			($group_name, $moderators) = split(/:/, $line);
			@moderator=split(/,/, $moderators);
			push (@groups, $group_name) if grep(/^$username$/, @moderator);
		}
	}
	$queue = 0;
	foreach $line (@selfreg) {
		if ($line =~ m|^Q:|) {
			chop $line if $line =~ m|\n$|;
			($q, $user, $pass, $email, $full, $edit, $notify, $last, $gr) = split(/:/, $line);
			if (grep(/^$gr$/, @groups)) {
				$queue += 1;
			}
		}
	}
	print "<P><HR><H4>User Applications</H4>\n" if $context == 1;
	if ($queue == 0) {
		print "<B><FONT COLOR=#ff0000>There are no user applications in your queue.</FONT></B>\n" if $context == 1;
	} else {
		if ($context == 1) {
			print "<B>There ";
			print "is 1 user application " if $queue == 1;
			print "are $queue user applications " if $queue > 1;
			print "in your queue.</B><P>\n";
			print "<A HREF=$cgiurl3?action=userqueue&username=$username>Click here to review your queue</A>\n";
		} elsif ($context == 2) {
			print "<IMG SRC=\"$html_url/icons/tree_e.gif\" HEIGHT=16 WIDTH=20 ALIGN=TOP><IMG SRC=\"$html_url/icons/tree_g.gif\" HEIGHT=16 WIDTH=20 ALIGN=TOP> ";
			print "<a href=\"$cgiurl3?action=userqueue&username=$username\" Target=\"Admin_Main\" onMouseOver=";
			print "\"return setStatus('Review your user queue')\"";
			print "><B>";
			print "1 User Application" if $queue == 1;
			print "$queue User Applications" if $queue > 1;
			print "</B></A><BR>\n";
		}
	}
}

#---SEPARATOR---#

sub userapp_framesetter {
	my ($username, $context, $reload_js) = @_;
	&header;
	print "<HTML><HEAD><TITLE>User Application</TITLE></HEAD>\n";
	if ($context == 1) {
		print "<FRAMESET ROWS=50%,50%>\n";
		print "<FRAME NAME=topqueue SRC=\"$cgiurl3?action=userapp_2&username=$username\">\n";
		print "<FRAME NAME=bottomqueue SRC=\"$cgiurl3?action=userqueue&username=$username&blank=1\">\n";
		print "</FRAMESET></HTML>\n";
	} else {
		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 user data<BR>that you choose from the frame above.</B></CENTER>\n";
		print "</BODY></HTML>\n";
	}
	exit(0);
}

#---SEPARATOR---#

sub userapp_2 {
	my ($username, $reload_js) = @_;
	&header;
	print "<HTML><HEAD><TITLE>User Queue</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('Do you really want to refuse the application for ' + name1 + '?  If you reject the application, you will no longer have access to the e-mail address of the applying user!');\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 onLoad=\"window.defaultStatus = 'User Queue'\">\n";
	if ($reload_js) {
		print "<SCRIPT LANGUAGE=\"JavaScript\">\nparent.frames[1].location='$cgiurl3?action=userqueue&username=$username&blank=1'\n</SCRIPT>\n";
	}
	print "$fs<CENTER><FONT SIZE=3><B>User Queue</B></FONT></CENTER><HR>\n";
	print "<B>\n";
	print "<A HREF=\"$cgiurlm?username=$username&cmd=user_mgr\" TARGET=\"Admin_Main\" ";
	print "onMouseOver=\"return setStatus('Return to User Manager')\">User Manager</A>: ";
	print "User Queue</B><HR><P>\n";
	open (SELFREG, "$admin_dir/selfreg.txt");
	@selfreg = <SELFREG>;
	close (SELFREG);
	undef @groups;
	open (GROUP, "$admin_dir/groups.txt");
	my (@group) = <GROUP>;
	close (GROUP);
	foreach $line (@group) {
		chop ($line) if $line =~ /\n/;
		($group_name, $moderators) = split(/:/, $line);
		@moderator=split(/,/, $moderators);
		push (@groups, $group_name) if grep(/^$username$/, @moderator);
	}
	$queue = 0;
	foreach $line (@selfreg) {
		if ($line =~ m|^Q:|) {
			chop $line if $line =~ m|\n$|;
			($q, $user, $pass, $email, $full, $edit, $notify, $last, $gr) = split(/:/, $line);
			if (grep(/^$gr$/, @groups)) {
				$queue += 1;
				push (@q, $line);
			}
		}
	}
	if ($queue == 0) {
		print "<FONT COLOR=ff0000><B>There are no users in your queue</B></FONT>\n";
		print "</BODY></HTML>\n";
		exit(0);
	}
	print "<FORM ACTION=$cgiurl3 METHOD=POST name=sf>\n";
	print "<INPUT TYPE=HIDDEN NAME=SELECTION VALUE=''>\n";
	print "<INPUT TYPE=HIDDEN NAME=username VALUE=$username>\n";
	print "<INPUT TYPE=HIDDEN NAME=action VALUE=userapp_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>Username</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>More Information</B></FONT></TD><TD>&nbsp;</TD></TR>\n";
	$counter = 0; $ctr = 0; $ct = $queue;
	foreach $line (@q) {
		($q, $user, $pass, $email, $full, $edit, $notify, $last, $gr) = 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\u$user</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;
		$index = "$user-$gr";
		print "<INPUT TYPE=CHECKBOX NAME=MARK VALUE=$index>&nbsp;&nbsp;</TD>";
		print "<TD><A HREF=\"javascript:subact('approve', '$index', 'user account \u$user')\" onMouseOver=\"return setStatus('Approve this application')\"><IMG SRC=\"$html_url/icons/approve_icon.gif\" HEIGHT=25 WIDTH=25 BORDER=1></A></TD>";
		print "<TD><A HREF=\"javascript:subact('refuse', '$index', 'user account \u$user')\" onMouseOver=\"return setStatus('Refuse this application')\"><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=\"$cgiurl3?username=$username&action=userapp_disp&user=$user&group=$gr\" TARGET=\"bottomqueue\" onMouseOver=\"return setStatus('View more information about this user')\"><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>";
		print "E-mail: $email<BR>Full Name: $full\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 applications')\" onMouseOver=\"return setStatus('Approve all marked applications')\"><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 applications')\" onMouseOver=\"return setStatus('Refuse all marked applications')\"><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></FORM>\n";
	print "</BODY></HTML>\n";
	exit(0);
}

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

sub userapp_disp {
	my ($username, $user_in, $group) = @_;
	open (SELFREG, "$admin_dir/selfreg.txt");
	@selfreg = <SELFREG>;
	close (SELFREG);
	foreach $line (@selfreg) {
		if ($line =~ m|^Q:|) {
			chop $line if $line =~ m|\n$|;
			($q, $user, $pass, $email, $full, $edit, $notify, $last, $gr) = split(/:/, $line);
			$linesave = $line if ($user eq $user_in && $group eq $gr);
		}
	}
	($q, $user, $pass, $email, $full, $edit, $notify, $last, $gr) = split(/:/, $linesave);
	&error_message("User Queue Error", "Selected user ($user_in in $group) not found in file.") if $linesave eq "";
	&header;
	print "<HTML><HEAD><TITLE>User Queue</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 onLoad=\"window.defaultStatus = 'User Queue'\">\n";
	print "$fs<CENTER><FONT SIZE=3><B>User Queue: \u$user_in (\u$group)</B></FONT></CENTER><HR>\n";
	print "<TABLE WIDTH=100%><TR>\n";
	$number = "$user-$group";
	print "<TD WIDTH=30 ALIGN=LEFT VALIGN=CENTER><A HREF=\"$cgiurl3?action=userapp_action&username=$username&SELECTION=approve$number\" onMouseOver=\"return setStatus('Approve this application')\">";
	print "<IMG SRC=\"$html_url/icons/approve_icon.gif\" HEIGHT=25 WIDTH=25></TD>\n";
	print "<TD>";
	print "</TD>\n";
	print "<TD WIDTH=30 ALIGN=RIGHT VALIGN=CENTER><A HREF=\"$cgiurl3?action=userapp_action&username=$username&SELECTION=refuse$number\" onClick=\"return confirm('Do you really want to refuse the application for this user?  If you reject the application, you will no longer have access to the e-mail address of the applying user!')\" onMouseOver=\"return setStatus('Refuse this application')\">";
	print "<IMG SRC=\"$html_url/icons/refuse_icon.gif\" HEIGHT=25 WIDTH=25></TD>\n";
	print "</TR></TABLE>\n";
	print "<P>\n";
	print "Username: <B>\u$user</B><BR>\n";
	print "E-mail: <B><A HREF=mailto:$email>$email</A></B><BR>\n";
	print "Full Name: <B>$full</B><BR>\n";
	print "Applying to: <B>\u$gr</B><P>\n";
	$profile_name = "$user_in-$gr";
	$profile_name = &getfn($profile_name);
	if (!-e "$admin_dir/profiles/$profile_name.txt") {
		exit(0);
	}
	&read_profile($profile_name);
	open (CONFIG, "$admin_dir/profiles/config.txt");
	@config = <CONFIG>;
	close (CONFIG);
	foreach $line (@config) {
		$line =~ m|^(\w+):(.*):(\d+):(\d+):(\d+):(\d+)|;
		($var, $val, $onoff, $type, $rows, $required) = ($1, $2, $3, $4, $5, $6);
		next if $P{$var} eq "";
		$t = $L{PD_DISPLAYFORMAT};
		$v1 = &unescape($val);
		($lint, $message) = &webtags($P{$var}, 1, 1);
		if ($lint ne "!Error") {
			$v2 = $message;
		} else {
			$v2 = $P{$line};
		}
		if ($type == 3) {
			$v2 = "<A HREF='mailto:$P{$var}'>$P{$var}</A>";
		} elsif ($type == 2) {
			$v2 = "<A HREF='$P{$var}' TARGET=_blank>$P{$var}</A>";
		}
		$v2 = join("", "<BLOCKQUOTE>", $v2, "</BLOCKQUOTE>") if $rows > 1;
		$t =~ s/\%description/$v1/g;
		$t =~ s/\%value/$v2/g;
		print "<LI>$t<P>\n";
	}
	exit(0);
}

#---SEPARATOR---#
#REQ:send_email_message
#REQ:_get_group_info
#REQ:delete_user
#REQ:save_profile_information
#REQ:create_blank_profile_file

sub userapp_action {
	my ($username, $application, $action) = @_;
	my ($q, $user, $pass, $email, $full, $edit, $notify, $last, $gr);
	undef @MESSAGE_OUT;
	&lock("userapp_action", "$admin_dir/selfreg.txt");
	open (SELFREG, "$admin_dir/selfreg.txt");
	@selfreg = <SELFREG>;
	close (SELFREG);
	$application =~ m|(.*)-(.*)|;
	($user_in, $group) = ($1, $2);
	$linesave = ""; $group_save = $group;
	foreach $line (@selfreg) {
		if ($line =~ m|^Q:|) {
			($q, $user, $pass, $email, $full, $edit, $notify, $last, $gr) = split(/:/, $line);
			chop ($gr) if $gr =~ m|\n$|;
			$linesave = $line if ($user eq $user_in && $group eq $gr);
			$line = "" if ($user eq $user_in && $group eq $gr);
		}
	}
	if ($linesave eq "") {
		&unlock("userapp_action", "$admin_dir/selfreg.txt");
		return 0 if $linesave eq "";
	}
	($q, $user, $pass, $email, $full, $edit, $notify, $last, $gr) = split(/:/, $linesave);
	@selfreg = grep(/\S/, @selfreg);
	open (SELFREG, ">$admin_dir/selfreg.txt");
	print SELFREG @selfreg;
	close (SELFREG);
	&unlock("userapp_action", "$admin_dir/selfreg.txt");
	if ($action eq "refuse") {
		&delete_user($user, $gr);
	} else {
		$pw = &initial_password;
		$l2 = "USERS:$user:*Q*:$email:$full:$edit:$notify:$last:$gr";
		&create_blank_profile_file("$user-$gr.txt");
		for ($i=1; $i<=2; $i++) {
			push (@salt, int(rand(26))+65);
		}
		$salt = pack('c2', @salt);
		$new_password = crypt($pw, $salt);
		$gr =~ s/\n$//;
		&save_profile_information($new_password, "", "", 2, "", "", $gr, $l2);
		$l = $L{REGISTER_PW_MAILED_BODY};
		$l =~ s/\\/\n/g;
		$l =~ s/\%boardtitle/$title/g;
		$l =~ s/\%username/$user_in/g;
		$l =~ s/\%password/$pw/g;
		&_get_group_info;
		$ts = "";
		foreach $key (sort(keys(%group))) {
			if ($group{$key} eq $group_save) {
				&extract("//$key/$key.$ext");
				$ts .= "<LI>" . &remove_html($topic_name) . "\n";
			}
		}
		$ts_auto = $ts; $ts_auto =~ s/\n/\n /g; $ts_auto =~ s/<LI>/\* /g;
		$l =~ s/\%topiclist/$ts_auto/g;
		$l .= "\n\n$html_url\n";
		if ($GLOBAL_OPTIONS{'capable'} eq "0") {
			push (@MESSAGE_OUT, join("\t", $email, $l));
		} else {
			$code = &send_email_message($email, $L{REGISTER_PW_MAILED_SUBJECT}, $l);
			&log_error("src-board-subs-101", "userapp_action", "E-mail sending did not go through for the user approval action; sending of message failed (code [$code]).") if $code ne "0";
		}
	}
}

sub initial_password {
	$l = 4 + int(rand(4));
	$lw = "";
	for ($i = 1; $i <= $l; $i++) {
		$letter = int(rand(36)) + 1;
		if ($letter > 26) {
			$letter -= 26;
			$lw .= $letter;
		} else {
			$letter += 64;
			$lw .= pack("c", $letter);
		}
	}
	$lw =~ tr/A-Z/a-z/;
	return $lw;
}

#---SEPARATOR---#

sub reg_configurator {
	if (!-w "$admin_dir/selfreg.txt") {
		&error_message("Registration configuration error", "The file 'selfreg.txt' in your administration files directory does not exist or is not world writable.  Check that permissions are 0777 (rwxrwxrwx) on this file.", 0, 1);
	}
	&header;
	print "<HTML><HEAD><TITLE>Self Registration Configurator</TITLE>\n";
	print '<BODY BGCOLOR="ffffff" TEXT="000000" LINK="0000FF" VLINK="0000FF" ';
	print "onLoad=\"window.defaultStatus = 'Self Registration Configurator'\">$fs\n";
	print "<FONT SIZE=3><CENTER><B>Self Registration Configurator</B></CENTER></FONT>\n";
	print "<HR><B>\n";
	print "<A HREF=\"$cgiurlm?username=$superuser&cmd=options_mgr\" onMouseOver=\"window.status = 'Return to the Options Manager'; return true\">Options Manager</A>:\n";
	print "Self Registration Configurator</B><HR>\n";
	print "<H3>Registration Screen</H3>\n";
	print "<FORM ACTION=$cgiurl METHOD=POST>\n";
	print "<INPUT TYPE=HIDDEN NAME=username VALUE=$superuser>\n";
	print "<INPUT TYPE=HIDDEN NAME=action VALUE=reg_config_save_rs>\n";
	print "<TABLE BGCOLOR=#ffffcc BORDER=1 WIDTH=100%><TR><TD>$fs\n";
	print "Settings that you specify here control the look of the initial registration\n";
	print "screen.<P>\n";
	open (SELFREG, "$admin_dir/selfreg.txt");
	@selfreg = <SELFREG>;
	close (SELFREG);
	undef %S;
	foreach $line (sort(@selfreg)) {
		$line =~ s/\n$//;
		if ($line =~ m|^S:(.*)|) {
			$x = $1;
			($var, $param) = split(/-/, $x);
			$S{$var} = &unescape($param);
		} elsif ($line =~ m|^W:(.*)|) {
			$x = $1;
			($var, $param) = split(/-/, $x);
			$W{$var} = &unescape($param) . " ";
		}
	}
	print "<INPUT TYPE=CHECKBOX NAME=TL VALUE=1 ";
	print "CHECKED" if $S{'tl'} == 1;
	print " onClick=\"var s = document.forms[0].TL.checked; if (s == false) { document.forms[0].HIDE.checked = false; document.forms[0].CHBYDEF.checked = false; document.forms[0].ONEONLY.checked = false;}\"";
	print "> Display list of topics<BR>\n";
	print "&nbsp;&nbsp;&nbsp;<INPUT TYPE=CHECKBOX NAME=HIDE VALUE=1 ";
	print "CHECKED" if $S{'hide'} == 1;
	print " onClick=\"var s = document.forms[0].HIDE.checked; if (s == true) { document.forms[0].TL.checked = true; }\"";
	print "> Hide any topics that are read-restricted<BR>\n";
	print "&nbsp;&nbsp;&nbsp;<INPUT TYPE=CHECKBOX NAME=CHBYDEF VALUE=1 ";
	print "CHECKED" if $S{'chbydef'} == 1;
	print " onClick=\"var s = document.forms[0].CHBYDEF.checked; if (s == true) { document.forms[0].TL.checked = true; document.forms[0].ONEONLY.checked = false; }\"";
	print "> Check all topics by default<BR>\n";
	print "&nbsp;&nbsp;&nbsp;<INPUT TYPE=CHECKBOX NAME=ONEONLY VALUE=1 ";
	print "CHECKED" if $S{'oneonly'} == 1;
	print " onClick=\"var s = document.forms[0].ONEONLY.checked; if (s == true) { document.forms[0].TL.checked = true; document.forms[0].CHBYDEF.checked = false; }\"";
	print "> Allow selection of only one topic<BR>\n";
	print "<P>\n";
	print "<INPUT TYPE=SUBMIT VALUE=\"Save Settings\"></TD></TR></TABLE>\n";
	print "</FORM>\n";
	print "<P><HR>\n";
	print "<H3>Welcome Message</H3>\n";
	print "<FORM ACTION=$cgiurl METHOD=POST>\n";
	print "<INPUT TYPE=HIDDEN NAME=username VALUE=$superuser>\n";
	print "<INPUT TYPE=HIDDEN NAME=action VALUE=reg_config_save_welcome>\n";
	print "<TABLE BGCOLOR=#ffffcc BORDER=1 WIDTH=100%><TR><TD>$fs\n";
	print "The &quot;Welcome Message&quot; you enter here is displayed to any user\n";
	print "who clicks the &quot;$L{REG_FRONTSCREEN_BUTTON}&quot; button.</FONT><P>\n";
	print "<TEXTAREA NAME=message ROWS=5 COLS=50 WRAP=VIRTUAL>";
	print $W{source};
	print $L{REGISTER_1_INSTR} if $W{'source'} eq "";
	print "</TEXTAREA><P>\n";
	print "$fs<INPUT TYPE=SUBMIT NAME=submit VALUE=\"Preview/Save Welcome Message\"></TD></TR></TABLE>\n";
	print "</FORM>\n";
	print "<P><HR>\n";
	print "<H3>Ban Abusive Domains</H3>\n";
	print "<FORM ACTION=$cgiurl METHOD=POST>\n";
	print "<INPUT TYPE=HIDDEN NAME=username VALUE=$superuser>\n";
	print "<INPUT TYPE=HIDDEN NAME=action VALUE=reg_config_save>\n";
	print "<TABLE BGCOLOR=#ffffcc BORDER=1 WIDTH=100%><TR><TD>$fs\n";
	print "You can prevent users from registering with e-mail addresses from certain\n";
	print "domains.  Enter the domains, one per line, to ban.  This affects new user\n";
	print "self-registrations only; it does not affect registered users or any users\n";
	print "that moderators add.\n</FONT><P>\n";
	print "<TEXTAREA ROWS=10 COLS=40 NAME=banned>\n";
	open (SELFREG, "$admin_dir/selfreg.txt");
	@selfreg = <SELFREG>;
	close (SELFREG);
	foreach $line (sort(@selfreg)) {
		$line =~ s/\n$//;
		if ($line =~ m|^B:(.*)|) {
			print "$1\n";
		}
	}
	print "</TEXTAREA><P>$fs";
	print "<INPUT TYPE=SUBMIT VALUE=\"Save Banned Domains\"></TD></TR></TABLE>\n";
	print "</BODY></HTML>\n";
	exit(0);
}

#---SEPARATOR---#

sub save_selfreg_config {
	my ($bdom) = @_;
	&lock("save_selfreg_config", "$admin_dir/selfreg.txt");
	open (SELFREG, "$admin_dir/selfreg.txt");
	@selfreg = <SELFREG>;
	close (SELFREG);
	@selfreg = grep(!/^B:/, @selfreg);
	@lines = split(/\n/, $bdom);
	foreach $line (@lines) {
		$line =~ s/^\s+//;
		$line =~ s/\s+$//;
		$line =~ s/^\.//;
		push (@selfreg, "B:$line\n");
	}
	open (SELFREG, ">$admin_dir/selfreg.txt") || &error_message("Registration configuration save error", "The file 'selfreg.txt' in your administration files directory does not exist or is not world writable.  Check that permissions are 0777 (rwxrwxrwx) on this file.", 0, 1);
	print SELFREG @selfreg;
	close (SELFREG);
	&unlock("save_selfreg_config", "$admin_dir/selfreg.txt");
}

#---SEPARATOR---#

sub save_selfreg_config_rs {
	&lock("save_selfreg_config_rs", "$admin_dir/selfreg.txt");
	open (SELFREG, "$admin_dir/selfreg.txt");
	@selfreg = <SELFREG>;
	close (SELFREG);
	@selfreg = grep(!/^S:/, @selfreg);
	foreach $key (keys(%FORM)) {
		if ($key =~ m|^([A-Z]+)$|) {
			$q = $1; $q =~ tr/A-Z/a-z/;
			push (@selfreg, "S:$q-" . &escape($FORM{$key}) . "\n");
		}
	}
	open (SELFREG, ">$admin_dir/selfreg.txt") || &error_message("Registration configuration save error", "The file 'selfreg.txt' in your administration files directory does not exist or is not world writable.  Check that permissions are 0777 (rwxrwxrwx) on this file.", 0, 1);
	print SELFREG @selfreg;
	close (SELFREG);
	&unlock("save_selfreg_config_rs", "$admin_dir/selfreg.txt");
}

#---SEPARATOR---#

sub save_selfreg_config_welcome {
	my ($source, $formatted) = @_;
	&lock("save_selfreg_config_welcome", "$admin_dir/selfreg.txt");
	open (SELFREG, "$admin_dir/selfreg.txt");
	@selfreg = <SELFREG>;
	close (SELFREG);
	@selfreg = grep(!/^W:/, @selfreg);
	push (@selfreg, "W:source-" . &escape($source) . "\n");
	push (@selfreg, "W:message-" . &escape($formatted) . " \n");
	open (SELFREG, ">$admin_dir/selfreg.txt") || &error_message("Registration configuration save error", "The file 'selfreg.txt' in your administration files directory does not exist or is not world writable.  Check that permissions are 0777 (rwxrwxrwx) on this file.", 0, 1);
	print SELFREG @selfreg;
	close (SELFREG);
	&unlock("save_selfreg_config_welcome", "$admin_dir/selfreg.txt");
}

# END - FILE IS CORRECTLY UPLOADED #
