# FILE: src-board-subs-7
# User Manager
#-------------------------------------------------------------------------------
# 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:userapp_1

sub user_mgr_1 {
	my ($username) = @_;
	my ($append,$owntopic);
	&header;
	print "<html><head><title>User Manager</title>\n";
	print "<SCRIPT LANGUAGE=\"JavaScript\">\n";
	print "<!--\n";
	print "function setStatus(msg) {\n";
	print "  window.status=msg\n";
	print "  return true\n";
	print "}\n";
	print "//-->\n";
	print "</SCRIPT>\n";
	print "</head>\n";
	print "<body bgcolor=\"ffffff\" text=\"000000\" link=\"0000FF\" ";
	print "vlink=\"0000FF\" ";
	print "onLoad=\"window.defaultStatus='User Manager: Group Selection'\">\n";
	print "$fs<FONT SIZE=3><CENTER><B>User Manager</B></CENTER></FONT>\n";
	$append = "?username=$username";
	print "<HR>\n";
	print "<B>Select one of the following groups of users to edit:</B>\n";
	print "<p>\n";
	my (%seen);
	open (GROUP, "$admin_dir/groups.txt");
	my (@group) = <GROUP>;
	close (GROUP);
	open (USER, "$admin_dir/users.txt");
	my (@user) = <USER>;
	close (USER);
	my ($line, $foo, @moderator, $moderators, $group_name, @groups);
	foreach $line (@group) {
		chop ($line) if $line =~ /\n/;
		($group_name, $moderators) = split(/:/, $line);
		@moderator=split(/,/, $moderators);
		push (@groups, $group_name) if grep(/^$username$/, @moderator);
	}
	my (@key) = sort(@groups);
	print "<TABLE CELLSPACING=0 CELLPADDING=2 BORDER=0><TR BGCOLOR=c0c0c0><TD>&nbsp;</TD><TD WIDTH=100%><FONT FACE=\"Verdana,Arial\" SIZE=1><B>Group</B></FONT></TD><TD><FONT FACE=\"Verdana,Arial\" SIZE=1><B>Users&nbsp;&nbsp;</B></TD><TD>&nbsp;</TD></TR>\n";
	$bgcolor = "ffffcc";
	if (@key) {
		foreach $line (@key) {
			@validuser = grep(/:$line\n?$/, @user);
			$user_count = scalar(@validuser);
			$user_count -= scalar(grep(/^[A-Z]/, @validuser));
			$user_count -= scalar(grep(/^(\w+):\*Q\*/, @validuser));
			$user_count = "0" if $user_count == 0;
			print "<TR BGCOLOR=$bgcolor><TD BGCOLOR=c0c0c0>&nbsp;</TD><TD>$fs";
			print "<A HREF=\"$cgiurlm?username=$username&cmd=user_mgr_2&";
			print "group=$line\" onMouseOver=\"return setStatus('Edit users in the ";
			print "\u$line group.')\">\u$line</A></TD><TD ALIGN=RIGHT>$fs$user_count&nbsp;&nbsp;</TD>\n";
			print "<TD BGCOLOR=c0c0c0>&nbsp;</TD></TR>\n";
			if ($bgcolor eq "ffffff") {
				$bgcolor = "ffffcc";
			} else {
				$bgcolor = "ffffff";
			}
		}
		print "<TR BGCOLOR=c0c0c0><TD COLSPAN=4>&nbsp;</TD></TR>\n";
	} else {
		print "<TR BGCOLOR=c0c0c0><TD>&nbsp;</TD><TD COLSPAN=3>You are not authorized to edit any groups!</TD></TR></TABLE>\n";
	}
	print "</TABLE>\n";
	if ($pro) {
		$groups = join(",", @groups);
		&userapp_1($username, $groups, 1);
	}
	print "</BODY></HTML>\n";
	exit(0);
}

#---SEPARATOR---#
#REQ:user_selfreg_config

