#!/usr/bin/perl -w
# user.cgi: show user profile
# usage: user.cgi
# note: call as ../user.php for better page loading
# 20061125 erikt@xs4all.nl

BEGIN { open(STDERR, ">>/WWW/t/tjongkim/tmp/errorlog"); }

use shout;
use elib;

# resource specifications 
$baseDir = "/WWW/t/tjongkim/private/molbeurs";
$longDate = `date`;
chomp($longDate);

$lastActionDate = "";
$bigAmount = 90;
$maxTrans = 25; # maximum number of transactions to show
# $hfactor = 2;
$moleError = 0;

# read arguments
$line = <STDIN>;
if (not defined $line) {
   if (defined $ENV{"QUERY_STRING"}) { $line = $ENV{"QUERY_STRING"}; }
   else { $line = ""; } 
}
chomp($line);
@args = split(/\&+/,$line);
%args = ();
for ($i=0;$i<=$#args;$i++) {
   ($field,$value) = split(/=+/,$args[$i]);
   if (not defined $value) { $value = 0; }
   $args{$field} = $value;
   $args{$field} =~ s/\++$//; # remove trailing spaces
   $args{$field} =~ s/^\++$//; # remove initial spaces
}

# standard line for output
print "Content-type: text/html\n\n";

# host check
$host = $ENV{"REMOTE_ADDR"};
if (open(INFILE,"$baseDir/blocked.host")) {
   while (<INFILE>) {
      $line = $_;
      chomp($line);
      $line =~ s/\s+//;
      if (defined $host and $host eq $line) {
         print <<THEEND;
<p>
Je computer heeft geen toegang tot de interne pagina's van de Molbeurs.
<p>
Als je vindt dat dit onterecht is, vraag dan 
aan erikt(at)xs4all.nl om te worden toegelaten.
THEEND
         exit(0);
      }
   }
   close(INFILE);
}

if (not defined $args{"NICKNAME"} or $args{"NICKNAME"} eq "") {
   print "<p>\nFout: Naam niet gedefinieerd.\n";
   exit(0);
}

# host check
$nickname = $args{"NICKNAME"};
if (open(INFILE,"$baseDir/blocked.user")) {
   while (<INFILE>) {
      $line = $_;
      chomp($line);
      $line =~ s/\s+//;
      if (lc($nickname) eq lc($line)) {
         print <<THEEND;
<p>
Dit account ($nickname) is geblokkeerd.
<p>
Als je vindt dat dit onterecht is, vraag dan
aan erikt(at)xs4all.nl om te worden toegelaten.
THEEND
         exit(0);
      }
   }
   close(INFILE);
}

# ip logging
&ipLogger();

# check for candidates that dropped out
%left = ();
%leftOrder = ();
$left = 0;
if (open(INFILE,"$baseDir/LEFT")) {
   while (<INFILE>) {
      $line = $_;
      chomp($line);
      $line =~ s/^\s+//;
      $line =~ s/\s+.*//;
      $line = lc($line);
      $left{"$line+mol"} = 1;
      $left{"$line+kandidaat"} = 1;
      $leftOrder{"$line+mol"} = $left;
      $leftOrder{"$line+kandidaat"} = $left;
      $left++;
   }
   close(INFILE);
}

# obtain rankings
%rankings = ();
&readRankings;

$nickname = $args{"NICKNAME"};
$file = "$baseDir/users/".lc($nickname);
if (not open(INFILE,$file)) {
   print "<p>\nFout: onbekende nickname: $nickname\n";
   exit(0);
}

# check if graph exists
$graph = "";
$image = "images/rankings/".lc($nickname);
if (defined $args{"SCORE"} and $args{"SCORE"} eq "1") { $image .= "2"; }
$image .= ".jpg";
if (open(IMGFILE,"$baseDir/www/$image")) {
   $graph = "<p>\n<img src=\"/molbeurs/$image\" width=\"352\" height=\"144\" alt=\"$nickname\"><br><small>Plaatje: <a href=\"/molbeurs/user.php?NICKNAME=$nickname\">plaats</a> | <a href=\"/molbeurs/user.php?NICKNAME=$nickname\&SCORE=1\">score</a></small>\n";
   close(IMGFILE);
}

