# FILE: src-board-subs-103
#-------------------------------------------------------------------------------
# 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:printuntil
#REQ:read_profile
#REQ:webtags

sub display_profile {
	my ($profile_name) = @_;
	$profile_name =~ m|(.+)-|; $username_save = $1;
	&header;
	$profile_name = &getfn($profile_name);
	if (!-e "$admin_dir/profiles/$profile_name.txt") {
		&printuntil(1, 1, 0, "$L{PD_TITLE}");
		print "<H3>$L{PD_DOESNOTEXIST}</H3>\n";
		print "$L{PD_DOESNOTEXIST_MESSAGE}\n";
		&printuntil(3, 17, 0, "", 0, 1);
		exit(0);
	}
	&read_profile($profile_name);
	$namestr = $L{PD_PROFILEOF};
	$name = $P{'fullname'};
	if ($name eq "") {
		$name = "\u$username_save";
	} else {
		$name .= " (\u$username_save)" if $name !~ m|^$username_save$|i;
	}
	$namestr =~ s/\%name/$name/g;
	&printuntil(1, 1, 0, "$namestr");
	print "<FONT SIZE=+1><B><CENTER>$namestr</CENTER></B></FONT><HR>\n";
	&printuntil(3, 9, 0, "", 0, 1);
	$pictflag = 0;
	if ($PICT{'picture'} ne "" && ($GLOBAL_OPTIONS{'user_picts'} == 1 || $GLOBAL_OPTIONS{'user_picts'} eq "")) {
		$file = "$admin_dir/profiles/$PICT{'picture'}";
		if (-e $file) {
			print "<CENTER><TABLE BORDER=2><TR><TD>";
			$time = time;
			print "<IMG SRC=\"$script_url/board-profile.$cgi_extension?action=display_picture&picture=$profile_name&timenow=$time\">";
			print "</TD></TR></TABLE></CENTER>\n";
		}
	}
	print "<UL>\n";
	if ($P{'email'} ne "email" && $P{'email'} ne "" && !$PREF{'noemail'}) {
		$t = $L{PD_DISPLAYFORMAT};
		$v1 = $L{PD_EMAIL};
		$v2 = "<A HREF=\"mailto:$P{'email'}\">$P{'email'}</A>";
		$t =~ s/\%description/$v1/g;
		$t =~ s/\%value/$v2/g;
		print "<LI>$t<P>\n";
	}
	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 $onoff == 0;
		next if $P{$var} eq "";
		next if ($P{$var . "_hide"} == 1 && !$required);
		$t = $L{PD_DISPLAYFORMAT};
		$v1 = &unescape($val);
		if ($P{$var} =~ m|\\(\S+)\{|) {
			($lint, $message) = &webtags($P{$var}, 1, 1);
			if ($lint ne "!Error") {
				$v2 = $message;
			} else {
				$v2 = $P{$line};
			}
		} else {
			$v2 = $P{$var};
		}
		if ($type == 3) {
			$v2 = "<A HREF='mailto:$P{$var}'>$P{$var}</A>";
		} elsif ($type == 2) {
			$P{$var} =~ s/^\s+//;
			$P{$var} =~ s/\s+$//;
			if ($P{$var} !~ m|^(\w+)://|) {
				$P{$var} = "http://$P{$var}";
			}
			$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";
	}
	foreach $line (sort(keys(%V))) {
		$t = $L{PD_DISPLAYFORMAT};
		$v1 = &unescape($V{$line});
		if ($P{$line} =~ m|\\(\S+)\{|) {
			($lint, $message) = &webtags($P{$line}, 1, 1);
			if ($lint ne "!Error") {
				$v2 = $message;
			} else {
				$v2 = $P{$line};
			}
		} else {
			$v2 = $P{$line};
		}
		$t =~ s/\%description/$v1/g;
		$t =~ s/\%value/$v2/g;
		print "<LI>$t<P>\n";
	}
	print "</UL>\n";
	&printuntil(11, 17, 0, "", 0, 1);
	exit(0);
}

#---SEPARATOR---#

sub display_picture {
	my ($profile_name) = @_;
	$profile_name = &getfn($profile_name);
	if (!-e "$admin_dir/profiles/$profile_name.txt") {
		&error_message("Profile Error", "Profile does not exist");
	}
	open (PROFILE, "$admin_dir/profiles/$profile_name.txt");
	@profile = <PROFILE>;
	close (PROFILE);
	@profile = grep(/\S/, @profile);
	@profile = grep(!/^#/, @profile);
	$flag = 0;
	foreach $line (@profile) {
		if ($line =~ m|<PICTURE>|) {
			$flag = 2;
		} elsif ($line =~ m|</PICTURE>|) {
			$flag = 0;
		} elsif ($flag == 2) {
			if ($line =~ m|^(\w+)=(.*)|) {
				$PICT{$1} = &unescape($2);
			}
		}
	}
	if ($PICT{'picture'} ne "") {
		$file = "$admin_dir/profiles/$PICT{'picture'}";
		if (-e $file) {
			open (FILE, $file);
			binmode(FILE);
			@file = <FILE>;
			close (FILE);
			print "Content-type: image/gif\n\n" if $file =~ m|\.gif$|;
			print "Content-type: image/jpeg\n\n" if $file =~ m|\.jpg$|;
			binmode(STDOUT);
			print @file;
			exit(0);
		}
	}
}

#---SEPARATOR---#
#REQ:create_blank_profile_file

sub compare_profiles_PRO {
	my ($input) = @_;
	@input = split(/\n/, $input);
	my ($line, $file, $user, $pass, $email, $fullname, $edit, $notify, $lastcheck, $group);
	foreach $line (@input) {
		$line =~ s/\n$//;
	}
	foreach $line (@input) {
		($file, $user, $pass, $email, $fullname, $edit, $notify, $lastcheck) = split(/:/, $line);
		if ($edit == 2 || $edit == 4) {
			$EMAIL_FORCE = $email;
		}
	}
	$line1 = shift(@input);
	($file, $user, $pass, $email, $fullname, $edit, $notify, $lastcheck, $group) = split(/:/, $line1);
	$email = $EMAIL_FORCE if $EMAIL_FORCE;
	$e{$email} = 1; $f{$fullname} = 1; $n{$notify} = 1;
	foreach $line (@input) {
		($file, $user, $pass, $email, $fullname, $edit, $notify, $lastcheck, $group) = split(/:/, $line);
		$email = $EMAIL_FORCE if $EMAIL_FORCE;
		return 1 if !$n{$notify};
		return 1 if !$e{$email};
		return 1 if !$f{$fullname};
	}
	($file, $user, $pass, $email, $fullname, $edit, $notify, $lastcheck, $group) = split(/:/, $line1);
	$filename = "$user-$group.txt" if $file eq "USERS";
	$filename = "$user-MODERATOR.txt" if $file eq "PASSWD";
	$filename = &getfn($filename);
	if (open (PROFILE, "$admin_dir/profiles/$filename")) {
		@profile_1 = <PROFILE>; close (PROFILE);
		@profile_1 = grep(!/^picture=/, @profile_1);
		$profile_1 = join("\n", @profile_1);
	} else {
		&create_blank_profile_file($filename);
	}
	$rv = 0;
	foreach $line (@input) {
		($file, $user, $pass, $email, $fullname, $edit, $notify, $lastcheck, $group) = split(/:/, $line);
		$filename = "$user-$group.txt" if $file eq "USERS";
		$filename = "$user-MODERATOR.txt" if $file eq "PASSWD";
		$filename = &getfn($filename);
		if (open (PROFILE, "$admin_dir/profiles/$filename")) {
			@profile_1 = <PROFILE>; close (PROFILE);
			@profile_1 = grep(!/^picture=/, @profile_1);
			$profile = join("\n", @profile_1);
			$rv = 1 if $profile ne $profile_1;
		} else {
			&create_blank_profile_file($filename);
		}
	}
	return $rv;
}

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

sub display_profile_differences_PRO {
	my ($username, $password, $input) = @_;
	@input = split(/\n/, $input);
	open (TOP, "$message_dir/$board_topics_file"); @top = <TOP>; close (TOP);
	@tpc = grep(/<!-Top/, @top);
	foreach $line (@tpc) {
		if ($line =~ m|<!-Top: (\d+)-!>|) {
			$t = $1;
			($head, $color, $lm, $announce, $announce_src, $sublist) = &get_page($t, $t);
			$head =~ m|<!--Topic: $t/(.*?)-->|; $topic_name = $1;
			foreach $line (split(/\n/, $sublist)) {
				if ($line =~ m|<!-Top: (\d+)-!>|) {
					$s = $1;
					($head2, $color2, $lm2, $announce2, $announce_src2, $sublist2) = &get_page($t, $s);
					$head2 =~ m|<!--Me: $s/(.*?)-->|; $subtopic{$s} = $1;
				}
			}
			$topic{$t} = &remove_html($topic_name);
		}
	}
	&header;
	&printuntil(1, 1, 0, $L{PROFILE_SYNC_TITLE});
	print "<FONT SIZE=3><CENTER><B>$L{PROFILE_SYNC_TITLE}</B></CENTER></FONT>\n";
	print "<HR>\n";
	print $L{PROFILE_SYNC_DESCR};
	print "<P><CENTER>\n";
	$ct = 0;
	foreach $line (@input) {
		$line =~ s/\n$//;
		($file, $user, $pass, $email, $fullname, $edit, $notify, $last, $group)	= split(/:/, $line);
		$EMAIL_FORCE = $email if ($edit == 2 || $edit == 4);
	}
	foreach $line (@input) {
		$line =~ s/\n$//;
		($file, $user, $pass, $email, $fullname, $edit, $notify, $last, $group)	= split(/:/, $line);
		$email = $EMAIL_FORCE if $EMAIL_FORCE;
		$ct += 1; $ct = 1 if $ct >= 3;
		print "<TABLE BORDER=1 WIDTH=100%><TR><TD>\n";
		print "<FORM ACTION=$script_url/board-profile.$cgi_extension METHOD=POST>\n";
		print "<FONT FACE=\"$face\" SIZE=\"$size\">\n";
		print "<U>$L{PROFEDIT_INFO}</U><P>\n";
		print "\u$user<BR>\n";
		print "$email";
		print " *" if $EMAIL_FORCE;
		print "<BR>\n";
		print "$fullname<P>\n";
		$filename = "$user-$group" if $file eq "USERS";
		$filename = "$user-MODERATOR" if $file eq "PASSWD";
		$filename = &getfn($filename);
		&read_profile($filename);
		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 $onoff == 0;
			$t = $L{PD_DISPLAYFORMAT};
			$v1 = &unescape($val);
			$v2 = $P{$var};
			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>";
			}
			$t =~ s/\%description/$v1/g;
			$t =~ s/\%value/$v2/g;
			print "<LI>$t<BR>\n";
		}
		if ($PICT{'picture'} ne "" && ($GLOBAL_OPTIONS{'user_picts'} == 1 || $GLOBAL_OPTIONS{'user_picts'} eq "")) {
			$time = time;
			print "<LI><I>$L{PD_PICTURE}</I> <B><A HREF=\"$script_url/board-profile.$cgi_extension?action=display_picture&picture=$filename&timenow=$time\">$L{PD_PICTURE_CLICK}</A></B><BR>\n";
		}
		print "<P>\n";
		print "<U>$L{PROFEDIT_EMAILNOTIFY}</U><BR>\n";
		foreach $line_n (split(/,/, $notify)) {
			if ($line_n =~ m|/|) {
				$topic_num = $`;
				$subs = $'; @subs = split(/&/, $subs);
			} else {
				$topic_num = $line_n;
				undef @subs;
			}
			print "- ", substr($topic{$topic_num}, 0, 60) if $topic{$topic_num} ne "";
			print "..." if length($topic{$topic_num}) > 60;
			print "<BR>\n" if $topic{$topic_num} ne "";
			if (scalar(@subs)) {
				foreach $line_s (@subs) {
					print "&nbsp;&nbsp;+ ", substr($subtopic{$line_s}, 0, 60) if $subtopic{$line_s} ne "";
					print "..." if length($subtopic{$line_s}) > 60;
					print "<BR>\n" if $subtopic{$line_s} ne "";
				}
			}
		}
		print "- $L{PROFILE_MYPOSTS}<BR>\n" if grep(/^0$/, split(/,/, $notify));
		print "<P><CENTER><INPUT TYPE=SUBMIT VALUE=\"$L{PROFILE_CHOOSETHISONE}\"></CENTER>\n";
		print "<INPUT TYPE=HIDDEN NAME=action VALUE=sync>\n";
		print "<INPUT TYPE=HIDDEN NAME=file VALUE=$file>\n";
		print "<INPUT TYPE=HIDDEN NAME=user VALUE=$user>\n";
		print "<INPUT TYPE=HIDDEN NAME=group VALUE=\"$group\">\n";
		print "<INPUT TYPE=HIDDEN NAME=username VALUE=$username>\n";
		print "<INPUT TYPE=HIDDEN NAME=password VALUE=$password>\n";
		print "</FORM></TD></TR></TABLE><P>\n";
	}
	print "</CENTER>\n";
	&printuntil(3, 17, 0, "", 0, 1);
	exit(0);
}

#---SEPARATOR---#

sub read_profile {
	my ($profile_name, $nostuff) = @_;
	$profile_name =~ s/\.txt$//;
	undef %P; undef %PICT; undef %V; undef %PREF; undef %EDIT;
	$profile_name = &getfn($profile_name);
	open (PROFILE, "$admin_dir/profiles/$profile_name.txt");
	@profile = <PROFILE>;
	close (PROFILE);
	@profile = grep(/\S/, @profile);
	@profile = grep(!/^#/, @profile);
	my ($line, $flag);
	foreach $line (@profile) {
		if ($line =~ m|<INFO>|) {
			$flag = 1;
		} elsif ($line =~ m|</INFO>|) {
			$flag = 0;
		} elsif ($flag == 1) {
			if ($line =~ m|^(\w+)=(.*)|) {
				$P{$1} = &unescape($2);
			}
		} elsif ($line =~ m|<PICTURE>|) {
			$flag = 2;
		} elsif ($line =~ m|</PICTURE>|) {
			$flag = 0;
		} elsif ($flag == 2) {
			if ($line =~ m|^(\w+)=(.*)|) {
				$PICT{$1} = &unescape($2) if ($GLOBAL_OPTIONS{'user_picts'} == 1 || $GLOBAL_OPTIONS{'user_picts'} eq "");
			}
		} elsif ($line =~ m|<CUSTOM>|) {
			$flag = 3;
		} elsif ($line =~ m|</CUSTOM>|) {
			$flag = 0;
		} elsif ($flag == 3) {
			if ($line =~ m|^(\w+)=(.*)|) {
				$V{$1} = &unescape($2);
			}
		} elsif ($line =~ m|<PREFS>|) {
			$flag = 4;
		} elsif ($line =~ m|</PREFS>|) {
			$flag = 0;
		} elsif ($flag == 4) {
			if ($line =~ m|^(\w+)=(.*)|) {
				$PREF{$1} = &unescape($2);
			}
		} elsif ($line =~ m|<EDITING>|) {
			$flag = 5;
		} elsif ($line =~ m|</EDITING>|) {
			$flag = 0;
		} elsif ($flag == 5) {
			if ($line =~ m|^(\w+)=(.*)|) {
				$EDIT{$1} = &unescape($2);
			}
		}
	}
	return 1 if $nostuff;
	my ($user, $group) = split(/\-/, $profile_name);
	my ($file, @file);
	$file = "passwd.txt" if $group eq "MODERATOR";
	$file = "users.txt" if $group ne "MODERATOR";
	open (FILE, "$admin_dir/$file"); @file = <FILE>; close (FILE);
	@file = grep(/^$user:/, @file);
	if ($file eq "users.txt") {
		@file = grep(/:$group\s*$/, @file);
	}
	($user, $pass, $email, $full) = split(/:/, $file[0]);
	$P{'email'} = $email;
	$P{'fullname'} = $full;
}

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

sub synchronize_PRO {
	my ($file, $user, $input_save) = @_;
	$USER_FLAG = 0;
	$filename_save = "$user-$group.txt" if $file eq "USERS";
	$filename_save = "$user-MODERATOR.txt" if $file eq "PASSWD";
	$filename_save = &getfn($filename_save);
	&read_profile($filename_save);
	$picture = 0;
	open (PROFILE, "$admin_dir/profiles/$filename_save");
	@profile_hold = <PROFILE>;
	close (PROFILE);
	if ($PICT{'picture'} ne "") {
		open (FILE, "$admin_dir/profiles/$PICT{'picture'}");
		binmode(FILE);
		@picturefile = <FILE>;
		close (FILE);
		$picture = 1;
		$pictureinfo = $PICT{'picture'};
	}
	@input = split(/\n/, $input_save);
	foreach $iline (@input) {
		($file, $user, $pass, $email, $fullname, $edit, $notify, $lastcheck, $group) = split(/:/, $iline);
		$filename_2 = "$user-$group.txt" if $file eq "USERS";
		$filename_2 = "$user-MODERATOR.txt" if $file eq "PASSWD";
		$filename_2 = &getfn($filename_2);
		next if $filename_2 eq $filename_save;
		&read_profile($filename_2);
		if ($PICT{'picture'} ne "") {
			unlink("$admin_dir/profiles/$PICT{'picture'}");
		}
		if ($picture == 1) {
			$num = &get_number;
			$filenew = "$num.gif" if $pictureinfo =~ m|\.gif$|;
			$filenew = "$num.jpg" if $pictureinfo =~ m|\.jpg$|;
			open (FILE, ">$admin_dir/profiles/$filenew");
			binmode(FILE);
			print FILE @picturefile;
			close (FILE);
			chmod (oct($perms0644), "$admin_dir/profiles/$filenew");
		}
		&lock("synchronize_PRO", "$admin_dir/profiles/$filename_2");
		open (FILE, ">$admin_dir/profiles/$filename_2");
		$flag = 0;
		foreach $line (@profile_hold) {
			if ($line =~ m|<PICTURE>|) {
				$flag = 1;
				print FILE $line;
			} elsif ($line =~ m|</PICTURE>|) {
				$flag = 0;
				print FILE "picture=$filenew\n" if $picture == 1;
				print FILE $line;
			} elsif ($flag == 0) {
				print FILE $line;
			}
		}
		close (FILE);
		chmod (oct($perms0666), "$admin_dir/profiles/$filename_2");
		&unlock("synchronize_PRO", "$admin_dir/profiles/$filename_2");
	}
}

#---SEPARATOR---#
#REQ:printuntil
#REQ:read_profile
#REQ:get_authorized_topics
#REQ:verify_postread_privileges

sub profile_editor_screen_PRO {
	my ($file, $username, $group, $username_editing, $action_url, $action, $editflag) = @_;
	$file =~ tr/A-Z/a-z/;
	if ($username ne $username_editing) {
		undef %authtopics;
		open (GROUPS, "$admin_dir/groups.txt");
		@groups = <GROUPS>;
		close (GROUPS);
		open (TOPICS, "$message_dir/$board_topics_file");
		@topics = <TOPICS>;
		close (TOPICS);
		@t = grep(/<!-Top: /, @topics);
		foreach $line (@t) {
			if ($line =~ m|<!-Top: (\d+)-!>|) {
				$o = $1;
				&extract("//$1/$1.$ext");
				foreach $line (@groups) {
					$line =~ s/\s+$//;
					if ($line =~ m|^$owner:|) {
						@mods = split(/,/, $');
						if (grep(/^$username_editing$/, @mods)) {
							$authtopics{$o} = 1;
						}
					}
				}
			}
		}
	}
	$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$|;
	($username, $password, $email, $fullname, $editing, $email_notify, $lastcheck, $group) = split(/:/, $uline);
	$LINEFORCE = "$file:$uline" if ($editing == 2 || $editing == 4);
	@emt = split(/,/, $email_notify); undef %extra; $extra_used = 0;
	foreach $l (@emt) {
		if ($l =~ m|^(\d+)/|) {
			$l = $1; $extra{$l} = $'; $extra_used = 1;
		}
	}
	$profilename = "$username-$group" if $file eq "users";
	$profilename = "$username-MODERATOR" if $file eq "passwd";
	$GROUP = $group;
	&read_profile($profilename);
	&header;
	&printuntil(1, 1, 0, $L{PROFEDIT_TITLE});
	$fs = "<FONT SIZE=\"$size\" FACE=\"$face\">";
	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{PRED_OPTIONS}</H4><UL>\n";
	if (!$editflag) {
		undef @myposts;
		undef %aliases;
		foreach $line (@result_save) {
			$line =~ s/\s*$//;
			($file, $user, $pass, $email, $full, $edit, $notify, $lastcheck, $group) = split(/:/, $line);
			$group =~ s/\s//g;
			$LINE_FORCE = $line if ($edit == 2 || $edit == 4);
			$aliases{"$user:$group"} = 1 if $file eq "USERS";
			$aliases{"$user:MODERATOR"} = 1 if $file eq "PASSWD";
		}
		$timecutoff = time - (7*24*60*60);
		$editcutoff = time - ($GLOBAL_OPTIONS{'usersedit_time'}*60);
		open (TOPICS, "$message_dir/$board_topics_file"); @top = <TOPICS>; close (TOPICS);
		@t = grep(/<!-Top: (\d+)-!>/, @top);
		foreach $t (@t) {
			$t =~ m|<!-Top: (\d+)-!>|; $key = $1;
			open (LOG, "$admin_dir/msg_index/$key-log.txt");
			while (<LOG>) {
				if ($_ =~ m|^(\d+);([^;]+);(\d+);(\d+)/(\d+);|) {
					($index, $postby, $timepost, $topic, $page) = ($1, $2, $3, $4, $5);
					next if $aliases{$postby} == 0;
					$recentpost = $timepost if $timepost > $recentpost;
					next if ($timepost < $timecutoff && $timepost < $editcutoff);
					push (@myposts, $_);
				}
			}
			close (LOG);
		}
	}
	if ($LINEFORCE) {
		($file, $user, $pass, $email, $full, $edit, $notify, $lastcheck, $group) = split(/:/, $LINEFORCE);
	}
	print "<LI><A HREF=#posts>$L{PRED_LASTPOSTS}</A>\n" if scalar(@myposts);
	print "<LI><A HREF=#info>$L{PROFEDIT_INFO}</A>\n";
	print "<LI><A HREF=#notify>$L{PROFEDIT_EMAILNOTIFY}</A>\n" if $GLOBAL_OPTIONS{'email'};
	print "<LI><A HREF=#personal>$L{PRED_PERSONALINFO}</A>\n";
	print "<LI><A HREF=#picture>$L{PRED_PICTURE}</A>\n" if ($GLOBAL_OPTIONS{'user_picts'} == 1 || $GLOBAL_OPTIONS{'user_picts'} eq "");
	print "<LI><A HREF=#prefs>$L{PRED_PREFERENCES}</A>\n";
	if ($GLOBAL_OPTIONS{'pwchange'} ne "0" || $editflag || $IS_MODERATOR) {
		print "<LI><A HREF=#pass>$L{PROFEDIT_CHANGEPASSWORD}</A>\n";
	}
	print "<LI><A HREF=#edit>Editing Privileges</A>\n" if $editflag;
	print "<LI><A HREF=$script_url/board-profile.$cgi_extension?action=display_profile&profile=$profilename>";
	print $L{VIEW_PROFILE} if $L{VIEW_PROFILE} ne "";
	print $L{PD_TITLE} if ($L{VIEW_PROFILE} eq "" && $L{PD_TITLE} ne "");
	print "View Profile" if ($L{VIEW_PROFILE} eq "" && $L{PD_TITLE} eq "");
	print "</A></UL><HR><P>\n";
	undef %USRQ; undef %MODQ;
	open (QUEUEFILE, "$admin_dir/queue.txt");
	@queue = <QUEUEFILE>;
	close (QUEUE);
	foreach $line (@queue) {
		chomp $line;
		($tn, $user, $moderator, $special, $public) = split(/:/, $line);
		$USRQ{$tn} = 1 if $user;
		$MODQ{$tn} = 1 if $moderator;
	}
	if (!$editflag) {
		if (scalar(@myposts)) {
			print "<A NAME=posts><H4>$L{PRED_LASTPOSTS}</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=editpost>\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>$fs\n";
			print $L{PRED_LASTPOSTS_INSTR}, "\n";
			print "<P><UL>\n"; $lc = 0;
			foreach $line (reverse(sort {$a <=> $b;} @myposts)) {
				($index, $by, $timepost, $where, $ipaddr, $iphost, $firstchars, $postby) = split(/;/, $line);
				$where =~ m|(\d+)/(\d+)|; $topic = $1; $page = $2;
				if (($timepost >= $editcutoff && $lc < $editcutoff) && $GLOBAL_OPTIONS{'usersedit'}) {
					print "</UL><P>", $L{PRED_EDIT_POSTS}, "<UL>";
				}
				$lc = $timepost;
				print "<LI> ";
				if ($timepost >= $editcutoff) {
					if ($GLOBAL_OPTIONS{'disable_if_queued'} == 0 || !(($MODQ{$topic} && $IS_MODERATOR) || ($USRQ{$topic} && !$IS_MODERATOR))) {
						print "<INPUT TYPE=SUBMIT VALUE=\"$L{PRED_EDIT_WORD}\" NAME=\"$index--$where\">\n";
					}
				}
				$url = "$message_url/$topic/$page.$ext#POST$index" if -e "$message_dir/$topic";
				$url = "$script_url/board-auth.$cgi_extension?file=/$topic/$page.$ext#POST$index" if !-e "$message_dir/$topic";
				print "<A HREF=\"$url\">";
				print &get_date_time('realshort', $timepost);
				print "</A> -- ";
				$posts = &unescape($firstchars);
				$posts = &remove_html($posts);
				$posts =~ s/</&lt;/g;
				$posts =~ s/>/&gt;/g;
				print $posts, "\n";
			}
			print "</UL></TD></TR></TABLE></FORM>\n";
			print "<HR>\n";
		}
	}
	print "<A NAME=info><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";
	$fullname = "" if $fullname eq "fullname";
	$email = "" if $email eq "email";
	print "<TR><TD>$fs<B>$L{PROFEDIT_YOURUSERNAME}</B></FONT><TD><TD>$fs<B>\u$username</B></FONT></TD></TR>\n";
	$mlstr = "";
	$mlstr = " MAXLENGTH=$GLOBAL_OPTIONS{'name_length_limit_number'}" if (($GLOBAL_OPTIONS{'name_length_limit'} == 1 || $GLOBAL_OPTIONS{'name_length_limit'} eq "") && $GLOBAL_OPTIONS{'name_length_limit_number'} > 0);
	$mlstr = " MAXLENGTH=35" if (($GLOBAL_OPTIONS{'name_length_limit'} == 1 || $GLOBAL_OPTIONS{'name_length_limit'} eq "") && $GLOBAL_OPTIONS{'name_length_limit_number'} == 0);
	$fullnamex = $fullname;
	$fullnamex =~ s/"/&quot;/g;
	print "<TR><TD>$fs<B>$L{PROFEDIT_YOURFULLNAME}</B></FONT><TD><TD><INPUT TYPE=TEXT NAME=profile_fullname SIZE=35 VALUE=\"$fullnamex\"$mlstr></TD></TR>\n";
	print "<TR><TD>$fs<B>$L{PROFEDIT_YOUREMAIL}</B></FONT><TD>";
	if ($editing == 1 || $username ne $username_editing || $editing == 3 || $GLOBAL_OPTIONS{'emchange'}) {
		print "<TD><INPUT TYPE=TEXT NAME=profile_email SIZE=35 VALUE=\"$email\" MAXLENGTH=100></TD></TR>\n";
	} else {
		print "<TD>$fs<B>$email</B><INPUT TYPE=HIDDEN NAME=profile_email SIZE=35 VALUE=\"$email\"></TD></TR>\n";
	}
	print "</TABLE><P>$fs<INPUT TYPE=SUBMIT VALUE=\"$L{PROFEDIT_SAVEINFO}\"></FONT>\n";
	print "</TD></TR></TABLE></FORM>\n";
	print "<HR>\n";
	if ($GLOBAL_OPTIONS{'email'} && ($IS_MODERATOR || $GLOBAL_OPTIONS{send_mail_only_admins} == 0)) {
		print "<A NAME=notify><H4>$L{PROFEDIT_EMAILNOTIFY}</H4>\n";
		print "<FORM ACTION=$action_url METHOD=POST NAME=emf>\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{PRED_CHOOSETOPICS}\n";
		undef $prs;
		open (TOP, "$message_dir/$board_topics_file"); @top = <TOP>; close (TOP);
		@topics = grep(/^<!-Top:/, @top); undef %st;
		@auth = &get_authorized_topics;
		$authflag = 0; $flag = 0;
		foreach $t (@topics) {
			if ($t =~ m|<!-Top: (\d+)-!>|) {
				$o = $1;
				$a = 1;
				if ($username_editing ne $username) {
					$a = 0 if $authtopics{$o} == 0;
					$a = 1 if -e "$message_dir/$o";
				} else {
					if (!-e "$message_dir/$o") {
						if (!grep(/^$o$/, @auth)) {
							$a = 0;
							($a) = &verify_postread_privileges($o, $FORM{'username'}, $FORM{'password'}, $FORM{'special_password'}, "security");
						}
					}
				}
				if ($a == 1) {
					&extract("//$o/$o.$ext");
					if ($extra_used) {
						($head, $color, $lm, $announce, $announce_src, $sublist, $about, $about_src, $message, $message_src) = &get_page($topic_number, $topic_number);
						@sl = split(/\n/, $sublist);
						undef @extra;
						@extra = split(/&/, $extra{$o});
						undef @s;
						foreach $l (@sl) {
							if ($l =~ m|<!-Top: (\d+)-!>|) {
								$st = $1;
								&extract("//$o/$st.$ext");
								$st{$st} = $me_name;
								push (@s, $st);
							}
						}
					}
					$prs .= "<INPUT TYPE=CHECKBOX NAME=notify_$o VALUE=1";
					$prs .= " CHECKED" if grep(/^$o$/, @emt);
					$prs .= ">";
					$prs .= "$topic_name";
					if ($extra_used) {
						$possible = scalar(@s);
						$selected = scalar(@extra);
						if ($possible != $selected && $selected > 0) {
							$prs .= "<SUP>*</SUP>";
							$flag += 1;
							foreach $st (@s) {
								if (grep(/^$st$/, @extra)) {
									$prs .= "<INPUT TYPE=HIDDEN NAME=notify_st_$o" . "_$st VALUE=1>\n";
									$fl += 1 if $fl % 2 == 0;
								} else {
									$prs .= "<INPUT TYPE=HIDDEN NAME=notify_st_$o" . "_$st VALUE=0>\n";
									$fl += 2 if $fl < 2;
								}
							}
						}
					}
					$prs .= "<BR>\n";
				} else {
					$authflag = 1;
				}
			}
		}
		if ($authflag) {
			print "$L{PRED_EMAILNOTIFY_AUTH}\n<P>\n";
		}
		print "<P><UL>";
		print $prs;
		print "<P>*$L{PRED_FIRSTLEVEL_ON}" if $flag;
		print "</UL>";
		print "<P>\n";
		print "<HR SIZE=0>\n";
		print "$L{PRED_REPLIES}\n<P><UL>\n";
		print "<INPUT TYPE=CHECKBOX NAME=notify_00 VALUE=1";
		print " CHECKED" if grep(/^00$/, @emt);
		print "> $L{PRED_REPLIESBOX}\n";
		print "</UL>\n";
		print "<HR SIZE=0>\n";
		print "<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}\n";
		print "</UL><P><HR SIZE=0><INPUT TYPE=SUBMIT VALUE=\"$L{PROFEDIT_SAVEINFO}\">\n";
		print "<INPUT TYPE=SUBMIT VALUE=\"$L{PRED_FIRSTLEVEL}\" NAME=submit>\n";
		print "</FONT></TD></TR></TABLE></FORM>\n";
		print "<HR>\n";
	}
	print "<A NAME=personal><H4>$L{PRED_PERSONALINFO}</H4>\n";
	print "<FORM ACTION=$action_url METHOD=POST NAME=prinfo>\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=infosection>\n";
	print "<INPUT TYPE=HIDDEN NAME=password VALUE=\"$FORM{'password'}\">\n";
	print "<TABLE WIDTH=100% BORDER=1><TR><TD>$fs\n";
	print "$L{PRED_PERSONALINFO_INSTR}<P>";
	print "<TABLE><TR><TD>$fs<U>$L{PRED_HIDE}</U></TD></TR>\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);
		if ($varname =~ m|^\d|) {
			$varname_show = join("", "VAR_", $varname);
		} else {
			$varname_show = $varname;
		}
		print "<TR>\n";
		print "<TD ALIGN=CENTER VALIGN=TOP>";
		if ($shown == 0) {
			print "<INPUT TYPE=CHECKBOX NAME=$varname_show", "_hide VALUE=1 CHECKED onClick=\"document.prinfo.$varname_show", "_hide.checked = true; alert('$L{PRED_HIDE_MESSAGE}');\">";
		} elsif (!$required) {
			print "<INPUT TYPE=CHECKBOX NAME=$varname_show", "_hide VALUE=1";
			print " CHECKED" if ($P{$varname . "_hide"} || !$shown);
			print ">";
		} else {
			print "<INPUT TYPE=CHECKBOX NAME=$varname_show", "_hide VALUE=1 onClick=\"document.prinfo.$varname_show", "_hide.checked = false; alert('$L{PRED_SHOW_MESSAGE}');\">";
		}
		print "</TD>\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) {
			$P{$varname} =~ s/'/&#39;/g;
			print "<INPUT TYPE=TEXT NAME=$varname_show SIZE=40 VALUE='$P{$varname}' MAXLENGTH=250>";
		} else {
			print "<TEXTAREA NAME=$varname_show COLS=38 ROWS=$rows WRAP=VIRTUAL>";
			print "$P{$varname}</TEXTAREA>";
		}
		print "</TD></TR>\n";
	}
	foreach $key (sort {$a <=> $b} keys(%V)) {
		print "<TR><TD ALIGN=CENTER VALIGN=CENTER>";
		print "<INPUT TYPE=CHECKBOX NAME=$key", "_hide VALUE=1";
		print " CHECKED" if $P{$key . "_hide"};
		print "></TD>\n";
		print "<TD VALIGN=TOP>$fs";
		print &unescape($V{$key});
		print ":</FONT></TD><TD>\n";
		$P{$key} =~ s/'/&#39;/g;
		print "<INPUT TYPE=TEXT NAME=$key SIZE=40 VALUE='$P{$key}'>";
		print "</TD></TR>\n";
	}
	print "<TR><TD COLSPAN=3>&nbsp;</TD></TR>\n";
	print "<TR><TD>&nbsp;</TD><TD COLSPAN=2>$fs$L{PRED_PERSONALINFO_CUSTOM_INSTR}</TD></TR>\n";
	print "<TR><TD COLSPAN=3>&nbsp;</TD></TR>\n";
	print "<TR><TD>&nbsp;</TD><TD><INPUT TYPE=TEXT SIZE=15 NAME=customfield></TD>";
	print "<TD><INPUT TYPE=TEXT SIZE=40 NAME=customanswer></TD></TR>\n";
	print "</TABLE>\n";
	print "<P><INPUT TYPE=SUBMIT VALUE=\"$L{PROFEDIT_SAVEINFO}\">\n";
	print "</TD></TR></TABLE>";
	print "</FORM>\n";
	if ($GLOBAL_OPTIONS{'user_picts'} == 1 || $GLOBAL_OPTIONS{'user_picts'} eq "") {
		print "<HR>\n";
		print "<A NAME=picture><H4>$L{PRED_PICTURE}</H4>\n";
		if ($editflag ) {
			print "<FORM ACTION=$action_url METHOD=POST>\n";
		} else {
			print "<FORM ACTION=\"$script_url/board-image.$cgi_extension\" METHOD=POST ENCTYPE=\"multipart/form-data\">\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=password VALUE=\"$FORM{'password'}\">\n";
		print "<TABLE WIDTH=100% BORDER=1><TR><TD>$fs\n";
		if ($editflag) {
			if ($PICT{'picture'} eq "") {
				print "No picture is currently uploaded for this person.  The person\n";
				print "who maintains this profile is the only one permitted to upload\n";
				print "an image for this profile.\n";
			} else {
				print "<BR><CENTER>";
				$time = time;
				print "<IMG SRC=\"$script_url/board-profile.$cgi_extension?action=display_picture&picture=$profilename&timenow=$time\">";
				print "</CENTER>\n";
			}
		} else {
			if ($PICT{'picture'} eq "") {
				print $L{PRED_PICTURE_NONE};
			} else {
				print "<BR><CENTER>";
				$time = time;
				print "<IMG SRC=\"$script_url/board-profile.$cgi_extension?action=display_picture&picture=$profilename&timenow=$time\">";
				print "</CENTER>\n";
				print "<P>$L{PRED_PICTURE_HERE}\n";
			}
			print "<P></FONT><INPUT TYPE=FILE NAME=newpicture SIZE=40><P>$fs\n";
			print "<INPUT TYPE=SUBMIT NAME=SUBMIT VALUE=\"$L{PRED_UPLOAD_BUTTON}\">\n";
		}
		if ($PICT{'picture'} ne "") {
			if ($editflag) {
				print "<INPUT TYPE=HIDDEN NAME=action2 VALUE=picture>\n";
				print "<P>When editing another person's profile, you are not permitted to\n";
				print "upload a new picture.  However, you may clear the picture that was\n";
				print "uploaded by this person by clicking the button below.<P>";
			} else {
				print "<P>$L{PRED_PICTURE_CLEAR}<P>";
			}
			print "<INPUT TYPE=SUBMIT NAME=SUBMIT VALUE=\"";
			print "$L{PRED_CLEAR_BUTTON}\">\n";
		}
		print "</TD></TR></TABLE></FORM>\n";
	}
	print "<HR>\n";
	print "<A NAME=prefs><H4>$L{PRED_PREFERENCES}</H4>\n";
	print "<FORM ACTION=$action_url METHOD=POST NAME=cf>\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=preferences>\n";
	print "<INPUT TYPE=HIDDEN NAME=password VALUE=\"$FORM{'password'}\">\n";
	print "<TABLE WIDTH=100% BORDER=1><TR><TD>$fs\n";
	print "$L{PRED_PREFERENCES_INSTR}<P>";
	print "<TABLE><TR><TD VALIGN=TOP>";
	print "<INPUT TYPE=CHECKBOX NAME=cookie VALUE=1";
	print " CHECKED" if $PREF{'cookie'} == 1;
	print "></TD><TD>$fs$L{PRED_COOKIE}</TD></TR>\n";
	print "<TR><TD>&nbsp;</TD><TD>";
	print "<INPUT TYPE=CHECKBOX NAME=cookie_temp VALUE=1";
	print " CHECKED" if ($PREF{'cookie'} == 1 && $PREF{'cookie_temp'} == 1);
	print " onClick=\"var s = document.cf.cookie_temp.checked; if (s != 0) { document.cf.cookie.checked = true }\"";
	print ">&nbsp;&nbsp;&nbsp;$fs$L{PRED_COOKIE_TEMP}</TD></TR>\n";
	print "<TR><TD VALIGN=TOP><INPUT TYPE=CHECKBOX NAME=noemail VALUE=1";
	print " CHECKED" if $PREF{'noemail'} == 1;
	print "></TD><TD>$fs$L{PRED_NOSHOW_EMAIL}</TD></TR>\n";
	print "<TR><TD VALIGN=TOP><INPUT TYPE=CHECKBOX NAME=skip_preview VALUE=1";
	print " CHECKED" if $PREF{'skip_preview'} == 1;
	print "></TD><TD>$fs$L{PRED_SKIP_PREVIEW}</TD></TR>\n";
	print "<TR><TD VALIGN=TOP><INPUT TYPE=CHECKBOX NAME=show_all_nm VALUE=1";
	print " CHECKED" if $PREF{'show_all_nm'} == 1;
	print "></TD><TD>$fs$L{PRED_SHOW_ALL_NM}</TD></TR>\n";
	print "<TR><TD VALIGN=TOP><INPUT TYPE=CHECKBOX NAME=nm_view VALUE=1";
	print " CHECKED" if $PREF{'nm_view'} == 1;
	print "></TD><TD>$fs$L{PRED_NM_VIEW}</TD></TR>\n";
	print "<TR><TD VALIGN=TOP><INPUT TYPE=CHECKBOX NAME=nm_newwindow VALUE=1";
	print " CHECKED" if $PREF{'nm_newwindow'} == 1;
	print "></TD><TD>$fs$L{PRED_NM_NEWWINDOW}</TD></TR>\n";
	print "<TR><TD VALIGN=TOP><INPUT TYPE=CHECKBOX NAME=last_favs VALUE=1";
	print " CHECKED" if $PREF{'last_favs'} == 1;
	print "></TD><TD>$fs$L{PRED_USE_FAVORITES_IN_LAST}</TD></TR>\n";
	if ($dictionary ne "") {
		print "<TR><TD VALIGN=TOP><INPUT TYPE=CHECKBOX NAME=spellcheck VALUE=1";
		print " CHECKED" if $PREF{'spellcheck'} == 1;
		print "></TD><TD>$fs$L{PRED_SPELLCHECK}</TD></TR>\n";
	}
	if ($spellchecker_net_feature_on && $GLOBAL_OPTIONS{'spellchecker'} == 1 && $L{DISABLE_SPELLCHECKER_NET} ne "") {
		print "<TR><TD VALIGN=TOP><INPUT TYPE=CHECKBOX NAME=disable_spellchecker VALUE=1";
		print " CHECKED" if $PREF{'disable_spellchecker'} == 1;
		print "></TD><TD>$fs$L{DISABLE_SPELLCHECKER_NET}</TD></TR>\n";
	}
	print "</TABLE>\n";
	print "<P>$L{PRED_FAVORITES}<P>\n";
	print "$L{PRED_FAVORITES_DESCR}<P>\n";
	print "<UL>\n";
	open (TOP, "$message_dir/$board_topics_file"); @top = <TOP>; close (TOP);
	@topics = grep(/^<!-Top:/, @top);
	foreach $t (@topics) {
		if ($t =~ m|<!-Top: (\d+)-!>|) {
			$o = $1;
			&extract("//$o/$o.$ext");
			$a = 1;
			if ($username_editing ne $username) {
				$a = 0 if $authtopics{$o} == 0;
				$a = 1 if -e "$message_dir/$o";
			} else {
				if (!-e "$message_dir/$o") {
					if (!grep(/^$o$/, @auth)) {
						$a = 0;
						($a) = &verify_postread_privileges($o, $FORM{'username'}, $FORM{'password'}, $FORM{'special_password'}, "security");
					}
				}
			}
			if ($a == 1) {
				print "<INPUT TYPE=CHECKBOX NAME=favorites VALUE=$o";
				print " CHECKED" if grep(/^$o$/, split(/,/, $PREF{'favorites'}));
				print "> $topic_name<BR>\n";
			}
		}
	}
	print "</UL>\n";
	print "<P><INPUT TYPE=SUBMIT VALUE=\"$L{PROFEDIT_SAVEINFO}\">\n";
	print "</TD></TR></TABLE>";
	print "</FORM>\n";
	if ($GLOBAL_OPTIONS{'pwchange'} ne "0" || $editflag || $IS_MODERATOR) {
		print "<HR>\n";
		print "<A NAME=pass><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 "<A NAME=edit><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";
		if ($GLOBAL_OPTIONS{'emchange'} == 0) {
			print "<INPUT TYPE=RADIO NAME=editing VALUE=";
			print "1" if $editing < 3;
			print "3" if $editing >= 3;
			print " CHECKED" if ($editing == 1 || $editing == 3);
			print "> Editing is <FONT COLOR=00aa00><B>enabled</B></FONT><BR>\n";
			print "<INPUT TYPE=RADIO NAME=editing VALUE=";
			print "2" if $editing < 3;
			print "4" if $editing >= 3;
			print " CHECKED" if ($editing == 2 || $editing == 4);
			print "> Editing is <FONT COLOR=00aa00><B>enabled,</B></FONT> <FONT COLOR=ff0000><B>except e-mail address</B></FONT><BR>\n";
		} else {
			print "<INPUT TYPE=RADIO NAME=editing VALUE=1";
			print " CHECKED" if $editing;
			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";
	}
	&printuntil(3, 17, 0, "", 0, 1);
	exit(0);
}

#---SEPARATOR---#
#REQ:read_profile
#REQ:synchronize_PRO
#REQ:verify_user_password
#REQ:get_number
#REQ:profile_editor_screen_PRO

sub image_handler_PRO {
	if ($FORM{'action'} eq "profile_editor") {
		($result) = &verify_user_password($FORM{'username'}, $FORM{'password'}, 1);
		@result = split(/\n/, $result);
		foreach $line (@result) {
			($file, $user, $pass, $email, $full, $edit) = split(/:/, $line);
			$line = "" if $edit == 0;
		}
		@result = grep(/\S/, @result);
		if (scalar(@result) == 0) {
			&error_message($L{PROFILE_AUTHERROR}, $L{PROFILE_AUTHERROR_DESCR});
		}
		$r = shift(@result);
		@result_save = @result;
		$r =~ s/\n$//;
		($file, $user, $pass, $email, $full, $edit, $notify, $last, $group) = split(/:/, $r);
		$profilename = "$user-MODERATOR" if $file eq "PASSWD";
		$profilename = "$user-$group" if $file eq "USERS";
		$USER_SAVE = $user;
		$GROUP_SAVE = $group;
		$FILE_SAVE = $file; $FILE_SAVE =~ tr/A-Z/a-z/;
		&read_profile($profilename);
		$sub = $FORM{'SUBMIT'};
		if ($sub eq $L{PRED_CLEAR_BUTTON}) {
			$profilename = &getfn($profilename);
			&lock("eq", "$admin_dir/profiles/$profilename.txt");
			open (PROFILE, "$admin_dir/profiles/$profilename.txt");
			@profile = <PROFILE>;
			close (PROFILE);
			@profile = grep(!/^picture=/, @profile);
			open (PROFILE, ">$admin_dir/profiles/$profilename.txt");
			print PROFILE @profile;
			close (PROFILE);
			&unlock("eq", "$admin_dir/profiles/$profilename.txt");
			unlink("$admin_dir/profiles/$PICT{'picture'}");
		} else {
			$formname = "newpicture";
			$content = $CONTENT{$formname};
			if ($FILE{$formname} eq "") {
				&error_message($L{BI_UPLOAD_ERROR_TITLE}, $L{BI_UPLOAD_ERROR_NODATA});
			} elsif (!grep(/^$content$/, keys(%tag))) {
				$fmt = $L{BI_UPLOAD_ERROR_BADFORMAT};
				$fmt =~ s/\%format/$content/g;
				&error_message($L{BI_UPLOAD_ERROR_TITLE}, $fmt);
			} elsif (length($FILE{$formname}) > ($GLOBAL_OPTIONS{'registered_maxsize'} * 1000) && $GLOBAL_OPTIONS{'registered_maxsize'} != 0) {
				$fmtstr = $L{BI_UPLOAD_EXCEEDED_MAXLENGTH};
				$maxsize = $GLOBAL_OPTIONS{'registered_maxsize'};
				$yoursize = length($FILE{$formname}); $yoursize = ($yoursize / 1000);
				if ($yoursize =~ m|\.|) { $yoursize = $`; }
				$fmtstr =~ s/\%maxsize/$maxsize/g;
				$fmtstr =~ s/\%yoursize/$yoursize/g;
				&error_message($L{BI_UPLOAD_ERROR_TITLE}, $fmtstr);
			}
			$newext = $extension{$content};
			($num) = &get_number;
			$filename = "$admin_dir/profiles/$num.$newext";
			open (FILE, ">$filename");
			binmode(FILE);
			print FILE $FILE{$formname};
			close (FILE);
			chmod(oct($perms0644), $filename);
			unlink("$admin_dir/profiles/$PICT{'picture'}") if $PICT{'picture'} ne "";
			$profilename = &getfn($profilename);
			&lock("eq", "$admin_dir/profiles/$profilename.txt");
			open (PROFILE, "$admin_dir/profiles/$profilename.txt");
			@profile = <PROFILE>;
			close (PROFILE);
			@profile = grep(!/^picture=/, @profile);
			foreach $line (@profile) {
				if ($line =~ m|<PICTURE>|) {
					$line .= "picture=$num.$newext\n";
				}
			}
			open (PROFILE, ">$admin_dir/profiles/$profilename.txt");
			print PROFILE @profile;
			close (PROFILE);
			&unlock("eq", "$admin_dir/profiles/$profilename.txt");
		}
		$s = join("\n", @result_save);
		$file = $FILE_SAVE; $file =~ tr/a-z/A-Z/;
		$group = $GROUP_SAVE;
		&synchronize_PRO($file, $USER_SAVE, $s);
		&profile_editor_screen_PRO($FILE_SAVE, $USER_SAVE, $GROUP_SAVE, $USER_SAVE, "$script_url/board-profile.$cgi_extension", "profile_editor");
		exit(0);
	}
}