sub user_mgr_2 {
	my ($username, $group) = @_;
	open (PASSWD, "$admin_dir/users.txt") || &error_message("File Error", "Cannot open user password file (users.txt)! (Code 070201)");
	@passwd = <PASSWD>;
	close (PASSWD);
	&header;
	print "<HTML><HEAD><TITLE>User Manager: \u$group</TITLE>\n";
	print "<SCRIPT LANGUAGE=\"JavaScript\">\n";
	print "<!--\n";
	print "function setStatus(msg) {\n";
	print "  window.status=msg\n";
	print "  return true\n";
	print "}\n";
	print "function markto(num,count,dir) {\n";
	print "  if (count == 1) {\n";
	print "    var c = document.uf.MARK.checked;\n";
	print "    document.uf.MARK.checked = 1-c;\n";
	print "  } else {\n";
	print "    var c = document.uf.MARK[num].checked;\n";
	print "    if (dir==1) {\n";
	print "      for (var i=0; i<=num; i++) {\n";
	print "        document.uf.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.uf.MARK[i].checked = 1-c;\n";
	print "      }\n";
	print "    }\n";
	print "  }\n";
	print "}\n";
	print "function usract(action, number, name1) {\n";
	print "  document.uf.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.uf.submit();\n";
	print "    }\n";
	print "  } else {\n";
	print "    document.uf.submit()\n";
	print "  }\n";
	print "}\n";
	print "//-->\n";
	print "</SCRIPT>\n";
	print "</head>\n";
	print "<body bgcolor=\"ffffff\" text=\"000000\" link=\"0000FF\" ";
	print "vlink=\"0000FF\" ";
	print "onLoad=\"window.defaultStatus='User Manager: \u$group'\">\n";
	print "$fs<FONT SIZE=3><CENTER><B>User Manager: \u$group</B></CENTER></FONT>\n";
	print "<HR>\n";
	print "<B><A HREF=\"$cgiurlm?username=$username&cmd=user_mgr\" onMouseOver=\"return setStatus('Return to User Manager (group selection) screen')\">User Manager</A>: Edit \u$group</B>\n";
	print "<HR>\n";
	print "<H3>Users</H3>\n";
	print "<FORM ACTION=\"$cgiurl3\" METHOD=POST NAME=uf>\n";
	undef @valid_user_list;
	foreach $line (sort(@passwd)) {
		($user, $encpass, $email, $fullname, $profile, $email, $check, $group_test) = split(/:/, $line);
		chop ($group_test) if $group_test =~ /\n$/;
		next if $encpass eq "*Q*";
		push (@valid_user_list, $line) if ($group_test eq $group && $user =~ /[^A-Z]/);
	}
	$count = @valid_user_list;
	if ($count > 25) {
		print "<UL>\n";
		for ($i=0; $i < $count; $i += 25) {
			if (($i+25) > ($count-1)) {
				$endstr = $count-1;
			} else {
				$endstr = ($i+24);
			}
			print "<LI><A HREF=\"$cgiurlm?username=$username&cmd=user_mgr_2&group=$group&start=$i\" onMouseOver=\"return setStatus('Edit this set of users')\">";
			$l = $valid_user_list[$i];
			$un1 = (split(/:/, $l))[0];
			$l = $valid_user_list[$endstr];
			$un2 = (split(/:/, $l))[0];
			print "\u$un1 - \u$un2</A> " if ($GLOBAL_OPTIONS{'capitalize_username'} == 1 || $GLOBAL_OPTIONS{'capitalize_username'} eq "");
			print "$un1 - $un2</A> " if ($GLOBAL_OPTIONS{'capitalize_username'} == 0 && $GLOBAL_OPTIONS{'capitalize_username'} ne "");
		}
		print "<LI><A HREF=\"$cgiurlm?username=$username&cmd=user_mgr_2&group=$group&start=showall\" onMouseOver=\"return setStatus('Edit the entire user list')\">";
		print "Entire User List</A>\n";
		print "</UL><P>\n";
		$st = $FORM{'start'};
		if ($st ne "showall") {
			if (($st + 25) >= $count) {
				@valid_user_list = splice(@valid_user_list, $st);
			} else {
				@valid_user_list = splice(@valid_user_list, $st, 25);
			}
		}
	}
	print "<INPUT TYPE=HIDDEN NAME=start VALUE=\"$FORM{'start'}\">\n";
	print "<TABLE CELLSPACING=0 CELLPADDING=2 BORDER=0>\n";
	$bgcolor = "ffffcc";
	$c = 0;
	$count = scalar(@valid_user_list);
	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><FONT FACE=\"Verdana,Arial\" SIZE=1><B>Copy</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>User</B></FONT></TD>";
	print "<TD>&nbsp;</TD><TD ALIGN=LEFT><FONT FACE=\"Verdana,Arial\" SIZE=1><B>Last&nbsp;Logged&nbsp;In</B></FONT></TD>" if $GLOBAL_OPTIONS{'SHOW_LAST_TIME'};
	print "<TD>&nbsp;</TD></TR>\n";
	$starflag = 0;
	foreach $line (@valid_user_list) {
		($user, $encpass, $email, $fullname, $profile, $email2, $check, $group_test) = 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>";
		$ct = $count;
		$ct = 25 if $count > 25;
		$ct = $count if $FORM{'start'} eq "showall";
		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++;
		$userx = "$user";
		$userx = "\u$user" if ($GLOBAL_OPTIONS{'capitalize_username'} == 1 || $GLOBAL_OPTIONS{'capitalize_username'} eq "");
		print "<INPUT TYPE=CHECKBOX NAME=MARK VALUE=\"$user\">&nbsp;&nbsp;</TD>";
		print "<TD><A HREF=\"javascript:usract('delete', '$user', '$userx')\" onMouseOver=\"return setStatus('Delete this user')\"><IMG SRC=\"$html_url/icons/delete_icon.gif\" HEIGHT=25 WIDTH=25 BORDER=1></A></TD>";
		print "<TD><A HREF=\"javascript:usract('copy', '$user', '$userx')\" onMouseOver=\"return setStatus('Copy this user to another group')\"><IMG SRC=\"$html_url/icons/copy_user_icon.gif\" HEIGHT=25 WIDTH=25 BORDER=1></A></TD>";
		print "<TD BGCOLOR=c0c0c0>&nbsp;</TD>\n";
		print "<TD><A HREF=\"javascript:usract('edit', '$user', '$user')\" onMouseOver=\"return setStatus('Edit this user')\"><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 ALIGN=LEFT>$fs$userx ";
		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");
		}
		if ($GLOBAL_OPTIONS{'redstar'} && ($profile > 2 || $check !~ m|/|)) {
			print "<FONT COLOR=#ff0000>*</FONT>";
		}
		print "</TD>";
		if ($GLOBAL_OPTIONS{'SHOW_LAST_TIME'}) {
			print "<TD BGCOLOR=c0c0c0>&nbsp;</TD><TD ALIGN=LEFT>$fs";
			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>";
			print "</TD>";
		}
		print "<TD BGCOLOR=c0c0c0>&nbsp;</TD>\n";
		print "</TR>\n";
	}
	if ($count > 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 users')\" onMouseOver=\"return setStatus('Delete all marked users')\"><IMG SRC=\"$html_url/icons/delete_icon.gif\" HEIGHT=25 WIDTH=25 BORDER=1></A></TD>";
		print "<TD><A HREF=\"javascript:usract('copy', 'ALL', 'all marked users')\" onMouseOver=\"return setStatus('Copy all marked users to another group')\"><IMG SRC=\"$html_url/icons/copy_user_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";
		if ($GLOBAL_OPTIONS{'SHOW_LAST_TIME'}) {
			print "<TD>&nbsp;</TD>";
			print "<TD BGCOLOR=c0c0c0>&nbsp;</TD>\n";
		}
		print "</TR>\n";
	}
	if ($count == 0) {
		print "<TR BGCOLOR=c0c0c0><TD>&nbsp;</TD><TD COLSPAN=10>$fs", "There are no users in this group!</FONT></TD></TR>\n" if $GLOBAL_OPTIONS{'SHOW_LAST_TIME'};
		print "<TR BGCOLOR=c0c0c0><TD>&nbsp;</TD><TD COLSPAN=8>$fs", "There are no users in this group!</FONT></TD></TR>\n" if !$GLOBAL_OPTIONS{'SHOW_LAST_TIME'};
	} else {
		print "<TR BGCOLOR=c0c0c0><TD COLSPAN=11>&nbsp;</TD></TR>\n" if $GLOBAL_OPTIONS{'SHOW_LAST_TIME'};
		print "<TR BGCOLOR=c0c0c0><TD COLSPAN=9>&nbsp;</TD></TR>\n" if !$GLOBAL_OPTIONS{'SHOW_LAST_TIME'};
	}
	print "</TABLE>\n";
	print "<BR>\n";
	print "<INPUT NAME=action TYPE=hidden value=\"user_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 "<HR></FORM>\n";
	print "<H3>Add a User</H3>\n";
	print "<FORM ACTION=\"$cgiurl3\" METHOD=POST>\n";
	print "<INPUT TYPE=HIDDEN NAME=\"username\" VALUE=\"$username\">\n";
	print "<INPUT TYPE=HIDDEN NAME=\"action\" VALUE=\"add_user\">\n";
	print "<INPUT TYPE=HIDDEN NAME=\"group\" VALUE=\"$group\">\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=newuser 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 User\">";
	print "</TD></TR></TABLE>\n";
	print "</TD></TR></TABLE>\n";
	print "</FORM>\n";
	print "<HR>\n";
	print "<H3>Add a User List</H3>\n";
	print "<FORM ACTION=\"$cgiurl3\" METHOD=POST>\n";
	print "<TABLE BORDER=1  BGCOLOR=ffffcc WIDTH=100%><TR><TD>";
	print "<TABLE CELLSPACING=0 CELLPADDING=2 BORDER=0><TR><TD>$fs";
	print "You can paste a delimited user list into this column. The program will\n";
	print "parse the incoming list to create user accounts automatically.</FONT><P>\n";
	print "<INPUT TYPE=HIDDEN NAME=username VALUE=$username>\n";
	print "<INPUT TYPE=HIDDEN NAME=action VALUE=preview_list>\n";
	print "<INPUT TYPE=HIDDEN NAME=group VALUE=$group>\n";
	print "<TEXTAREA NAME=list ROWS=7 COLS=40 WRAP=VIRTUAL></TEXTAREA><P>\n";
	print "<INPUT TYPE=SUBMIT VALUE=\"Add these Users\">\n";
	print "</TD></TR></TABLE>\n";
	print "</TD></TR></TABLE>\n";
	print "</FORM>\n";
	print "<HR>\n";
	print "<H3>Copy All Users</H3>\n";
	print "<FORM ACTION=\"$cgiurl3\" METHOD=POST>\n";
	print "<TABLE BORDER=1  BGCOLOR=ffffcc WIDTH=100%><TR><TD>";
	print "<TABLE CELLSPACING=0 CELLPADDING=2 BORDER=0><TR><TD>$fs";
	print "You can copy all users from this group into another group for which you\n";
	print "are a moderator.<P>\n";
	print "<INPUT TYPE=HIDDEN NAME=username VALUE=$username>\n";
	print "<INPUT TYPE=HIDDEN NAME=action VALUE=copy_user>\n";
	print "<INPUT TYPE=HIDDEN NAME=group VALUE=$group>\n";
	print "<INPUT TYPE=HIDDEN NAME=users VALUE=\"*\">\n";
	print "Copy users to:  <SELECT NAME=newgroup SIZE=1>\n";
	print "<OPTION VALUE=NONE>--- Select Destination Group ---\n";
	open (GRP, "$admin_dir/groups.txt"); @grp = <GRP>; close (GRP);
	foreach $line (@grp) {
		($grpname, $mods) = split(/:/, $line); @mods = split(/,/, $mods);
		if (grep(/^$username$/, @mods)) {
			print "<OPTION VALUE=$grpname>\u$grpname\n";
		}
	}
	print "</SELECT><P>\n";
	print "<INPUT TYPE=SUBMIT VALUE=\"Copy All Users\">\n";
	print "</TD></TR></TABLE>\n";
	print "</TD></TR></TABLE>\n";
	print "</FORM>\n";
	if ($pro) {
		&user_selfreg_config($username, $group);
	}
	print "<BR>\n";
	print "</BODY></HTML>\n";
	exit(0);
}

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