# get score of previous day
$prevScore = &getPreviousScore($nickname);

# intro
$nickname =~ s/\+/ /g;
print <<THEEND;
<html>
<head>
<title>Molbeurs: $nickname</title>
<link rel="alternate" type="application/rss+xml" title="RSS Molbeurs" href="http://ifarm.nl/molbeurs/rss.xml">
<meta name="robots" content="noindex, nofollow">
</head>
<body bgcolor="#cccccc">
<div align="center">
<table><tr><td valign="top" align="right" width="180">
THEEND

# show current users
&ipShow();

print <<THEEND;
<td valign="top">
<table width="778" bgcolor="white" cellpadding="5" cellspacing="5">
<tr><td width="55%">
THEEND

&menu();

print <<THEEND;
<table cellspacing="0">
<tr>
<td valign="top">
<table cellspacing="10" align="left">
<tr>
<td>
THEEND

$hostR = "";
$dateR = "";
$nickname = "";
@trades = ();
%stocks = ();
%history = ();
$money = 0;
$sold = 0;
$bought = 0;
while (<INFILE>) {
   $line = $_;
   chomp($line);
   if ($line =~ /^HOST\s+(\S+)/) { $hostR = $1; }
   elsif ($line =~ /^DATE\s+(\S+)/) { $dateR = $1; }
   elsif ($line =~ /^NICKNAME\s+(\S+)/) { $nickname = $1; }
   elsif ($line =~ /^TRADE\s+(.*)$/) { 
      push(@trades,$1); 
      @f = split(/\s+/,$line);
      if ($f[1] eq "sell" and $f[4] =~ /^\d+$/) { $sold += $f[4]; }
      elsif ($f[1] eq "buy" and $f[3] ne "salaris" and $f[4] =~ /^\d+$/) { 
         $bought += $f[4]; 
      }
   }
   elsif ($line =~ /^SALARY\s+(.*)$/) { push(@trades,$1); }
   elsif ($line =~ /^dukaten\s+(\S+)/) { $money = $1; }
   elsif ($line =~ /^([a-z\-]+\+mol)\s+(\S+)/) { $stocks{$1} = $2; }
   elsif ($line =~ /^([a-z\-]+\+kandidaat)\s+(\S+)/) { $stocks{$1} = $2; }
   elsif ($line =~ /^BONUS ([a-z\-]+\+(mol|kandidaat))\s+(\d+)/) { 
      $history{$1} = defined $history{$1} ? $history{$1}+$3 : $3; 
   } elsif ($line !~ /^(BONUS|HISTORY|MAIL|PASSWORD|TSHIRT)\s/) { 
      print "<!-- cannot parse user line: $line -->\n"; 
   }
}
close(INFILE);
$dateR =~ s/\./-/;
$dateR =~ s/\./-/;
$dateR =~ s/\./ /;

# read number of stocks for bank
if (lc($nickname) eq "de+bank") {
   $users = 0;
   if (opendir(DIR,"$baseDir/users")) { 
      @dir = readdir(DIR);  
      closedir(DIR);
      $users = -2+$#dir;
   }
   $sold = $users*20; # not ok for users that joined later
   $bought = 0;
   %stocks = ();
   if (open(LOGFILE,"$baseDir/logs/logfile")) {
      while (<LOGFILE>) {
         $line = $_;
         chomp($line);
         if ($line =~ /^(skip|kick)/) { next; }
         @fields = split(/\s+/,$line);
         # 2009.01.01.00:00:04 anniek+mol sell 1 29.97 29.97 29.97 Erik+TKS
         if (defined $fields[2] and $fields[2] =~ /^(buy|sell)$/) {
            $stock = $fields[1];
            $amount = $fields[3];
            if ($fields[2] eq "sell") { 
               $bought += $amount; 
               $amount = -$amount; 
            } else { $sold += $amount; }
            $stocks{$stock} = defined $stocks{$stock} ?
                              $stocks{$stock}+$amount : $amount+$users;
         }
      }
      close(LOGFILE);
   }
}
&readPrices();