#---SEPARATOR---#

sub create_blank_profile_file {
	my ($filename) = @_;
	$filename = &getfn($filename);
	return 0 if -e "$admin_dir/profiles/$filename";
	if (-e "$admin_dir/newprofile.conf") {
		open (FILE, "$admin_dir/newprofile.conf");
		@newprofile = <FILE>;
		close (FILE);
		@newprofile = grep(/\S/, @newprofile);
		@newprofile = grep(!/^\s*#/, @newprofile);
		open (FILE, ">$admin_dir/profiles/$filename");
		print FILE @newprofile;
		close (FILE);
	} else {
		open (FILE, ">$admin_dir/profiles/$filename");
		print FILE "<INFO>\n</INFO>\n<CUSTOM>\n</CUSTOM>\n<PICTURE>\n</PICTURE>\n<EDITING>\n</EDITING>\n<PREFS>\n</PREFS>\n";
		close (FILE);
	}
}

#---SEPARATOR---#
#REQ:get_authorized_topics
#REQ:save_profile_information
#REQ:verify_postread_privileges

sub notify_save_pro {
	my ($username, $username_editing) = @_;
	if ($username eq "1" && $username_editing eq "") {
		$username_editing = $username;
	}
	@result_saved = @result;
	@notifykeys = grep(/^notify_/, keys(%FORM));
	@notify_topics = grep(/^notify_\d/, @notifykeys);
	@notify_subs = grep(/^notify_st_/, @notifykeys);
	$ns = "";
	undef %authtopics;
	if ($username ne $username_editing) {
		open (GROUPS, "$admin_dir/groups.txt");
		@groups = <GROUPS>;
		close (GROUPS);
		open (TOPICS, "$message_dir/$board_topics_file");
		@topics = <TOPICS>;
		close (TOPICS);
		@t = grep(/<!-Top: /, @topics);
		foreach $line (@t) {
			if ($line =~ m|<!-Top: (\d+)-!>|) {
				$o = $1; &extract("//$o/$o.$ext");
				foreach $line (@groups) {
					$line =~ s/\s+$//;
					if ($line =~ m|^$owner:|) {
						@mods = split(/,/, $');
						if (grep(/^$username_editing$/, @mods)) {
							$authtopics{$o} = 1;
						}
					}
				}
			}
		}
	} else {
		@auth = &get_authorized_topics;
		foreach $auth (@auth) {
			$authtopics{$auth} = 1;
		}
	}
	foreach $key (@notify_topics) {
		if ($key =~ m|^notify_(\d+)|) {
			$t = $1; $o = $1; $a = 0;
			if ($t =~ m|^0+$|) {
				$a = 1;
			} elsif (-e "$message_dir/$t") {
				$a = 1;
			} else {
				if ($authtopics{$t} == 1) {
					$a = 1;
				} elsif ($username eq $username_editing) {
					($a) = &verify_postread_privileges($o, $FORM{'username'}, $FORM{'password'}, $FORM{'special_password'}, "security");
				}
			}
			if ($a == 0) {
				&log_error("src-board-subs-103", "notify_save_pro", "User $username_editing tried to register user $username for unauthorized topic $t");
			}
			if ($a == 1) {
				$ns .= "$t"; $tm = join("", "_", $t, "_");
				@sp = grep(/^notify_st$tm/, @notify_subs);
				if (scalar(@sp) > 0) {
					$ns .= "/";
					undef @c;
					foreach $sub (@sp) {
						if ($sub =~ m|^notify_st$tm(\d+)|) {
							push (@c, $1) if $FORM{$sub} == 1;
						}
					}
					$ns .= join("&", @c);
				}
				$ns .= ",";
			}
		}
	}
	chop ($ns) if $ns =~ m|,$|;
	$ns = "*" if $ns eq "";
	&save_profile_information("", "", "", "", $ns, "", "", @result_saved);
}

#---SEPARATOR---#
#REQ:create_blank_profile_file

sub prefs_save_pro {
	@recognized_settings = ('disable_spellchecker', 'noemail', 'cookie', 'cookie_temp', 'skip_preview', 'show_all_nm', 'nm_view', 'nm_newwindow', 'favorites', 'spellcheck', 'last_favs');
	foreach $r (@result_save) {
		$r =~ s/\s*$//;
		($file, $username, $password, $email, $fullname, $editing, $email_notify, $lastcheck, $group) = split(/:/, $r);
		$profilename = "$username-$group" if $file eq "USERS";
		$profilename = "$username-MODERATOR" if $file eq "PASSWD";
		$profilename = &getfn($profilename);
		&lock("prefs_save_pro", "$admin_dir/profiles/$profilename.txt");
		if (open (FILE, "$admin_dir/profiles/$profilename.txt")) {
			@profile = <FILE>; close (FILE);
		} else {
			&create_blank_profile_file("$profilename.txt");
			open (FILE, "$admin_dir/profiles/$profilename.txt");
			@profile = <FILE>; close (FILE);
		}
		open (FILE, ">$admin_dir/profiles/$profilename.txt");
		$flag = 0;
		foreach $line (@profile) {
			if ($line =~ m|<PREFS>|) {
				$flag = 1;
				print FILE $line;
				foreach $pref (@recognized_settings) {
					if ($pref ne "favorites") {
						if ($FORM{$pref} != 0) {
							print FILE "$pref=1\n";
						} else {
							print FILE "$pref=0\n";
						}
					} else {
						print FILE "$pref=$FORM{'favorites'}\n";
					}
				}
			} elsif ($line =~ m|</PREFS>|) {
				print FILE $line;
				$flag = 0;
			} elsif ($flag == 0) {
				print FILE $line;
			}
		}
		close (FILE);
		&unlock("prefs_save_pro", "$admin_dir/profiles/$profilename.txt");
	}
}

#---SEPARATOR---#
#REQ:read_profile
#REQ:create_blank_profile_file

sub info_save_pro {
	undef %seen;
	foreach $r (@result_save) {
		$r =~ s/\s*$//;
		($file, $username, $password, $email, $fullname, $editing, $email_notify, $lastcheck, $group) = split(/:/, $r);
		$profilename = "$username-$group" if $file eq "USERS";
		$profilename = "$username-MODERATOR" if $file eq "PASSWD";
		$profilename = &getfn($profilename);
		&read_profile("$profilename.txt");
		&lock("info_save_pro", "$admin_dir/profiles/$profilename.txt");
		if (open (FILE, "$admin_dir/profiles/$profilename.txt")) {
			@profile = <FILE>; close (FILE);
		} else {
			&create_blank_profile_file("$profilename.txt");
			open (FILE, "$admin_dir/profiles/$profilename.txt");
			@profile = <FILE>; close (FILE);
		}
		undef @infosect;
		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);
			if ($var =~ m|^\d|) {
				$varform = "VAR_$var";
			} else {
				$varform = $var;
			}
			$ov = &escape($P{$var});
			if ($FORM{$varform} ne "") {
				$val2 = &escape($FORM{$varform});
				push (@infosect, "$var=$val2");
				push (@infosect, "$var" . "_hide=1") if ((!$required && $FORM{$varform . "_hide"}) || !$onoff);
			} else {
				push (@infosect, "$var=") if $required == 0;
				push (@infosect, "$var=$ov") if $required == 1;
			}
		}
		undef @customsect;
		foreach $key (sort {$a <=> $b} keys(%V)) {
			if ($FORM{$key} ne "") {
				$val2 = &escape($FORM{$key});
				$val3 = &escape($V{$key});
				push (@infosect, "$key=$val2");
				push (@customsect, "$key=$val3");
				push (@infosect, "$key" . "_hide=1") if ($FORM{$key . "_hide"});
			}
		}
		if ($FORM{'customfield'} ne "") {
			$key = time;
			$FORM{'customfield'} =~ s/\s*$//;
			$FORM{'customfield'} =~ s/^\s*//;
			$FORM{'customfield'} =~ s/:$//;
			$val3 = &escape($FORM{'customfield'});
			push (@customsect, "$key=$val3");
			$val2 = &escape($FORM{'customanswer'});
			push (@infosect, "$key=$val2");
		}
		open (FILE, ">$admin_dir/profiles/$profilename.txt");
		$flag = 0;
		foreach $line (@profile) {
			if ($line =~ m|<INFO>|) {
				$flag = 1;
				print FILE $line;
				print FILE join("\n", @infosect);
				print FILE "\n";
			} elsif ($line =~ m|</INFO>|) {
				print FILE $line;
				$flag = 0;
			} elsif ($line =~ m|<CUSTOM>|) {
				$flag = 1;
				print FILE $line;
				print FILE join("\n", @customsect);
				print FILE "\n";
			} elsif ($line =~ m|</CUSTOM>|) {
				print FILE $line;
				$flag = 0;
			} elsif ($flag == 0) {
				print FILE $line;
			}
		}
		close (FILE);
		&unlock("info_save_pro", "$admin_dir/profiles/$profilename.txt");
	}
}