sub add_user {
	my ($username, $newuser, $pass1, $pass2, $group, $email, $full) = @_;
	$newuser =~ tr/A-Z/a-z/; $pass1 =~ tr/A-Z/a-z/; $pass2 =~ tr/A-Z/a-z/;
	$newuser =~ s/\s//g; $pass1 =~ s/\s//g; $pass2 =~ s/\s//g;
	while ($newuser =~ m|(\W)|g) {
		$o = ord($1); $m = $1;
		&error_message("Add User 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 User Error", "Password is invalid (password may not contain the character <B>$m</B>).", 1, 1) if $o < 126;
	}
	&error_message("Add User Error", "The entered passwords do not match!", 1, 1) if $pass1 ne $pass2;
	$usercount = length($newuser);
	&error_message("Add User Error", "The username is invalid (username must be between 1 and 15 characters).", 1, 1) if ($usercount < 1 || $usercount > 15);
	$passcount = length($pass1);
	&error_message("Add User Error", "The entered passwords are invalid (password must be between 1 and 15 alphanumeric characters).", 1, 1) if ($passcount < 1 || $passcount > 15);
	&lock("add_user", "$admin_dir/users.txt");
	open(PASSWD,"$admin_dir/users.txt") || &error_message("Add User Error", "Cannot read password file (users.txt)! (Code 070401)", 1, 1);
	@passwdline = <PASSWD>;
	close(PASSWD);
	foreach $line (@passwdline) {
		($user, $encpass, $foo, $foo, $foo, $foo, $foo,$group_test) = split(/:/, $line); chomp $group_test;
		&error_message("Add User Error", "The selected username already exists as a user in this group!", 1, 1) if $user eq $newuser && $group_test eq $group;
	}
	srand(time);
	undef (@salt);
	for ($i=1; $i<=2; $i++) {
		push (@salt, int(rand(26))+65);
	}
	$salt = pack('c2', @salt);
	$new_password = crypt($pass1, $salt);
	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;
	}
	if ($pro) {
		$line_new = "$newuser:$new_password:$email_new:$full:3::0:$group\n";
	} else {
		$line_new = "$newuser:$new_password:$email_new:$full:1::0:$group\n";
	}
	push (@passwdline, $line_new);
	$pwline = \@passwdline;
	&safe_write("$admin_dir/users.txt", $pwline);
	&unlock("add_user", "$admin_dir/users.txt");
	if ($pro) {
		&create_blank_profile_file("$newuser-$group.txt");
	}
	return $line_new;
}

