#!/usr/bin/perl -I.
# Dreamcast Version
# SONIC ADVENTURE
# Chao Daycare Center
# 


use strict;

use CGI;
use	DC;
use POSIX	'strftime';
use DB;


## Set up variables
use vars	(	'$dc',	# DC object
				'@IN',
				'@BINDATA',
				'$PDATA',
				'$CHAO',
				'$WIN', '@Jewel',
				'$errorURL',
				'@chara',
				'$charnum',
				'$cgiPath',
				'$date',
				'@ChrCode',
				'$MAX', '$START', '$END', '$UserKey', '$NowRank', '$MaxRec', '$nextflag',
			);

@chara=('sonic','tails','knuckles','big','e102','amy');
@Jewel=('pearl', 'amethyst', 'sapphire', 'ruby', 'emerald');

#...............................................
# Handling time
	$date = strftime("UPLOADED ON %m/%d/%Y, %I:%M %p (%Z)", localtime);

	my $q = new CGI;
	$dc = new DC($q);
	$dc->q->import_names('IN');

	$errorURL = "chao_daycare.html";
	$cgiPath = "/cgi-bin/soa/sonicadv/chao_daycare.cgi";

	@BINDATA = ();
	$PDATA = "";
	$CHAO = "";
	$nextflag = 1;

    &check_data;

    if($dc->q->param('command') eq 'form') {
        # Form output again
        $dc->output_form("html/chao_daycare_form.html");
    } elsif ($dc->q->param('command') eq 'view') {
		&check_search;

		$NowRank=-1;
		
		&output_records(&read_data());
	} else {
		# Record data into Database
		my ($dbh, $errN, $errstr, @row, $key);
		
		# Read user information from the table
		$key = $dc->make_key($IN::mailid);

		($dbh, $errstr) = DB::openOracleConnection();
		if( !$dbh )
		{
			$dc->error("[chao_daycare] Error connecting to database: $errstr");
		}

		# Update user table information
		($errN, $errstr, @row) = DB::getRow_UserByUK( $dbh, $dc->DBaseTable('USER'), $key );
		if ($errN)
		{
			$dc->error("[chao_daycare] Fetching user key: $errN .... $errstr", $errorURL);
		}

		($errN, $errstr)       = DB::modifyRow_UserByEmail( $dbh, $dc->DBaseTable('USER'), $IN::mailid, $dc->q->param('NAME'), $dc->q->param('CITY'), $IN::STATE, $IN::COUNTRY, $IN::MAIL, $row[$dc->UserOff('GAME')], $row[$dc->UserOff('BIRTH')], $row[$dc->UserOff('PARENT')], $row[$dc->UserOff('BLOCK')], $row[$dc->UserOff('P1EMAIL')], $row[$dc->UserOff('P2EMAIL')], time, $row[$dc->UserOff('PENDING')], $row[$dc->UserOff('EMBLEMS')], $row[$dc->UserOff('GOLD')], $row[$dc->UserOff('SILVER')], $row[$dc->UserOff('BRONZE')], $row[$dc->UserOff('BLUERIB')] );
		if ($errN)
		{
			$dc->error("[chao_daycare] Unable to update user info: $errN .... $errstr", $errorURL);
		}

		($errN, $errstr) = DB::insertRow_Chao( $dbh, $dc->DBaseTable('CHAO'), $key, $dc->q->param('ChaoName'), $CHAO, $charnum, $IN::PASSWORD, $dc->q->param('COMMENT'), time );
		if ($errN)
		{
			$dc->error("[chao_daycare] Unable to create Chao info: $errN .... $errstr", $errorURL);
		}		
		# Delete Chao that are older than 24 hours
	    ($errN, $errstr)       = DB::deleteRow_ChaoByTime( $dbh, $dc->DBaseTable('CHAO'), (24*60*60) );
		if ($errN)
		{
			$dc->error("[chao_daycare] Unable to delete old Chao: $errN .... $errstr", $errorURL);
		}

		DB::closeOracleConnection( $dbh );

		# Display Record
		&output_verify;
    }

