# FILE: src-board-subs-15
# Moderator and group management
#-------------------------------------------------------------------------------
# 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.
#-------------------------------------------------------------------------------

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

sub add_moderator {
	my ($username, $newuser, $pass1, $pass2, $email, $full) = @_;
	$newuser =~ tr/A-Z/a-z/; $pass1 =~ tr/A-Z/a-z/; $pass2 =~ tr/A-Z/a-z/;
	while ($newuser =~ m|(\W)|g) {
		$o = ord($1); $m = $1;
		&error_message("Add Moderator Error", "Username is invalid (username may not contain the character <B>$m</B>).", 1, 1) if $o < 126;
	}
	while ($pass1 =~ m|(\W)|g) {
		$o = ord($1); $m = $1;
		&error_message("Add Moderator Error", "Password is invalid (password may not contain the character <B>$m</B>).", 1, 1) if $o < 126;
	}
	&error_message("Add Moderator Error", "The entered passwords do not match!", 1, 1) if $pass1 ne $pass2;
	$usercount = length($newuser);
	&error_message("Add Moderator Error", "The username is invalid (username must be between 1 and 20 characters).", 1, 1) if ($usercount < 1 || $usercount > 20);
	$passcount = length($pass1);
	&error_message("Add Moderator Error", "The entered passwords are invalid (password must be between 1 and 20 characters).", 1, 1) if ($passcount < 1 || $passcount > 20);
	open(PASSWD,"$admin_dir/passwd.txt") || &error_message("Add Moderator Error", "Cannot read password file (passwd.txt)! (Code 020401)");
	@passwdline = <PASSWD>;
	close(PASSWD);
	foreach $line (@passwdline) {
		($user, $encpass, $therest) = split(/:/, $line);
		&error_message("Add Moderator Error", "The selected username already exists as a moderator!", 1, 1) if $user eq $newuser;
	}
	srand(time);
	undef (@salt);
	for ($i=1; $i<=2; $i++) {
		push (@salt, int(rand(26))+65);
	}
	$salt = pack('c2', @salt);
	&lock("add_moderator", "$admin_dir/passwd.txt");
	if ($email =~ m|^([\w\-\+\.]+)\@([\w\-\+\.]+)$|) {
		$email_new = $email;
	} else {
		$email_new = "email";
	}
	if ($full eq "") {
		$full = "fullname";
	} else {
		$full =~ s/\n//g;
		$full =~ s/[:<>]//g;
	}
	$new_password = crypt($pass1, $salt);
	open(PASSWD,">>$admin_dir/passwd.txt") || &error_message("Add Moderator Error", "Cannot append password file (passwd.txt)! (Code 020202)");
	print PASSWD "$newuser:$new_password:$email:$full:1::0\n";
	close(PASSWD);
	if ($pro) {
		&create_blank_profile_file("$newuser-MODERATOR.txt");
	}
	&unlock("add_moderator", "$admin_dir/passwd.txt");
}

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

sub delete_moderator {
	my ($toremove) = @_;
	my (@passwd, $line, $user, $therest);
	&lock("delete_moderator", "$admin_dir/passwd.txt");
	open (PASSWD, "$admin_dir/passwd.txt") || &error_message("File Error", "Cannot open password file (passwd.txt) for reading! (Code 020501)");
	@passwd = <PASSWD>;
	close (PASSWD);
	open (PASSWD, ">$admin_dir/passwd.txt") || &error_message("File Error", "Cannot open password file (passwd.txt) for writing! (Code 020502)");
	foreach $line (@passwd) {
		($user) = split(/:/, $line);
		print PASSWD $line if $toremove ne $user;
	}
	close (PASSWD);
	&unlock("delete_moderator", "$admin_dir/passwd.txt");
	&lock("delete_moderator", "$admin_dir/groups.txt");
	open (GRP, "$admin_dir/groups.txt"); @grp = <GRP>; close (GRP);
	foreach $line (@grp) {
		chop $line if $line =~ /\n/;
		($group, $users) = split(/:/, $line);
		@users = split(/,/, $users);
		@users = grep(!/^$toremove$/, @users);
		$users = join(",", @users);
		$users .= "\n";
		$line = join(":", $group, $users);
	}
	open (GRP, ">$admin_dir/groups.txt");
	print GRP @grp;
	close (GRP);
	&unlock("delete_moderator", "$admin_dir/groups.txt");
	if ($pro) {
		$line = $toremove;
		$profile_fn = &getfn("$line-MODERATOR.txt");
		if (-e "$admin_dir/profiles/$profile_fn") {
			$PICT{'picture'} = "";
			&read_profile("$profile_fn");
			if ($PICT{'picture'} ne "") {
				unlink("$admin_dir/profiles/$PICT{'picture'}");
			}
			unlink("$admin_dir/profiles/$profile_fn");
		}
	}
}

#---SEPARATOR---#