print <<THEEND;
<p>
<div style="background-color:$colorM;">
<table cellspacing="5">
<tr>
<th colspan="3" align="left" style="color:white;">Molaandelen
THEEND

$owns = 0;
$moleOwns = 0;
$stocksM = 0;
foreach $name (sort {&sortMarket($prices{$a},$prices{$b},$a,$b)} keys %prices) {
   if (not defined $stocks{$name}) { $stocks{$name} = 0; }
   if ($stocks{$name} >= 0 and $name =~ /mol$/) {
      $fancyName = &fancyStock($name,1);
      $owns += $stocks{$name};
      $moleOwns += $stocks{$name};
      $stocksM += $stocks{$name}*$prices{$name};
      print "<tr><td style=\"color:white;\" align=\"right\"><small>&nbsp;&nbsp;$stocks{$name}x</small><td style=\"color:white;\" align=\"left\"><small>$fancyName</small><td style=\"color:white;\" align=\"right\"><small>$prices{$name}</small>\n";
   }
}
print <<THEEND;
</table>
</div>
THEEND
#"</table></div>\n";

print "<td>\n";

print <<THEEND;
<div style="background-color:$colorC;">
<table cellspacing="5">
<tr>
<th colspan="3" align="left" style="color:white;">Kandidaataandelen
THEEND

$stocksC = 0;
foreach $name (sort {&sortMarketReverse($prices{$a},$prices{$b},$a,$b)} keys %prices) {
   if (not defined $stocks{$name}) { $stocks{$name} = 0; }
   if ($stocks{$name} >= 0 and $name =~ /kandidaat$/) {
      $fancyName = &fancyStock($name,1);
      #$fancyName =~ s/didaat(\*)?</$1</;
      $owns += $stocks{$name};
      $stocksC += $stocks{$name}*$prices{$name};
      print "<tr><td style=\"color:white;\" align=\"right\"><small>&nbsp;&nbsp;$stocks{$name}x</small><td style=\"color:white;\" align=\"left\"><small>$fancyName</small><td style=\"color:white;\" align=\"right\"><small>$prices{$name}</small>\n";
   }
}

$stocksH = 0;
foreach $stock (keys %history) {
   if (defined $prices{$stock}) {
      $stocksH += $history{$stock}*$prices{$stock};
   }
}
# if ($hfactor > 0 and $historyEpisodes > 0) {
if ($bonusFactor > 0) {
   $stocksH = sprintf "%0.2f",$stocksH/$bonusFactor;
} else { $stocksH = 0; }

$total = $money+$stocksC+$stocksM+$stocksH;
$total = sprintf "%0.2f",$total;
$stocksM = sprintf "%0.2f",$stocksM;
$stocksC = sprintf "%0.2f",$stocksC;
$money = sprintf "%0.2f",$money;
print "</table>\n</div>\n";
if (lc($nickname) ne "de+bank") {
   print <<THEEND;
<tr><td colspan="2"><small>
Score: $total ( <strong><font color="$colorM">$stocksM</font></strong> + <strong><font color="$colorC">$stocksC</font></strong> + <strong>$money dukaten</strong> + $stocksH)
</small>
THEEND
}

if ($nickname !~ /^(De.Bank|Het.Goede.Doel)$/i) { &checkTrades(); }