exit(0);

#--------------------------------------------------------
# Data Check
#--------------------------------------------------------
sub check_data {
	if ($dc->q->param('command') eq 'view')
	{
		# Don't bother processing if just viewing the daycare
		return;
	}

	my $MAIL = "";
    my $Warning = "";
	my ($MAIL);
	my ($dbh, $errN, $errstr, @row, $key);

    # Decode Data
    if( &decode($dc->q->param('chaodata')) != 0) {
        $dc->error("Something wrong with your Chao data.<BR>Please recreate the Chao upload file and try again.", $errorURL);
    }

    # Key Acquisition
    $MAIL = $IN::mailid;
    $MAIL =~ y/A-Z/a-z/;
	$dc->q->param('mailid', $MAIL);
    if($MAIL eq "" || $MAIL !~ /[A-Za-z0-9_][-A-Za-z0-9:\._%]*@[-A-Za-z0-9][-A-Za-z0-9\.]*[-A-Za-z0-9]\.[A-Za-z0-9][-A-Za-z0-9\.]*[A-Za-z0-9]/) {
        $dc->error("Something wrong with E-mail address \"$MAIL\".<BR>Please make sure there are no spaces at the end of your E-mail address.", $errorURL);
    }

    # Hardware ID decode - Not Used
    # &decode_hwid(substr($dc->q->param('dcid'),0,12));

    if($IN::PASSWORD ne "" && $IN::PASSWORD !~ /[0-9a-zA-Z]/) {
        $dc->q->param('command', 'form');
    }

    if($dc->q->param('NAME') eq "") {
		$Warning .= "Oops, you forgot to tell us your name!<BR>";
        $dc->q->param('command', 'form');
    }
    $dc->q->param('NAME', $dc->smut_check($dc->q->param('NAME')));

    if($dc->q->param('CITY') eq "") {
        $Warning .= "Your city was not entered.<BR>";
        $dc->q->param('command', 'form');
    }
    $dc->q->param('CITY', $dc->smut_check($IN::CITY));

    if($IN::COUNTRY eq "") {
        $Warning .= "Your country was not entered.<BR>";
        $dc->q->param('command', 'form');
    }

	if (($IN::COUNTRY eq "US") && ($IN::STATE eq "")) {
        $Warning .= "State must be entered if from the Unitied States.<BR>";
        $dc->q->param('command', 'form');
	} elsif (($IN::COUNTRY ne "US") && ($IN::STATE ne "")) {
        $Warning .= "You must not select a state if your country is not the United States.<BR>";
        $dc->q->param('command', 'form');
	}

    if($IN::MAIL ne "Y") {
		$dc->q->param('MAIL','N');
    }

	my $trunc = substr($dc->q->param('COMMENT'),0,127);
	$dc->q->param('COMMENT', $dc->smut_check($trunc));

	# Set up the error message
	$dc->q->param('Warning', $Warning);
}