#---SEPARATOR---#

sub preview_user_list {
	my ($username, $group, $listin, $delim, $errflag) = @_;
	&header;
	print "<HTML><HEAD><TITLE>Preview User List</TITLE></HEAD>\n";
	print "<BODY BGCOLOR=ffffff TEXT=000000 LINK=0000FF VLINK=800080 ALINK=FF0000>";
	print "$fs<FONT SIZE=3><CENTER><B>Preview User List</B></CENTER></FONT>\n";
	print "<HR>\n";
	print "<B><A HREF=\"$cgiurlm?username=$username&cmd=user_mgr\" onMouseOver=\"window.status = 'Return to User Manager (group selection) screen'; return true\">User Manager</A>: <A HREF=\"$cgiurlm?username=$username&cmd=user_mgr_2&group=$group\" onMouseOver=\"window.status = 'Return to editing \u$group group'; return true\">Edit \u$group</A>: Preview User List</B>\n";
	print "<HR>\n";
	print "<FORM method=POST action=\"$cgiurl3\" NAME=puf>\n";
	print "<input type=hidden name=\"action\" value=\"submit_list\">\n";
	print "<input type=hidden name=\"username\" value=\"$username\">\n";
	print "<input type=hidden name=\"group\" value=\"$group\">\n";
	if ($errflag ne "") {
		print "<CENTER><TABLE BORDER=1 WIDTH=90% BGCOLOR=ffcccc><TR><TD>$fs";
		print "<H3 ALIGN=CENTER>Error</H3>The following error(s) occurred when adding users: ";
		print "<P><UL>$errflag</UL><P>The users still displayed on the preview have <I>not</I> ";
		print "yet been added.  Please correct the indicated problems and resubmit the form.</FONT>\n";
		print "</TD></TR></TABLE></CENTER><P>\n";
	} else {
		print "<H3>Creation Preview</H3>\n";
	}
	print "<TABLE BGCOLOR=ffffcc BORDER=1 WIDTH=100%><TR><TD>";
	$delim = "\t" if $delim eq "tab";
	$delim = "," if $delim eq "comma";
	$delim = ";" if $delim eq "semi";
	@users = split(/\n/, $listin);
	if ($delim eq "") {
		$d1 = scalar(grep(/\t/, @users));
		$d2 = scalar(grep(/,/, @users));
		$d3 = scalar(grep(/;/, @users));
		if ($d1 >= $d2 && $d1 >= $d3) {
			$delim = "\t";
		} elsif ($d2 >= $d1 && $d2 >= $d3) {
			$delim = ",";
		} elsif ($d3 >= $d1 && $d3 >= $d2) {
			$delim = ";";
		} else {
			$delim = "\t";
		}
	}
	$delim2 = "tab" if $delim eq "\t";
	$delim2 = "comma" if $delim eq ",";
	$delim2 = "semi" if $delim eq ";";
	print "<INPUT TYPE=HIDDEN NAME=delimiter VALUE=\"$delim2\">\n";
	undef %emv;
	undef %fnv;
	undef %unv;
	undef %pwv;
	$mf = 0;
	$mdv = 0;
	foreach $user (@users) {
		$c = 0;
		@u = split(/$delim/, $user);
		$mdv = scalar(@u) if scalar(@u) > $mdv;
		$f = 0;
		$thisone = "";
		for ($i = 1; $i <= 2; $i++) {
			foreach $u (@u) {
				$u =~ s/^\s+//;
				$u =~ s/\s+$//;
				$c += 1; $fv = $c - $f;
				$key = "COL" . $fv;
				if ($u eq "*FULLNAME*" || $FORM{$key} eq "FULLNAME") {
					$fnv{($c-$f)} += 10000;
					$user = "" if $u =~ /^\*/;
				} elsif ($u eq "*EMAIL*" || $FORM{$key} eq "EMAIL") {
					$emv{($c-$f)} += 10000;
					$user = "" if $u =~ /^\*/;
				} elsif ($u eq "*USERNAME*" || $FORM{$key} eq "USERNAME") {
					$unv{($c-$f)} += 10000;
					$user = "" if $u =~ /^\*/;
				} elsif ($u eq "*PASSWORD*" || $FORM{$key} eq "PASSWORD") {
					$pwv{($c-$f)} += 10000;
					$user = "" if $u =~ /^\*/;
				} elsif ($FORM{$key} eq "SKIP") {
				} elsif ($u =~ m|^([\w\s\.\-\+]+)\@([\w\s\.\-\+]+)$|) {
					$emv{($c-$f)} += 1;
				} elsif ($u =~ m/\s/) {
					$fnv{($c-$f)} += 1;
					$thisone = $u;
				} elsif ($thisone =~ m|$u|i) {
					$unv{($c-$f)} += 1;
				} elsif ($u =~ m|^(\w+)$|) {
					$pwv{($c-$f)} += 1;
				}
			}
			$f = $c;
		}
		$user = join("$delim", @u) if $user ne "";
		$c = $c / 2;
		$mf = $c if $c > $mf;
	}
	@users = grep(/\S/,  @users);
	$mx = 0; $id = 0;
	foreach $key (keys(%emv)) {
		if ($emv{$key} > $mx) {
			$id = $key;
			$mx = $emv{$key};
		}
	}
	$emv = $id;
	$mx = 0; $id = 0;
	foreach $key (keys(%fnv)) {
		if ($fnv{$key} > $mx) {
			$id = $key;
			$mx = $fnv{$key};
		}
	}
	$fnv = $id;
	$mx = 0; $id = 0;
	foreach $key (keys(%unv)) {
		if ($unv{$key} > $mx) {
			$id = $key;
			$mx = $unv{$key};
		}
	}
	$unv = $id;
	$mx = 0; $id = 0;
	foreach $key (keys(%pwv)) {
		if ($pwv{$key} > $mx) {
			$id = $key;
			$mx = $fnv{$key};
		}
	}
	$pwv = $id;
	print "$fs";
	print "The following user accounts will be generated if you choose to accept this list:<P>\n";
	print "<P><TABLE BORDER=1>\n";
	print "<TR>\n";
	for ($i = 1; $i <= $mf; $i++) {
		print "<TD><SELECT NAME=COL$i SIZE=1>\n";
		print "<OPTION VALUE='SKIP' ";
		print "SELECTED" if $sk[$i];
		print ">Skip this field\n";
		print "<OPTION VALUE='USERNAME' ";
		print "SELECTED" if ($unv == $i && $sk[$i] == 0);
		print ">Username\n";
		print "<OPTION VALUE='PASSWORD' ";
		print "SELECTED" if ($pwv == $i && $sk[$i] == 0);
		print ">Password\n";
		print "<OPTION VALUE='FULLNAME' ";
		print "SELECTED" if ($fnv == $i && $sk[$i] == 0);
		print ">Full Name\n";
		print "<OPTION VALUE='EMAIL' ";
		print "SELECTED" if ($emv == $i && $sk[$i] == 0);
		print ">E-mail Address\n";
		print "</SELECT></TD>\n";
	}
	print "</TR>\n";
	$ctr1 = 0; $ctr2 = 0;
	foreach $user (@users) {
		print "<TR>"; $ctr1 += 1; $ctr2 = 0;
		@u = split(/$delim/, $user);
		foreach $u (@u) {
			$ctr2 += 1;
			print "<TD><INPUT NAME=x$ctr1", "y$ctr2 SIZE=15 VALUE=\"$u\"></TD>";
		}
		while ($ctr2 < $mdv) {
			$ctr2 += 1;
			print "<TD><INPUT NAME=x$ctr1", "y$ctr2 SIZE=15 VALUE=\"\"></TD>";
		}
		print "</TR>\n";
	}
	print "<INPUT TYPE=HIDDEN NAME=x", ($ctr1+1), "y1 VALUE=\"\\\">\n";
	print "</TABLE>\n";
	print "<P>\n";
	print "<INPUT TYPE=SUBMIT onClick=\"document.puf.modify.value = '0'\" VALUE=\"Accept List and Add Accounts\">\n";
	print "</TD></TR></TABLE><P>\n";
	print "<HR><P><H3>Advanced Options</H3>\n";
	print "<TABLE BGCOLOR=ffffcc BORDER=1 WIDTH=100%><TR><TD>$fs";
	print "The following advanced options allow you to manipulate the list above and then refresh the preview.<P>\n";
	print "<INPUT NAME=genuser TYPE=CHECKBOX VALUE=1> <B>Generate Usernames:</B><UL>";
	print "<INPUT TYPE=RADIO NAME=genuname VALUE=fullname> From full names<BR>\n";
	print "<INPUT TYPE=RADIO NAME=genuname VALUE=email> From e-mail addresses</UL><P>\n";
	print "<INPUT NAME=genpass TYPE=CHECKBOX VALUE=1> <B>Generate Passwords:</B><UL>";
	print "<INPUT TYPE=RADIO NAME=genpasswd VALUE=ln> Equal to last name<BR>\n";
	print "<INPUT TYPE=RADIO NAME=genpasswd VALUE=user> Equal to username<BR>\n";
	print "<INPUT TYPE=RADIO NAME=genpasswd VALUE=same> Give everyone the same password: </FONT><INPUT TYPE=TEXT SIZE=15 NAME=samepasswd>$fs</UL><P>\n";
	print "<INPUT NAME=manipemail TYPE=CHECKBOX VALUE=1> <B>Manipulate E-mail Addresses:</B><UL>";
	print "Append this text to each e-mail address: </FONT><INPUT TYPE=TEXT SIZE=20 NAME=emailadd>$fs</UL><P>\n";
	print "<P><INPUT TYPE=SUBMIT onClick=\"document.puf.modify.value = '1'\" VALUE=\"Refresh Preview\">\n";
	print "<INPUT TYPE=HIDDEN NAME=modify VALUE=0></TD></TR></TABLE>\n";
	print "</FORM>\n<HR><P></BODY></HTML>\n";
	exit(0);
}


