<?
/*
#######################################################################
#
#  About:
#
#  The following PHP3 code provides a nice class interface for
#  html graphs.  It provides a single, reasonably consistent
#  interface for creating HTML based graphs.  The idea behind
#  this code is that the user of the class sets up four or five
#  arrays and pass these to html_graph() which then takes
#  care of all the messy HTML layout.  I am reasonably happy
#  with the outcome of this interface.  The HTML that must be
#  generated for HTML graphs *is* messy, and the interface is
#  very clean and flexible.  I think that once you generate
#  one graph with it, you'll never look at creating HTML graphs
#  the same.  The arrays that must be set up consist of:
#
#       * A names array containing column/row identifiers ($names)
#       * One or two values arrays containg corresponding
#         values to the column/row names ($values & $dvalues)
#       * One or two bars array which also corresponds to the names
#         array.  The values in these arrays are URLS to graphics
#         or color codes starting with a # which will be used to
#         generate the graph bar.  Color codes and graphics may
#         be mixed in the same chart, although color codes can't
#         be used on Vertical charts. ($bars & $dbars)
#       * The heart of customization... a vals array.  If this
#         array isn't created then html_graphs will use all
#         default values for the chart.  Items that are customizable
#         include font styles & colors, backgrounds, graphics,
#         labels, cellspacing, cellpadding, borders, anotations
#         and scaling factor. ($vals)
#
#######################################################################
#
#  Examples:
#
#  See http://www.pobox.com/~pdavis/programs/
#
#######################################################################
*/

/*
#######################################################################
#
#  Function:  html_graph($names, $values, $bars, $vals[, $dvalues, $dbars])
#
#   Purpose:  Calls routines to initialize defaults, set up table
#             print data, and close table.
#
# Arguments:
#                   $names - Array of element names.
#                  $values - Array of corresponding values for elements.
#                    $bars - Array of corresponding graphic image names
#                            or color codes (begining with a #) for elements.
#                            Color codes can't be used on vertical charts.
#                 $dvalues - Array of corresponding values for elements.
#                            This set is required only in the double graph.
#                   $dbars - Array of corresponding graphic image names
#                            or color codes (begining with a #) for elements.
#                            This set is required only in the double graph.
#
#                    $vals -  array("vlabel"=>"",
#                                   "hlabel"=>"",
#                                   "type"=>"",
#                                   "cellpadding"=>"",
#                                   "cellspacing"=>"",
#                                   "border"=>"",
#                                   "width"=>"",
#                                   "background"=>"",
#                                   "vfcolor"=>"",
#                                   "hfcolor"=>"",
#                                   "vbgcolor"=>"",
#                                   "hbgcolor"=>"",
#                                   "vfstyle"=>"",
#                                   "hfstyle"=>"",
#                                   "noshowvals"=>"",
#                                   "scale"=>"",
#                                   "namebgcolor"=>"",
#                                   "valuebgcolor"=>"",
#                                   "namefcolor"=>"",
#                                   "valuefcolor"=>"",
#                                   "namefstyle"=>"",
#                                   "valuefstyle"=>"",
#                                   "doublefcolor"=>"")
#
#             Where:
#
#                   vlabel - Vertical Label to apply
#                            default is NUL
#                   hlabel - Horizontal Label to apply
#                            default is NUL
#                     type - Type of graph
#                            0 = horizontal
#                            1 = vertical
#                            2 = double horizontal
#                            3 = double vertical
#                            default is 0
#              cellpadding - Padding for the overall table
#                            default is 0
#              cellspacing - Space for the overall table
#                            default is 0
#                   border - Border size for the overall table
#                            default is 0
#                    width - Width of the overall table
#                            default is NUL
#               background - Background image for the overall table
#                            If this value exists then no BGCOLOR
#                            codes will be added to table elements.
#                            default is NUL
#                  vfcolor - Vertical label font color
#                            default is #000000
#                  hfcolor - Horizontal label font color
#                            default is #000000
#                 vbgcolor - Vertical label background color
#                            Not used if background is set
#                            default is #FFFFFF
#                 hbgcolor - Horizontal label background color
#                            Not used if background is set
#                            default is #FFFFFF
#                  vfstyle - Vertical label font style
#                            default is NUL
#                  hfstyle - Horizontal label font style
#                            default is NUL
#               noshowvals - Don't show numeric value at end of graphic
#                            Boolean value, default is FALSE
#                    scale - Scale values by some number.
#                            default is 1.
#              namebgcolor - Color code for element name cells
#                            Not used if background is set
#                            default is "#000000"
#             valuebgcolor - Color code for value cells
#                            Not used if background is set
#                            default is "#000000"
#               namefcolor - Color code for font of name element
#                            default is "#FFFFFF"
#              valuefcolor - Color code for font of value element
#                            default is "#000000"
#               namefstyle - Style code for font of name element
#                            default is NUL
#              valuefstyle - Style code for font of value element
#                            default is NUL
#             doublefcolor - Color code for font of second element value
#                            default is "#886666"
#
#######################################################################
*/
function html_graph($names, $values, $bars, $vals, $dvalues=0, $dbars=0)
   {
    
// Set the error level on entry and exit so as not to interfear
    // with anyone elses error checking.
    
$er = error_reporting(1);

    
// Set the values that the user didn't
    
$vals = hv_graph_defaults($vals);
    
start_graph($vals, $names);

    if (
$vals["type"] == 0)
       {
        
horizontal_graph($names, $values, $bars, $vals);
       }
    elseif (
$vals["type"] == 1)
       {
        
vertical_graph($names, $values, $bars, $vals);
       }
    elseif (
$vals["type"] == 2)
       {
        
double_horizontal_graph($names, $values, $bars, $vals, $dvalues, $dbars);
       }
    elseif (
$vals["type"] == 3)
       {
        
double_vertical_graph($names, $values, $bars, $vals, $dvalues, $dbars);
       }

    
end_graph();

    
// Set the error level back to where it was.
    
error_reporting($er);  
   }