#------------------------------------------------
# Decode
#------------------------------------------------
sub decode {
    my $srcdata = shift;

	my $errorNum = 0;
	my $ORGCHAO = "";
	my @CHAOARRAY = ();
	my $CHAONAME = "";
	my $CLEANNAME = "";
	my ($i, $j, $val, $val2);

    my (@XOR_CODE) = (65,84,69,90);     # 0x5A455441
    my (@PLUS_VAL) = (65,78,65,78);     # 0x4E414E41

    # BASE64Decode
    @BINDATA = $dc->decode_base64($srcdata);

    my @tmp_val = (0,0,0,0);
    for(my $i=0;$i<145;$i++) {
        my $tmp_val2 = 0;
        for(my $j=0;$j<4;$j++) {
            $BINDATA[$i*4+$j] ^= ($tmp_val[$j] ^ $XOR_CODE[$j]);
            $tmp_val[$j] = ($tmp_val[$j] + $PLUS_VAL[$j] + $tmp_val2);
            $tmp_val2 = $tmp_val[$j]>>8;
            $tmp_val[$j] &= 255;
        }
    }
 
    my $CRC = ($BINDATA[1]<<8)+$BINDATA[0];
    # if($CRC != $dc->crc(\@BINDATA)) {
        # $dc->error("CRC Check Error!<BR>Chao data is corrupted.", $errorURL);
		# $errorNum = 1;
    # }

    # A flag is eliminated automatically when the file is download
    $BINDATA[68+54] |= 32;

    my $DATA_ID = sprintf "%02X%02X%02X%02X",$BINDATA[7],$BINDATA[6],$BINDATA[5],$BINDATA[4];
    if($DATA_ID ne 'CDACB521') {
        $dc->error("Something wrong with Chao data.\"$DATA_ID\"", $errorURL);
		$errorNum = 1;
    }

	# Convert just the A-Z characters, and leave all others as ~
	$CLEANNAME = "";
    for($i=72;$i<79;$i++) {
		$val = $dc->ChrCode($BINDATA[$i]);
		if (($val ge 'A') && ($val le 'Z'))
		{
			$CLEANNAME .= $val;
		}
		else
		{
			$CLEANNAME .= '~';
		}
    }

	# Convert any dirty words
	$CLEANNAME = $dc->smut_check($CLEANNAME);

	# Convert the string back, and modify BINDATA.
	for ($i = 0; $i < 8; ++$i)
	{
		if (substr($CLEANNAME, $i, 1) ne '~')
		{
			$BINDATA[(72 + $i)] = ord(substr($CLEANNAME, $i, 1));
		}
	}

	$CHAONAME = "";
	my $kanji = 0;
    for($i=72;$i<79;$i++)
	{
		$val = $BINDATA[$i];
		$val2 = $BINDATA[$i + 1];
		
		$j = $dc->convert_katakana($val, $val2, $CHAONAME);
		if ($j)
		{
			# Katakana was found, value contains loop skip value
			$kanji = 1;
			if ($j == 2)
			{
				# Two character combo so skip past two characters
				++$i;
			}
		}
		else
		{
			if (($kanji == 1) && ($dc->ChrCode($val) eq '-'))
			{
				# "-" Repeat the immediately preceding vowel.
				$CHAONAME .= substr($CHAONAME, -1, 1);
			}
			else
			{
				$CHAONAME .= $dc->ChrCode($val);
			}
		}
    }

	# Convert Chao name into HTML safe text
	$q->autoEscape(0);
	$dc->q->param('ChaoName', $CHAONAME);
	$q->autoEscape(1);
	if ($dc->q->param('ChaoName') eq "")
	{
		#Put generic name
		$dc->q->param('ChaoName', "YOUR CHAO");
	}


    for($i=8;$i<68;$i++) {
        $PDATA .= pack("c",$BINDATA[$i]);
    }
    $CHAO = "";
    for($i=68;$i<580;$i++) {
        $CHAO .= pack("c",$BINDATA[$i]);
    }

	# Jewels won count
	$WIN = $BINDATA[120];

	# Favorite Character
    $charnum = 0;
    my $val = -101;
    my $val2;
    for(my $i=0;$i<6;$i++) {
        $val2=$BINDATA[$i*2+176];
        if($val2 >= 128) {
            $val2 -= 256;
        }
        if($val<$val2) {
            $charnum = $i;
            $val = $val2;
        }
    }

    return($errorNum);
}