#---SEPARATOR---#

sub modify_list {
	$listin = &unescape($FORM{"listin"});
	undef @sk;
	$delim = "\t" if $FORM{"delimiter"} eq "tab";
	$delim = "," if $FORM{"delimiter"} eq "comma";
	$delim = ";" if $FORM{"delimiter"} eq "semi";
	if ($listin eq "") {
		$maxx = 0; $maxy = 0;
		$ctr1 = 0; $ctr2 = 0;
		$flag1 = 0; $flag2 = 0;
		foreach $key (keys(%FORM)) {
			if ($key =~ m|x(\d+)y(\d+)|) {
				$maxx = $1 if $1 > $maxx;
				$maxy = $2 if $2 > $maxy;
			}
		}
		for ($ctr1 = 1; $ctr1 <= $maxx; $ctr1 += 1) {
			for ($ctr2 = 1; $ctr2 <= $maxy; $ctr2 += 1) {
				$pos = "x$ctr1" . "y$ctr2";
				$listin .= $FORM{$pos} . $delim;
			}
			$pos = "x" . ($ctr1+1) . "y1";
			if ($FORM{$pos} eq "\\") {
				last;
			} else {
				chop ($listin);
				$listin .= "\n";
			}
		}
	}
	@users = split(/\n/, $listin);
	$ctr = 0; $fields = 0;
	foreach $user (@users) {
		$c = 0; $ctr += 1;
		@u = split(/$delim/, $user);
		foreach $p (@u) {
			$c += 1;
			$key = "COL$c";
			$p =~ s/^\s+//;
			$p =~ s/\s$//;
			$username[$ctr] = $p if $FORM{$key} eq "USERNAME";
			$password[$ctr] = $p if $FORM{$key} eq "PASSWORD";
			$email[$ctr] = $p if $FORM{$key} eq "EMAIL";
			$fullname[$ctr] = $p if $FORM{$key} eq "FULLNAME";
		}
		$user = join("$delim", @u);
		$fields = scalar(@u) if scalar(@u) > $fields;
	}
	foreach $user (@users) {
		@u = split(/$delim/, $user);
		if (scalar(@u) < $fields) {
			$user .= $delim x ($fields - scalar(@u));
		}
	}
	for ($i = 1; $i <= $fields; $i++) {
		$key = "COL$i";
		$sk[$i] = 1 if $FORM{$key} eq "SKIP";
	}
	if ($FORM{"genuser"}) {
		if ($FORM{"genuname"} eq "email") {
			&error_message("Modify Listing", "Unable to generate usernames from e-mail addresses -- you do not have an e-mail address column!") if $email[1] eq "";
			&error_message("Modify Listing", "Unable to generate usernames from e-mail addresses -- you already have a username column!") if $username[1] ne "";
			for ($i = 1; $i <= $ctr; $i++) {
				$em = $email[$i];
				$em =~ m|^([\w\+\-\.]+)\@?|; $o = $1; $o =~ s/\W//g;
				$users[$i-1] .= "$delim$o";
				$username[$i] = $o;
			}
			$fields += 1;
			$FORM{"COL$fields"} = "USERNAME";
		} elsif ($FORM{"genuname"} eq "fullname") {
			&error_message("Modify Listing", "Unable to generate usernames from full names -- you do not have a full name address column!") if $fullname[1] eq "";
			&error_message("Modify Listing", "Unable to generate usernames from full names -- you already have a username column!") if $username[1] ne "";
			for ($i = 1; $i <= $ctr; $i++) {
				$o = &extract_lastname($fullname[$i]);
				$o =~ tr/A-Z/a-z/;
				$users[$i-1] .= "$delim$o";
				$username[$i] = $o;
			}
			$fields += 1;
			$FORM{"COL$fields"} = "USERNAME";
		} else {
			&error_message("Modify Listing", "Unable to generate usernames -- you did not select an option under that heading!");
		}
	}
	if ($FORM{"genpass"}) {
		if ($FORM{"genpasswd"} eq "ln") {
			&error_message("Modify Listing", "Unable to generate passwords from last names -- you do not have a full name column!") if $fullname[1] eq "";
			&error_message("Modify Listing", "Unable to generate passwords from last names -- you already have a password column!") if $password[1] ne "";
			for ($i = 1; $i <= $ctr; $i++) {
				$o = &extract_lastname($fullname[$i]);
				$o =~ tr/A-Z/a-z/;
				$users[$i-1] .= "$delim$o";
				$password[$i] = $o;
			}
			$fields += 1;
			$FORM{"COL$fields"} = "PASSWORD";
		} elsif ($FORM{"genpasswd"} eq "user") {
			&error_message("Modify Listing", "Unable to generate passwords from usernames -- you do not have a username column!") if $username[1] eq "";
			&error_message("Modify Listing", "Unable to generate passwords from usernames -- you already have a password column!") if $password[1] ne "";
			for ($i = 1; $i <= $ctr; $i++) {
				$users[$i-1] .= "$delim$username[$i]";
				$password[$i] = $username[$i];
			}
			$fields += 1;
			$FORM{"COL$fields"} = "PASSWORD";
		} elsif ($FORM{"genpasswd"} eq "same") {
			&error_message("Modify Listing", "Unable to generate passwords -- you already have a password column!") if $password[1] ne "";
			for ($i = 1; $i <= $ctr; $i++) {
				$users[$i-1] .= "$delim$FORM{'samepasswd'}";
				$password[$i] = $FORM{'samepasswd'}
			}
			$fields += 1;
			$FORM{"COL$fields"} = "PASSWORD";
		} else {
			&error_message("Modify Listing", "Unable to generate passwords -- you did not select an option under that heading!");
		}
	}
	if ($FORM{'manipemail'}) {
		&error_message("Modify Listing", "Unable to manipulate e-mail addresses -- you do not have an e-mail address column!") if $email[1] eq "";
		foreach $user (@users) {
			$c = 0; $ctr += 1;
			@u = split(/$delim/, $user);
			foreach $p (@u) {
				$c += 1;
				$key = "COL$c";
				$p .= $FORM{'emailadd'} if $FORM{$key} eq "EMAIL";
			}
			$user = join("$delim", @u);
		}
	}
	$listin = join("\n", @users);
	return $listin;
}