/*
#######################################################################
#
#  Function:  html_graph_init()
#
#   Purpose:  Sets up the $vals array by initializing all values to
#             null.  Used to avoid warnings from error_reporting being
#             set high.  This routine only needs to be called if you
#             are woried about using uninitialized variables.
#           
#   Returns:  The initialized $vals array
#
#######################################################################
*/
function html_graph_init()
   {
    
$vals = array("vlabel"=>"",
                  
"hlabel"=>"",
                  
"type"=>"",
                  
"cellpadding"=>"",
                  
"cellspacing"=>"",
                  
"border"=>"",
                  
"width"=>"",
                  
"background"=>"",
                  
"vfcolor"=>"",
                  
"hfcolor"=>"",
                  
"vbgcolor"=>"",
                  
"hbgcolor"=>"",
                  
"vfstyle"=>"",
                  
"hfstyle"=>"",
                  
"noshowvals"=>"",
                  
"scale"=>"",
                  
"namebgcolor"=>"",
                  
"valuebgcolor"=>"",
                  
"namefcolor"=>"",
                  
"valuefcolor"=>"",
                  
"namefstyle"=>"",
                  
"valuefstyle"=>"",
                  
"doublefcolor"=>"");

    return(
$vals);
   }
/*
#######################################################################
#
#  Function:  start_graph($vals, $names)
#
#   Purpose:  Prints out the table header and graph labels.
#
#######################################################################
*/
function start_graph($vals, $names)
   {
    print
'<TABLE';
    print
' CELLPADDING="' . $vals["cellpadding"] . '"';
    print
' CELLSPACING="' . $vals["cellspacing"] . '"';
    print
' BORDER="' . $vals["border"] . '"';

    if (
$vals["width"] != 0) { print ' WIDTH="' . $vals["width"] . '"'; }
    if (
$vals["background"]) { print ' BACKGROUND="' . $vals["background"] . '"'; }

    print
'>';

    if ((
$vals["vlabel"]) || ($vals["hlabel"]))
       {
        if ((
$vals["type"] == 0) || ($vals["type"] == 2 ))// horizontal chart
           
{
            
$rowspan = SizeOf($names) + 1;
            
$colspan = 3;
           }
        elseif (
$vals["type"] == 1 || ($vals["type"] == 3 )) // vertical chart
           
{
            
$rowspan = 3;
            
$colspan = SizeOf($names) + 1;
           }

        print
'<TR><TD ALIGN=CENTER VALIGN="CENTER" ';

        
// If a background was choosen don't print cell BGCOLOR
        
if (! $vals["background"]) { print 'BGCOLOR="' . $vals["hbgcolor"] . '"'; }

        print
' COLSPAN="' . $colspan . '">';
        print
'<FONT COLOR="' . $vals["hfcolor"] . '" STYLE="' . $vals["hfstyle"] . '">';
        print
"<B>" . $vals["hlabel"] . "</B>";
        print
'</FONT></TD></TR>';

        print
'<TR><TD ALIGN="CENTER" VALIGN="CENTER" ';

        
// If a background was choosen don't print cell BGCOLOR
        
if (! $vals["background"]) { print 'BGCOLOR="' . $vals["vbgcolor"] . '"'; }

        print
' ROWSPAN="' . $rowspan . '">';
        print
'<FONT COLOR="' . $vals["vfcolor"] . '" STYLE="' . $vals["vfstyle"] . '">';
        print
"<B>" . $vals["vlabel"] . "</B>";
        print
'</FONT></TD>';
       }
   }