#--------------------------------------------------------
# Result Output
#--------------------------------------------------------
sub output_verify {
	my ($NAME, $CITY, $COMMENT, $MAILID, $CHAONAME);

	$NAME = $dc->q->param('NAME');
	$CITY = $dc->q->param('CITY');
	$COMMENT = $dc->q->param('COMMENT');
	$MAILID = $dc->q->param('mailid');
	$CHAONAME = $dc->q->param('ChaoName');

    print "Content-type: text/html\n\n";
    print <<EOF;

<html>
<head>
<title>
Sonic Adventure Online - Hints
</title>
<meta name="x-uirequest" content="urlbaroff">
<script LANGUAGE = "JavaScript">
<!--
        if (document.images) {
            img1on = new Image(); 
            img1on.src = "file:/button_back_on.gif";   
            img1off = new Image(); 
            img1off.src = "file:/button_back.gif"; 
        }

function imgOn(imgName) {
        if (document.images) {
            document[imgName].src = eval(imgName + "on.src");
        }
}

function imgOff(imgName) {
        if (document.images) {
            document[imgName].src = eval(imgName + "off.src");
        }
}



// -->

</script>
<bgsound src="file:/sonicadv/chao.adx">
</head>
<body x-marginleft=0 x-margintop=0   background="file:/bg_scroller.gif" bgcolor="#000000" marginheight=0 marginwidth=0 topmargin=0 leftmargin=0>
<center>
<img src="file:/blank_dot.gif" width=1 height=30 border=0 alt=""><br>
<table cellspacing=0 cellpadding=5 border=0 width=590><tr><td align=center valign=top bgcolor="#000033"><table cellspacing=0 cellpadding=0 border=0 width=580><tr><td align=left valign=top bgcolor="#ffffff">

<!-- HEADER IMAGE -->
<!-- choose from below... -->
<!-- header_chao_showoff.gif -->
<!-- header_events.gif -->
<!-- header_world_rankings.gif -->

<img src="file:/header_chao_daycare.gif" width=580 height=150 border=0 alt=""><br>

<!-- END HEADER IMAGE -->

<table cellspacing=0 cellpadding=0 border=0 width=580><tr><td align=left valign=top width="10">
<img src="file:/blank_dot.gif" width=10 height=1 border=0 alt="">
</td>
<td align=left valign=top width=560>

<!-- BEGIN CONTENT HERE -->

<CENTER>
<TABLE border=1 cellpadding=5 cellspacing=0 width=560 BGCOLOR="#CCCCCC">
<TR>
<TD height="60" align="left" colspan=2 BGCOLOR="#666666">
<FONT COLOR="#FFFFFF">
$date<BR>
We will take good care of $CHAONAME for 24 hours!
</FONT>
</TD>
</TR>
<TR>
<TD WIDTH="140">Owner:</TD>
<TD>$NAME</TD>
</TR>

<TR>
<TD>E-Mail:</TD>
EOF
		if ($dc->q->param('MAIL') eq "Y")
		{
			print "<TD>$MAILID</TD>\n";
		} else {
			print "<TD>Hidden</TD>\n";
		}

	print <<EOF;
</TR>

<TR>
<TD>
EOF

		if ($dc->Flags($IN::COUNTRY) ne "")
		{
			print "<img src=\"/images/flags/".$dc->Flags($IN::COUNTRY)."\" width=40 height=20 border=0 align=\"right\">";	
		} else {
			# Draw the generic flag
			print "<img src=\"/images/flags/flag_other.gif\" width=40 height=20 border=0 align=\"right\">";
		}
		print "Location:</TD><TD>\n";

        print "$CITY, ";
		if ($IN::STATE ne "") {
			printf "%s, ", $dc->state_name($IN::STATE);
		}
		printf "%s\n", $dc->country_name($IN::COUNTRY);

    print <<EOF;
</TD></TR>

<TR>
<TD VALIGN="top">
<img src="/images/favorite/$chara[$charnum]_small.gif" width=50 height=50 border=0 align="right">Favorite:</TD>
<TD VALIGN="TOP">Awards:
EOF

		my (@mask) = (0x01, 0x02, 0x04, 0x08, 0x10);
		for (my $i = 0; $i < 5; $i++)
		{
			if ($WIN & $mask[$i])
			{
				print "<img src=\"/images/jewels/$Jewel[$i].gif\" width=50 height=50 border=0 hspace=5 align=\"top\">";
			} else {
				print "<img src=\"/images/jewels/jewel_blank.gif\" width=50 height=50 border=0 hspace=5 align=\"top\">";
			}
		}
	print <<EOF;
</TD>
</TR>

<TR>
<TD>Password:</TD>
<TD>$IN::PASSWORD</TD>
</TR>

<TR><TD colspan=2>Comments:<br>
$COMMENT</TD></TR>
</TABLE>
</CENTER>

<!-- END CONTENT HERE -->
&nbsp;<BR>
<a href="/chao_daycare.html"  onMouseOver="imgOn('img1')" onMouseOut="imgOff('img1')"><img src="file:/button_back.gif" width=81 height=24 border=0 alt="" name="img1"></a><P>				
</td><td align=left valign=top width="10">
<img src="file:/blank_dot.gif" width=10 height=1 border=0 alt="">
</td>
</tr>
</table>
</tr>
</tr>
</table>
</td>
</tr>
</table>
<br>&nbsp;
</center>
</body>
</html>
EOF

}

