Statistics and counters: Graph Maker Function

Graph Maker Function

function GraphRows($rows, $opts) 
{ 
#  options 
#     
#    box_x_size: width of values area 
#    box_y_size: height of the values area 
#    x_size: total width of the graph 
#    y_size: total height of the graph 
#    x_val: array element of record to assign as x_value 
#    y_val: array element to assign as y_value 
#    x_label: label for the Bottom of the graph 
#    y_label: label for the left side 
#    font: font number to use from system 
#    font_file: file to use as the font 
#    show_x_val: true == show X value of each bar with the y_label 
#    show_y_val: true == show Y value labels 
#    title: string for top of graph 
#    bar_color: color array to use for bars 
#    box_color: color to use for the box edging and value box. 
#    label_color: color for the labels 
#    val_color: color to to use for the values 
#    title_color: color to use for the title. 
#    bg_color: color for the background. 
#    bg_trans: make the background transparant. 
#    img_format: can be « png », « gif », or « jpg ». 
 
  $defaults = array(« show_x_val » => 1, 
            « show_y_val » => 1, 
            « show_y_lines » => 1, 
            « font » => 1, 
            « x_val » => NULL, 
            « y_val » => NULL, 
            « title » => NULL, 
            « x_label » => NULL, 
            « y_label » => NULL, 
            « x_title » => NULL, 
            « y_title » => NULL, 
            « x_slant » => NULL, 
            « font_file » => NULL, 
            « x_size » => NULL, 
            « y_size » => NULL, 
            « box_x_size » => 300, 
            « box_y_size » => 200, 
            « right_margin » => 2, 
            « fg_color » => array(1,1,1), 
            « bg_color » => array(232, 226, 202), 
            « bg_trans » => NULL, 
            « bar_color » => array(128, 128, 128), 
            « box_color » => NULL, 
            « val_color » => NULL, 
            « title_color » => NULL, 
            « return » => NULL, 
            « img_format » => « png »); 
  foreach($defaults as $opt => $val) 
  { 
    if(!array_Key_exists($opt, $opts)) 
      { 
    $opts[« $opt »] = $val; 
      } 
  } 
  if($opts[« font_file »]) 
    { 
      $opts[« font »] =imageloadfont($opts[« font_file »]); 
    } 
  $font_y = imagefontheight($opts[« font »]); 
  $font_x = imagefontwidth($opts[« font »]); 
   
#the boxed area with be 2 from the top and right, 30 from the left, and 12 from the bottom. 
# the border will be 1px wide. 
  $max_x = 0; 
  $max_y = 0; 
  $longest_x = 0; 
  $longest_y = 0; 
  $x_mod = 1.3; 
  $y_mod = 1.3; 
   
# find the longest x and y value str lengths for the label margin size. 
  foreach($rows as $idx => $row) 
  { 
    $y_val = $row; 
    $x_val = $idx; 
    if(is_array($row)) 
      { 
    foreach($row as $idx => $val) 
    { 
      $y_val = $val; 
      break; 
    } 
    if($opts[« y_val »]) 
      { 
        if(array_key_exists($opts[« y_val »], $row)) 
          { 
        $y_val = $row[$opts[« y_val »]]; 
          } 
      } 
 
    if($opts[« x_val »]) 
      { 
        if(array_key_exists($opts[« x_val »], $row)) 
          { 
        $x_val = $row[$opts[« x_val »]]; 
          } 
      } 
      } 
    if($y_val > $max_y) 
      { 
    $max_y = $y_val; 
      } 
    if($x_val > $max_x) 
      { 
    $max_x = $x_val; 
      } 
    $y_len = strlen($y_val); 
    $x_len = strlen($x_val); 
    if($y_len > $longest_y) 
      { 
    $longest_y = $y_len; 
      } 
    if($x_len > $longest_x) 
      { 
    $longest_x = $x_len; 
      } 
  } 
  $left_margin = 0; 
  $bottom_margin = 0; 
  $top_margin = $font_y * ($y_mod/2); 
  if($opts[« title »] != NULL) 
    { 
      $top_margin = $font_y * $y_mod + $font_y * ($y_mod/2); 
    } 
  if($opts[« show_x_val »]) 
    { 
      $bottom_margin += $font_y * $y_mod; 
      if($opts[« x_slant »]) 
    { 
      $bottom_margin += $font_x * $longest_x – $font_y * $y_mod; 
    } 
    } 
  if($opts[« show_y_in_x »]) 
    { 
      $bottom_margin += $font_y * $y_mod; 
    } 
  if($opts[« x_title »]) 
    { 
      $bottom_margin += $font_y * $y_mod; 
    } 
  if($opts[« show_y_val »]) 
    { 
      $left_margin += $font_x * $x_mod * $longest_y; 
    } 
  if($opts[« y_title »]) 
    { 
      $t_margin = $font_y * $y_mod + $font_y * ($y_mod/2); 
      $l_margin = $font_x * $x_mod * strlen($opts[« y_title »]); 
      if($t_margin > $top_margin) 
    { 
      $top_margin = $t_margin; 
    } 
      if($l_margin > $left_margin) 
    { 
      $left_margin = $l_margin; 
    } 
    } 
# we have to calculate the x and y image and box sizes depending on which is present. 
  # img sizing overrides the box size; 
  if($opts[« x_size »]) 
    { 
      $opts[« box_x_size »] = $img_x – $left_margin – 2 – $opts[« right_margin »] ; 
   } 
  else 
    { 
      $opts[« x_size »] = $left_margin + $opts[« box_x_size »] + 2 + $opts[« right_margin »]; 
    } 
  if($opts[« y_size »]) 
    { 
      $opts[« box_y_size »] = $img_y – $top_margin – 2 – $bottom_margin; 
    } 
  else 
    { 
     $opts[« y_size »] = $top_margin + 2 + $opts[« box_y_size »] + $bottom_margin; 
    } 
 
  $box_top = $top_margin+1; 
  $box_bottom = $box_top + 2 + $opts[« box_y_size »]; 
  $box_left = $left_margin+1; 
  $box_right = $box_left + $opts[« box_x_size »]; 
  $img =  imagecreate($opts[« x_size »]+1, $opts[« y_size »]+1); 
  list($r, $g, $b) = $opts[« bg_color »]; 
  $bg_color = imagecolorallocate($img, $r, $g, $b); 
  if($opts[« bg_trans »]) 
    { 
      imagecolortransparent($img, $bg_color); 
    } 
  list($r, $g, $b) = $opts[« fg_color »]; 
  $fg_color = imagecolorallocate($img, $r, $g, $b); 
  if(is_array($opts[« val_color »])) 
    { 
      list($r, $g, $b) = $opts[« val_color »]; 
    } 
  $box_color = $fg_color; 
  if(is_array($opts[« box_color »])) 
    { 
      list($r, $g, $b) = $opts[« box_color »]; 
      $box_color = imagecolorallocate($img, $r, $g, $b); 
    } 
  $bar_color = $fg_color; 
  if(is_array($opts[« bar_color »])) 
    { 
      list($r, $g, $b) = $opts[« bar_color »]; 
      $bar_color = imagecolorallocate($img, $r, $g, $b); 
    } 
  $title_color = $fg_color; 
  if(is_array($opts[« title_color »])) 
    { 
      list($r, $g, $b) = $opts[« title_color »]; 
      $title_color = imagecolorallocate($img, $r, $g, $b); 
    } 
  $val_color = $fg_color; 
  if(is_array($opts[« val_color »])) 
    { 
      list($r, $g, $b) = $opts[« val_color »]; 
      $val_color = imagecolorallocate($img, $r, $g, $b); 
    } 
  imagerectangle($img, 0, 0, $opts[« x_size »], $opts[« y_size »], $box_color); 
  imagerectangle($img, $box_left, $box_top, $box_right, $box_bottom, $box_color); 
  $num_records = count($rows); 
# lets find the next item up. 
# find the maximal marker. 
 
  $finder = $max_y;   
  $multiple = 1; 
  while($finder > 10) 
    { 
      $finder = $finder/10; 
      $multiple *= 10; 
    } 
  $oldfinder =$finder; 
  $finder = round($finder); 
  if($finder < $oldfinder) 
    { 
      $finder++; 
    } 
# ok, so we have UP to 10 marks. 
  $num_marks = $finder; 
  $max_y = $finder * $multiple; 
 
  $xspan = ($opts[« box_x_size »] – $num_records -1)/$num_records; 
  $yspan = $opts[« box_y_size »]/$num_marks; 
 
  for($x=$num_marks;$x>=0;$x–) 
    { 
      if($opts[« show_y_lines »]) 
    { 
      imageline($img, 
            $box_left, ($x*$yspan)+$top_margin+1, 
            $box_right, ($x*$yspan)+$top_margin+1, 
            $box_color); 
    } 
      if($opts[« show_y_val »]) 
    { 
      $text = ($num_marks – $x)*$multiple; 
      imagestring($img, $opts[« font »], 
              $left_margin – strlen($text)*$x_mod*$font_x, 
              ($x*$yspan)+$top_margin-($font_y/2)+2, 
              $text, $box_color); 
    } 
    } 
  if($opts[« title »]) 
    { 
      $txtlen = strlen($opts[« title »]) * $font_x; 
      $left = $opts[« box_x_size »]/2 – $txtlen/2 + $left_margin +1; 
      $top = $font_y * $y_mod / 3; 
      imagestring($img, $opts[« font »], $left, $top, $opts[« title »], $title_color); 
    } 
  if($opts[« y_title »]) 
    { 
      $txtlen = strlen($opts[« y_title »]) * $font_x; 
      $left = $left_margin / 2 – $txtlen / 2; 
      $top = $font_y * $y_mod / 3; 
      imagestring($img, $opts[« font »], $left, $top, $opts[« y_title »], $title_color); 
    } 
  if($opts[« x_title »]) 
    { 
      $left = $left_margin; 
      $top = $opts[« box_y_size »] + $top_margin + $font_y * $y_mod / 3; 
      if($opts[« show_x_val »]) 
    { 
      $top += $font_y * $y_mod; 
    } 
      if($opts[« show_y_in_x »]) 
    { 
      $top += $font_y * $y_mod; 
    } 
      imagestring($img, $opts[« font »], $left, $top, $opts[« x_title »], $title_color); 
    } 
 
  $x_pos = 0; 
  foreach($rows as $idx => $row) 
  { 
    $y_value = $row; 
    $x_value = $idx; 
    if(is_array($row)) 
      { 
    if($opts[« y_val »] && array_key_exists($opts[« y_val »], $row)) 
      { 
        $y_value = $row[$opts[« y_val »]]; 
      } 
    else 
      { 
        foreach($row as $var => $val) 
        {