/*
#######################################################################
#
#  Function:  end_graph()
#
#   Purpose:  Prints out the table footer.
#
#######################################################################
*/
function end_graph()
   {
    print
"</TABLE>";
   }

/*
#######################################################################
#
#  Function:  hv_graph_defaults($vals)
#
#   Purpose:  Sets the default values for the $vals array
#
#######################################################################
*/
function hv_graph_defaults($vals)
   {
    if (!
$vals["vfcolor"]) { $vals["vfcolor"]="#000000"; }
    if (!
$vals["hfcolor"]) { $vals["hfcolor"]="#000000"; }
    if (!
$vals["vbgcolor"]) { $vals["vbgcolor"]="#FFFFFF"; }
    if (!
$vals["hbgcolor"]) { $vals["hbgcolor"]="#FFFFFF"; }
    if (!
$vals["cellpadding"]) { $vals["cellpadding"]=0; }
    if (!
$vals["cellspacing"]) { $vals["cellspacing"]=0; }
    if (!
$vals["border"]) { $vals["border"]=0; }
    if (!
$vals["scale"]) { $vals["scale"]=.1; }
    if (!
$vals["namebgcolor"]) { $vals["namebgcolor"]="#FFFFFF"; }
    if (!
$vals["valuebgcolor"]) { $vals["valuebgcolor"]="#FFFFFF"; }
    if (!
$vals["namefcolor"]) { $vals["namefcolor"]="#000000"; }
    if (!
$vals["valuefcolor"]) { $vals["valuefcolor"]="#000000"; }
    if (!
$vals["doublefcolor"]) { $vals["doublefcolor"]="#886666"; }

    return (
$vals);
   }

/*
#######################################################################
#
#  Function:  horizontal_graph($names, $values, $bars, $vals)
#
#   Purpose:  Prints out the actual data for the horizontal chart.
#
#######################################################################
*/
function horizontal_graph($names, $values, $bars, $vals)
   {
    for(
$i=0;$i<SizeOf($values);$i++ )
       {
?>
       <TR>
        <TD ALIGN=RIGHT
<?
        
// If a background was choosen don't print cell BGCOLOR
        
if (! $vals["background"]) { print ' BGCOLOR="' . $vals["namebgcolor"] . '"'; }
?>
         >
         <FONT SIZE="-1" COLOR="<? echo $vals["namefcolor"] ?>" STYLE="<? echo $vals["namefstyle"] ?>">
         <? echo $names[$i] ?>
         </FONT>
        </TD>
        <TD  ALIGN=LEFT
<?
        
// If a background was choosen don't print cell BGCOLOR
        
if (! $vals["background"]) { print ' BGCOLOR="' . $vals["valuebgcolor"] . '"'; }
?>
         >
<?
        
// Decide if the value in bar is a color code or image.
        
if (ereg("^#", $bars[$i]))
           {
?>
            <TABLE ALIGN="LEFT" CELLPADDING=0 CELLSPACING=0
             BGCOLOR="<? echo $bars[$i] ?>"
             WIDTH="<? echo $values[$i] * $vals["scale"] ?>">
             <TR><TD>&nbsp</TD></TR>
            </TABLE>
<?
            
}
         else
            {
             print
'<IMG SRC="' . $bars[$i] . '"';
             print
' HEIGHT=10 WIDTH="' . $values[$i] * $vals["scale"] . '">';
            }
        if (!
$vals["noshowvals"])
           {
            print
'<I><FONT SIZE="-2" COLOR="' . $vals["valuefcolor"] . '" ';
            print
' STYLE="' . $vals["valuefstyle"] . '">(';
            print
$values[$i] . ")</FONT></I>";
           }
?>
        </TD>
       </TR>
<?
       
} // endfor

   
} // end horizontal_graph