######################################################################
# Display contents of Chao Daycare
######################################################################

#--------------------------------------------------------
# Data Check
#--------------------------------------------------------
sub check_search {
	my ($errN, $errstr, $dbh, $sth, @chao);

	if($IN::max ne "") {
		$MAX = $IN::max;
		if($MAX<=0) {
			# Set default maximum size
			$MAX=10;
		}
	}
		
	$START=0;
	if($IN::start ne "") {
		$START = $IN::start;
		if($START<0) {
			$START=0;
		}
	}
		
	if($IN::mailid ne "") {
		$UserKey = $dc->get_key($IN::mailid);
		if ($UserKey eq "")
		{
			# Terminate the search
			$dc->output_form("html/chao_search_error.html");
			undef($UserKey);
			exit(0);
		}
		else
		{
			($dbh, $errstr) = DB::openOracleConnection();
			if( !$dbh )
			{
				$dc->error("[chao_daycare] Error connecting to database: $errstr", $errorURL);
			}

		    ($errN, $errstr, @chao) = DB::getRow_ChaoByUK( $dbh, $dc->DBaseTable('CHAO'), $UserKey );
			if ($errN)
			{
				$dc->error("[chao_daycare] Fetching user info: $errN .... $errstr", $errorURL);
			}

			DB::closeOracleConnection( $dbh );

			if (($chao[$dc->ChaoOff('KEY')] ne $UserKey))
			{
				# Terminate the search
				$dc->output_form("html/chao_search_error.html");
				undef($UserKey);
				exit(0);
			}
		}
	}
}

#--------------------------------------------------------
# Read Key Data
#--------------------------------------------------------
sub read_data {
	my $key = shift;
	my ($errN, $errstr, $dbh, $sth, @row);

	($dbh, $errstr) = DB::openOracleConnection();
	if( !$dbh )
	{
		$dc->error("[chao_daycare] Error connecting to database: $errstr", $errorURL);
	}
	# Delete Chao that are older than 24 hours
	($errN, $errstr)       = DB::deleteRow_ChaoByTime( $dbh, $dc->DBaseTable('CHAO'), (24*60*60) );
	if ($errN)
	{
		$dc->error("[chao_daycare] Unable to delete old Chao: $errN .... $errstr", $errorURL);
	}
	if($UserKey eq "") {
		($errN, $errstr, $sth) = DB::selectAllRows_Chao( $dbh, $dc->DBaseTable('CHAO') );
		if ($errN)
		{
			$dc->error("[chao_daycare] Unable to read Chao list: $errN .... $errstr", $errorURL);
		}

		$MaxRec = 0;
	    while( (@row) = DB::getNextRow_Chao($sth) )
		{
			++$MaxRec;
		}

		if($START < $MaxRec) {
			if(($MaxRec-$START)>($MAX)) {
				$END=$START+$MAX;
				$nextflag=0;
			} else {
				$END=$MaxRec;
				$nextflag=1;
			}
		}
		
	}
	
	return $dbh;
}