if ($#trades >= 0) { print "<tr><td colspan=\"2\"><small>Laatste transacties:\n"; }
for ($i=$#trades;
     (($i>=$#trades-$maxTrans or 
       (defined $args{"MAX"} and $args{"MAX"} eq "1")) and $i >= 0);$i--) {
   @fields = split(/\s+/,$trades[$i]);
   if ($fields[2] eq "salaris") { $fields[0] = ""; }
   elsif ($fields[0] eq "buy") { $fields[0] = "gekocht"; }
   else { $fields[0] = "verkocht"; }
   $fields[5] =~ s/^.....(..).(..).(.*)...$/$2-$1 $3/;
   $fields[2] = &fancyStock($fields[2]);
   $fields[1] = "<a href=\"/molbeurs/user.php?NICKNAME=$fields[1]\">".&fancyUser($fields[1])."</a>";
   $fields[4] = sprintf "%0.2f",$fields[4];
   if ($fields[3] >= $bigAmount) { $fields[3] = "<strong>$fields[3]x</strong>"; }
   else { $fields[3] .= "x"; }
   print "<br>$fields[5] $fields[0] $fields[3] $fields[2] &agrave; $fields[4]\n";
}
if ($#trades > $maxTrans and 
    (not defined $args{"MAX"} or $args{"MAX"} ne "1")) { 
   print "<br>(<a href=\"/molbeurs/user.php?NICKNAME=$nickname\&MAX=1\">alles</a>)\n"; 
}
if ($#trades >= 0) { print "</small>"; }
if (lc($nickname) ne "de+bank") { &printHistory(); }
print "</table>\n";
print "<td valign=\"top\" width=\"45%\">\n";

$nickname =~ s/\+/ /g;

$tshirt = "";
$maxPrize = 5;
#if (defined $rankings{"Erik TKS"} and $rankings{"Erik TKS"} <= $maxPrize) {
#   $maxPrize++;
#}
# 20090312
#   ($rankings{$nickname} <= 6 and $rankings{$nickname} != 1)) {
if (defined $rankings{$nickname} and 
    $rankings{$nickname} <= $maxPrize and
    $nickname ne "Erik TKS not yet") {
   $tshirt = "<img src=\"/molbeurs/images/tsmall.jpg\" width=\"14\" height=\"14\" alt=\"tshirt\">";
}
if (defined $rankings{$nickname}) { $rankings{$nickname} .= "e"; }
else { $rankings{$nickname} = "geen"; }

if ($prevScore < 0) { $prevScoreLine = ""; }
else {
   if ($total >= $prevScore) {
      $prevScoreLine = sprintf
                       "<br>Winst vandaag: <font color=\"green\">+%0.2f</font> dukaten",
                       $total-$prevScore;
   } else {
      $prevScoreLine = sprintf
                       "<br>Verlies vandaag: <font color=\"red\">%0.2f</font> dukaten",
                       $total-$prevScore;
   }
}
$bezit = "bezit";
if (lc($nickname) eq "de bank") { $bezit = "omloop"; }
if ($moleOwns < $MINMOLE) { 
   $moleOwns = sprintf "<font color=\"red\">%d</font> (%d te weinig!)",
               $moleOwns,$MINMOLE-$moleOwns; 
}
print <<THEEND;
$graph
<p>
<h1>$nickname</h1>
<p>
Plaats: $rankings{$nickname} $tshirt
<br>Registratie: $dateR
<br>Aandelen gekocht: $bought
<br>Aandelen verkocht: $sold
<br>Aandelen in $bezit: $owns
<br>Molaandelen in $bezit: $moleOwns
$prevScoreLine
THEEND
# if ($lastActionDate ne "") {
#    print "<br>Laatste activiteit: $lastActionDate\n";
# }
# <br>IP: $hostR

# offer trade actions
if ($nickname !~ /^(De Bank|Het Goede Doel)$/) { 
   &buyAndSell(); 
   &getShoutText(); 
}

print <<THEEND;
<p>
<hr>
<address>
Generated at $longDate. erikt(at)xs4all.nl
</address>
</table>
</table>
<td valign="top">
THEEND

if (lc($nickname) ne "de bank") { &showShoutText(11); }
else { &showShoutText(3); }

print <<THEEND;
</table>
</div>
</body>
</html>
THEEND

exit(0);

sub buyAndSell {
   print <<THEEND;
<p>
<div style="background-color:$colorC; color:white;">
<h2>Kandidaataandelen verhandelen</h2>
<p>
<form method="post" action="/molbeurs/cgi-bin/trade.cgi">
<input type="hidden" name="NICKNAME" value="$nickname">
<table>
<tr>
<td style="color:white;" align="right"> Naam
<td style="color:white;" align="left"> $nickname
<tr>
<td style="color:white;" align="right"> Aandeel
<td align="left">
<select name="STOCK">
<option value="none">&nbsp;</option>
THEEND
   foreach $name (@people) {
#     if (not defined $left{lc($name)."+mol"}) {
         $fancyName = &fancyName($name) . " Kandidaat";
         print "<option value=\"$name kandidaat\">$fancyName</option>\n";
#     }
   }
print <<THEEND;
</select>
<tr>
<td style="color:white;" align="right"> Actie
<td align="left">
<select name="ACTION">
<option value="none">&nbsp;</option>
<option value="buy">Kopen</option>
<option value="sell">Verkopen</option>
</select>
<tr>
<td style="color:white;" align="right"> Aantal
<td align="left"><input type="text" size="20" name="NUMBER">
<tr>
<td style="color:white;" align="right"> Wachtwoord
<td align="left"><input type="password" size="20" name="PASSWORD">
<tr>
<td align="right"> &nbsp;
<td align="left"><input type="submit" value=" Verstuur ">
</table>
</form>
</div>
<p>
<div style="background-color:$colorM; color:white;">
<h2>Molaandelen verhandelen</h2>
<p>
<form method="post" action="/molbeurs/cgi-bin/trade.cgi">
<input type="hidden" name="NICKNAME" value="$nickname">
<table>
<tr>
<td style="color:white;" align="right"> Naam
<td style="color:white;" align="left"> $nickname
<tr>
<td style="color:white;" align="right"> Aandeel
<td align="left">
<select name="STOCK">
<option value="none">&nbsp;</option>
THEEND
   foreach $name (@people) {
      if (not defined $left{lc($name)."+mol"}) {
         $fancyName = &fancyName($name) . " Mol";
         print "<option value=\"$name mol\">$fancyName</option>\n";
      }
   }
print <<THEEND;
</select>
<tr>
<td style="color:white;" align="right"> Actie
<td align="left">
<select name="ACTION">
<option value="none">&nbsp;</option>
<option value="buy">Kopen</option>
<option value="sell">Verkopen</option>
</select>
<tr>
<td style="color:white;" align="right"> Aantal
<td align="left"><input type="text" size="20" name="NUMBER">
<tr>
<td style="color:white;" align="right"> Wachtwoord
<td align="left"><input type="password" size="20" name="PASSWORD">
<tr>
<td align="right"> &nbsp;
<td align="left"><input type="submit" value=" Verstuur ">
</table>
</form>
</div>
THEEND
}

sub fancyName {
   my ($line) = shift(@_);
   my ($upper);

   if ($line =~ /^([a-z])/) {
      $upper = $1;
      $upper =~ tr/a-z/A-Z/;
      $line =~ s/^./$upper/;
   }
   return($line);
}

sub menu {
   print <<THEEND;
<img src="/molbeurs/images/molbeurs.jpg" width="760" height="80" alt="molbeurs">
<form action="/molbeurs/cgi-bin/user.cgi">
<div align="center">
<a href="/molbeurs/">Home</a> |
<a href="/molbeurs/faq.html">Uitleg</a> |
<a href="/molbeurs/graphs.html">Grafieken</a> |
<a href="/molbeurs/register.html">Registreren</a> |
Naam: <input type="text" size="16" name="NICKNAME"> 
<input type="submit" value=" Zoek ">
| <a href="http://www.wieisdemol.com/molbeurs/">Forum</a>
| <a href="/demol/category/molbeurs/">Blog</a>
| <a href="/molbeurs/submit.html">Idee&euml;nbus</a>
| <a href="/molbeurs/contact.html">Contact</a>
</div>
</form>
THEEND
}

sub checkTrades {
   my (@files,$dir,$file,$line,$n,$s,$a,$p,$action,@trades,$i,$best,$buffer,
       $duplicates,%seen,$duplicateFlag);
   my $count = 0;
   my $nicknameSpace;

   $nicknameSpace = $nickname;
   $nicknameSpace =~ s/\+/ /g;
   @trades = &readTrades();
   $buffer = "";
   %seen = ();
   $duplicates = 0;
   for ($i=0;$i<=$#trades;$i++) {
      ($file,$d,$action,$n,$s,$a,$p,$best) = split(/\s+/,$trades[$i]);
#     $p = $prices{$s};
#print "$file#$d#$action#$n#$s#$a#$p#$best#$nickname\n";
      $duplicateFlag = "";
      if ($n eq $nickname) {
         if (defined $seen{"$action $s"}) {
            $duplicates++;
            $duplicateFlag = " <font style=\"color:red;\">*</font>";
         }
         $seen{"$action $s"} = 1;
      }
      $s = &fancyStock($s);
      $koopstop = "";
      # check for koopstop
      if (open(INFILE,"grep \"^skipping $d\" $baseDir/logs/logfile|")) {
         $line = <INFILE>;
         if (defined $line and $line =~ /molecount/) { 
            $koopstop = " &nbsp;<strong><font color=\"red\"><small>Te weinig M</small></font></strong>"; 
            $moleError = 1;
         } elsif (defined $line and $line ne "") { 
            $koopstop = " &nbsp;<strong><font color=\"red\"><small>Koopstop</small></font></strong>"; 
         }
         close(INFILE);
      }
      $d = &summarizeDate($d);
      $action = ($action eq "buy") ? "kopen" : "verkopen";
#     $best = ($best eq "-") ? "" : " <font style=\"color:green;\">*</font>";
      $best = "";
      if ($n eq $nickname) {
         $count++;
         $lastActionDate = $d;
         $buffer .= "<br><input type=\"checkbox\" name=\"x$count\" value=\"$file\">\n";
         $buffer .= "$d $action ${a}x $s &agrave; $p$best$duplicateFlag$koopstop\n";
      }
   }
   print <<THEEND;
<tr><td colspan="2"><small>
<form method="post" action="/molbeurs/cgi-bin/deleteTrade.cgi">
Voorstellen ($count, <a href="http://ifarm.nl/molbeurs/cgi-bin/standings.cgi?TRADED">andere</a>):
$buffer
<br>
<input type="hidden" value="$nicknameSpace" name="NICKNAME">
<input type="hidden" value="$count" name="MAX">
<input type="submit" value=" verwijder ">
wachtwoord: <input type="password" size="10" name="PASSWORD">
THEEND
#  if ($moleError > 0) {
#     print "<p><font color=\"red\">Je hebt te weinig Molaandelen. Zolang je minder dan $MINMOLE Molaandelen hebt, kan je geen nieuwe Kandidaataandelen kopen. Koop dus eerst voldoende Molaandelen bij.</font>\n"; 
#  }
   if ($duplicates > 0) {
      print "<br><font style=\"color:red;\">Aantal duplicaatvoorstellen: $duplicates</font>\n";
   }
   print "</form>\n</small>\n";
}

sub readTrades {
   my (@files,$dir,$file,$line,$n,$s,$a,$p,$action,@out,$i);
   my (%bestBuyProp,%bestBuyPrice,%bestSellProp,%bestSellPrice);
   my $count = 0;
   my $nicknameSpace;

   @out = ();
   %bestBuyProp = ();
   %bestBuyPrice = ();
   %bestSellProp = ();
   %bestSellPrice = ();
   $nicknameSpace = $nickname;
   $nicknameSpace =~ s/\+/ /g;
   if (not open(INFILE,"grep . /dev/null $baseDir/trades/* 2>/dev/null |")) {
      print "Fout: kan transactiebestanden niet lezen\n";
   } else {
      while (<INFILE>) {
         $line = $_;
         chomp($line);
         $line =~ s/^([^:]*:[^:]*:[^:]*)://;
         $file = $1;
         $file =~ s/.*\///;
         ($d,$action,$n,$s,$a,$p) = split(/\s+/,$line);
         push(@out,"$file $d $action $n $s $a $p -");
         if ($action =~ /buy/i and
             (not defined $bestBuyPrice{$s} or $p > $bestBuyPrice{$s})) {
            $bestBuyPrice{$s} = $p;
            $bestBuyProp{$s} = $#out;
         }
         if ($action =~ /sell/i and
             (not defined $bestSellPrice{$s} or $p < $bestSellPrice{$s})) {
            $bestSellPrice{$s} = $p;
            $bestSellProp{$s} = $#out;
         }
      }
      close(INFILE);
   }
   foreach $i (keys %bestBuyProp) { $out[$bestBuyProp{$i}] =~ s/.$/\+/; }
   foreach $i (keys %bestSellProp) { $out[$bestSellProp{$i}] =~ s/.$/\+/; }
   return(@out);
}

sub fancyStock {
   my ($s,$noHTML) = @_;
   my ($color,@s,$stock,$left);

   if (not defined $noHTML) { $noHTML = 0; }
   $stock = $s;
   if ($stock eq "salaris") { return($stock); }
   $stock =~ /^(.)(.*)\+(.)(.*)$/;
   @s = ($1,$2,$3,$4);
   $s[0] =~ tr/a-z/A-Z/;
   $s[2] =~ tr/a-z/A-Z/;
   if ($s[1] =~ /-([a-z])/) {
      $upper = $1;
      $upper =~ tr/a-z/A-Z/;
      $s[1] =~ s/-./-$upper/;
   }
   if ($stock =~ /mol$/) { $color = $colorM; }
   else { $color = $colorC; }
   $stock = "$s[0]$s[1]&nbsp;$s[2]$s[3]";
   if (defined $left{$s}) { $left = "*"; } else { $left = ""; }
   if (not $noHTML) { $stock = "<a href=\"/molbeurs/stock.php?STOCK=$s\" style=\"color:$color;\">$stock$left</a>"; }
   else { $stock = "<a href=\"/molbeurs/stock.php?STOCK=$s\" style=\"color:white;\">$stock$left</a>"; }
   return($stock);
}

sub fancyUser {
   my ($user,$html) = @_;
   my ($fancyUser);

   $fancyUser = $user;
   $fancyUser =~ s/\+/ /g;
   if (defined $html and $html >= 0) {
      $fancyUser = "<a href=\"/molbeurs/user.php?NICKNAME=$user\">$fancyUser</a>";
   }
   return($fancyUser);
}

sub readPrices {
   %prices = ();
   $file = "$baseDir/prices";
   if (not open(INFILE,$file)) { print "Fout: prijzenbestand onleesbaar\n"; }
   else {
      $noPrices = 1;
      %prices = ();
      while (<INFILE>) {
         $line = $_;
         chomp($line);
         $line =~ /^(\S+)\s(\S+)\s/;
         $prices{$1} = $2;
         $noPrices = 0;
      }
      close(INFILE);
      if ($noPrices) {
         if (not open(INFILE,$file)) { print "Fout: prijzenbestand onleesbaar\n"; }
         else {
            sleep(1);
            while (<INFILE>) {
               $line = $_;
               chomp($line);
               $line =~ /^(\S+)\s(\S+)\s/;
               $prices{$1} = $2;
            }
            close(INFILE);
         }
      }
   }  
}

sub summarizeDate {
   my ($date) = shift(@_);

   if ($date =~ /^.....(..).(..).(..):(..):..$/) {
      $date = "$2-$1 $3:$4";
   }
   return($date);
}

sub readRankings {
   %rankings = ();
   if (open(INFILE,"$baseDir/www/rankings.html")) {
      while (<INFILE>) {
         $line = $_;
         chomp($line);
         # line format: <!-- 1 10117.92 0 5453.88 4664.04 Neon -->
         if ($line =~ /^<!--\s+(\d+)\s+([\d\.]+)\s+([\d\.]+)\s+([\d\.]+)\s+([\d\.]+)\s+(.*)\s+-->/) {
            $place = $1;
            $nickname = $6;
            $nickname =~ s/\s+\d+\.\d+\s*$//;
            # $nickname =~ s/\s/\+/;
            # $nickname =~ tr/A-Z/a-z/;
            $rankings{$nickname} = $place;
         }
      }
close(INFILE);
   }
}

sub getPreviousScore {
   my $nickname = shift(@_);
   $nickname =~ s/\+/ /g;

   my $prevScore = 10000+10*(10-$left)*$molePrice;
   if (open(RANKFILE,"$baseDir/logs/rankings/today")) {
      while (<RANKFILE>) {
         my $line = $_;
         chomp($line);
         if ($line !~ /^<!--/) { next; }
         my @fields = split(/\s+/,$line);
         # <!-- 1 12347.11 0 12312.02 35.09 Siebrand bonus -->
         shift(@fields); shift(@fields);
         my $score = shift(@fields);
         shift(@fields); shift(@fields); shift(@fields);
         pop(@fields);
         $name = join(" ",@fields);
         $name =~ s/\s+\d+\.\d+\s*$//;
         if (lc($name) eq lc($nickname)) { $prevScore = $score; last; }
      }
      close(RANKFILE);
   }
   return($prevScore);
}

sub printHistory {
   print <<THEEND;
<tr><td>
<div style="background-color:white;">
<table cellspacing="5">
<tr>
<th colspan="3" align="left" style="color:black;">Bonusaandelen Mol
THEEND

   my $owns = 0;
   my $stocksM = 0;
   foreach my $name (sort {&sortMarket($prices{$a},$prices{$b},$a,$b)} keys %prices) {
      if (not defined $history{$name}) { $history{$name} = 0; }
      if ($history{$name} >= 0 and $name =~ /mol$/) {
         my $fancyName = &fancyStock($name,0);
         $owns += $stocks{$name};
         $stocksM += $history{$name}*$prices{$name};
         print "<tr><td style=\"color:black;\" align=\"right\"><small>$history{$name}x</small><td style=\"color:black;\" align=\"left\"><small>$fancyName</small><td style=\"color:black;\" align=\"right\"><small>$prices{$name}</small>\n";
      }
   }
   print <<THEEND;
</table>
</div>
<td>
<div style="background-color:white;">
<table cellspacing="5">
<tr>
<th colspan="3" align="left" style="color:black;">Bonusaandelen Kandidaat
THEEND
   my $stocksC = 0;
   foreach my $name (sort {&sortMarketReverse($prices{$a},$prices{$b},$a,$b)} keys %prices) {
      if (not defined $history{$name}) { $history{$name} = 0; }
      if ($history{$name} >= 0 and $name =~ /kandidaat$/) {
         my $fancyName = &fancyStock($name,0);
         $owns += $history{$name};
         $stocksC += $history{$name}*$prices{$name};
         print "<tr><td style=\"color:black;\" align=\"right\"><small>$history{$name}x</small><td style=\"color:black;\" align=\"left\"><small>$fancyName</small><td style=\"color:black;\" align=\"right\"><small>$prices{$name}</small>\n";
      }
   }
   print "</table>\n</div>\n";
   my $total = $stocksC+$stocksM;
   # if ($hfactor > 0 and $historyEpisodes > 0) {
   if ($bonusFactor > 0) {
      $total = sprintf "%0.2f",$total/$bonusFactor;
   } else { $total = "0.00"; }
   $stocksM = sprintf "%0.2f",$stocksM;
   $stocksC = sprintf "%0.2f",$stocksC;
   print <<THEEND;
<tr><td colspan="2"><small>
Bonusscore: $total ( ( $stocksM + $stocksC ) / $bonusFactor )
</small>
THEEND
}
