#Perl to make HTML bar graph out of milage table

open(INFILE, "< DadGas.txt") or die "Can not open DadGas.txt $!";
# This program gets the date from the 1st column, 
# gets the mileage from the 5th column,
# and ignores everything else.

$do_html = 1;

$graph_width = 730;
$target_bar_width = 4;

$reasonable_min = 30;
$reasonable_max = 60;
$pix_for_rmin = 20;
$pix_for_rmax = 200;

$span_o_reason = $reasonable_max - $reasonable_min;
$pix_r_span = $pix_for_rmax - $pix_for_rmin;
$pix_per_mpg = $pix_r_span/$span_o_reason;

$max_samples_per_row = 0;
$life_miles = 0;
$life_gas = 0;
$num_years = 0;
$min_mileage = 999;
$max_mileage = 0;
$total_num_samples = 0;
$last_year = '';
while ($inline = <INFILE>) {
  $date = $total_miles = $gas = $miles = $mileage = '';
  ($date,$total_miles,$gas,$miles,$mileage) = 
    ($inline =~ m/(\S+)\s(\S+)\s(\S+)\s(\S+)\s(\S+)/);
  $mileage = $mileage + 0;
  unless ($inline =~ m/test/i) {
    $life_miles = $life_miles + $miles;
    $life_gas = $life_gas + $gas;
  }
  ($year,$month,$day) = ($date =~ m|(\w\w\w\w)-(\d\d)-(\d\d)|);
  if ($year ne $last_year and $last_year) {
    $annuals{$total_num_samples} = $last_year;
  }
  $last_year = $year;
  $last_month = $month;
  unless ($inline =~ m/test/i) {
    if ($reasonable_min<$mileage and $mileage<$reasonable_max) {
      $min_mileage = $mileage if $mileage<$min_mileage;
      $max_mileage = $mileage if $mileage>$max_mileage;
      $total_num_samples++;
      push @mileages,$mileage;
#print "pushed $mileages[$total_num_samples-1] at ",$total_num_samples-1,"\n";
    }
  }
}
$annuals{$total_num_samples} = $last_year;

#print "total_num_samples = $total_num_samples\n";

if ($do_html) {
print '<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">',"\n";
print '<html><head><title>Mileage Graph</title></head>',"\n";
print '<body bgcolor="E0E0E0">',"\n";
print '<table border="5" bordercolor="c0c0c0" rules="none"';
print ' cellpadding="0" cellspacing="0">',"\n";
}

$max_samples_per_row = int($graph_width/$target_bar_width);
#print "max_samples_per_row=$max_samples_per_row\n";
#print "\n";


$first_sample_of_row = 0;
$last_sample_of_row = 0;
$all_done = 0;
while (not $all_done) {

  $num_samples_this_row = 0;
  $num_samples = 0;
  $done = 0;
  while (not $done) {
    if ($annuals{$num_samples + $first_sample_of_row}) {
#print "annuals ",$num_samples + $first_sample_of_row," = $annuals{$num_samples + $first_sample_of_row} \n";
      $num_samples_this_row = $num_samples;
    }
    $num_samples = $num_samples + 1;
    if ($num_samples >= $max_samples_per_row) {
      $done = 1;
    }
    if ($num_samples + $first_sample_of_row >= $total_num_samples) {
      $num_samples_this_row = $num_samples;
      $done = 1;
      $all_done = 1;
    }
  }
#print "\n";
  $last_sample_of_row = $first_sample_of_row + $num_samples_this_row-1;
#print "$num_samples_this_row samples in this row, last is ",$mileages[$last_sample_of_row],"\n";
  $width = $target_bar_width;
#print "This row is from $first_sample_of_row to $last_sample_of_row\n";
  $max_samples_per_row = $num_samples_this_row if $max_samples_per_row < $num_samples_this_row;

  if ($do_html) {
  #Start row
  print '<tr>',"\n";
  #Do 30, 40, 50 scale at left of bars
  print '<td style="vertical-align:bottom; text-align:right; line-height:20px; width:24pt">',"\n";
  print '<u>mpg</u><br>50-<br>-<br>-<br>40-<br>-<br>-<br>30-<br>-<br></td>',"\n";
  print '<td valign="bottom"><img width="',$width,'" height="28" src="blu8x8.gif" alt="30.01"></td>',"\n";
  print '<td valign="bottom"><img width="',$width,'" height="88" src="blu8x8.gif" alt="40.00"></td>',"\n";
  print '<td valign="bottom"><img width="',$width,'" height="148" src="blu8x8.gif" alt="50.00"></td>',"\n";
  }

  foreach $sample_num ($first_sample_of_row..$last_sample_of_row) {
    $mileage = $mileages[$sample_num];
    if ($annuals{$sample_num} or $sample_num == 0) {
      if ($do_html) {
      print '<td style="vertical-align:bottom; text-align:right; line-height:20px; width:1pt">',"\n";
      print '-<br>-<br>-<br>-<br>-<br>-<br>-<br>-<br>-<br></td>',"\n";
      }
    }
#print "Graphing sample $sample_num which is $mileage\n";
    $height = int(
              ($mileage*$pix_per_mpg)
              -($reasonable_min*$pix_per_mpg)
              +$pix_for_rmin #intended offset
              +8  #trial and error value to get dashs to line up
              +0.5);
    $mileage = sprintf("%2.2f",$mileage);
    if ($do_html) {
    print '<td valign="bottom"><img width="',$width,'" height="',$height,'" src="blu8x8.gif" alt="',$mileage,'"></td>',"\n";
    }
  }

  if ($do_html) {
  #End row
  print '<td style="vertical-align:bottom; text-align:right; line-height:20px; width:1pt">',"\n";
  print '-<br>-<br>-<br>-<br>-<br>-<br>-<br>-<br>-<br></td>',"\n";
  print '</tr>',"\n";
  }

  print '<tr>',"\n";
  print '<td></td>',"\n";
  print '<td align="center" colspan="3"></td>',"\n";
  $last_col = 0;
  foreach $sample_num ($first_sample_of_row..$last_sample_of_row+1) {
    if ($annuals{$sample_num}) {
      print '<td></td>',"\n";
      $this_span = $sample_num - $first_sample_of_row - $last_col;
      $last_col = $sample_num - $first_sample_of_row;
      if ($this_span*$width > 30) {
        print '<td align="center" colspan="',$this_span,'">',$annuals{$sample_num},'</td>',"\n";
      } else {
        print '<td align="center" colspan="',$this_span,'"></td>',"\n";
      }
    }
  }
  print '</tr>',"\n";


  $first_sample_of_row = $last_sample_of_row + 1;
#print "\n";

}
#End frame
$life_mpg = $life_miles/$life_gas;
$life_mpg = 0.1*int(10*$life_mpg + 0.5);
print '</tr><tr><td align="center" colspan="',$max_samples_per_row,'">Life: ',$life_mpg,' MPG</td>',"\n";
print '</tr><tr><td align="center" colspan="',$max_samples_per_row,'"><small>To see the actual data, hold your pointer over the bars.</small></td>',"\n";
print '</tr><tr><td align="center" colspan="',$max_samples_per_row,'"><small>(The left 3 bars are just for checking the vertical scale.',"\n";
print 'They should line up with the 30, 40, and 50mpg tick marks.)</small></td>',"\n";
print '</table></body></html>',"\n";

__END__