#--------------------------------------------------------
# HTML Output
#--------------------------------------------------------
sub output_records {
	my $dbh = shift;
	my ($errN, $errstr, $sth, @user, @chao);
	my $loop = 0;

	print "Content-type: text/html\n\n";

	print <<EOF;
<html>
<head>
<title>
Sonic Adventure Online - Hints
</title>
<meta name="x-uirequest" content="urlbaroff">
<script LANGUAGE = "JavaScript">
<!--
        if (document.images) {
            img1on = new Image(); 
            img1on.src = "file:/button_back_on.gif";   
            img1off = new Image(); 
            img1off.src = "file:/button_back.gif"; 
        }

function imgOn(imgName) {
        if (document.images) {
            document[imgName].src = eval(imgName + "on.src");
        }
}

function imgOff(imgName) {
        if (document.images) {
            document[imgName].src = eval(imgName + "off.src");
        }
}
// -->
</script>
<bgsound src="file:/sonicadv/chao.adx">
</head>
<body x-marginleft=0 x-margintop=0   background="file:/bg_scroller.gif" bgcolor="#000000" marginheight=0 marginwidth=0 topmargin=0 leftmargin=0>
<center>
<img src="file:/blank_dot.gif" width=1 height=30 border=0 alt=""><br>
<table cellspacing=0 cellpadding=5 border=0 width=590><tr><td align=center valign=top bgcolor="#000033"><table cellspacing=0 cellpadding=0 border=0 width=580><tr><td align=left valign=top bgcolor="#ffffff">

<!-- HEADER IMAGE -->
<!-- choose from below... -->
<!-- header_chao_showoff.gif -->
<!-- header_events.gif -->
<!-- header_world_rankings.gif -->

<img src="file:/header_chao_daycare.gif" width=580 height=150 border=0 alt=""><br>

<!-- END HEADER IMAGE -->

<table cellspacing=0 cellpadding=0 border=0 width=580><tr><td align=left valign=top width="10">
<img src="file:/blank_dot.gif" width=10 height=1 border=0 alt="">
</td>
<td align=left valign=top width=560>

<!-- BEGIN CONTENT HERE -->
EOF
	if ($UserKey eq "")
	{
		&output_link;
	}

	print "<br><img src=\"file:/blank_dot.gif\" height=\"10\" width=\"1\"><br>";
	
	($errN, $errstr, $sth) = DB::selectAllRows_Chao( $dbh, $dc->DBaseTable('CHAO') );
	if ($errN)
	{
		$dc->error("[chao_daycare] Unable to read Chao list: $errN .... $errstr", $errorURL);
	}
	
	if($UserKey ne "") {
		my $Rank = 0;
	    while( (@chao) = DB::getNextRow_Chao($sth) )
		{
			if (($chao[$dc->ChaoOff('KEY')] eq $UserKey) && (@chao ne ""))
			{
				($errN, $errstr, @user) = DB::getRow_UserByUK( $dbh, $dc->DBaseTable('USER'), $UserKey );
				if ($errN)
				{
					$dc->error("[chao_daycare] Fetching user info: $errN .... $errstr", $errorURL);
				}

				&build_table($Rank, \@user, \@chao);
			}
			++$Rank;
		}
	} else {
		for($loop=0;$loop<$END;$loop++) {
			(@chao) = DB::getNextRow_Chao($sth);
			if ($loop >= $START)
			{
				($errN, $errstr, @user) = DB::getRow_UserByUK( $dbh, $dc->DBaseTable('USER'), $chao[$dc->ChaoOff('KEY')] );
				if ($errN)
				{
					$dc->error("[chao_daycare] Fetching user info: $errN .... $errstr", $errorURL);
				}
				&build_table($loop, \@user, \@chao);
			}
		}
	}

	DB::closeOracleConnection( $dbh );

	if ($UserKey eq "")
	{
		&output_link;
	}

    print <<EOF;
<!-- END CONTENT HERE -->
<P>
<a href="/chao_down.html"  onMouseOver="imgOn('img1')" onMouseOut="imgOff('img1')"><img src="file:/button_back.gif" width=81 height=24 border=0 alt="" name="img1"></a><P>				
</td><td align=left valign=top width="10">
<img src="file:/blank_dot.gif" width=10 height=1 border=0 alt="">
</td>
</tr>
</table>
</tr>
</tr>
</table>
</td>
</tr>
</table>
<br>&nbsp;
</center>
</body>
</html>
EOF

}