sub extract_lastname {
	my ($name) = @_;
	my ($lastname);
	$name =~ s/^[\w\s\.\,]//g;
	if ($name =~ /^(\w+)\s+(\w+)$/) {
		$lastname = $2;
	} elsif ($name =~ /^(\w+),\s*(\w+)/) {
		$lastname = $1;
	} elsif ($name =~ /^(\w+)\s+(\w+)\s+(\w+)$/) {
		$lastname = $3;
	} elsif ($name =~ /^(\w+)\s+(\w+)\s*,\s*(\w+)/) {
		$lastname = $2;
	} elsif ($name =~ /^(\w+)\s+(\w+)\.?\s+(\w+)$/) {
		$lastname = $3;
	} elsif ($name =~ /^(\w+)\s+(\w+)\.?\s+(\w+)\s*,/) {
		$lastname = $3;
	} elsif ($name =~ /^(\w+)\.\s+(\w+)\s+(\w+)\s*,?/) {
		$lastname = $3;
	} else {
		$lastname = $name;
	}
	return $lastname;
}

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

sub add_user_list {
	my ($username, $group) = @_;
	$delim = "\t" if $FORM{"delimiter"} eq "tab";
	$delim = "," if $FORM{"delimiter"} eq "comma";
	$delim = ";" if $FORM{"delimiter"} eq "semi";
	$maxx = 0; $maxy = 0;
	$ctr1 = 0; $ctr2 = 0;
	foreach $key (keys(%FORM)) {
		if ($key =~ m|x(\d+)y(\d+)|) {
			$maxx = $1 if $1 > $maxx;
			$maxy = $2 if $2 > $maxy;
		}
	}
	for ($ctr1 = 1; $ctr1 <= $maxx; $ctr1 += 1) {
		for ($ctr2 = 1; $ctr2 <= $maxy; $ctr2 += 1) {
			$pos = "x$ctr1" . "y$ctr2";
			$listin .= $FORM{$pos} . $delim;
		}
		$pos = "x" . ($ctr1+1) . "y1";
		chop ($listin);
		if ($FORM{$pos} eq "\\") {
			last;
		} else {
			$listin .= "\n";
		}
	}
	open (PASS, "$admin_dir/users.txt");
	@pass = <PASS>;
	close (PASS);
	@pass_grp = grep(/:$group\s*$/, @pass);
	undef @username_f;
	foreach $line (@pass_grp) {
		push (@username_f, (split(/:/, $line))[0]);
	}
	@users = split(/\n/, $listin);
	$ctr = 0; $fields = 0;
	foreach $user (@users) {
		@u = split(/$delim/, $user);
		foreach $p (@u) {
			$p =~ s/^\s+//;
			$p =~ s/\s$//;
		}
		$user = join("$delim", @u);
	}
	for ($ix = 0; $ix < scalar(@users); $ix++) {
		$c = 0;
		$user = $users[$ix];
		@u = split(/$delim/, $user);
		foreach $p (@u) {
			$c += 1;
			$key = "COL$c";
			$username[$ix] = $p if $FORM{$key} eq "USERNAME";
			$password[$ix] = $p if $FORM{$key} eq "PASSWORD";
			$email[$ix] = $p if $FORM{$key} eq "EMAIL";
			$fullname[$ix] = $p if $FORM{$key} eq "FULLNAME";
		}
		$fields = $c if $c > $fields;
	}
	&preview_user_list($FORM{"username"}, $FORM{"group"}, $listin, $FORM{"delimiter"}, "You did not define a username column") if $username[0] eq "";
	&preview_user_list($FORM{"username"}, $FORM{"group"}, $listin, $FORM{"delimiter"}, "You did not define a password column") if $password[0] eq "";
	$errflag = ""; undef @erfl;
	for ($i = 0; $i < scalar(@users); $i++) {
		$pw = $password[$i];
		$pw =~ tr/A-Z/a-z/;
		$un = $username[$i];
		$un =~ tr/A-Z/a-z/;
		if ($un ne "\\") {
			$unflag = 0; $pwflag = 0;
			while ($un =~ m|(\W)|g) {
				$o = ord($1); $m = $1;
				$unflag = 1 if $o < 126;
			}
			while ($pw =~ m|(\W)|g) {
				$o = ord($1); $m = $1;
				$pwflag = 1 if $o < 126;
			}
		}
		if ($un eq "\\") {

		} elsif ($unflag == 1) {
			$errflag .= "<LI>Username &quot;$un&quot; is not a valid username.\n";
			push (@erfl, $i);
		} elsif ($pwflag == 1) {
			$errflag .= "<LI>Username &quot;$un&quot; has an invalid password.\n";
			push (@erfl, $i);
		} elsif (length($un) < 1 || length($un) > 15) {
			$errflag .= "<LI>Username &quot;$un&quot; is not between 1 and 15 characters.\n";
			push (@erfl, $i);
		} elsif (grep(/^$un$/, @username_f)) {
			$errflag .= "<LI>Username &quot;$un&quot; is already taken.\n";
			push (@erfl, $i);
		} elsif (length($password[$i]) < 1 || length($password[$i]) > 15) {
			$errflag .= "<LI>Username &quot;$un&quot; has a password &quot;$pw&quot; that is not between 1 and 15 characters.\n";
			push (@erfl, $i);
		} else {
			$fn = $fullname[$i];$fn =~ s/[:<>;]//g;
			$em = $email[$i]; $em =~ s/[:<>;]//g;
			srand(time);
			undef (@salt);
			for ($j=1; $j<=2; $j++) {
				push (@salt, int(rand(26))+65);
			}
			$salt = pack('c2', @salt);
			$pass = crypt($pw, $salt);
			push (@pass2, "$un:$pass:$em:$fn:1::0:$group\n") if !$pro;
			push (@pass2, "$un:$pass:$em:$fn:3::0:$group\n") if $pro;
			push (@username_f, $un);
			if ($pro) {
				&create_blank_profile_file("$un-$group.txt");
			}
		}
	}
	&lock("add_user_list", "$admin_dir/users.txt");
	open (PASS, "$admin_dir/users.txt");
	@pass = <PASS>;
	close (PASS);
	push (@pass, @pass2);
	$ref = \@pass;
	&safe_write("$admin_dir/users.txt", $ref);
	&unlock("add_user_list", "$admin_dir/users.txt");
	if ($errflag ne "") {
		undef @users2;
		for ($i = 0; $i < scalar(@users); $i++) {
			if (grep(/^$i$/, @erfl)) {
				push (@users2, $users[$i]);
			}
		}
		$listin = join("\n", @users2);
		&preview_user_list($FORM{"username"}, $FORM{"group"}, $listin, $FORM{"delimiter"}, $errflag);
	}
}

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