/*
#######################################################################
#
#  Function:  vertical_graph($names, $values, $bars, $vals)
#
#   Purpose:  Prints out the actual data for the vertical chart.
#
#######################################################################
*/
function vertical_graph($names, $values, $bars, $vals)
   {
    print
"<TR>";

    for(
$i=0;$i<SizeOf($values);$i++ )
       {

        print
'<TD  ALIGN="CENTER" VALIGN="BOTTOM" ';

        
// If a background was choosen don't print cell BGCOLOR
        
if (! $vals["background"]) { print ' BGCOLOR="' . $vals["valuebgcolor"] . '"'; }
        print
">";

        if (!
$vals["noshowvals"])
           {
            print
'<I><FONT SIZE="-2" COLOR="' . $vals["valuefcolor"] . '" ';
            print
' STYLE="' . $vals["valuefstyle"] . '">(';
            print
$values[$i] . ")</FONT></I><BR>";
           }
?>

         <IMG SRC="<? echo $bars[$i] ?>" WIDTH=5 HEIGHT="<?

        
// Values of zero are displayed wrong because a image height of zero
        // gives a strange behavior in Netscape. For this reason the height
        // is set at 1 pixel if the value is zero. - Jan Diepens
        
if ($values[$i] != 0)
           {
            echo
$values[$i] * $vals["scale"];
           }
        else
           {
            echo
"1";
           }
?>">

         </TD>
<?
       
} // endfor

    
print "</TR><TR>";

    for(
$i=0;$i<SizeOf($values);$i++ )
       {
?>
        <TD ALIGN="CENTER" VALIGN="TOP"

<?
        
// If a background was choosen don't print cell BGCOLOR
        
if (! $vals["background"]) { print ' BGCOLOR="' . $vals["namebgcolor"] . '"'; }
?>
         >
         <FONT SIZE="-1" COLOR="<? echo $vals["namefcolor"] ?>" STYLE="<? echo $vals["namefstyle"] ?>">
         <? echo $names[$i] ?>
         </FONT>
        </TD>
<?
       
} // endfor

   
} // end vertical_graph

/*
#######################################################################
#
#  Function:  double_horizontal_graph($names, $values, $bars,
#                                     $vals, $dvalues, $dbars)
#
#   Purpose:  Prints out the actual data for the double horizontal chart.
#
#######################################################################
*/
function double_horizontal_graph($names, $values, $bars, $vals, $dvalues, $dbars)
   {
    for(
$i=0;$i<SizeOf($values);$i++ )
       {
?>
       <TR>
        <TD ALIGN=RIGHT
<?
        
// If a background was choosen don't print cell BGCOLOR
        
if (! $vals["background"]) { print ' BGCOLOR="' . $vals["namebgcolor"] . '"'; }
?>
         >
         <FONT SIZE="-1" COLOR="<? echo $vals["namefcolor"] ?>" STYLE="<? echo $vals["namefstyle"] ?>">
         <? echo $names[$i] ?>
         </FONT>
        </TD>
        <TD  ALIGN=LEFT
<?
        
// If a background was choosen don't print cell BGCOLOR
        
if (! $vals["background"]) { print ' BGCOLOR="' . $vals["valuebgcolor"] . '"'; }
?>
         >
         <TABLE ALIGN="LEFT" CELLPADDING=0 CELLSPACING=0 WIDTH="<? echo $dvalues[$i] * $vals["scale"] ?>">
          <TR><TD
<?
        
// Set background to a color if it starts with # or
        // an image otherwise.
        
if (ereg("^#", $dbars[$i])) { print 'BGCOLOR="' . $dbars[$i] . '">'; }
        else { print
'BACKGROUND="' . $dbars[$i] . '">'; }
?>
           <NOWRAP>
<?
        
// Decide if the value in bar is a color code or image.
        
if (ereg("^#", $bars[$i]))
           {
?>
            <TABLE ALIGN="LEFT" CELLPADDING=0 CELLSPACING=0
             BGCOLOR="<? echo $bars[$i] ?>"
             WIDTH="<? echo $values[$i] * $vals["scale"] ?>">
             <TR><TD>&nbsp</TD></TR>
            </TABLE>
<?
            
}
         else
            {
             print
'<IMG SRC="' . $bars[$i] . '"';
             print
' HEIGHT=10 WIDTH="' . $values[$i] * $vals["scale"] . '">';
            }          

        if (!
$vals["noshowvals"])
           {
            print
'<I><FONT SIZE="-3" COLOR="' . $vals["valuefcolor"] . '" ';
            print
' STYLE="' . $vals["valuefstyle"] . '">(';
            print
$values[$i] . ")</FONT></I>";
           }
?>
           </NOWRAP>
          </TD></TR>
         </TABLE>
<?
        
if (! $vals["noshowvals"])
           {
            print
'<I><FONT SIZE="-3" COLOR="' . $vals["doublefcolor"] . '" ';
            print
' STYLE="' . $vals["valuefstyle"] . '">(';
            print
$dvalues[$i] . ")</FONT></I>";
           }
?>
        </TD>
       </TR>
<?
       
} // endfor

   
} // end double_horizontal_graph