#---SEPARATOR---#

sub clear_picture {
	@result = @_;
	foreach $r (@result) {
		$r =~ s/\s*$//;
		($file, $username, $password, $email, $fullname, $editing, $email_notify, $lastcheck, $group) = split(/:/, $r);
		$profilename = "$username-$group" if $file eq "USERS";
		$profilename = "$username-MODERATOR" if $file eq "PASSWD";
		$profilename = &getfn($profilename);
		&lock("clear_picture", "$admin_dir/profiles/$profilename.txt");
		open (PROFILE, "$admin_dir/profiles/$profilename.txt");
		@profile = <PROFILE>;
		close (PROFILE);
		@profile = grep(!/^picture=/, @profile);
		open (PROFILE, ">$admin_dir/profiles/$profilename.txt");
		print PROFILE @profile;
		close (PROFILE);
		&unlock("clear_picture", "$admin_dir/profiles/$profilename.txt");
		unlink("$admin_dir/profiles/$PICT{'picture'}");
	}
}

#---SEPARATOR---#
#REQ:printuntil
#REQ:get_navbar
#REQ:read_source
#REQ:remove_swearing
#REQ:inverse_webtags

sub edit_post_form {
	my ($foo1, $foo2, $post_index, $source, $formatted, $username, $error_force, $referer) = @_;
	my ($head, $color, $lm, $ann, $ann_src, $sublist, $about, $about_src, $message, $message_src) = &get_page($topic_number, $page_number);
	&extract("//$referer.$ext");
	undef @myposts;
	undef @aliases;
	foreach $line (@result_save) {
		$line =~ s/\s*$//;
		($file, $user, $pass, $email, $full, $edit, $notify, $lastcheck, $group) = split(/:/, $line);
		push (@aliases, "$user:$group") if $file eq "USERS";
		push (@aliases, "$user:MODERATOR") if $file eq "PASSWD";
		$IS_MODERATOR = 1 if $file eq "PASSWD";
		$IS_USER = 1 if $file eq "USERS";
	}
	open (LOG, "$admin_dir/msg_index/$topic_number-log.txt");
	$editcutoff = time - ($GLOBAL_OPTIONS{'usersedit_time'}*60);
	$ok = 0;
	while (<LOG>) {
		if (m|^(\d+);([^;]+);(\d+);(\d+)/(\d+);|) {
			($index, $postby, $timepost, $topic, $page) = ($1, $2, $3, $4, $5);
			if ($index == $post_index) {
				$px = quotemeta($postby);
				$ok = 1 if grep(/^$px$/, @aliases);
				$linesave = $_;
				last;
			}
		}
	}
	close (LOG);
	&error_message($L{PRED_EDIT_SORRY_TITLE}, $L{PRED_EDIT_SORRY_NOAUTHOR}, 0, 1) if !$ok;
	$pl = $linesave;
	($index, $postby, $timepost, $where) = split(/;/, $pl);
	if ($timepost < $editcutoff) {
		$l = $L{PRED_EDIT_SORRY_DESCR};
		$g = $GLOBAL_OPTIONS{'usersedit_time'};
		$l =~ s/\%minutes/$g/g;
		&error_message($L{PRED_EDIT_SORRY_TITLE}, $l, 0, 1);
	}
	($topic_number, $page_number) = split(/\//, $where);
	undef %USRQ; undef %MODQ;
	open (QUEUEFILE, "$admin_dir/queue.txt");
	@queue = <QUEUEFILE>;
	close (QUEUE);
	foreach $line (@queue) {
		chomp $line;
		($tn, $user, $moderator, $special, $public) = split(/:/, $line);
		$USRQ{$tn} = 1 if $user;
		$MODQ{$tn} = 1 if $moderator;
	}
	$tn = $topic_number;
	if ((($USRQ{$tn} && !$IS_MODERATOR) || ($MODQ{$tn} && $IS_MODERATOR)) && $GLOBAL_OPTIONS{'disable_if_queued'} == 1) {
		&error_message("Cannot Edit This Post!", "You cannot edit messages posted to this topic.");
	}
	($head, $color, $lm, $ann, $ann_src, $sublist, $about, $about_src, $message, $message_src) = &get_page($topic_number, $page_number);
	&extract("//$topic_number/$page_number.$ext");
	if ($formatted eq "") {
		@file = split(/\n/, $message);
		$message = "";
		$flag = 0;
		foreach $line (@file) {
			if ($line =~ /<!-Post: $post_index-!/) {
				$flag = 1;
			} elsif ($line =~ /<!-\/Post: $post_index-!/) {
				$flag = 0;
			} elsif ($flag == 1) {
				if ($line =~ m|<!-Text-!>(.*)<!-/Text-!>|) {
					$formatted = $1;
				}
			}
		}
	}
	if ($source eq "" && $GLOBAL_OPTIONS{'nosource'} == 0) {
		$source = &read_source($topic_number, $page_number, $post_index);
		$source = &inverse_webtags($formatted) if $source eq "";
	} elsif ($source eq "") {
		$source = &inverse_webtags($formatted);
	}
	&header;
	&printuntil(1, 1, $topic_number, $L{PED_TITLE});
	print "<CENTER><FONT SIZE=+1><B>$L{PED_TITLE}</B></FONT></CENTER><HR>\n<B>\n";
	&printuntil (3, 3, $topic_number, "", 0, 1);
	@file = split(/\n/, $head);
	($navbar) = &get_navbar($topic_number, $page_number, "post", 0);
	print "<A HREF=\"$message_url/$board_topics_file\" onMouseOver=\"window.status = '$L{NBRETURN} $L{NBMAINPAGE}'; return true\">$title</A>:\n";
	print $navbar, "$L{PED_TITLE}";
	print "</B><HR>\n";
	($bgcolor, $text, $link, $vlink, $alink, $face, $size, $img) = &extract_colorsonly;
	&printuntil(3, 11, 0, "", 0, 1);
	if (!$error_force) {
		print "$L{A_PREVIEW_APPEARS_BELOW}<BR><BR>\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\">" if !$error_force;
	if (!-e "$message_dir/$topic_number") {
		while ($formatted =~ m|<IMG SRC="$message_url/(\d+)/(\d+)\.(\w+)"([^>]*)>|) {
			$tn = $1; $pn = $2; $ex = $3;
			$formatted = join("", $`, "<img src=\"$script_url/board-admin.$cgi_extension?action=show_secure_graphic&file=/$tn/$pn.$ex&HTTP_REFERER=//$topic_number/$page_number.$ext&username=$FORM{'username'}\"$4>", $');
		}
		while ($formatted =~ m|<!-Attachment: ([^!]+)-!><CENTER><TABLE BORDER=1><TR><TD><IMG SRC="$html_url/icons/mime_(\w+).gif" ALIGN=LEFT ALT="([^"]+)">(.*?)<BR><A HREF="$message_url/(\d+)/[^"]+"><B>([^<]+)</B></A> \(([^>]+)\)</TD></TR></TABLE></CENTER><!-/Attachment-!>|) {
			($file, $icon, $type, $descr, $topic, $fakefile, $size) = ($1, $2, $3, $4, $5, $6, $7);
			$formatted = join("", $`, "<CENTER><TABLE BORDER=1><TR><TD><IMG SRC=\"$html_url/icons/mime_$icon.gif\" ALIGN=LEFT>$descr<BR><A HREF=\"$script_url/board-auth.$cgi_extension?type=$type&file=/$topic/$file\"><B>$fakefile</B></A> ($size)</TD></TR></TABLE></CENTER>", $');
		}
	}
	if ($GLOBAL_OPTIONS{'profanity'}) {
		($formatted) = &remove_swearing($formatted, 0, 1) if ($GLOBAL_OPTIONS{'profanity_detected'} == 1 || $GLOBAL_OPTIONS{'profanity_detected'} eq "");
		($x) = &remove_swearing($formatted, 0, 1) if $GLOBAL_OPTIONS{'profanity_detected'} == 2;
		if ($x ne "") {
			$formatted = "<H3>$L{PROFANITY_DETECTED}</H3>";
			$l = $L{PROFANITY_DETECTED_MESSAGE};
			$l =~ s/\%wordlist/$x/g;
			$formatted .= $l;
			$error_force = 1;
			print "</TD></TR></TABLE>\n";
		}
	}
	print $formatted;
	print "</TD></TR></TABLE>\n" if !$error_force;
	print "<HR>\n";
	$source =~ s/\s+$//; $source =~ s/^\s+//;
	$source = &unescape($source) if ($source !~ /\s/ && $FORM{'editing_flag'} == 0);
	$source =~ s/\s+$//; $source =~ s/^\s+//;
	if ($flag_edited == 1 || $FORM{'editing_flag'}) {
		$source =~ s/&/&amp;/g;
		$source =~ s/</&lt;/g;
		$source =~ s/>/&gt;/g;
		$source =~ s/"/&quot;/g;
	}
	$source =~ s/^\s+//;
	$source =~ s/\s+$//;
	print "<FORM ACTION=\"$script_url/board-profile.$cgi_extension\" METHOD=POST><TABLE BORDER=1 WIDTH=100%><TR><TD>";
	print "<TABLE><TR><TD>";
	print "<TEXTAREA NAME=message ROWS=8 COLS=60 WRAP=VIRTUAL>";
	print "$source</TEXTAREA></TD></TR></TABLE><BR>\n";
	print "<input type=hidden name=\"action\" value=\"edit_message\">\n";
	print "<input type=hidden name=\"username\" value=\"$username\">\n";
	print "<input type=submit name=submit value=\"$L{PED_REFRESH}\">\n";
	print "<input type=hidden name=postindex value=\"$post_index\">\n";
	print "<input type=submit name=SAVE value=\"$L{PED_SAVE}\">\n" if !$error_force;
	print "<input type=hidden name=\"HTTP_REFERER\" value=\"//$topic_number/$page_number.$ext\">\n";
	print "<input type=hidden value=\"1\" name=\"editing_flag\">\n";
	print "<input type=hidden value=\"$FORM{'password'}\" name=\"password\">\n";
	print "<input type=hidden name=RETURN value=1>\n" if $FORM{'RETURN'};
	print "</TD></TR></TABLE>\n";
	print "</FORM>\n";
	&printuntil(13, 17, 0, "", 0, 1);
	exit(0);
}

#---SEPARATOR---#
#REQ:save_edited_message
#REQ:edit_post_form
#REQ:compare_source
#REQ:webtags
#REQ:remove_swearing

sub edit_message_action {
	&extract($FORM{'HTTP_REFERER'});
	undef @myposts;
	undef @aliases;
	foreach $line (@result_save) {
		$line =~ s/\s*$//;
		($file, $user, $pass, $email, $full, $edit, $notify, $lastcheck, $group) = split(/:/, $line);
		push (@aliases, "$user:$group") if $file eq "USERS";
		push (@aliases, "$user:MODERATOR") if $file eq "PASSWD";
		$IS_MODERATOR = 1 if $file eq "PASSWD";
	}
	$editcutoff = time - ($GLOBAL_OPTIONS{'usersedit_time'}*60);
	$post_index = $FORM{'postindex'};
	open (LOG, "$admin_dir/msg_index/$topic_number-log.txt");
	while (<LOG>) {
		if (m|^(\d+);([^;]+);(\d+);(\d+)/(\d+);|) {
			($index, $postby, $timepost, $topic, $page) = ($1, $2, $3, $4, $5);
			if ($index == $post_index) {
				$px = quotemeta($postby);
				$ok = 1 if grep(/^$px$/, @aliases);
				$linesave = $_;
				last;
			}
		}
	}
	close (LOG);
	&error_message($L{PRED_EDIT_SORRY_TITLE}, $L{PRED_EDIT_SORRY_NOAUTHOR}, 0, 1) if !$ok;
	$pl = $linesave;
	($index, $postby, $timepost, $where) = split(/;/, $pl);
	if ($timepost < $editcutoff) {
		$l = $L{PRED_EDIT_SORRY_DESCR};
		$g = $GLOBAL_OPTIONS{'usersedit_time'};
		$l =~ s/\%minutes/$g/g;
		&error_message($L{PRED_EDIT_SORRY_TITLE}, $l, 0, 1);
	}
	undef %USRQ; undef %MODQ;
	open (QUEUEFILE, "$admin_dir/queue.txt");
	@queue = <QUEUEFILE>;
	close (QUEUE);
	foreach $line (@queue) {
		chomp $line;
		($tn, $user, $moderator, $special, $public) = split(/:/, $line);
		$USRQ{$tn} = 1 if $user;
		$MODQ{$tn} = 1 if $moderator;
	}
	$tn = $topic_number;
	if ((($USRQ{$tn} && !$IS_MODERATOR) || ($MODQ{$tn} && $IS_MODERATOR)) && $GLOBAL_OPTIONS{'disable_if_queued'} == 1) {
		&error_message("Cannot Edit This Post!", "Cannot edit in queue-approved topics");
	}
	$source = $FORM{"message"};
	($lint, $message) = &webtags($source, 0, 1);
	&error_message ($L{POSTED_ERROR}, $L{BPADDMSGERRORDESC}) if $message eq "";
	$error_force = 1 if $lint eq "!Error";
	($removed, $added) = &compare_source($source, $topic_number, $me_number, $FORM{'postindex'});
	if ($added) {
		$message = "<H3>$L{POSTED_ERROR}</H3>$L{POSTED_ATTACHMENTS}<P><UL>";
		@added = split(/\n/, $added);
		foreach $line (@added) {
			$message .= "<LI>$line\n";
		}
		$message .= "</UL><P>$L{POSTED_ATTACHMENTS_2}";
		$error_force = 1;
	}
	if ($FORM{'SAVE'} eq "" || $error_force == 1) {
		&edit_post_form($topic_number, $me_number, $FORM{"postindex"}, $source, $message, $FORM{"username"}, $error_force, $FORM{'HTTP_REFERER'});
		exit(0);
	}
	if ($GLOBAL_OPTIONS{'profanity'}) {
		($message) = &remove_swearing($message, 0, 1) if ($GLOBAL_OPTIONS{'profanity_detected'} == 1 || $GLOBAL_OPTIONS{'profanity_detected'} eq "");
		($x) = &remove_swearing($message, 0, 1) if $GLOBAL_OPTIONS{'profanity_detected'} == 2;
		if ($x ne "") {
			&edit_post_form($topic_number, $me_number, $FORM{"postindex"}, $source, $message, $FORM{"username"}, $error_force, $FORM{'HTTP_REFERER'});
			exit(0);
		}
	}
	&save_edited_message($topic_number, $me_number, $FORM{"postindex"}, &escape($source), $message, $FORM{"username"});
}

#---SEPARATOR---#
#REQ:read_profile
#REQ:verify_user_password

sub get_preferences {
	my ($user_x, $password_in, $pwline) = @_;
	my ($result, $r, $file, $user, $pass, $email, $full, $edit, $notify, $last, $group, $filename);
	$user_x = "" if $user_x == 1;
	if ($user_x eq "") {
		$user_x = $FORM{'username'} if ($FORM{'username'} ne "" && $user_x eq "");
		$user_x = $COOKIE{'user' . $COOKIE_ID} if $user_x eq "";
		$password_in = $FORM{'password'} if $password_in eq "";
		($pwline) = &verify_user_password($user_x, $password_in, 0, 1);
		@pwline = split(/\n/, $pwline);
		$pwline = $pwline[0];
	}
	return 0 if $pwline eq "";
	($file, $user, $pass, $email, $full, $edit, $notify, $last, $group) = split(/:/, $pwline);
	$fn = "$user-MODERATOR" if $file eq "PASSWD";
	$fn = "$user-$group" if $file eq "USERS";
	&read_profile($fn);
}

#---SEPARATOR---#
#REQ:get_authorized_topics
#REQ:verify_postread_privileges

sub validate_auths {
	my ($topic) = @_;
	my (@auth, $a, $pass, $guess, $this_ip_banned);
	@auth = &get_authorized_topics;
	if (!grep(/^$topic$/, @auth)) {
		$FORM{'username'} = $COOKIE{'user' . $COOKIE_ID} if ($FORM{'username'} eq "" && $COOKIE{'user' . $COOKIE_ID} ne "");
		($a) = &verify_postread_privileges($topic, $FORM{'username'}, $FORM{'password'}, $FORM{'special_password'}, "security");
		if ($a == 1) {
			push (@auth, $topic);
			if (open(FILE, "$secdir/$topic/passwd.txt")) {
				@file = <FILE>;
				close (FILE);
				$pass = $file[0]; $pass =~ s/\s+$//;
				$guess = crypt($pass, "cookie");
				$COOKIE_STRING .= "Set-Cookie: auth$topic$COOKIE_ID=$guess; path=/\n";
			}
			$COOKIE{"auth$topic" . $COOKIE_ID} = $guess;
		} elsif ($a == 2) {
			$this_ip_banned = 1;
		}
	}
	return @auth;
}

#---SEPARATOR---#
#REQ:printuntil
#REQ:get_authorized_topics
#REQ:verify_postread_privileges

sub select_by_subtopics {
	my ($file, $username, $group, $username_editing, $action_url, $action, $editflag) = @_;
	$file =~ tr/A-Z/a-z/;
	undef %authtopics;
	if ($username ne $username_editing) {
		undef %authtopics;
		open (GROUPS, "$admin_dir/groups.txt");
		@groups = <GROUPS>;
		close (GROUPS);
		open (TOPICS, "$message_dir/$board_topics_file");
		@topics = <TOPICS>;
		close (TOPICS);
		@t = grep(/<!-Top: /, @topics);
		foreach $line (@t) {
			if ($line =~ m|<!-Top: (\d+)-!>|) {
				$o = $1;
				&extract("//$1/$1.$ext");
				foreach $line (@groups) {
					$line =~ s/\s+$//;
					if ($line =~ m|^$owner:|) {
						@mods = split(/,/, $');
						if (grep(/^$username_editing$/, @mods)) {
							$authtopics{$o} = 1;
						}
					}
				}
			}
		}
	}
	open (TOP, "$message_dir/$board_topics_file"); @top = <TOP>; close (TOP);
	@topics = grep(/^<!-Top:/, @top); undef %st;
	@auth = &get_authorized_topics;
	$authflag = 0; $flag = 0;
	foreach $t (@topics) {
		if ($t =~ m|<!-Top: (\d+)-!>|) {
			$o = $1;
			$a = 1;
			if ($username_editing ne $username) {
				$a = 0 if $authtopics{$o} == 0;
				$a = 1 if -e "$message_dir/$o";
			} else {
				if (!-e "$message_dir/$o") {
					if (!grep(/^$o$/, @auth)) {
						$a = 0;
						($a) = &verify_postread_privileges($o, $FORM{'username'}, $FORM{'password'}, $FORM{'special_password'}, "security");
					}
				}
			}
			$authtopics{$o} = $a;
		}
	}
	open (FILE, "$admin_dir/$file.txt"); @file = <FILE>; close (FILE);
	if ($file eq "passwd") {
		($uline) = grep(/^$username:/, @file);
	} else {
		@u = grep(/^$username:/, @file);
		($uline) = grep(/:$group\s*$/, @u);
	}
	chop ($uline) if $uline =~ m|\n$|;
	($username, $password, $email, $fullname, $editing, $email_notify, $lastcheck, $group) = split(/:/, $uline);
	$GROUP = $FORM{'group'} if $FORM{'group'};
	@emt = split(/,/, $email_notify); undef %extra;
	foreach $l (@emt) {
		if ($l =~ m|^(\d+)/|) {
			$l = $1; $extra{$l} = $';
		}
	}
	&header;
	&printuntil(1, 1, 0, $L{PROFEDIT_TITLE});
	$fs = "<FONT SIZE=\"$size\" FACE=\"$face\">";
	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 "<A HREF=\"javascript:history.back()\" onMouseOver=\"return setStatus('Return to editing \u$username')\">";
		print "Edit \u$username</A>: Select E-mail Notification by Subtopic</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 "<A HREF=\"javascript:history.back()\" onMouseOver=\"return setStatus('Return to editing \u$username')\">";
		print "Edit \u$username</A>: Select E-mail Notification by Subtopic</B><HR>\n";
	} else {
		print "<B><A HREF=\"$script_url/board-profile.$cgi_extension\">";
		print $L{PROFEDIT_TITLE};
		print "</A>: <A HREF=\"javascript:history.back()\">$L{PRED_EDITINGYOU}</A>: ";
		print "$L{PRED_SELECTBYSUB}</B><HR>\n";
	}
	print "<A NAME=notify><H4>$L{PROFEDIT_EMAILNOTIFY}</H4>\n";
	print "<FORM ACTION=$action_url METHOD=POST NAME=emf>\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{PRED_CHOOSETOPICS}\n";
	undef $prs;
	open (TOP, "$message_dir/$board_topics_file"); @top = <TOP>; close (TOP);
	@topics = grep(/^<!-Top:/, @top); undef %st;
	@auth = &get_authorized_topics;
	$authflag = 0; $flag = 0; undef $prs;
	foreach $t (@topics) {
		if ($t =~ m|<!-Top: (\d+)-!>|) {
			$o = $1;
			$a = 1;
			if ($username_editing ne $username) {
				$a = 0;
				$a = 1 if $authtopics{$o};
				$a = 1 if -e "$message_dir/$o";
			} else {
				if (!-e "$message_dir/$o") {
					if (!grep(/^$o$/, @auth)) {
						$a = 0;
						($a) = &verify_postread_privileges($o, $FORM{'username'}, $FORM{'password'}, $FORM{'special_password'}, "security");
					}
				}
			}
			if ($a == 1) {
				&extract("//$o/$o.$ext");
				($head, $color, $lm, $announce, $announce_src, $sublist, $about, $about_src, $message, $message_src) = &get_page($topic_number, $topic_number);
				@sl = split(/\n/, $sublist);
				@extra = split(/&/, $extra{$o});
				undef @s;
				foreach $l (@sl) {
					if ($l =~ m|<!-Top: (\d+)-!>|) {
						$st = $1;
						&extract("//$o/$st.$ext");
						$st{$st} = $me_name;
						push (@s, $st);
					}
				}
				$prs .= "<INPUT TYPE=CHECKBOX NAME=notify_$o VALUE=1";
				$prs .= " CHECKED" if grep(/^$o$/, @emt);
				$prs .= " onClick=\"var s = document.emf.notify_$o.checked; ";
				foreach $st (@s) {
					$prs .= "document.emf.notify_st_$o" . "_$st.checked = s; ";
				}
				$prs .= "\"> $topic_name<BR>\n";
				foreach $st (@s) {
					$prs .= "&nbsp;&nbsp;&nbsp;<INPUT TYPE=CHECKBOX NAME=notify_st_$o" . "_$st VALUE=1";
					$prs .= " CHECKED" if grep(/^$st$/, @extra);
					$prs .= " CHECKED" if ($extra{$o} eq "" && grep(/^$o$/, @emt));
					$prs .= " onClick=\"var s = document.emf.notify_st_$o" . "_$st.checked; ";
					$prs .= "if (s == true) { document.emf.notify_$o.checked = true; }\"";
					$prs .= "> $st{$st}<BR>\n";
				}
			} else {
				$authflag = 1;
			}
		}
	}
	if ($authflag) {
		print "$L{PRED_EMAILNOTIFY_AUTH}\n<P>\n";
	}
	print "<P><UL>";
	print $prs;
	print "<P>*$L{PRED_FIRSTLEVEL_ON}" if $flag;
	print "</UL>";
	print "<P>\n";
	print "<HR SIZE=0>\n";
	print "$L{PRED_REPLIES}\n<P><UL>\n";
	print "<INPUT TYPE=CHECKBOX NAME=notify_00 VALUE=1";
	print " CHECKED" if grep(/^00$/, @emt);
	print "> $L{PRED_REPLIESBOX}\n";
	print "</UL>\n";
	print "<HR SIZE=0>\n";
	print "<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}\n";
	print "</UL><P><HR SIZE=0><INPUT TYPE=SUBMIT VALUE=\"$L{PROFEDIT_SAVEINFO}\">\n";
	print "</FONT></TD></TR></TABLE></FORM>\n";
	&printuntil(3, 17, 0, "", 0, 1);
	exit(0);
}

# END - FILE IS CORRECTLY UPLOADED #