sub groups_by_moderator {
	my ($moderator) = @_;
	open (GROUP, "$admin_dir/groups.txt") || &error_message("File Error", "Cannot open group file (groups.txt) for reading!");
	@group = <GROUP>;
	close (GROUP);
	&header;
	print "<HTML><HEAD><TITLE>Edit Groups for \u$moderator</TITLE>\n";
	print "<SCRIPT LANGUAGE=\"JavaScript\">\n";
	print "<!-- Hide\n";
	print "function setStatus(msg) {\n";
	print "  window.status = msg; return true\n";
	print "}\n";
	print "//-->\n";
	print "</SCRIPT>\n";
	print "</HEAD>\n";
	print "<BODY BGCOLOR=ffffff TEXT=000000 LINK=0000ff VLINK=0000ff ALINK=ff0000 onLoad=\"window.defaultStatus = 'Edit groups by moderator'\">\n";
	print "$fs<FONT SIZE=3><CENTER><B>Edit Groups for \u$moderator</B></CENTER></FONT>\n";
	print "<HR>\n";
	print "<B><A HREF=\"$cgiurlm?username=$username&cmd=moderator_mgr\" onMouseOver=\"return setStatus('Return to moderator manager screen')\">Moderator Manager</A>: Edit Groups for \u$moderator</B>\n<HR>\n";
	print "<H3>Groups for \u$moderator</H3>\n";
	print "<FORM ACTION=\"$cgiurl2\" METHOD=POST NAME=sf>\n";
	print "<TABLE BGCOLOR=#ffffcc BORDER=1 WIDTH=100%><TR><TD>$fs\n";
	print "\"\u$moderator\" will belong to the following group(s):<P><UL>\n";
	foreach $line (sort(@group)) {
		$line =~ s/\s+$//;
		($gname, $moder) = split(/:/, $line);
		@moder = split(/,/, $moder);
		print "<INPUT TYPE=CHECKBOX NAME=group VALUE=\"$gname\"";
		print " CHECKED" if grep(/^$moderator$/, @moder);
		print "> \u$gname<BR>\n";
	}
	print "</UL><P><INPUT TYPE=SUBMIT VALUE=\"Save Settings\">\n";
	print "</TD></TR></TABLE>\n";
	print "<INPUT TYPE=HIDDEN NAME=action VALUE=group_by_moderator>\n";
	print "<INPUT TYPE=HIDDEN NAME=moderator VALUE=$moderator>\n";
	print "<INPUT TYPE=HIDDEN NAME=username VALUE=$username>\n";
	print "</FORM></BODY></HTML>\n";
	exit(0);
}

#---SEPARATOR---#

sub groups_by_moderator_save {
	my ($moderator, $groups) = @_;
	&lock("groups_by_moderator_save", "$admin_dir/groups.txt");
	open (GROUP, "$admin_dir/groups.txt") || &error_message("File Error", "Cannot open group file (groups.txt) for reading!");
	@group = <GROUP>;
	close (GROUP);
	@gn = split(/,/, $groups);
	foreach $line (@group) {
		($gname, $mod) = split(/:/, $line);
		$mod =~ s/\s+$//;
		@mod = split(/,/, $mod);
		@mod = grep(!/^$moderator$/, @mod);
		push (@mod, $moderator) if grep(/^$gname$/, @gn);
		$line = join(":", $gname, join(",", @mod));
		$line .= "\n";
	}
	open (GROUP, ">$admin_dir/groups.txt") || &error_message("File Error", "Cannot write group file (groups.txt)!");
	print GROUP @group;
	close (GROUP);
	&unlock("groups_by_moderator_save", "$admin_dir/groups.txt");
}

#---SEPARATOR---#

