###############################################################################
# Profile.pl                                                                  #
###############################################################################
# YaBB: Yet another Bulletin Board                                            #
# Open-Source Project started by Zef Hemel (email@example.com)                   #
# Software Version: YaBB 1 Gold - Release                                     #
# =========================================================================== #
# Software Distributed by:    http://yabb.xnull.com                           #
# Support, News, Updates at:  http://yabb.xnull.com/community/                #
# =========================================================================== #
# Copyright (c) 2000-2001 X-Null - All Rights Reserved                        #
# Software by: The YaBB Development Team                                      #
###############################################################################

$profileplver="1 Gold - Release";

sub ModifyProfile {
	if ($INFO{'username'} =~ m~/~){ &fatal_error($txt{'224'}); }
	if ($INFO{'username'} =~ m~\\~){ &fatal_error($txt{'225'}); }
	if($username ne $INFO{'username'} && $settings[7] ne 'Administrator') {
		&fatal_error($txt{'80'});
	}
	opendir(DIR, "$facesdir") || fatal_error("$txt{'230'} ($facesdir)!<BR>$txt{'681'}");
	closedir(DIR);

	$yytitle = $txt{'79'};
	fopen(FILE, "$memberdir/$INFO{'username'}.dat");
	@memsettings=<FILE>;
	fclose(FILE);
	foreach (@memsettings) {
		$_ =~ s~[\n\r]~~g;
	}
	$dr = $memsettings[14] ? $memsettings[14] : $txt{'470'};
	if ($memsettings[11] eq 'Male') {
		$GenderMale = ' selected';
	}
	if ($memsettings[11] eq 'Female') {
		$GenderFemale = ' selected';
	}
	$signature = $memsettings[5];
	$signature =~ s/\&\&/\n/g;
	$signature =~ s/\&lt;/</g;
	$signature =~ s/\&gt;/>/g;
	&CalcAge("parse"); # Let's get the birthdate
	$memsettings[9] =~ tr/+/ /;

	if ($memsettings[17] == 6) { $tsl6 = ' selected'; }
	elsif ($memsettings[17] == 5) { $tsl5 = ' selected'; }
	elsif($memsettings[17] == 4) { $tsl4 = ' selected'; }
	elsif ($memsettings[17] == 3) { $tsl3 = ' selected'; }
	elsif ($memsettings[17] == 2) { $tsl2 = ' selected'; }
	elsif ($memsettings[17] == 1) { $tsl1 = ' selected'; }
	elsif ($timeselected == 6) { $tsl6 = ' selected'; }
	elsif ($timeselected == 5) { $tsl5 = ' selected'; }
	elsif ($timeselected == 4) { $tsl4 = ' selected'; }
	elsif ($timeselected == 3) { $tsl3 = ' selected'; }
	elsif ($timeselected == 2) { $tsl2 = ' selected'; }
	else { $tsl1 = ' selected'; }

	&header;


	$oldformat = $date;
	$oldmonth = substr($oldformat,0,2);
	$oldday = substr($oldformat,3,2);
	$oldyear = ("20".substr($oldformat,6,2)) - 1900;
	$oldhour = substr($oldformat,-8,2);
	$oldminute = substr($oldformat,-5,2);
	$oldsecond = substr($oldformat,-2,2);
	use Time::Local 'timelocal';
	eval { $oldtime = timelocal($oldsecond,$oldminute,$oldhour,$oldday,$oldmonth-1,$oldyear); };
	my ($psec,$pmin,$phour,$dummy,$dummy,$dummy,$dummy,$dummy,$dummy) = localtime($oldtime);
	if ($phour < 10) { $phour = "0$phour" };
	if ($pmin < 10) { $pmin = "0$pmin" };
	if ($psec < 10) { $psec = "0$psec" };
	$proftime = $phour.":".$pmin.":".$psec;
	$ampm = $phour > 11 ? 'pm' : 'am';
	$phour = $phour % 12 || 12;
	$proftime = qq~$phour:$pmin:$psec$ampm~;

	print <<"EOT";
<form action="$cgi&action=profile2" method="POST" name="creator">
<table border=0 width=720 cellspacing=1 bgcolor="$color{'bordercolor'}" class="bordercolor" align="center">
  <tr>
    <td class="titlebg" bgcolor="$color{'titlebg'}" height="30">
    &nbsp;<img src="$imagesdir/profile_sm.gif" alt="" border="0">&nbsp;
    <font size=2 class="text1" color="$color{'titletext'}"><b>$txt{'79'}</b></font></td>
  </tr><tr>
    <td class="windowbg" bgcolor="$color{'windowbg'}" height="25"><BR><font size=1>$txt{'698'}</font><BR><BR></td>
  </tr><tr>
    <td class="catbg" bgcolor="$color{'catbg'}" height="25"><font size=2><b>$txt{'517'}</b></font></td>
  </tr><tr>
    <td class="windowbg" bgcolor="$color{'windowbg'}"><font size=2>
    <table border=0 width="100%" cellpadding="3">
      <tr>
	<td width="320"><font size=2><b>$txt{'35'}: </b></font></td>
	<td><font size=2><input type="hidden" name="username" value="$INFO{'username'}">$INFO{'username'}</font></td>
      </tr><tr>
	<td width="320"><font size=2><b>$txt{'81'}: </b></font><BR>
	<font size=1>$txt{'596'}</font></td>
	<td><input type="password" name="passwrd1" size="20" value="$memsettings[0]"></td>
      </tr><tr>
	<td width="320"><font size=2><b>$txt{'82'}: </b></font></td>
	<td><input type="password" name="passwrd2" size="20" value="$memsettings[0]"></td>
      </tr><tr>
	<td width="320"><font size=2><b>$txt{'68'}: </b></font><BR>
	<font size=1>$txt{'518'}</font></td>
	<td><input type="text" name="name" size="30" value="$memsettings[1]"></font></td>
      </tr><tr>
	<td width="320"><font size=2><b>$txt{'69'}: </b></font><BR>
        <font size="1">$txt{'679'}</font></td>
	<td><input type="text" name="email" size="30" value="$memsettings[2]"></td>
      </tr>
    </table><BR>
    </td>
  </tr><tr>
    <td class="catbg" bgcolor="$color{'catbg'}" height="25"><font size=2><b>$txt{'597'}</b></font></td>
  </tr><tr>
    <td class="windowbg" bgcolor="$color{'windowbg'}">
    <table border=0 width="100%" cellpadding="3">
      <tr>
	<td width="320"><font size=2><b>$txt{'231'}: </b></font></td>
	<td>
	<select name="gender" size="1">
	 <option value=""></option>
	 <option value="Male"$GenderMale>$txt{'238'}</option>
	 <option value="Female"$GenderFemale>$txt{'239'}</option>
	</select>
	</td>
      </tr><tr>
	<td width="320"><font size=2><b>$txt{'563'}:</b></font></td>
	<td><font size=1>$txt{'564'}<input type="text" name="bday1" size="2" maxlength="2" value="$umonth">$txt{'565'}<input type="text" name="bday2" size="2" maxlength="2" value="$uday">$txt{'566'}<input type="text" name="bday3" size="4" maxlength="4" value="$uyear"></font></td>
      </tr><tr>
	<td width="320"><font size=2><b>$txt{'227'}: </b></font></td>
	<td><font size=2><input type="text" name="location" size="50" value="$memsettings[15]"></font></td>
      </tr><tr>
	<td colspan=2>
	<BR><hr width="100%" size="1" color="$color{'windowbg3'}" class="windowbg3"></td>
      </tr><tr>
	<td width="320"><font size=2><b>$txt{'83'}: </b></font><BR>
	<font size=1>$txt{'598'}</font></td>
	<td><font size=2><input type=text name=websitetitle size=50 value="$memsettings[3]"></font></td>
      </tr><tr>
	<td width="320"><font size=2><b>$txt{'84'}: </b></font><BR>
	<font size=1>$txt{'599'}</font></td>
	<td><font size=2><input type=text name=websiteurl size=50 value="$memsettings[4]"></font></td>
      </tr><tr>
	<td colspan=2>
	<BR><hr width="100%" size="1" color="$color{'windowbg3'}" class="windowbg3"></td>
      </tr><tr>
	<td width="320"><font size=2><b>$txt{'513'}: </b></font><BR>
	<font size=1>$txt{'600'}</font></td>
	<td><font size=2><input type=text name=icq size=20 value="$memsettings[8]"></font></td>
      </tr><tr>
	<td width="320"><font size=2><b>$txt{'603'}: </b></font><BR>
	<font size=1>$txt{'601'}</font></td>
	<td><font size=2><input type=text name=aim size=20 value="$memsettings[9]"></font></td>
      </tr><tr>
	<td width="320"><font size=2><b>$txt{'604'}: </b></font><BR>
	<font size=1>$txt{'602'}</font></td>
	<td><font size=2><input type=text name=yim size=20 value="$memsettings[10]"></font></td>
      </tr><tr>
	<td colspan=2>
	<BR><hr width="100%" size="1" color="$color{'windowbg3'}" class="windowbg3"></td>
      </tr><tr>
	<td width="320"><font size=2><b>$txt{'228'}: </b></font></td>
	<td><font size=2><input type=text name=usertext size=50 value="$memsettings[12]"></font></td>
      </tr>
EOT
if($allowpics) {
	opendir(DIR, "$facesdir") || fatal_error("$txt{'230'} ($facesdir)!<BR>$txt{'681'}");
	@contents = readdir(DIR);
	closedir(DIR);
	$images = "";
	foreach $line (sort @contents){
		($name, $extension) = split (/\./, $line);
		$checked = "";
		if ($line eq $memsettings[13]) { $checked = ' selected'; }
		if ($memsettings[13] =~ m~\Ahttp://~ && $line eq 'blank.gif') { $checked = ' selected'; }
		if ($extension =~ /gif/i || $extension =~ /jpg/i || $extension =~ /jpeg/i || $extension =~ /png/i ){
			if ($line eq 'blank.gif') { $name = $txt{'422'}; }
			$images .= qq~<option value="$line"$checked>$name\n~;
		}
	}
	if ($memsettings[13] =~ m~\Ahttp://~) {
		$pic = 'blank.gif';
		$checked = ' checked';
		$tmp = $memsettings[13];
	}
	else {
		$pic = $memsettings[13];
		$tmp = 'http://';
	}

	print <<"EOT";
      <tr>
	<td width="320"><b><font size=2>$txt{'229'}:</B></font><BR>
	<font size=1>$txt{'474'} $userpic_limits</font></td>
        <td>
        <script language="JavaScript1.2" type="text/javascript">
        function showimage()
        {
           document.images.icons.src="$facesurl/"+document.creator.userpic.options[document.creator.userpic.selectedIndex].value;
        }
        </script>
        <select name="userpic" size=6 onChange="showimage()">$images</select>
        &nbsp;&nbsp;<img src="$facesurl/$pic" name="icons" border=0 hspace=15>
	</td>
      </tr><tr>
	<td width="320"><font size="2"><B>$txt{'475'}</B></font></td>
	<td><input type="checkbox" name="userpicpersonalcheck"$checked>
	<input type="text" name="userpicpersonal" size="45" value="$tmp"></td>
      </tr>
EOT
}
print <<EOT;
    </table><BR>
    </td>
  </tr><tr>
    <td class="catbg" bgcolor="$color{'catbg'}" height="25"><font size=2><b>$txt{'605'}</b></font></td>
  </tr><tr>
    <td class="windowbg" bgcolor="$color{'windowbg'}"><font size=2>
    <table border=0 cellpadding="3" cellspacing="0">
EOT
if ($allow_hide_email == 1) { print <<"EOT";
    <tr>
	<td width="320"><font size=2><b>$txt{'721'}</b></font></td>
	<td><input type="checkbox" name="hideemail" value="checked" $memsettings[19]></td>
    </tr>
EOT
}
print <<"EOT";
      <tr>
	<td width="320"><font size=2><b>$txt{'486'}:</b></font><BR>
	<font size=1>$txt{'479'}</font></td>
	<td width="50">
	<select name="usertimeselect" size=1>
	 <option value="1"$tsl1>$txt{'480'}
	 <option value="5"$tsl5>$txt{'484'}
	 <option value="4"$tsl4>$txt{'483'}
	 <option value="2"$tsl2>$txt{'481'}
	 <option value="3"$tsl3>$txt{'482'}
	 <option value="6"$tsl6>$txt{'485'}
	</select>
	</td>
      </tr><tr>
	<td width="320"><font size=2><b>$txt{'371'}:</b></font><BR>
	<font size=1>$txt{'519'}</font></td>
	<td><font size=1>
	<input name=usertimeoffset size=5 maxlength=5 value=$memsettings[18]>
	<BR>$txt{'741'}: <i>$proftime</i></font></td>
      </tr><tr>
	<td colspan=2><hr width="100%" size="1" color="$color{'windowbg3'}" class="windowbg3"></td>
      </tr><tr>
	<td width="320"><font size=2><b>$txt{'85'}:</b></font><BR>
	<font size=1>$txt{'606'}</font></td>
	<td><font size=2><textarea name="signature" rows="4" cols="50" wrap="virtual">$signature</textarea><BR>
	<FONT SIZE="1">$txt{'664'} <input value="$MaxSigLen" size="3" name="msgCL" disabled></FONT><BR><BR></font></td></tr>
<script language="JavaScript">
<!--
var supportsKeys = false
function tick() {
	calcCharLeft(document.forms[0])
	if (!supportsKeys) timerID = setTimeout("tick()",$MaxSigLen)
}

function calcCharLeft(sig) {
	clipped = false
	maxLength = $MaxSigLen
	if (document.creator.signature.value.length > maxLength) {
		document.creator.signature.value = document.creator.signature.value.substring(0,maxLength)
		charleft = 0
		clipped = true
	} else {
		charleft = maxLength - document.creator.signature.value.length
	}
	document.creator.msgCL.value = charleft
	return clipped
}

tick();
//-->
</script>
EOT
	fopen(FILE, "$vardir/membergroups.txt");
	@lines = <FILE>;
	fclose(FILE);
	if($settings[7] eq 'Administrator') {
		$position='';
		foreach $curl (@lines) {
			if($curl ne $lines[1] && $curl ne $lines[2] && $curl ne $lines[3] && $curl ne $lines[4] && $curl ne $lines[5] && $curl ne $lines[6]) {
				if($curl ne $lines[0]) { $position= qq~$position<option>$curl~; }
				else { $position= qq~$position<option value="Administrator">$curl~; }
			}
		}
		if($memsettings[7] eq 'Administrator') { $tt = $lines[0]; }
		else { $tt = $memsettings[7]; }
		print <<"EOT";
      <tr>
	<td colspan=2><hr width="100%" size="1" color="$color{'windowbg3'}" class="windowbg3"></td>
      </tr><tr>
	<td width="320"><font size=2><b>$txt{'86'}: </b></font></td>
	<td><font size=2><input type=text name=settings6 size=4 value="$memsettings[6]"></font></td>
      </tr><tr>
	<td width="320"><font size=2><b>$txt{'87'}: </b></font></td>
	<td><font size=2><select name="settings7">
	 <option value="$memsettings[7]">$tt
	 <option value="$memsettings[7]">---------------
	 <option value="">
	 $position
	</select></font></td>
      </tr><tr>
        <td width="320"><font size=2><b>$txt{'233'}:</b><BR>
        <font size=1>$txt{'421'}</font></td>
        <td><input type="text" name="dr" size="20" value="$dr"></td></tr>
EOT
	}
	print <<"EOT";
	<tr><td align="center" colspan="2"><BR><input type=submit name=moda value="$txt{'88'}">
	<input type=submit name=moda value="$txt{'89'}"><BR><BR>
	</td>
      </tr>
    </table>
    </td>
  </tr>
</table>
</form>
EOT
	&footer;
	exit;
}

sub ModifyProfile2 {
	my( %member, $key, $value, $newpassemail, @memberlist, $a, @check_settings, @reserve, $matchword, $matchcase, $matchuser, $matchname, $namecheck, $reserved, $reservecheck, @dirdata, $filename, @entries, $entry, $umail, @members, $tempname );
	$FORM{'signature'} =~ s~\n~\&\&~g;
	while( ($key,$value) = each(%FORM) ) {
		$value =~ s~\A\s+~~;
		$value =~ s~\s+\Z~~;
		$value =~ s~[\n\r]~~g;
		$member{$key} = $value;
	}

	# make sure this person has access to this profile
	if($username ne $member{'username'} && $settings[7] ne 'Administrator') {
		&fatal_error($txt{'80'});
	}
	if( $settings[7] ne 'Administrator' ) {
		$member{'username'} = $username;
		$member{'settings6'} = $settings[6];
		$member{'settings7'} = $settings[7];
	}
	if($member{'settings6'} !~ /\A[0-9]+\Z/) { &fatal_error("$txt{'749'}"); }
	if ($member{'username'} =~ /\//){ &fatal_error($txt{'224'}); }
	if ($member{'username'} =~ /\\/){ &fatal_error($txt{'225'}); }
	$INFO{'username'} = $member{'username'};
	if( $member{'userpicpersonalcheck'} && ( $member{'userpicpersonal'} =~ m/\.gif\Z/i || $member{'userpicpersonal'} =~ m/\.jpg\Z/i || $member{'userpicpersonal'} =~ m/\.jpeg\Z/i || $member{'userpicpersonal'} =~ m/\.png\Z/i ) ) {
		$member{'userpic'} = $member{'userpicpersonal'};
	}
	if($member{'userpic'} eq "") { $member{'userpic'} = "blank.gif"; }
	&fatal_error("$txt{'592'}") if($member{'userpic'} !~ m^\A[0-9a-zA-Z_\.\#\%\-\:\+\?\$\&\~\.\,\@/]+\Z^);
	if(!$allowpics) { $member{'userpic'} = "blank.gif"; }
	if( $emailnewpass && lc $member{'email'} ne lc $settings[2] && $settings[7] ne 'Administrator') {
		srand();
		$member{'passwrd1'} = int( rand(100) );
		$member{'passwrd1'} =~ tr/0123456789/ymifxupbck/;
		$_ = int( rand(77) );
		$_ =~ tr/0123456789/q8dv7w4jm3/;
		$member{'passwrd1'} .= $_;
		$_ = int( rand(89) );
		$_ =~ tr/0123456789/y6uivpkcxw/;
		$member{'passwrd1'} .= $_;
		$_ = int( rand(188) );
		$_ =~ tr/0123456789/poiuytrewq/;
		$member{'passwrd1'} .= $_;
		$_ = int( rand(65) );
		$_ =~ tr/0123456789/lkjhgfdaut/;
		$member{'passwrd1'} .= $_;
		$newpassemail = 1;
	} else {
		&fatal_error("($member{'username'}) $txt{'213'}") if($member{'passwrd1'} ne $member{'passwrd2'});
		&fatal_error("($member{'username'}) $txt{'91'}") if($member{'passwrd1'} eq '');
		&fatal_error("$txt{'241'}") if($member{'passwrd1'} !~ /\A[\s0-9A-Za-z!@#$%\^&*\(\)_\+|`~\-=\\:;'",\.\/?\[\]\{\}]+\Z/);
	}
	&fatal_error("$txt{'75'}") if($member{'name'} eq '');
	&fatal_error("$txt{'242'}") if($member{'name'} !~ /^[\s0-9A-Za-z\[\]#%+,-|\.:=?@^_]+$/);
	&fatal_error("$txt{'75'}") if($member{'name'} eq '|');
	&fatal_error("$txt{'568'}") if(length($member{'name'}) > 20);
	&fatal_error("$txt{'76'}") if($member{'email'} eq '');
	&fatal_error("$txt{'243'}") if($member{'email'} !~ /^[0-9A-Za-z@\._\-]+$/);
	&fatal_error("$txt{'500'}") if(($member{'email'} =~ /(@.*@)|(\.\.)|(@\.)|(\.@)|(^\.)|(\.$)/) || ($member{'email'} !~ /^.+@\[?(\w|[-.])+\.[a-zA-Z]{2,4}|[0-9]{1,4}\]?$/));
	if( $member{'bday1'} ne "" || $member{'bday1'} ne "" || $member{'bday1'} ne "" ) {
		&fatal_error("$txt{'567'}") if( $member{'bday1'} !~ /^[0-9]+$/ || $member{'bday2'} !~ /^[0-9]+$/ || $member{'bday3'} !~ /^[0-9]+$/ || length($member{'bday3'}) < 4 );
		&fatal_error("$txt{'567'}") if( $member{'bday1'} < 1 || $member{'bday1'} > 12 || $member{'bday2'} < 1 || $member{'bday2'} > 31 || $member{'bday3'} < 1901 || $member{'bday3'} > $year-5 );
	}
	&fatal_error("$txt{'680'}") if ($member{'username'} eq "admin" && $member{'settings7'} ne "Administrator");

	if($member{'moda'} eq $txt{'88'}) {
		if (length($member{'signature'}) > $MaxSigLen) { $member{'signature'} = substr($member{'signature'},0,$MaxSigLen); }
	        $member{'icq'} =~ s/[^0-9]//g;
		$member{'bday1'} =~ s/[^0-9]//g;
	        $member{'bday2'} =~ s/[^0-9]//g;
		$member{'bday3'} =~ s/[^0-9]//g;
		if($member{'bday1'}) { $member{'bday'} = "$member{'bday1'}/$member{'bday2'}/$member{'bday3'}"; }
		else { $member{'bday'} = ''; }
		$member{'signature'} =~ s/</&lt;/g;
	        $member{'signature'} =~ s/</&gt;/g;
	        $member{'aim'} =~ s/ /\+/g;
	        $member{'yim'} =~ s/ /\+/g;
		if($settings[7] ne "Administrator") { $member{'dr'} = $settings[14]; }
		# store the name temorarily so we can restore any _'s later
		$tempname = $member{'name'};
		$member{'name'} =~ s/\_/ /g;

		&ToHTML($member{'location'});
		&ToHTML($member{'aim'});
		&ToHTML($member{'yim'});
		&ToHTML($member{'gender'});
		&ToHTML($member{'usertext'});
		&ToHTML($member{'websiteurl'});
		&ToHTML($member{'websitetitle'});
		&ToHTML($member{'email'});
		&ToHTML($FORM{'hideemail'});
		&ToHTML($member{'name'});

		&FromHTML($member{'usertext'});
		$member{'usertext'} =~ s~(\S{15})(?=\S)~$1 ~g;
		&ToHTML($member{'usertext'});

		if ( length $member{'signature'} > 1000 ) { $member{'signature'} = substr( $member{'signature'}, 0, 1000 ); }
		$member{'usertimeoffset'} =~ tr/,/./;
		$member{'usertimeoffset'} =~ s/[^\d*|\.|\-|w*]//g;
		if (( $member{'usertimeoffset'} < -23.5) || ( $member{'usertimeoffset'} > 23.5)) { &fatal_error($txt{'487'}); }

		fopen(FILE, "$memberdir/memberlist.txt");
		@memberlist = <FILE>;
		fclose(FILE);
		$testname = lc $member{'name'};
		for ($a = 0; $a < @memberlist; $a++) {
			chomp $memberlist[$a];
			$membername = lc $memberlist[$a];
			if( fopen(FILE2, "$memberdir/$memberlist[$a].dat") ) {
				# Load users and check email
				if( !$yyUDLoaded{$memberlist[$a]} && -e("$memberdir/$memberlist[$a].dat") && $memberlist[$a] ne $member{'username'}) {
					# If user is not in memory, s/he must be loaded.
					&LoadUser($memberlist[$a]);
					if($userprofile{$memberlist[$a]}->[2] eq $member{'email'}) { &fatal_error("$txt{'730'} ($member{'email'}) $txt{'731'}"); }
				}
				$tmpa = <FILE2>;
				$realnametemp = <FILE2>;
				fclose(FILE2);
				chomp $realnametemp;
				$realnametemp = lc $realnametemp;
				if ($realnametemp eq $testname && $memberlist[$a] ne $username && $settings[7] ne 'Administrator') { &fatal_error("($member{'name'}) $txt{'473'}"); }
			}
		}

		fopen(FILE, "$vardir/reserve.txt") || &fatal_error("$txt{'23'} reserve.txt");
		@reserve = <FILE>;
		fclose(FILE);
		fopen(FILE, "$vardir/reservecfg.txt") || &fatal_error("$txt{'23'} reservecfg.txt");
		@reservecfg = <FILE>;
		fclose(FILE);
		for( $a = 0; $a < @reservecfg; $a++ ) {
			chomp $reservecfg[$a];
		}
		$matchword = $reservecfg[0] eq 'checked';
		$matchcase = $reservecfg[1] eq 'checked';
		$matchuser = $reservecfg[2] eq 'checked';
		$matchname = $reservecfg[3] eq 'checked';
		$namecheck = $matchcase eq 'checked' ? $member{'name'} : lc $member{'name'};

		foreach $reserved (@reserve) {
			chomp $reserved;
			$reservecheck = $matchcase ? $reserved : lc $reserved;
			if ($matchname) {
				if ($matchword) {
					if ($namecheck eq $reservecheck) { &fatal_error("$txt{'244'} $reserved"); }
				}
				else {
					if ($namecheck =~ $reservecheck) { &fatal_error("$txt{'244'} $reserved"); }
				}
			}
		}

		# let's restore the name now
		&ToHTML($tempname);
		$member{'name'} = $tempname;

		fopen( FILE, ">$memberdir/$member{'username'}.dat", 1);
		print FILE "$member{'passwrd1'}\n";
		print FILE "$member{'name'}\n";
		print FILE "$member{'email'}\n";
		print FILE "$member{'websitetitle'}\n";
		print FILE "$member{'websiteurl'}\n";
		print FILE "$member{'signature'}\n";
		print FILE "$member{'settings6'}\n";
		print FILE "$member{'settings7'}\n";
		print FILE "$member{'icq'}\n";
		print FILE "$member{'aim'}\n";
		print FILE "$member{'yim'}\n";
		print FILE "$member{'gender'}\n";
		print FILE "$member{'usertext'}\n";
		print FILE "$member{'userpic'}\n";
		print FILE "$member{'dr'}\n";
		print FILE "$member{'location'}\n";
		print FILE "$member{'bday'}\n";
		print FILE "$member{'usertimeselect'}\n";
		print FILE "$member{'usertimeoffset'}\n";
		if ($FORM{'hideemail'} ne "checked") { $FORM{'hideemail'} = ""; }
		print FILE "$FORM{'hideemail'}\n";
		fclose(FILE);

	if($newpassemail) {

	# Write log
	fopen(LOG, "$vardir/log.txt");
	@entries = <LOG>;
	fclose(LOG);
	fopen(LOG, ">$vardir/log.txt", 1);
	$field="$username";
	foreach $curentry (@entries) {
	        $curentry =~ s/\n//g;
     		($name, $value) = split(/\|/, $curentry);
	        if($name ne "$field") {
	                print LOG "$curentry\n";
	        }
	}
	fclose(LOG);

	$yySetCookies = qq~Set-Cookie: $cookieusername=; expires=Thu, 01-Jan-1970 00:00:00 GMT;\n~;
	$yySetCookies .= qq~Set-Cookie: $cookiepassword=; expires=Thu, 01-Jan-1970 00:00:00 GMT;\n~;
	$yySetCookies .= qq~Set-Cookie: $cookieusername=; path=/; expires=Thu, 01-Jan-1970 00:00:00 GMT;\n~;
	$yySetCookies .= qq~Set-Cookie: $cookiepassword=; path=/; expires=Thu, 01-Jan-1970 00:00:00 GMT;\n~;
	$username = 'Guest';
	$password = '';
	@settings = ();
	$realname = '';
	$realemail = '';
	$ENV{'HTTP_COOKIE'} = '';

	&FormatUserName($member{'username'});
	$yytitle="$txt{'245'}";
	&header;

		&sendmail($member{'email'},qq~$txt{'700'} $mbname~, "$txt{'733'} $member{'passwrd1'} $txt{'734'} $member{'username'}.\n\n$txt{'701'} $scripturl?action=profile&username=$useraccount{$member{'username'}}\n\n$txt{'130'}");
		print <<"EOT";
<BR>
<table border=0 width=100% cellspacing=1 bgcolor="$color{'bordercolor'}" class="bordercolor" align="center">
  <tr>
    <td class="titlebg" bgcolor="$color{'titlebg'}"><font size=2 class="text1" color="$color{'titletext'}"><b>$txt{'97'}</b></font></td>
  </tr><tr>
   <td class="windowbg" bgcolor="$color{'windowbg'}" align="left" cellpadding=3><font size=2>$txt{'638'}</font></td>
  </tr><tr>
    <td class="windowbg" bgcolor="$color{'windowbg2'}" valign=top><form action="$cgi&action=login2" method="POST">
    <table border=0>
      <tr>
        <td><font size=2><b>$txt{'35'}:</b></font></td>
        <td><font size=2><input type=text name="username" size=15 value="$member{'username'}"></font></td>
        <td><font size=2><b>$txt{'36'}:</b></font></td>
        <td><font size=2><input type=password name="passwrd" size=15></font> &nbsp;</td>
        <td><font size=2><b>$txt{'497'}:</b></font></td>
        <td><font size=2><input type=text name="cookielength" size=4 value="$Cookie_Length">
        <td><font size=2><b>$txt{'508'}:</B></font></td>
        <td><font size=2><input type=checkbox name="cookieneverexp"></font></td> &nbsp;</font></td>
        <td align=center colspan=2><input type=submit value="$txt{'34'}"></td>
      </tr>
    </table>
    </td>
  </tr>
</table>
EOT
	&footer;
	exit;
	}
	else {
		if ( $member{'username'} eq $username ) {
			$Cookie_Exp_Date = 'Sun, 17-Jan-2038 00:00:00 GMT';
			$password = crypt("$member{'passwrd1'}",$pwseed);

			$yySetCookies = qq~Set-Cookie: $cookieusername=$username; path=/; expires=$Cookie_Exp_Date;\n~;
			$yySetCookies .= qq~Set-Cookie: $cookiepassword=$password; path=/; expires=$Cookie_Exp_Date;\n~;

			&LoadUserSettings;
			&WriteLog;
		}
		&ViewProfile;
	}
	} else {

		if($settings[7] eq 'Administrator') {
			unlink("$memberdir/$member{'username'}.dat");
			unlink("$memberdir/$member{'username'}.msg");
			unlink("$memberdir/$member{'username'}.log");
	                unlink("$memberdir/$member{'username'}.outbox");
	                unlink("$memberdir/$member{'username'}.imconfig");
		}
		elsif( $member{'username'} eq $username ) {
			unlink("$memberdir/$username.dat");
			unlink("$memberdir/$username.msg");
			unlink("$memberdir/$username.log");
	                unlink("$memberdir/$username.outbox");
	                unlink("$memberdir/$username.imconfig");
		}

		opendir (DIRECTORY,"$datadir");
		@dirdata = readdir(DIRECTORY);
		closedir (DIRECTORY);

		if($settings[7] eq 'Administrator') {
			$umail=$member{'email'};
		} else {
			$umail=$settings[2];
		}
		foreach $filename (@dirdata) {
			unless( $filename =~ m~mail\A~ ) { next; }
			fopen(FILE, "$datadir/$filename");
			@entries = <FILE>;
			fclose(FILE);

			fopen(FILE, ">$datadir/$filename");
			foreach $entry (@entries) {
				$entry =~ s/[\n\r]//g;
				if ($entry ne $umail) {
					print FILE "$entry\n";
				}
			}
			fclose(FILE);

		}

		fopen(FILE, "$memberdir/memberlist.txt");
		@members = <FILE>;
		fclose(FILE);
		fopen(FILE, ">$memberdir/memberlist.txt", 1);
		my $memberfound = 0;
		my $lastvalidmember = '';
		foreach $curmem (@members) {
			chomp $curmem;
			if($curmem ne $member{'username'}) { print FILE "$curmem\n"; $lastvalidmember = $curmem; }
			else { ++$memberfound; }
		}
		fclose(FILE);
		my $membershiptotal = @members - $memberfound;
		fopen(FILE, "+>$memberdir/members.ttl");
		print FILE qq~$membershiptotal|$lastvalidmember~;
		fclose(FILE);
		if($settings[7] ne 'Administrator') {
			require "$sourcedir/LogInOut.pl"; &Logout;
		}
		$yySetLocation = qq~$scripturl~;
		&redirectexit;
	}
	exit;
}

sub ViewProfile {
	if ($INFO{'username'} =~ /\//){ &fatal_error("$txt{'224'}" ); }
	if ($INFO{'username'} =~ /\\/){ &fatal_error("$txt{'225'}" ); }
	if(!-e ("$memberdir/$INFO{'username'}.dat")){ &fatal_error("$txt{'453'} -- $INFO{'username'}"); }

	my($memberinfo, $modify, $email, $gender, $pic);

	$yytitle = "$txt{'92'} $INFO{'username'}";
	&header;

	# get the member's info
	fopen(FILE, "$memberdir/$INFO{'username'}.dat");
	@memsettings=<FILE>;
	fclose(FILE);
	chomp @memsettings;

	$icq = $memsettings[8];
	$memsettings[9] =~ tr/+/ /;
	$dr = "";
	if ($memsettings[14] eq "") { $dr = "$txt{'470'}"; }
	else { $dr = "$memsettings[14]"; $dr = &timeformat($dr); }
	&CalcAge("calc"); # How old is he/she?
	&CalcAge("isbday"); # is it the bday?
	if($isbday) { $isbday = "<img src=\"$imagesdir/bdaycake.gif\" width=40>"; }
	$memsettings[9] =~ s/\+/ /g;

	fopen(FILE, "$vardir/membergroups.txt");
	@membergroups = <FILE>;
	fclose(FILE);
	if($memsettings[6] > $GodPostNum) { $memberinfo = "$membergroups[6]"; }
	elsif($memsettings[6] > $SrPostNum) { $memberinfo = "$membergroups[5]"; }
	elsif($memsettings[6] > $FullPostNum) { $memberinfo = "$membergroups[4]"; }
	elsif($memsettings[6] > $JrPostNum) { $memberinfo = "$membergroups[3]"; }
	else { $memberinfo = "$membergroups[2]"; }
	if($memsettings[7] ne "") { $memberinfo = "$memsettings[7]"; }
	if($memsettings[7] eq "Administrator") { $memberinfo = "$membergroups[0]"; }

	&FormatUserName($INFO{'username'});
	if ($username eq $INFO{'username'} || $settings[7] eq "Administrator") {
		$modify = qq~&#171; <a href="$cgi&action=profile&username=$useraccount{$INFO{'username'}}"><font size=2 class="text1" color="$color{'titletext'}">$txt{'17'}</font></a> &#187;~;
	}
	if ($memsettings[19] ne "checked" || $settings[7] eq "Administrator" || $allow_hide_email ne 1) {
		$email = qq~<a href="mailto:$memsettings[2]">$memsettings[2]</a>~;
	}
	else { $email = qq~<i>$txt{'722'}</i>~; }
	$gender = "";
	if ($memsettings[11] eq "Male") { $gender = qq~$txt{'238'}~; }
	if ($memsettings[11] eq "Female") { $gender = qq~$txt{'239'}~; }
	if($allowpics) {
	if ($memsettings[13] =~ /^\http:\/\// ) {
		if ($userpic_width ne 0) { $tmp_width = "width=$userpic_width"; } else { $tmp_width=""; }
		if ($userpic_height ne 0) { $tmp_height = "height=$userpic_height"; } else { $tmp_height=""; }
		$pic = qq~<a href="$memsettings[13]" target="_blank" onClick="window.fopen('$memsettings[13]', 'ppic$INFO{username}', 'resizable,width=200,height=200'); return false;">~;
		$pic = qq~<img src="$memsettings[13]" $tmp_width $tmp_height border=0></a>~;
	}
	else {
		$pic = qq~<a href="$facesurl/$memsettings[13]" target="_blank" onClick="window.fopen('$facesurl/$memsettings[13]', 'ppic$INFO{username}', 'resizable,width=200,height=200'); return false;">~;
		$pic = qq~<img src="$facesurl/$memsettings[13]" border=0></a>~;
	}
	}

	$online = "$txt{'113'} ?";
	fopen(FILE, "$vardir/log.txt");
	@entries = <FILE>;
	fclose(FILE);
	foreach $curentry (@entries) {
		chomp $curentry;
		($name, $value) = split(/\|/, $curentry);
		if( $name ) {
			&LoadUser($name);
			if( $useraccount{$name} eq $INFO{'username'}) {
				$online =~ s~\?~<i>$txt{'686'}</i>.~;
			}
		}
	}
	$online =~ s~\?~<i>$txt{'687'}</i>.~;
	if($memsettings[6] > 100000) { $memsettings[6] = "$txt{'683'}"; }

	print <<"EOT";
<table border="0" cellpadding="4" cellspacing="1" bgcolor="$color{'bordercolor'}" class="bordercolor" align="center">
  <tr>
    <td class="titlebg" colspan="2" bgcolor="$color{'titlebg'}">
    <table border="0" cellspacing="0" cellpadding="0" width="100%">
      <tr height="30">
	<td width="220">
        <img src="$imagesdir/profile_sm.gif" alt="" border="0">&nbsp;
        <font size=2 class="text1" color="$color{'titletext'}"><B>$txt{'35'}: $INFO{'username'}</b></font></td>
	<td align="center" width="200">
        <font size=2 class="text1" color="$color{'titletext'}">$modify</font></td>
	<td align="center" width="150">
        <font size=2 class="text1" color="$color{'titletext'}">$txt{'232'}</font></td>
      </tr>
    </table>
    </td>
  </tr><tr>
    <td bgcolor="$color{'windowbg'}" class="windowbg" width="420">
    <table border=0 cellspacing="0" cellpadding="2" width="100%">
      <tr>
	<td><font size=2><b>$txt{'68'}: </b></font></td>
	<td><font size=2>$memsettings[1]</font></td>
      </tr><tr>
        <td><font size=2><b>$txt{'86'}: </b></font></td>
        <td><font size=2>$memsettings[6]</font></td>
      </tr><tr>
        <td><font size=2><b>$txt{'87'}: </b></font></td>
        <td><font size=2>$memberinfo</font></td>
      </tr><tr>
        <td><font size=2><b>$txt{'233'}: </b></font></td>
        <td><font size=2>$dr</font></td>
      </tr><tr>
	<td colspan="2"><hr size="1" width="100%" color="$color{'windowbg3'}" class="windowbg3"></td>
      </tr><tr>
        <td><font size=2><b>$txt{'513'}:</b></font></td>
        <td><font size=2><a href="$cgi&action=icqpager&UIN=$icq" target=_blank>$memsettings[8]</a></font></td>
      </tr><tr>
        <td><font size=2><b>$txt{'603'}: </b></font></td>
        <td><font size=2>$memsettings[9]</font></td>
      </tr><tr>
        <td><font size=2><b>$txt{'604'}: </b></font></td>
        <td><font size=2>$memsettings[10]</font></td>
      </tr><tr>
	<td><font size=2><b>$txt{'69'}: </b></font></td>
	<td><font size=2>$email</font></td>
      </tr><tr>
        <td><font size=2><b>$txt{'96'}: </b></font></td>
        <td><font size=2><a href="$memsettings[4]" target=_blank>$memsettings[3]</a></font></td>
      </tr><tr>
	<td colspan="2"><hr size="1" width="100%" color="$color{'windowbg3'}" class="windowbg3"></td>
      </tr><tr>
	<td><font size=2><b>$txt{'231'}: </b></font></td>
	<td><font size=2>$gender</font></td>
      </tr><tr>
        <td><font size=2><b>$txt{'420'}:</b></font></td>
        <td><font size=2>$age</font> &nbsp; $isbday</td>
      </tr><tr>
        <td><font size=2><b>$txt{'227'}: </b></font></td>
        <td><font size=2>$memsettings[15]</font></td>
      </tr>
    </table>
    </td>
    <td bgcolor="$color{'windowbg'}" class="windowbg" valign="middle" align="center" width="150">
    $pic<BR><BR>
    <font size=2>$memsettings[12]</font></td>
  </tr><tr height="25">
    <td class="titlebg" bgcolor="$color{'titlebg'}" colspan="2">
    &nbsp;<font size=2 class="text1" color="$color{'titletext'}"><b>$txt{'459'}:</b></font></td>
  </tr><tr>
    <td colspan="2" bgcolor="$color{'windowbg2'}" class="windowbg2" valign="middle">
    <form action="$cgi&action=usersrecentposts&username=$useraccount{$INFO{'username'}}" method="POST">
    <font size=2>
    $online<BR><BR>
    <a href="$cgi&action=imsend&to=$useraccount{$INFO{'username'}}">$txt{'688'}</a>.<BR><BR>
    $txt{'460'} <select name="viewscount" size="1">
     <option value="5">5</option>
     <option value="10" selected>10</option>
     <option value="50">50</option>
     <option value="0">$txt{'190'}</option>
    </select> $txt{'461'}. <input type=submit value="$txt{'462'}">
    </font></td>
  </tr>
</table>
</form>
EOT
	&footer;
	exit;
}

sub usersrecentposts {
	my $curuser = $INFO{'username'};
	&FormatUserName($curuser);
	if ($curuser =~ m~/~){ &fatal_error($txt{'224'}); }
	if ($curuser =~ m~\\~){ &fatal_error($txt{'225'}); }
	my $display = $FORM{'viewscount'};
	if( $display =~ /\D/ ) { &fatal_error($txt{'337'}); }
	$display ||= 999999999;
	my( @memset, @categories, %data, %cat, $numfound, $oldestfound, $curcat, %catname, %cataccess, %catboards, $openmemgr, @membergroups, $tmpa, %openmemgr, $curboard, @threads, @boardinfo, $i, $c, @messages, $tnum, $tsub, $tname, $temail, $tdate, $treplies, $tusername, $ticon, $tstate, $mname, $memail, $mdate, $musername, $micon, $mattach, $mip, $mns, $mtime, $counter, $board, $notify );

	fopen(FILE, "$memberdir/$curuser.dat") || &fatal_error("$txt{'23'} $curuser.txt");
	@memset = <FILE>;
	fclose(FILE);

	@categories = ();
	fopen(FILE, "$vardir/cat.txt");
	@categories = <FILE>;
	fclose(FILE);

	# Load Censor List
	&LoadCensorList;

	$oldestfound = stringtotime("01/10/37 $txt{'107'} 00:00:00");

	foreach $curcat (@categories) {
		chomp $curcat;
		fopen(FILE, "$boardsdir/$curcat.cat");
		$catname{$curcat} = <FILE>;
		chomp $catname{$curcat};
		$cataccess{$curcat} = <FILE>;
		chomp $cataccess{$curcat};
		@{$catboards{$curcat}} = <FILE>;
		fclose(FILE);
		$openmemgr{$curcat} = 0;
		@membergroups = split( /,/, $cataccess{$curcat} );
		foreach $tmpa (@membergroups) {
			if( $tmpa eq $settings[7]) { $openmemgr{$curcat} = 1; last; }
		}
		if( ! $cataccess{$curcat} || $settings[7] eq 'Administrator' ) {
			$openmemgr{$curcat} = 1;
		}
		unless( $openmemgr{$curcat} ) { next; }
		boardcheck: foreach $curboard (@{$catboards{$curcat}}) {
			chomp $curboard;
			fopen(FILE, "$boardsdir/$curboard.txt");
			@threads = <FILE>;
			fclose(FILE);

			fopen(FILE, "$boardsdir/$curboard.dat");
			@boardinfo = <FILE>;
			fclose(FILE);
			foreach (@boardinfo) {
				chomp;
			}
			@{$boardinfo{$curboard}} = @boardinfo;
			$cat{$curboard} = $curcat;

			threadcheck: for ($i = 0; $i < @threads; $i++) {
				chomp $threads[$i];
				($tnum, $tsub, $tname, $temail, $tdate, $treplies, $tusername, $ticon, $tstate) = split( /\|/, $threads[$i] );
				fopen(FILE, "$datadir/$tnum.txt") || next;
				@messages = <FILE>;
				fclose(FILE);

				for ($c = 0; $c < @messages; $c++) {
					chomp $messages[$c];
					($msub, $mname, $memail, $mdate, $musername, $micon, $mattach, $mip, $message, $mns) = split(/\|/,$messages[$c]);
					if ($curuser eq $musername) {
						$mtime = stringtotime($mdate);
						if( $numfound >= $display && $mtime <= $oldestfound ) {
							next boardcheck;
						}
						else {
							$data{$mtime} = [$curboard, $tnum, $c, $msub, $mname, $memail, $mdate, $musername, $micon, $mattach, $mip, $message, $mns];
							if( $mtime < $oldestfound ) { $oldestfound = $mtime; }
							++$numfound;
						}
					}
				}
			}
		}
	}

	$yytitle = "$txt{'458'} $memset[1]";
	&header;
print<<"EOT";
<p align=left><a href="$cgi&action=viewprofile&username=$useraccount{$curuser}"><font size=2><b>$txt{'92'} $memset[1]</b></font></a></p>
EOT
	@messages = sort {$b <=> $a } keys %data;
	if( @messages > $display ) { $#messages = $display - 1; }
	$counter = 1;
	for( $i = 0; $i < @messages; $i++ ) {
		($board, $tnum, $c, $msub, $mname, $memail, $mdate, $musername, $micon, $mattach, $mip, $message, $mns) = @{ $data{$messages[$i]} };
		foreach (@censored) {
			($tmpa,$tmpb) = @{$_};
			$message =~ s~\Q$tmpa\E~$tmpb~gi;
			$msub =~ s~\Q$tmpa\E~$tmpb~gi;
		}
		if($enable_ubbc) { $ns = $mns; &DoUBBC; }
		if($enable_notification) {
			$notify = qq~$menusep<a href="$scripturl?board=$board&action=notify&thread=$tnum&start=$c">$img{'notify'}</a>~;
		}
		print <<"EOT";
<table border=0 width=100% cellspacing=1 $color{'bordercolor'}>
<tr>
	<td align=left bgcolor="$color{'titlebg'}"><font class="text1" color="$color{'titletext'}" size=2>&nbsp;$counter&nbsp;</font></td>
	<td width=75% bgcolor="$color{'titlebg'}"><font class="text1" color="$color{'titletext'}" size=2><b>&nbsp;$catname{$cat{$board}} / $boardinfo{$board}->[0] / <a href="$scripturl?board=$board&action=display&num=$tnum&start=$c"><font class="text1" color="$color{'titletext'}" size=2>$msub</font></a></b></font></td>
	<td align=right bgcolor="$color{'titlebg'}"><nobr>&nbsp;<font class="text1" color="$color{'titletext'}" size=2>$txt{'30'}: $mdate&nbsp;</font></nobr></td>
</tr>
<tr height=80>
	<td colspan=3 bgcolor="$color{'windowbg2'}" valign=top><font size=2>$message</font></td>
</tr>
<tr>
	<td colspan=3 bgcolor="$color{'catbg'}"><font size=2>
		&nbsp;<a href="$scripturl?board=$board&action=post&num=$tnum&start=$c&title=Post+reply">$img{'reply'}</a>$menusep<a href="$scripturl?board=$board&action=post&num=$tnum&quote=$c&title=Post+reply">$img{'replyquote'}</a>$notify
	</font></td>
</tr>
</table><br>
EOT
		++$counter;
	}

print <<"EOT";
<p align=left><a href="$cgi&action=viewprofile&username=$useraccount{$curuser}"><font size=2><b>$txt{'92'} $memset[1]</b></font></a></p></font>
EOT
	&footer;
	exit;
}
1;