/*
#######################################################################
#
#  Function:  double_vertical_graph($names, $values, $bars, $vals, $dvalues, $dbars)
#
#   Purpose:  Prints out the actual data for the double vertical chart.
#
#    Author: Jan Diepens
#
#######################################################################
*/
function double_vertical_graph($names, $values, $bars, $vals, $dvalues, $dbars)
   {
   
// print "<TR>";

    
for( $i=0;$i<SizeOf($values);$i++ )
       {

        print
'<TD  ALIGN="CENTER" VALIGN="BOTTOM" ';
        
// If a background was choosen don't print cell BGCOLOR
        
if (! $vals["background"]) { print ' BGCOLOR="' . $vals["valuebgcolor"] . '"'; }
        print
">";

        print
'<TABLE><TR><TD ALIGN="CENTER" VALIGN="BOTTOM" ';

        
// If a background was choosen don't print cell BGCOLOR
        
if (! $vals["background"]) { print ' BGCOLOR="' . $vals["valuebgcolor"] . '"'; }
        print
">";

        if (!
$vals["noshowvals"])
           {
            print
'<I><FONT SIZE="-2" COLOR="' . $vals["valuefcolor"] . '" ';
            print
' STYLE="' . $vals["valuefstyle"] . '">(';
            print
$values[$i] . ")</FONT></I><BR>";
           }
?>

         <IMG SRC="<? echo $bars[$i] ?>" WIDTH=10 HEIGHT="<? if ($values[$i]!=0){
                echo
$values[$i] * $vals["scale"];
                } else { echo
"1";} ?>">
         </TD><TD ALIGN="CENTER" VALIGN="BOTTOM"
<?
         
// If a background was choosen don't print cell BGCOLOR
        
if (! $vals["background"]) { print ' BGCOLOR="' . $vals["valuebgcolor"] . '"'; }
        print
">";

        if (!
$vals["noshowvals"])
           {
            print
'<I><FONT SIZE="-2" COLOR="' . $vals["doublefcolor"] . '" ';
            print
' STYLE="' . $vals["valuefstyle"] . '">(';
            print
$dvalues[$i] . ")</FONT></I><BR>";
           }
?>

         <IMG SRC="<? echo $dbars[$i] ?>" WIDTH=10 HEIGHT="<? if ($dvalues[$i]!=0){
                echo
$dvalues[$i] * $vals["scale"];
                } else { echo
"1";} ?>">
         </TD></TR></TABLE>
         </TD>
<?
       
} // endfor

    
print "</TR><TR>";

    for(
$i=0;$i<SizeOf($values);$i++ )
       {
?>
        <TD ALIGN="CENTER" VALIGN="TOP"

<?
        
// If a background was choosen don't print cell BGCOLOR
        
if (! $vals["background"]) { print ' BGCOLOR="' . $vals["namebgcolor"] . '"'; }
?>
         >
         <FONT SIZE="-1" COLOR="<? echo $vals["namefcolor"] ?>" STYLE="<? echo $vals["namefstyle"] ?>">
         <? echo $names[$i] ?>
         </FONT>
        </TD>
<?
       
} // endfor

   
} // end double_vertical_graph
    //    print "</TR>";

?>