sub moderator_mgr {
	open (PASSWD, "$admin_dir/passwd.txt") || &error_message("File Error", "Cannot open moderator password file (passwd.txt)! (Code 040601)");
	@passwd = <PASSWD>;
	close (PASSWD);
	$count = scalar(@passwd);
	&header;
	print "<HTML><HEAD><TITLE>Moderator Manager</TITLE>\n";
	print "<SCRIPT LANGUAGE=\"JavaScript\">\n";
	print "<!-- Hide\n";
	print "function setStatus(msg) {\n";
	print "  window.status = msg; return true\n";
	print "}\n";
	print "function usract(action, number, name1) {\n";
	print "  document.sf.SELECTION.value = action + number;\n";
	print "  if (action == 'delete') {\n";
	print "    var m = confirm(\"Are you sure you want to delete \" + name1 + \"?\");\n";
	print "    if (m == true) {\n";
	print "      document.sf.submit();\n";
	print "    }\n";
	print "  } else {\n";
	print "    document.sf.submit()\n";
	print "  }\n";
	print "}\n";
	print "function 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>\n";
	print "</HEAD><BODY BGCOLOR=ffffff TEXT=000000 LINK=0000ff VLINK=0000ff ";
	print "ALINK=ffff00 onLoad=\"window.defaultStatus = 'Moderator Manager'\"";
	print ">\n\n";
	print "$fs\n";
	print "<FONT SIZE=3><CENTER><B>Moderator Manager</B></CENTER></FONT>\n<HR>\n";
	print "<H3>Moderators</H3><FORM ACTION=\"$cgiurl2\" METHOD=POST NAME=sf>\n";
	print "<TABLE CELLSPACING=0 CELLPADDING=2 BORDER=0>\n";
	$bgcolor = "ffffcc";
	$c = 0;
	$ct = scalar(@passwd);
	print "<TR ALIGN=CENTER BGCOLOR=c0c0c0><TD>&nbsp;</TD><TD><FONT FACE=\"Verdana,Arial\" SIZE=1><B>Mark</B></FONT></TD><TD><FONT FACE=\"Verdana,Arial\" SIZE=1><B>Del</B></FONT></TD><TD>&nbsp;</TD><TD><FONT FACE=\"Verdana,Arial\" SIZE=1><B>Edit</B></FONT></TD><TD><FONT FACE=\"Verdana,Arial\" SIZE=1><B>Grp</B></FONT></TD><TD>&nbsp;</TD><TD ALIGN=LEFT WIDTH=100%><FONT FACE=\"Verdana,Arial\" SIZE=1><B>Moderator</B></FONT></TD><TD>&nbsp;</TD><TD ALIGN=LEFT><FONT FACE=\"Verdana,Arial\" SIZE=1><B>Last&nbsp;Logged&nbsp;In</B></FONT></TD><TD>&nbsp;</TD></TR>\n";
	undef @mod;
	foreach $line (sort(@passwd)) {
		($user, $encpass, $email, $fullname, $profile, $email2, $last) = split(/:/, $line);
		print "<TR VALIGN=CENTER ALIGN=CENTER BGCOLOR=#$bgcolor><TD BGCOLOR=c0c0c0>&nbsp;</TD>";
		if ($bgcolor eq "ffffcc") {
			$bgcolor = "ffffff";
		} else {
			$bgcolor = "ffffcc";
		}
		$num = $user;
		print "<TD>";
		print "<A HREF=\"#\" onClick=\"markto($c, $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($c, $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;";
		$c++;
		print "<INPUT TYPE=CHECKBOX NAME=MARK VALUE=$num>&nbsp;&nbsp;</TD>";
		print "<TD><A HREF=\"javascript:usract('delete', '$num', '\u$num')\" onMouseOver=\"return setStatus('Delete this moderator')\"><IMG SRC=\"$html_url/icons/delete_icon.gif\" HEIGHT=25 WIDTH=25 BORDER=1></A></TD>" if $user ne $superuser;
		print "<TD ALIGN=CENTER VALIGN=CENTER>N/A</TD>" if $user eq $superuser;
		print "<TD BGCOLOR=c0c0c0>&nbsp;</TD>\n";
		print "<TD><A HREF=\"javascript:usract('edit', '$num', '\u$num')\" onMouseOver=\"return setStatus('Edit this moderator')\"><IMG SRC=\"$html_url/icons/edit_icon.gif\" HEIGHT=25 WIDTH=25 BORDER=1></A></TD>" if $user ne $superuser;
		print "<TD><A HREF=\"$script_url/board-profile.$cgi_extension?action=profile_editor_screen&password=adminlogin&username=$superuser\" onMouseOver=\"return setStatus('Edit yourself')\"><IMG SRC=\"$html_url/icons/edit_icon.gif\" HEIGHT=25 WIDTH=25 BORDER=1></A></TD>" if $user eq $superuser;
		print "<TD><A HREF=\"javascript:usract('group', '$num', '\u$num')\" onMouseOver=\"return setStatus('Set editing group(s) for this moderator')\"><IMG SRC=\"$html_url/icons/group_icon.gif\" HEIGHT=25 WIDTH=25 BORDER=1></A></TD>";
		print "<TD BGCOLOR=c0c0c0>&nbsp;</TD>\n";
		print "<TD WIDTH=100% ALIGN=LEFT>$fs\u$user ";
		if ($fullname ne "" && $fullname ne "none" && $fullname ne "fullname") {
			print "($fullname)" if ($email eq "" || $email eq "email");
			print "(<A HREF=mailto:$email>$fullname</A>)" if ($email ne "" && $email ne "email");
		}
		print "</TD><TD BGCOLOR=c0c0c0>&nbsp;</TD><TD ALIGN=LEFT>$fs";
		$check = $last; chomp $check;
		if ($profile > 2 || $check !~ m|/|) {
			print "(Never)";
		} else {
			$check =~ m|/|; $bef = $';
			$dt = &get_date_time("dateonly", $bef); $dt =~ s/\s/&nbsp;/g;
			print $dt;
		}
		print "</FONT></TD><TD BGCOLOR=#c0c0c0>&nbsp;</TD>";
		print "</TR>\n";
	}
	if ($ct > 0) {
		print "<TR BGCOLOR=#ccccff ALIGN=CENTER>";
		print "<TD BGCOLOR=c0c0c0>&nbsp;</TD>\n";
		print "<TD ALIGN=LEFT><FONT FACE=\"Verdana,Arial\" SIZE=2><B>(Marked)</B></TD>";
		print "<TD><A HREF=\"javascript:usract('delete', 'All', 'all marked moderators')\" onMouseOver=\"return setStatus('Delete all marked moderators')\"><IMG SRC=\"$html_url/icons/delete_icon.gif\" HEIGHT=25 WIDTH=25 BORDER=1></A></TD>";
		print "<TD BGCOLOR=c0c0c0>&nbsp;</TD>\n";
		print "<TD>&nbsp;</TD>";
		print "<TD>&nbsp;</TD>";
		print "<TD 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 "<INPUT NAME=action TYPE=hidden value=\"moderator_form\">\n";
	print "<INPUT NAME=username TYPE=hidden value=\"$username\">\n";
	print "<INPUT NAME=SELECTION TYPE=hidden VALUE=\"\">\n";
	print "<HR></FORM>\n";
	print "<FORM ACTION=\"$cgiurl2\" METHOD=POST>\n";
	print "<H3>Add a Moderator</H3>\n";
	print "<TABLE BORDER=1 WIDTH=100% BGCOLOR=ffffcc><TR><TD>";
	print "<TABLE CELLSPACING=0 CELLPADDING=2 BORDER=0><TR><TD>$fs", "Username:</TD><TD>";
	print "<INPUT TYPE=TEXT NAME=user SIZE=15>";
	print "</TD></TR><TR><TD>$fs", "Password:</TD><TD>";
	print "<INPUT TYPE=PASSWORD NAME=pass_1 SIZE=15>";
	print "</TD></TR><TR><TD>$fs", "Verify Password:</TD><TD>";
	print "<INPUT TYPE=PASSWORD NAME=pass_2 SIZE=15>";
	print "</TD></TR><TR><TD>$fs", "E-mail (<I>optional</I>):</TD><TD>";
	print "<INPUT TYPE=TEXT NAME=email SIZE=30>";
	print "</TD></TR><TR><TD>$fs", "Full name (<I>optional</I>):</TD><TD>";
	print "<INPUT TYPE=TEXT NAME=fullname SIZE=30>";
	print "</TD></TR><TR><TD COLSPAN=2>&nbsp;</TD></TR><TR><TD COLSPAN=2>\n";
	print "<INPUT TYPE=SUBMIT VALUE=\"Add this Moderator\">";
	print "</TD></TR></TABLE>\n";
	print "</TD></TR></TABLE>\n";
	print "<INPUT NAME=action TYPE=hidden value=\"add_moderator\">\n";
	print "<INPUT NAME=username TYPE=hidden value=\"$username\">\n";
	print "</TD></TR></TABLE>\n";
	print "</FORM></BODY></HTML>\n";
	exit(0);
}

#---SEPARATOR---#

sub group_mgr {
	my ($username) = @_;
	open (GROUP, "$admin_dir/groups.txt") || &error_message("File Error", "Cannot open group file (groups.txt)!");
	@group = <GROUP>;
	close (GROUP);
	$count = @group;
	&header;
	print "<HTML><HEAD><TITLE>Group Manager</TITLE>\n";
	print "<SCRIPT LANGUAGE=\"JavaScript\">\n";
	print "<!-- Hide\n";
	print "function setStatus(msg) {\n";
	print "  window.status = msg; return true\n";
	print "}\n";
	print "function usract(action, number, name1) {\n";
	print "  document.sf.SELECTION.value = action + number;\n";
	print "  if (action == 'delete') {\n";
	print "    var m = confirm(\"Are you sure you want to delete \" + name1 + \"?\");\n";
	print "    if (m == true) {\n";
	print "      document.sf.submit();\n";
	print "    }\n";
	print "  } else {\n";
	print "    document.sf.submit()\n";
	print "  }\n";
	print "}\n";
	print "function 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>\n";
	print "</HEAD><BODY BGCOLOR=ffffff TEXT=000000 LINK=0000ff VLINK=0000ff ";
	print "ALINK=ffff00 onLoad=\"window.defaultStatus = 'Group Manager'\"";
	print ">\n\n";
	print "<FORM ACTION=\"$cgiurl2\" METHOD=POST NAME=sf>$fs\n";
	print "<FONT SIZE=3><CENTER><B>Group Manager</B></CENTER></FONT>\n<HR>\n";
	print "<H3>Groups</H3>\n";
	print "<TABLE CELLSPACING=0 CELLPADDING=2 BORDER=0>\n";
	$bgcolor = "ffffcc";
	$c = 0;
	@group = grep(!/^#/, @group);
	$ct = scalar(@group);
	print "<TR ALIGN=CENTER BGCOLOR=c0c0c0><TD>&nbsp;</TD><TD><FONT FACE=\"Verdana,Arial\" SIZE=1><B>Mark</B></FONT></TD><TD><FONT FACE=\"Verdana,Arial\" SIZE=1><B>Del</B></FONT></TD><TD>&nbsp;</TD><TD><FONT FACE=\"Verdana,Arial\" SIZE=1><B>Edit</B></FONT></TD><TD>&nbsp;</TD><TD ALIGN=LEFT WIDTH=100%><FONT FACE=\"Verdana,Arial\" SIZE=1><B>Group</B></FONT></TD><TD>&nbsp;</TD></TR>\n";
	foreach $line (sort(@group)) {
		chomp $line; next if $line !~ m|\S|;
		($group, $users) = split(/:/, $line);
		@users = split(/,/, $users); $uct = scalar(@users);
		print "<TR VALIGN=CENTER ALIGN=CENTER BGCOLOR=#$bgcolor><TD BGCOLOR=c0c0c0>&nbsp;</TD>";
		if ($bgcolor eq "ffffcc") {
			$bgcolor = "ffffff";
		} else {
			$bgcolor = "ffffcc";
		}
		$num = $group;
		foreach $numb (sort(@group)) {
			if ($numb eq $num) {
				$fl = 1;
			} elsif ($fl == 0) {
				$topstr .= "document.sf.MARK$numb.checked = c;";
			} elsif ($fl == 1) {
				$botstr .= "document.sf.MARK$numb.checked = c;";
			}
		}
		print "<TD>";
		print "<A HREF=\"#\" onClick=\"markto($c, $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($c, $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;";
		$c++;
		print "<INPUT TYPE=CHECKBOX NAME=MARK VALUE=$num>&nbsp;&nbsp;</TD>";
		print "<TD><A HREF=\"javascript:usract('delete', '$num', '\u$num')\" onMouseOver=\"return setStatus('Delete this group')\"><IMG SRC=\"$html_url/icons/delete_icon.gif\" HEIGHT=25 WIDTH=25 BORDER=1></A></TD>";
		print "<TD BGCOLOR=c0c0c0>&nbsp;</TD>\n";
		print "<TD><A HREF=\"javascript:usract('edit', '$num', '\u$num')\" onMouseOver=\"return setStatus('Edit this group (add/remove moderators from it)')\"><IMG SRC=\"$html_url/icons/edit_icon.gif\" HEIGHT=25 WIDTH=25 BORDER=1></A></TD>";
		print "<TD BGCOLOR=c0c0c0>&nbsp;</TD>\n";
		print "<TD WIDTH=100% ALIGN=LEFT><FONT FACE=\"Verdana,Arial\" SIZE=2>\n";
		$uct = 0 if $uct eq "";
		print "\u$group ($uct moderator";
		print "s" if $uct != 1;
		print ")</TD><TD BGCOLOR=c0c0c0>&nbsp;</TD>";
		print "</TR>\n";
	}
	if ($ct > 0) {
		print "<TR BGCOLOR=#ccccff ALIGN=CENTER>";
		print "<TD BGCOLOR=c0c0c0>&nbsp;</TD>\n";
		print "<TD ALIGN=LEFT><FONT FACE=\"Verdana,Arial\" SIZE=2><B>(Marked)</B></TD>";
		print "<TD><A HREF=\"javascript:usract('delete', 'All', 'all marked groups')\" onMouseOver=\"return setStatus('Delete all marked topics')\"><IMG SRC=\"$html_url/icons/delete_icon.gif\" HEIGHT=25 WIDTH=25 BORDER=1></A></TD>";
		print "<TD BGCOLOR=c0c0c0>&nbsp;</TD>\n";
		print "<TD>&nbsp;</TD>";
		print "<TD 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=8>&nbsp;</TD></TR></TABLE>\n";
	print "</TABLE>\n";
	print "<BR>\n";
	print "<INPUT NAME=action TYPE=hidden value=\"group_form\">\n";
	print "<INPUT NAME=username TYPE=hidden value=\"$username\">\n";
	print "<INPUT NAME=SELECTION TYPE=hidden VALUE=\"\">\n";
	print "<HR></FORM>\n";
	print "<FORM ACTION=\"$cgiurl2\" METHOD=POST>\n";
	print "<H3>Add a Group</H3>\n";
	print "<TABLE BORDER=1 WIDTH=100% BGCOLOR=ffffcc><TR><TD>";
	print "<TABLE CELLSPACING=0 CELLPADDING=2 BORDER=0><TR><TD>$fs", "Group Name:</TD><TD>";
	print "<INPUT TYPE=TEXT NAME=group SIZE=15>";
	print "</TD></TR></TABLE>\n";
	print "<INPUT NAME=action TYPE=hidden value=\"add_group\">\n";
	print "<INPUT NAME=username TYPE=hidden value=\"$username\">\n";
	print "<P>\n";
	print "<INPUT TYPE=submit VALUE=\"Add this Group\">\n";
	print "</TD></TR></TABLE>\n";
	print "</FORM></BODY></HTML>\n";
	exit(0);
}

#---SEPARATOR---#

sub add_group {
	my ($username, $newgroup) = @_;
	my (@groupline, $usercount, $line);
	&error_message("Add Group Error", "Group name is invalid -- it may contain only alphanumeric characters and the underscore character (&quot;_&quot;).") if $newgroup =~ /\W/;
	$usercount = length($newgroup);
	$newgroup =~ tr/A-Z/a-z/;
	&error_message("Add Group Error", "The group name is invalid (name must be between 2 and 20 characters).") if ($usercount < 2 || $usercount > 20);
	&lock("add_group", "$admin_dir/groups.txt");
	open(GROUP,"$admin_dir/groups.txt") || &error_message("Add Group Error", "Cannot read group file (groups.txt)! (Code 060201)");
	@groupline = <GROUP>;
	close(GROUP);
	foreach $line (@groupline) {
		($user, $therest) = split(/:/, $line);
		&error_message("Add Group Error", "The selected group ($newgroup) already exists!") if $user eq $newgroup;
	}
	@groupline = grep(!/^#/, @groupline);
	open(GROUP,">$admin_dir/groups.txt") || &error_message("Add Group Error", "Cannot write group file (groups.txt)! (Code 060302)");
	print GROUP @groupline;
	print GROUP "$newgroup:$superuser\n";
	close(GROUP);
	&unlock("add_group", "$admin_dir/groups.txt");
}

#---SEPARATOR---#

sub delete_group {
	my ($toremove) = @_;
	my (@group, $line, $user, $therest);
	$flag = 0;
	&lock("delete_group", "$admin_dir/groups.txt");
	open (GROUP, "$admin_dir/groups.txt") || &error_message("File Error", "Cannot open group file (groups.txt) for reading! (Code 060301)");
	@group = <GROUP>;
	close (GROUP);
	open (GROUP, ">$admin_dir/groups.txt") || &error_message("File Error", "Cannot open group file (groups.txt) for writing! (Code 060302)");
	foreach $line (@group) {
		($user) = split(/:/, $line);
		print GROUP $line if $toremove ne $user;
	}
	close (GROUP);
	&unlock("delete_group", "$admin_dir/groups.txt");
	&lock("delete_group", "$admin_dir/users.txt");
	open (USERS, "$admin_dir/users.txt"); @users = <USERS>; close (USERS);
	foreach $line (@users) {
		$line = "" if $line =~ m|:$toremove\s*$|;
	}
	@users = grep(/\S/, @users); $flag = 1 if scalar(@users) == 0;
	$usercontent = \@users;
	&safe_write("$admin_dir/users.txt", $usercontent, $flag);
	&unlock("delete_group", "$admin_dir/users.txt");
	if ($pro) {
		&lock("delete_group", "$admin_dir/selfreg.txt");
		open (SELFREG, "$admin_dir/selfreg.txt");
		@selfreg = <SELFREG>;
		close (SELFREG);
		foreach $line (@selfreg) {
			if ($line =~ m|^\-:$toremove:|) {
				$line = "";
			} elsif ($line =~ m|^Q:(.*):$toremove\s*$|) {
				$line = "";
			}
		}
		@selfreg = grep(/\S/, @selfreg);
		open (SELFREG, ">$admin_dir/selfreg.txt");
		print SELFREG @selfreg;
		close (SELFREG);
		&unlock("delete_group", "$admin_dir/selfreg.txt");
	}
}

#---SEPARATOR---#

sub edit_group {
	my ($username, $group) = @_;
	open (GROUP, "$admin_dir/groups.txt") || &error_message("File Error", "Cannot open group file (groups.txt) for reading! (Code 060401)");
	@group = <GROUP>;
	close (GROUP);
	&error_message("Invalid Group Selection", "The specified group does not exist! (Code 060402)") if !grep(/^$group:/, @group);
	&error_message("Invalid Group Selection", "The specified group does not exist! (Code 060403)") if $group eq "";
	($line) = grep(/^$group:/, @group);
	($group, $usersingroup) = split(/:/, $line, 2);
	chop ($usersingroup) if $usersingroup =~ /\n$/;
	@users = split(/,/, $usersingroup);
	$count = @users;
	&header;
	print "<HTML><HEAD><TITLE>Edit Group</TITLE>\n";
	print "<SCRIPT LANGUAGE=\"JavaScript\">\n";
	print "<!-- Hide\n";
	print "function setStatus(msg) {\n";
	print "  window.status = msg; return true\n";
	print "}\n";
	print "function usract(action, number, name1) {\n";
	print "  document.sf.SELECTION.value = action + number;\n";
	print "  if (action == 'delete') {\n";
	print "    var m = confirm(\"Are you sure you want to remove \" + name1 + \" from this group?\");\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 markto(num,count,dir) {\n";
	print "  if (count == 1) {\n";
	print "    var c = document.sf.MARK.checked;\n";
	print "    document.sf.MARK.checked = 1-c;\n";
	print "  } else {\n";
	print "    var c = document.sf.MARK[num].checked;\n";
	print "    if (dir==1) {\n";
	print "      for (var i=0; i<=num; i++) {\n";
	print "        document.sf.MARK[i].checked = 1-c;\n";
	print "      }\n";
	print "    }\n";
	print "    if (dir==0) {\n";
	print "      for (var i=num; i<count; i++) {\n";
	print "        document.sf.MARK[i].checked = 1-c;\n";
	print "      }\n";
	print "    }\n";
	print "  }\n";
	print "}\n";
	print "function usract2(action, number, name1) {\n";
	print "  document.sf2.SELECTION.value = action + number;\n";
	print "  document.sf2.submit()\n";
	print "}\n";
	print "function markto2(num,count,dir) {\n";
	print "  if (count == 1) {\n";
	print "    var c = document.sf2.MARK.checked;\n";
	print "    document.sf2.MARK.checked = 1-c;\n";
	print "  } else {\n";
	print "    var c = document.sf2.MARK[num].checked;\n";
	print "    if (dir==1) {\n";
	print "      for (var i=0; i<=num; i++) {\n";
	print "        document.sf2.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.sf2.MARK[i].checked = 1-c;\n";
	print "      }\n";
	print "    }\n";
	print "  }\n";
	print "}\n";
	print "//-->\n";
	print "</SCRIPT>\n";
	print "</HEAD>\n";
	print "<BODY BGCOLOR=ffffff TEXT=000000 LINK=0000ff VLINK=0000ff ALINK=ff0000 onLoad=\"window.defaultStatus = 'Group Editor: \u$group'\">\n";
	print "$fs<FONT SIZE=3><CENTER><B>Group Editor: \u$group</B></CENTER></FONT>\n";
	print "<HR>\n";
	print "<B><A HREF=\"$cgiurlm?username=$username&cmd=group_mgr\" onMouseOver=\"return setStatus('Return to group manager screen')\">Group Manager</A>: Edit \u$group</B>\n<HR>\n";
	print "<H3>Moderators In Group</H3>\n";
	print "<FORM ACTION=\"$cgiurl2\" METHOD=POST NAME=sf>\n";
	print "<TABLE CELLSPACING=0 CELLPADDING=2 BORDER=0>\n";
	$bgcolor = "ffffcc";
	$c = 0;
	$ct = scalar(@users);
	open (PASSWD, "$admin_dir/passwd.txt"); @passwd = <PASSWD>; close (PASSWD);
	foreach $line (@passwd) {
		($un, $pw, $em, $fnm) = split(/:/, $line);
		$fn{$un} = $fnm;
	}
	print "<TR ALIGN=CENTER BGCOLOR=c0c0c0><TD>&nbsp;</TD><TD><FONT FACE=\"Verdana,Arial\" SIZE=1><B>Mark</B></FONT></TD><TD><FONT FACE=\"Verdana,Arial\" SIZE=1><B>Rem</B></FONT></TD><TD>&nbsp;</TD><TD ALIGN=LEFT WIDTH=100%><FONT FACE=\"Verdana,Arial\" SIZE=1><B>Moderator</B></FONT></TD><TD>&nbsp;</TD></TR>\n";
	foreach $line (sort(@users)) {
		$fullname = $fn{$line};
		$num = $line;
		print "<TR VALIGN=CENTER ALIGN=CENTER BGCOLOR=#$bgcolor><TD BGCOLOR=c0c0c0>&nbsp;</TD>";
		if ($bgcolor eq "ffffcc") {
			$bgcolor = "ffffff";
		} else {
			$bgcolor = "ffffcc";
		}
		$num = $line;
		print "<TD>";
		print "<A HREF=\"#\" onClick=\"markto($c, $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($c, $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;";
		$c++;
		print "<INPUT TYPE=CHECKBOX NAME=MARK VALUE=$num>&nbsp;&nbsp;</TD>";
		print "<TD><A HREF=\"javascript:usract('delete', '$num', '\u$num')\" onMouseOver=\"return setStatus('Remove this moderator')\"><IMG SRC=\"$html_url/icons/group_icon_remove.gif\" HEIGHT=25 WIDTH=25 BORDER=1></A></TD>";
		print "<TD BGCOLOR=c0c0c0>&nbsp;</TD>\n";
		print "<TD WIDTH=100% ALIGN=LEFT><FONT FACE=\"Verdana,Arial\" SIZE=2>\u$num ";
		if ($fullname ne "" && $fullname ne "none" && $fullname ne "fullname") {
			print "($fullname)";
		}
		print "</TD><TD BGCOLOR=c0c0c0>&nbsp;</TD>";
		print "</TR>\n";
	}
	if ($ct > 0) {
		print "<TR BGCOLOR=#ccccff ALIGN=CENTER>";
		print "<TD BGCOLOR=c0c0c0>&nbsp;</TD>\n";
		print "<TD ALIGN=LEFT><FONT FACE=\"Verdana,Arial\" SIZE=2><B>(Marked)</B></TD>";
		print "<TD><A HREF=\"javascript:usract('delete', 'All', 'all marked moderators')\" onMouseOver=\"return setStatus('Remove all marked moderators')\"><IMG SRC=\"$html_url/icons/group_icon_remove.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 "</TR>\n";
	}
	print "<TR BGCOLOR=c0c0c0><TD COLSPAN=6>&nbsp;</TD></TR></TABLE>\n";
	print "</TABLE>\n";
	print "<P>\n";
	print "<INPUT NAME=action TYPE=hidden value=\"edit_group_form\">\n";
	print "<INPUT NAME=username TYPE=hidden value=\"$username\">\n";
	print "<INPUT NAME=group TYPE=hidden VALUE=\"$group\">\n";
	print "<INPUT NAME=SELECTION TYPE=hidden VALUE=\"\">\n";
	print "</FORM>\n";
	@users_pr = @users;
	undef @users;
	foreach $line (@passwd) {
		($user, $pw, $em, $fn) = split(/:/, $line);
		if (!grep(/^$user$/, @users_pr)) {
			push (@users, $user);
		}
	}
	if (scalar(@users) > 0) {
		print "<HR><H3>Add Moderators to Group</H3>\n";
		print "<FORM ACTION=\"$cgiurl2\" METHOD=POST NAME=sf2>\n";
		print "<INPUT NAME=SELECTION TYPE=hidden VALUE=\"\">\n";
		print "<INPUT NAME=action TYPE=hidden value=\"add_to_group\">\n";
		print "<INPUT NAME=username TYPE=hidden value=\"$username\">\n";
		print "<INPUT NAME=group TYPE=hidden VALUE=\"$group\">\n";
		print "<TABLE CELLSPACING=0 CELLPADDING=2 BORDER=0>\n";
		$bgcolor = "ffffcc";
		$c = 0;
		$ct = scalar(@users);
		print "<TR ALIGN=CENTER BGCOLOR=c0c0c0><TD>&nbsp;</TD><TD><FONT FACE=\"Verdana,Arial\" SIZE=1><B>Mark</B></FONT></TD><TD><FONT FACE=\"Verdana,Arial\" SIZE=1><B>Add</B></FONT></TD><TD>&nbsp;</TD><TD ALIGN=LEFT WIDTH=100%><FONT FACE=\"Verdana,Arial\" SIZE=1><B>Moderator</B></FONT></TD><TD>&nbsp;</TD></TR>\n";
		foreach $line (sort(@users)) {
			$fullname = $fn{$line};
			$num = $line;
			print "<TR VALIGN=CENTER ALIGN=CENTER BGCOLOR=#$bgcolor><TD BGCOLOR=c0c0c0>&nbsp;</TD>";
			if ($bgcolor eq "ffffcc") {
				$bgcolor = "ffffff";
			} else {
				$bgcolor = "ffffcc";
			}
			$num = $line;
			print "<TD>";
			print "<A HREF=\"#\" onClick=\"markto2($c, $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=\"markto2($c, $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;";
			$c++;
			print "<INPUT TYPE=CHECKBOX NAME=MARK VALUE=$num>&nbsp;&nbsp;</TD>";
			print "<TD><A HREF=\"javascript:usract2('add', '$num', '\u$num')\" onMouseOver=\"return setStatus('Add this moderator')\"><IMG SRC=\"$html_url/icons/group_icon_add.gif\" HEIGHT=25 WIDTH=25 BORDER=1></A></TD>";
			print "<TD BGCOLOR=c0c0c0>&nbsp;</TD>\n";
			print "<TD WIDTH=100% ALIGN=LEFT><FONT FACE=\"Verdana,Arial\" SIZE=2>\u$num ";
			if ($fullname ne "" && $fullname ne "none" && $fullname ne "fullname") {
				print "($fullname)";
			}
			print "</TD><TD BGCOLOR=c0c0c0>&nbsp;</TD>";
			print "</TR>\n";
		}
		if ($ct > 0) {
			print "<TR BGCOLOR=#ccccff ALIGN=CENTER>";
			print "<TD BGCOLOR=c0c0c0>&nbsp;</TD>\n";
			print "<TD ALIGN=LEFT><FONT FACE=\"Verdana,Arial\" SIZE=2><B>(Marked)</B></TD>";
			print "<TD><A HREF=\"javascript:usract2('add', 'All', 'all marked moderators')\" onMouseOver=\"return setStatus('Add all marked moderators')\"><IMG SRC=\"$html_url/icons/group_icon_add.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 "</TR>\n";
		}
		print "<TR BGCOLOR=c0c0c0><TD COLSPAN=6>&nbsp;</TD></TR></TABLE>\n";
		print "</TABLE>\n";
		print "</FORM><BR>\n";
	}
	print "</BODY></HTML>\n";
}

#---SEPARATOR---#

sub delete_moderator_from_group {
	my ($moderator, $group) = @_;
	&lock("delete_moderator_from_group", "$admin_dir/groups.txt");
	open (GROUP, "$admin_dir/groups.txt") || &error_message("Delete Moderator From Group Error", "Could not open groups file (groups.txt)! (Code 060501)");
	@group = <GROUP>;
	close (GROUP);
	foreach $line (@group) {
		next if $line !~ /^$group:/;
		chop $line if $line =~ /\n$/;
		($group, $users) = split(/:/, $line, 2);
		@users = split(/,/, $users);
		@newusers = sort(grep(!/^$moderator$/, @users));
		$newuserstring = join(",", @newusers);
		$newuserstring .= "\n";
		$line = "$group:$newuserstring";
	}
	open (GROUP, ">$admin_dir/groups.txt") || &error_message("Delete Moderator From Group Error", "Could not write to groups file (groups.txt)! (Code 060502)");
	print GROUP @group;
	close (GROUP);
	&unlock("delete_moderator_from_group", "$admin_dir/groups.txt");
}

#---SEPARATOR---#

sub add_to_group {
	my ($group, $moderator) = @_;
	&lock("add_to_group", "$admin_dir/passwd.txt");
	open (PASSWD, "$admin_dir/passwd.txt") || &error_message("Add Moderator To Group Error", "Cannot open password file (passwd.txt)! (Code 060601)");
	@passwd = <PASSWD>;
	close (PASSWD);
	&unlock("add_to_group", "$admin_dir/passwd.txt");
	&error_message("Add Moderator To Group Error", "Specified moderator does not exist in password file! (Code 060602)") if (!grep(/^$moderator:/, @passwd));
	&lock("add_to_group", "$admin_dir/groups.txt");
	open (GROUP, "$admin_dir/groups.txt") || &error_message("Add Moderator To Group Error", "Cannot open group file (groups.txt)! (Code 060603)");
	@group = <GROUP>;
	close (GROUP);
	&error_message("Add Moderator To Group Error", "Specified group does not exist in group file! (Code 060604)") if (!grep(/^$group:/, @group));
	foreach $line (@group) {
		next if $line !~ /^$group:/;
		($group, $users) = split(/:/, $line, 2);
		chop ($users) if $users =~ /\n$/;
		@users = split(/,/, $users);
		if (grep(/^$moderator$/, @users)) {
			&unlock("add_to_group", "$admin_dir/groups.txt");
			&error_message("Add Moderator To Group Error", "Specified moderator is already a member of the specified group! (Code 060605)") ;
		}
		push (@users, $moderator);
		$line = "$group:";
		$line .= join(",", @users);
		$line .= "\n";
	}
	open (GROUP, ">$admin_dir/groups.txt") || &error_message("Delete Moderator From Group Error", "Could not write to groups file (groups.txt)! (Code 060606)");
	print GROUP @group;
	close (GROUP);
	&unlock("add_to_group", "$admin_dir/groups.txt");
}

# END - FILE IS CORRECTLY UPLOADED #