sub build_table {
	my $rank = shift;
	my $user = shift;
	my $chao = shift;

	my ($swim, $fly, $run, $power, @BINDATA);

	@BINDATA = unpack("C" x (512), $chao->[$dc->ChaoOff('CHAO')]);

	# Swim Power
	$swim = int(($BINDATA[12]+($BINDATA[13]<<8))/10);

	# Flying Power
	$fly = int(($BINDATA[14]+($BINDATA[15]<<8))/10);

	# Running Power
	$run = int(($BINDATA[16]+($BINDATA[17]<<8))/10);

	# Power
	$power = int(($BINDATA[18]+($BINDATA[19]<<8))/10);

	print "<FORM METHOD=\"POST\" ACTION=\"/cgi-bin/soa/sonicadv/getchao.cgi\">\n";
	print "<INPUT TYPE=\"hidden\" NAME=\"UserKey\" VALUE=\"$chao->[$dc->ChaoOff('KEY')]\">\n";
	print "<TABLE border=0 cellpadding=5 cellspacing=0 width=560 bgcolor=\"#CCCCCC\">\n";
	print "<TR>\n";
	print "<TD bgcolor=\"#666666\" width=\"50\"><font ALIGN=\"right\" color=\"#FFFFFF\">";
	printf "%2d.", $rank + 1;
	print "</FONT></TD>\n";
	print "<TD colspan=3 bgcolor=\"#666666\"><font color=\"#FFFFFF\">";
	print "Chao Name: $chao->[$dc->ChaoOff('NAME')]</FONT></TD>\n</TR>\n";

	print "<TR>";
	if ($dc->Flags($user->[$dc->UserOff('COUNTRY')]) ne "")
	{
		print "<TD><img src=\"/images/flags/".$dc->Flags($user->[$dc->UserOff('COUNTRY')])."\" width=40 height=20 border=0></TD>\n";	
	} else {
		# Draw the generic flag
		print "<TD><img src=\"/images/flags/flag_other.gif\" width=40 height=20 border=0></TD>\n";
	}
	print "<TD colspan=\"2\">Owner: $user->[$dc->UserOff('NAME')]<BR>\n";
	print "Location: $user->[$dc->UserOff('CITY')], ";
	if ($user->[$dc->UserOff('STATE')] ne "") {
		printf "%s, ", $dc->state_name($user->[$dc->UserOff('STATE')]);
	}
	printf " %s</TD>\n", $dc->country_name($user->[$dc->UserOff('COUNTRY')]);
	if($user->[$dc->UserOff('MFLAG')] eq "Y") {
		print "<TD width=40><A HREF=\"mailto:$user->[$dc->UserOff('EMAIL')]\"><IMG src=\"file:/icon_mail.gif\" border=0></A></TD>\n";
	} else {
		print "<TD width=40><BR></TD>\n";
	}
	print "</td></TR>\n";
	
	print "<TR><TD></TD><TD colspan=\"3\">Owner's Awards:<br>";

	my $count = 0;
	my $loop;

	if ($user->[$dc->UserOff('EMBLEMS')] == 130)
	{
		# User gets emblem award if has all 130
		print "<img src=\"/images/wrank/emblem_small.gif\" width=25 height=25 border=0 hspace=2 align=\"top\">";
		++$count;
	}

	for ($loop = 0; $loop < $user->[$dc->UserOff('GOLD')]; ++$loop)
	{
		print "<img src=\"/images/wrank/gold_small.gif\" width=25 height=25 border=0 hspace=2 align=\"top\">";
		++$count;
		if ($count >= 16)
		{
			print "<BR><img src=\"file:/blank_dot.gif\" height=2 width=1 border=0><br>\n";
			$count = 0;
		}
	}

	for ($loop = 0; $loop < $user->[$dc->UserOff('SILVER')]; ++$loop)
	{
		print "<img src=\"/images/wrank/silver_small.gif\" width=25 height=25 border=0 hspace=2 align=\"top\">";
		++$count;
		if ($count >= 16)
		{
			print "<BR><img src=\"file:/blank_small.gif\" height=2 width=1 border=0><br>\n";
			$count = 0;
		}
	}

	for ($loop = 0; $loop < $user->[$dc->UserOff('BRONZE')]; ++$loop)
	{
		print "<img src=\"/images/wrank/bronze_small.gif\" width=25 height=25 border=0 hspace=2 align=\"top\">";
		++$count;
		if ($count >= 16)
		{
			print "<BR><img src=\"file:/blank_dot.gif\" height=2 width=1 border=0><br>\n";
			$count = 0;
		}
	}

	for ($loop = 0; $loop < $user->[$dc->UserOff('BLUERIB')]; ++$loop)
	{
		print "<img src=\"/images/wrank/ribbon_small.gif\" width=25 height=25 border=0 hspace=2 align=\"top\">";
		++$count;
		if ($count >= 16)
		{
			print "<BR><img src=\"file:/blank_dot.gif\" height=2 width=1 border=0><br>\n";
			$count = 0;
		}
	}

	print "</TD></TR>\n<TR>";
	print "<TD bgcolor=\"#DDDDDD\"></TD>";
	print "<TD colspan=3 bgcolor=\"#DDDDDD\">Swim: $swim, Fly: $fly, Run: $run, Power: $power</TD>\n";
	print "</TR>\n<TR>";
	print "<TD bgcolor=\"#DDDDDD\"></TD>";
	print "<TD colspan=3 bgcolor=\"#DDDDDD\">Comments:<br>$chao->[$dc->ChaoOff('COMMENT')]<BR></TD></TR>\n";
			
	if($chao->[$dc->ChaoOff('PW')] ne "") {
		print <<EOF;
<TR><TD></TD><TD>
<FONT size=2>Password: <INPUT TYPE="password" NAME="password" SIZE=16 MAXLENGTH=16></FONT>
</TD>
EOF
	} else {
		print <<EOF;
<TR><TD colspan=2></TD>
EOF
	}
		print <<EOF;
<TD colspan=2 align="center" align="right">
<INPUT TYPE="submit" VALUE="Download">
</TD>
</TR>
</FORM>
</TABLE>
<BR>
EOF
}

sub output_link {
	# Link Menu Output
	my $str = "";
	my $prank = 0;
	my $nrank = 0;
		
	if($START > 0) {
		$prank=$START-$MAX;
		if($prank<0) { $prank=0; }
		$str= 'command=view&max=' . $MAX . '&start=' . $prank;
		print "[<A HREF=\"$cgiPath?$str\">Previous room</A>]\n";
	}
	if($nextflag==0) {
		$nrank=$START+$MAX;
		$str= 'command=view&max=' . $MAX . '&start=' . $nrank;
		print "[<A HREF=\"$cgiPath?$str\">Next room</A>]\n";
	}
}

#------------------------ EOF --------------------------
