<?php

// Load the least-square regression class.
require_once( 'RootDirectory.inc.php' );
require_once( 
$RootDirectory 'Includes/XY_Plot/XY_Plot.php' );

function 
plot$data$regression$coefficients$functionString$isScale false )
{
  
//-----------------------------------------------------------
  
$imageWidth     450;
  
$imageHeight    200;

  if ( 
$isScale )
  {
    
$leftMargin        8;
    
$rightMargin       25;

    
$topMargin         8;
    
$bottomMargin      35;
  }
  else
  {
    
$leftMargin        2;
    
$rightMargin       2;

    
$topMargin         2;
    
$bottomMargin      15;
  }

  
// Verticle scale
  
$Y_MajorScale   1;
  
$Y_MinorScale   $Y_MajorScale 5;
  
$X_MajorScale   1;
  
$X_MinorScale   $X_MajorScale 5;
  
//-----------------------------------------------------------

  // Create image
  
$image imageCreate$imageWidth $imageHeight );

  
//---------------------------------
  // Create basic color map
  //---------------------------------
  
$colorMap = array();

  
$colorMap"Background" ] = imageColorAllocate$image 255 255 255 );
  
//imagecolortransparent( $image , $colorMap[ "Background" ] );

  // Create a standard color palette
  
$colorMap"Black"       ] = imagecolorallocate$image,   0,   0,   );
  
$colorMap"Red"         ] = imagecolorallocate$image192,   0,   );
  
$colorMap"Green"       ] = imagecolorallocate$image,   0192,   );
  
$colorMap"Blue"        ] = imagecolorallocate$image,   0,   0192 );
  
$colorMap"Brown"       ] = imagecolorallocate$image,  48,  48,   );
  
$colorMap"Cyan"        ] = imagecolorallocate$image,   0192192 );
  
$colorMap"Purple"      ] = imagecolorallocate$image192,   0192 );
  
$colorMap"LightGray"   ] = imagecolorallocate$image192192192 );

  
$colorMap"DarkGray"    ] = imagecolorallocate$image,  48,  48,  48 );
  
$colorMap"LightRed"    ] = imagecolorallocate$image255,   0,   );
  
$colorMap"LightGreen"  ] = imagecolorallocate$image,   0255,   );
  
$colorMap"LightBlue"   ] = imagecolorallocate$image,   0,   0255 );
  
$colorMap"Yellow"      ] = imagecolorallocate$image255255,   );
  
$colorMap"LightCyan"   ] = imagecolorallocate$image,   0255255 );
  
$colorMap"LightPurple" ] = imagecolorallocate$image255,   0255 );
  
$colorMap"White"       ] = imagecolorallocate$image255255255 );

  
$colorMap"Gray10"      ] = imagecolorallocate$image ,  26 ,  26 ,  26 );
  
$colorMap"Gray20"      ] = imagecolorallocate$image ,  51 ,  51 ,  51 );
  
$colorMap"Gray30"      ] = imagecolorallocate$image ,  77 ,  77 ,  77 );
  
$colorMap"Gray40"      ] = imagecolorallocate$image 102 102 102 );
  
$colorMap"Gray50"      ] = imagecolorallocate$image 128 128 128 );
  
$colorMap"Gray60"      ] = imagecolorallocate$image 154 154 154 );
  
$colorMap"Gray70"      ] = imagecolorallocate$image 180 180 180 );
  
$colorMap"Gray80"      ] = imagecolorallocate$image 205 205 205 );
  
$colorMap"Gray90"      ] = imagecolorallocate$image 230 230 230 );

  
// Place text
  
imageString
  
(
    
$image,
    
2,
    
$leftMargin,
    
$imageHeight 15,
    
$functionString,
    
$colorMap"Black" ]
  );

  
// New plot
  
$plot = new XY_PlotClass$image );

  
// Setup boundaries
  
$plot->sizeWindow
  
(
    
$leftMargin,
    
$topMargin,
    
$imageWidth $rightMargin,
    
$imageHeight $bottomMargin
  
);

  
// Draw border around graph area.
  
imageRectangle
  
(
    
$image,
    
$leftMargin,
    
$topMargin,
    
$imageWidth $rightMargin,
    
$imageHeight $bottomMargin,
    
$colorMap"LightGray" ]
  );

  foreach ( 
$data as $point )
    
$plot->addData$point], $point] );

  
$plot->setColor$colorMap"Red" ] );

  
$plot->autoScaleX_MinMax);
  
$plot->autoScaleY_MinMax);


  if ( 
$isScale )
  {
    
// Setup and draw minor horizontal scale (right to left)
    
$plot->SetX_MinorDivisionScale$X_MinorScale );
    
$plot->SetX_MinorDivisionColor$colorMap"Gray90" ] );
    
$plot->DrawX_MinorDivisions();

    
// Setup and draw minor vertical scale (top to bottom)
    
$plot->SetY_MinorDivisionScale$Y_MinorScale );
    
$plot->SetY_MinorDivisionColor$colorMap"Gray90" ] );
    
$plot->DrawY_MinorDivisions();

    
//----------------------------------
    // Setup and draw major horizontal scale (right to left)
    //----------------------------------

    // Extend lines 5 pixels past margins for label
    
$plot->SetX_MajorDivisionExtention);

    
// Scale
    
$plot->SetX_MajorDivisionScale$X_MajorScale );

    
// Division lines are blue
    
$plot->SetX_MajorDivisionColor$colorMap"Gray70" ] );

    
// Text labels are dark gray
    
$plot->SetX_MajorDivisionTextColor$colorMap"Black" ] );

    
// Draw it
    
$plot->DrawX_MajorDivisions();

    
//----------------------------------
    // Setup and draw major vertical scale (top to bottom)
    //----------------------------------

    // Extend lines 5 pixels past margins for label
    
$plot->SetY_MajorDivisionExtention);

    
// Scale
    
$plot->SetY_MajorDivisionScale$Y_MajorScale );

    
// Divisions in drak gray
    
$plot->SetY_MajorDivisionColor$colorMap"Gray70" ] );

    
// Lables in dark gray
    
$plot->SetY_MajorDivisionTextColor$colorMap"Black" ] );

    
// Draw it
    
$plot->DrawY_MajorDivisions();
  }

  
$min $plot->getX_Min();
  
$max $plot->getX_Max();

  
// Render the points to image
  
$plot->setCircleSize);
  
$plot->renderPoints();

  
$plot->resetData();

  
$frameWidth $imageWidth $leftMargin $rightMargin;
  for ( 
$xIndex 0$xIndex $frameWidth; ++$xIndex )
  {
    
$x $xIndex * ( $max $min ) / $frameWidth $min;
    
$y $regression->getFunction$x$coefficients );
    
$plot->addData$x$y );
  }

  
$plot->setColor$colorMap"LightRed" ] );
  
$plot->renderWithLines();

  
// Output image
  
header"Content-Type: image/png" );
  
imagePNG$image );

}

// //-----------------------------------------------------------------------------
// // This function is here until PHP 5.5 is released.  Alas, it's not here yet.
// //-----------------------------------------------------------------------------
// function array_column( $data, $column )
// {
//   $result = array();
//   foreach ( $data as $row )
//     array_push( $result, $row[ $column ] );
//
//   return $result;
// }

?>