sub delete_user {
	my ($toremove, $group) = @_;
	my (@passwd, @nogroup, @thegroup, @toremove, $line, $user);
	@toremove = split(/,/, $toremove);
	&lock("delete_user", "$admin_dir/users.txt");
	open (PASSWD, "$admin_dir/users.txt") || &error_message("File Error", "Cannot open password file (users.txt) for reading! (Code 070901)");
	@passwd = <PASSWD>;
	close (PASSWD);
	@nogroup = grep(!/:$group\s*$/, @passwd);
	@thegroup = grep(/:$group\s*$/, @passwd);
	foreach $line (@thegroup) {
		$user = (split(/:/, $line))[0];
		$line = "" if grep(/^$user$/, @toremove);
	}
	@passwd = @nogroup;
	push (@passwd, grep(/\S/, @thegroup));
	$ref = \@passwd;
	$flag = 0; $flag = 1 if scalar(@passwd) == 0;
	&safe_write("$admin_dir/users.txt", $ref);
	&unlock("delete_user", "$admin_dir/users.txt");
	if ($pro) {
		foreach $line (@toremove) {
			$profile_fn = &getfn("$line-$group.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 posting_options {
	my ($topic, $anon, $stamp, $email) = @_;
	my ($line, @file, $t, $opt, $was_anon);
	$anon += 0;
	$stamp += 0;
	&lock("posting_options", "$admin_dir/postoptions.txt");
	open (FILE, "$admin_dir/postoptions.txt");
	@file = <FILE>;
	close (FILE);
	($line) = grep(/^$topic:/, @file);
	($t, $opt) = split(/:/, $line);
	$was_anon = $opt;
	@file = grep(!/^$topic:/, @file);
	push (@file, "$topic:$anon:$stamp:$email\n");
	open (FILE, ">$admin_dir/postoptions.txt");
	print FILE @file;
	close (FILE);
	&unlock("posting_options", "$admin_dir/postoptions.txt");
	if ($anon != $was_anon) {
		return 2;
	} else {
		return 0;
	}
}

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

sub copy_user_action {
	my ($username, $users, $oldgroup, $newgroup) = @_;
	my ($count, @file, $line, @users, %users, %seen, @new, @c, @copied, @err);
	undef %users; undef %seen;
	if ($users ne "*") {
		@users = split(/,/, $users);
		foreach $line (@users) {
			$users{$line} = 1;
		}
	}
	&lock("copy_user_action", "$admin_dir/users.txt");
	open (FILE, "$admin_dir/users.txt"); @file = <FILE>; close (FILE);
	foreach $line (@file) {
		$line = "" if $line !~ /\S/;
		@c = split(/:/, $line);
		$uname = $c[0]; $grpname = $c[7]; chomp $grpname;
		if ($grpname eq $oldgroup && ($users eq "*" || $users{$uname} == 1)) {
			$c[7] = $newgroup;
			$newline = join(":", @c); $newline .= "\n";
			push (@new, $newline);
		} elsif ($grpname eq $newgroup) {
			$seen{$uname} = 1;
		}
	}
	undef %nukes;
	foreach $line (@new) {
		@c = split(/:/, $line);
		$uname = $c[0];
		if ($FORM{"action-$uname"} == 1) {
			next;
		} elsif ($FORM{"action-$uname"} == 2) {
			$nukes{"$uname"} = 1;
			push (@copied, $line);
		} elsif ($seen{$uname}) {
			push (@errors, $line);
		} else {
			$nukes{"$uname"} = 1;
			push (@copied, $line);
		}
	}
	foreach $line (@file) {
		@c = split(/:/, $line);
		if ($nukes{$c[0]} == 1 && $c[7] =~ m|$newgroup\s*$|) {
			$line = "";
		}
	}
	@file = grep(/\S/, @file);
	push (@file, @copied);
	$ref = \@file;
	&safe_write("$admin_dir/users.txt", $ref);
	&unlock("copy_user_action", "$admin_dir/users.txt");
	if ($pro) {
		$m = &get_number;
		foreach $line (@copied) {
			@c = split(/:/, $line);
			if (open(PROFILEOLD, "$admin_dir/profiles/$c[0]-$oldgroup.txt")) {
				open (PROFILENEW, ">$admin_dir/profiles/$c[0]-$newgroup.txt");
				while (<PROFILEOLD>) {
					$linex = $_;
					if ($linex =~ m|picture=(.*)|) {
						$f = $1;
						$m += 1;
						$f =~ m|\.(\w+)$|; $extt = $1;
						open (SRC, "$admin_dir/profiles/$f");
						binmode(SRC);
						@src = <SRC>;
						close (SRC);
						open (DEST, ">$admin_dir/profiles/$m.$extt");
						binmode(DEST);
						print DEST @src;
						close (DEST);
						$linex = "picture=$m.$extt\n";
					}
					print PROFILENEW $linex;
				}
				close (PROFILENEW); close (PROFILEOLD);
			}
		}
	}
	$pls = "";
	$pls = "s" if ($users =~ /,/ || $users eq "*");
	&header;
	print "<HTML><HEAD><TITLE>Copy User$pls</TITLE>\n";
	print "<STYLE>\n";
	print "<!--\n";
	print "TD {font: 10pt Verdana,Arial,Helvetica}\n";
	print "-->\n";
	print "</STYLE>\n";
	print "</HEAD>\n";
	print '<BODY BGCOLOR="ffffff" TEXT="000000" LINK="0000FF" VLINK="0000FF" ';
	print "onLoad=\"window.defaultStatus = 'Copy User$pls'\">$fs\n";
	print "<FONT SIZE=3><CENTER><B>Copy User$pls</B></CENTER></FONT>\n";
	print "<HR>\n";
	print "<B><A HREF=$cgiurlm?cmd=user_mgr&username=$username>User Manager</A>:\n";
	print "<A HREF=$cgiurlm?cmd=user_mgr_2&username=$username&group=$oldgroup&start=$FORM{'start'}>Edit \u$oldgroup</A>:\n";
	print "Copy User$pls</B>\n";
	print "<HR><P>\n";
	print "<FONT COLOR=#00aa00><B>";
	print scalar(@copied);
	print " user";
	print "s" if scalar(@copied) != 1;
	print " successfully copied to \u$newgroup!</B></FONT><P>\n";
	if (scalar(@errors)) {
		print scalar(@errors);
		print " of the selected users could not be copied to the new group because a user\n";
		print "with that username already exists.  For each of the users below, select whether\n";
		print "to skip copying the user or to overwrite the existing user.  Any users that are\n";
		print "not on this list have either been successfully copied to the new group.<P>\n";
		print "<FORM ACTION=$cgiurl3 METHOD=POST>\n";
		print "<INPUT TYPE=HIDDEN NAME=username VALUE=$username>\n";
		print "<INPUT TYPE=HIDDEN NAME=action VALUE=copy_user>\n";
		print "<INPUT TYPE=HIDDEN NAME=group VALUE=$oldgroup>\n";
		print "<INPUT TYPE=HIDDEN NAME=start VALUE=\"$FORM{'start'}\">\n";
		print "<INPUT TYPE=HIDDEN NAME=newgroup VALUE=$newgroup>\n";
		print "<TABLE><TR><TD><B>Skip</B></TD><TD><B>Overwrite</B></TD><TD><B>User</B></TD></TR>\n";
		undef @utodo;
		foreach $line (@errors) {
			@c = split(/:/, $line);
			print "<TR><TD><INPUT TYPE=RADIO NAME=action-$c[0] VALUE=1 CHECKED></TD>\n";
			print "<TD><INPUT TYPE=RADIO NAME=action-$c[0] VALUE=2></TD>\n";
			print "<TD>\u$c[0]";
			print " ($c[3])" if $c[3];
			print "</TD></TR>\n";
			push (@utodo, $c[0]);
		}
		print "</TABLE>\n";
		print "<INPUT TYPE=HIDDEN NAME=users VALUE=\"", join(",", @utodo), "\">\n";
		print "<P><INPUT TYPE=SUBMIT VALUE=\"Submit Choices\">\n";
		print "</FORM></BODY></HTML>\n";
		exit(0);
	} else {
		print "<A HREF=$cgiurlm?cmd=user_mgr_2&username=$username&group=$oldgroup&start=$FORM{'start'}>Click here to continue</A><P>\n";
		print "</BODY></HTML>\n";
		exit(0);
	}
}

# END - FILE IS CORRECTLY UPLOADED #
