Heuristic ranking analysis
[contractdashboard.git] / lib / pChart2.1.0 / class / pScatter.class.php
blob:a/lib/pChart2.1.0/class/pScatter.class.php -> blob:b/lib/pChart2.1.0/class/pScatter.class.php
--- a/lib/pChart2.1.0/class/pScatter.class.php
+++ b/lib/pChart2.1.0/class/pScatter.class.php
@@ -1,1 +1,828 @@
-
+<?php

+ /*

+     pScatter - class to draw scatter charts

+

+     Version     : 2.1.0

+     Made by     : Jean-Damien POGOLOTTI

+     Last Update : 26/01/11

+

+     This file can be distributed under the license you can find at :

+

+                       http://www.pchart.net/license

+

+     You can find the whole class documentation on the pChart web site.

+ */

+

+ define("SCATTER_MISSING_X_SERIE"	, 190001);

+ define("SCATTER_MISSING_Y_SERIE"	, 190002);

+

+ /* pScatter class definition */

+ class pScatter

+  {

+   var $pChartObject;

+   var $pDataObject;

+

+   /* Class creator */

+   function pScatter($pChartObject,$pDataObject)

+    {

+     $this->pChartObject = $pChartObject;

+     $this->pDataObject  = $pDataObject;

+    }

+

+   /* Prepare the scale */

+   function drawScatterScale($Format="")

+    {

+     $Mode		= isset($Format["Mode"]) ? $Format["Mode"] : SCALE_MODE_FLOATING;

+     $Floating		= isset($Format["Floating"]) ? $Format["Floating"] : FALSE;

+     $XLabelsRotation	= isset($Format["XLabelsRotation"]) ? $Format["XLabelsRotation"] : 90;

+     $MinDivHeight	= isset($Format["MinDivHeight"]) ? $Format["MinDivHeight"] : 20;

+     $Factors		= isset($Format["Factors"]) ? $Format["Factors"] : array(1,2,5);

+     $ManualScale	= isset($Format["ManualScale"]) ? $Format["ManualScale"] : array("0"=>array("Min"=>-100,"Max"=>100));

+     $XMargin		= isset($Format["XMargin"]) ? $Format["XMargin"] : 0;

+     $YMargin		= isset($Format["YMargin"]) ? $Format["YMargin"] : 0;

+     $ScaleSpacing	= isset($Format["ScaleSpacing"]) ? $Format["ScaleSpacing"] : 15;

+     $InnerTickWidth	= isset($Format["InnerTickWidth"]) ? $Format["InnerTickWidth"] : 2;

+     $OuterTickWidth	= isset($Format["OuterTickWidth"]) ? $Format["OuterTickWidth"] : 2;

+     $DrawXLines	= isset($Format["DrawXLines"]) ? $Format["DrawXLines"] : ALL;

+     $DrawYLines	= isset($Format["DrawYLines"]) ? $Format["DrawYLines"] : ALL;

+     $GridTicks		= isset($Format["GridTicks"]) ? $Format["GridTicks"] : 4;

+     $GridR		= isset($Format["GridR"]) ? $Format["GridR"] : 255;

+     $GridG		= isset($Format["GridG"]) ? $Format["GridG"] : 255;

+     $GridB		= isset($Format["GridB"]) ? $Format["GridB"] : 255;

+     $GridAlpha		= isset($Format["GridAlpha"]) ? $Format["GridAlpha"] : 40;

+     $AxisRo		= isset($Format["AxisR"]) ? $Format["AxisR"] : 0;

+     $AxisGo		= isset($Format["AxisG"]) ? $Format["AxisG"] : 0;

+     $AxisBo		= isset($Format["AxisB"]) ? $Format["AxisB"] : 0;

+     $AxisAlpha		= isset($Format["AxisAlpha"]) ? $Format["AxisAlpha"] : 100;

+     $TickRo		= isset($Format["TickR"]) ? $Format["TickR"] : 0;

+     $TickGo		= isset($Format["TickG"]) ? $Format["TickG"] : 0;

+     $TickBo		= isset($Format["TickB"]) ? $Format["TickB"] : 0;

+     $TickAlpha		= isset($Format["TickAlpha"]) ? $Format["TickAlpha"] : 100;

+     $DrawSubTicks	= isset($Format["DrawSubTicks"]) ? $Format["DrawSubTicks"] : FALSE;

+     $InnerSubTickWidth	= isset($Format["InnerSubTickWidth"]) ? $Format["InnerSubTickWidth"] : 0;

+     $OuterSubTickWidth	= isset($Format["OuterSubTickWidth"]) ? $Format["OuterSubTickWidth"] : 2;

+     $SubTickR		= isset($Format["SubTickR"]) ? $Format["SubTickR"] : 255;

+     $SubTickG		= isset($Format["SubTickG"]) ? $Format["SubTickG"] : 0;

+     $SubTickB		= isset($Format["SubTickB"]) ? $Format["SubTickB"] : 0;

+     $SubTickAlpha	= isset($Format["SubTickAlpha"]) ? $Format["SubTickAlpha"] : 100;

+     $XReleasePercent	= isset($Format["XReleasePercent"]) ? $Format["XReleasePercent"] : 1;

+     $DrawArrows	= isset($Format["DrawArrows"]) ? $Format["DrawArrows"] : FALSE;

+     $ArrowSize         = isset($Format["ArrowSize"]) ? $Format["ArrowSize"] : 8;

+     $CycleBackground	= isset($Format["CycleBackground"]) ? $Format["CycleBackground"] : FALSE;

+     $BackgroundR1	= isset($Format["BackgroundR1"]) ? $Format["BackgroundR1"] : 255;

+     $BackgroundG1	= isset($Format["BackgroundG1"]) ? $Format["BackgroundG1"] : 255;

+     $BackgroundB1	= isset($Format["BackgroundB1"]) ? $Format["BackgroundB1"] : 255;

+     $BackgroundAlpha1	= isset($Format["BackgroundAlpha1"]) ? $Format["BackgroundAlpha1"] : 10;

+     $BackgroundR2	= isset($Format["BackgroundR2"]) ? $Format["BackgroundR2"] : 230;

+     $BackgroundG2	= isset($Format["BackgroundG2"]) ? $Format["BackgroundG2"] : 230;

+     $BackgroundB2	= isset($Format["BackgroundB2"]) ? $Format["BackgroundB2"] : 230;

+     $BackgroundAlpha2	= isset($Format["BackgroundAlpha2"]) ? $Format["BackgroundAlpha2"] : 10;

+

+     /* Check if we have at least both one X and Y axis */

+     $GotXAxis = FALSE; $GotYAxis = FALSE;

+     foreach($this->pDataObject->Data["Axis"] as $AxisID => $AxisSettings)

+      {

+       if ( $AxisSettings["Identity"] == AXIS_X ) { $GotXAxis = TRUE; }

+       if ( $AxisSettings["Identity"] == AXIS_Y ) { $GotYAxis = TRUE; }

+      }

+     if ( !$GotXAxis ) { return(SCATTER_MISSING_X_SERIE); }

+     if ( !$GotYAxis ) { return(SCATTER_MISSING_Y_SERIE); }

+

+     /* Skip a NOTICE event in case of an empty array */

+     if ( $DrawYLines == NONE ) { $DrawYLines = array("zarma"=>"31"); }

+

+     $Data = $this->pDataObject->getData();

+

+     foreach($Data["Axis"] as $AxisID => $AxisSettings)

+      {

+       if ( $AxisSettings["Identity"] == AXIS_X)

+        { $Width = $this->pChartObject->GraphAreaX2 - $this->pChartObject->GraphAreaX1 - $XMargin*2; }

+       else

+        { $Width = $this->pChartObject->GraphAreaY2 - $this->pChartObject->GraphAreaY1 - $YMargin*2; }

+

+       $AxisMin = ABSOLUTE_MAX; $AxisMax = OUT_OF_SIGHT;

+       if ( $Mode == SCALE_MODE_FLOATING )

+        {

+         foreach($Data["Series"] as $SerieID => $SerieParameter)

+          {

+           if ( $SerieParameter["Axis"] == $AxisID && $Data["Series"][$SerieID]["isDrawable"] )

+            {

+             $AxisMax = max($AxisMax,$Data["Series"][$SerieID]["Max"]);

+             $AxisMin = min($AxisMin,$Data["Series"][$SerieID]["Min"]);

+            }

+          }

+         $AutoMargin = (($AxisMax-$AxisMin)/100)*$XReleasePercent;

+

+         $Data["Axis"][$AxisID]["Min"] = $AxisMin-$AutoMargin; $Data["Axis"][$AxisID]["Max"] = $AxisMax+$AutoMargin;

+        }

+       elseif ( $Mode == SCALE_MODE_MANUAL )

+        {

+         if ( isset($ManualScale[$AxisID]["Min"]) && isset($ManualScale[$AxisID]["Max"]) )

+          {

+           $Data["Axis"][$AxisID]["Min"] = $ManualScale[$AxisID]["Min"];

+           $Data["Axis"][$AxisID]["Max"] = $ManualScale[$AxisID]["Max"];

+          }

+         else

+          { echo "Manual scale boundaries not set."; exit(); }

+        }

+

+       /* Full manual scale */

+       if ( isset($ManualScale[$AxisID]["Rows"]) && isset($ManualScale[$AxisID]["RowHeight"]) )

+        $Scale = array("Rows"=>$ManualScale[$AxisID]["Rows"],"RowHeight"=>$ManualScale[$AxisID]["RowHeight"],"XMin"=>$ManualScale[$AxisID]["Min"],"XMax"=>$ManualScale[$AxisID]["Max"]);

+       else

+        {

+         $MaxDivs = floor($Width/$MinDivHeight);

+         $Scale   = $this->pChartObject->computeScale($Data["Axis"][$AxisID]["Min"],$Data["Axis"][$AxisID]["Max"],$MaxDivs,$Factors,$AxisID);

+        }

+

+       $Data["Axis"][$AxisID]["Margin"]    = $AxisSettings["Identity"] == AXIS_X ? $XMargin : $YMargin;

+       $Data["Axis"][$AxisID]["ScaleMin"]  = $Scale["XMin"];

+       $Data["Axis"][$AxisID]["ScaleMax"]  = $Scale["XMax"];

+       $Data["Axis"][$AxisID]["Rows"]      = $Scale["Rows"];

+       $Data["Axis"][$AxisID]["RowHeight"] = $Scale["RowHeight"];

+

+       if ( isset($Scale["Format"]) ) { $Data["Axis"][$AxisID]["Format"] = $Scale["Format"]; }

+

+       if ( !isset($Data["Axis"][$AxisID]["Display"]) ) { $Data["Axis"][$AxisID]["Display"] = NULL; }

+       if ( !isset($Data["Axis"][$AxisID]["Format"]) )  { $Data["Axis"][$AxisID]["Format"] = NULL; }

+       if ( !isset($Data["Axis"][$AxisID]["Unit"]) )    { $Data["Axis"][$AxisID]["Unit"] = NULL; }

+      }

+

+     /* Get the default font color */

+     $FontColorRo = $this->pChartObject->FontColorR; $FontColorGo = $this->pChartObject->FontColorG; $FontColorBo = $this->pChartObject->FontColorB;

+

+     /* Set the original boundaries */

+     $AxisPos["L"] = $this->pChartObject->GraphAreaX1; $AxisPos["R"] = $this->pChartObject->GraphAreaX2; $AxisPos["T"] = $this->pChartObject->GraphAreaY1; $AxisPos["B"] = $this->pChartObject->GraphAreaY2;

+

+     foreach($Data["Axis"] as $AxisID => $AxisSettings)

+      {

+       if ( isset($AxisSettings["Color"]) )

+        {

+         $AxisR = $AxisSettings["Color"]["R"]; $AxisG = $AxisSettings["Color"]["G"]; $AxisB = $AxisSettings["Color"]["B"];

+         $TickR = $AxisSettings["Color"]["R"]; $TickG = $AxisSettings["Color"]["G"]; $TickB = $AxisSettings["Color"]["B"];

+         $this->pChartObject->setFontProperties(array("R"=>$AxisSettings["Color"]["R"],"G"=>$AxisSettings["Color"]["G"],"B"=>$AxisSettings["Color"]["B"]));

+        }

+       else

+        {

+         $AxisR = $AxisRo; $AxisG = $AxisGo; $AxisB = $AxisBo;

+         $TickR = $TickRo; $TickG = $TickGo; $TickB = $TickBo;

+         $this->pChartObject->setFontProperties(array("R"=>$FontColorRo,"G"=>$FontColorGo,"B"=>$FontColorBo));

+        }

+

+       $LastValue = "w00t"; $ID = 1;

+       if ( $AxisSettings["Identity"] == AXIS_X )

+        {

+         if ( $AxisSettings["Position"] == AXIS_POSITION_BOTTOM )

+          {

+           if ( $XLabelsRotation == 0 )				   { $LabelAlign = TEXT_ALIGN_TOPMIDDLE; $LabelOffset = 2; }

+           if ( $XLabelsRotation > 0 && $XLabelsRotation < 190 )   { $LabelAlign = TEXT_ALIGN_MIDDLERIGHT; $LabelOffset = 5; }

+           if ( $XLabelsRotation == 180 )			   { $LabelAlign = TEXT_ALIGN_BOTTOMMIDDLE; $LabelOffset = 5; }

+           if ( $XLabelsRotation > 180 && $XLabelsRotation < 360 ) { $LabelAlign = TEXT_ALIGN_MIDDLELEFT; $LabelOffset = 2; }

+

+           if ( $Floating )

+            { $FloatingOffset = $YMargin; $this->pChartObject->drawLine($this->pChartObject->GraphAreaX1+$AxisSettings["Margin"],$AxisPos["B"],$this->pChartObject->GraphAreaX2-$AxisSettings["Margin"],$AxisPos["B"],array("R"=>$AxisR,"G"=>$AxisG,"B"=>$AxisB,"Alpha"=>$AxisAlpha)); }

+           else

+            { $FloatingOffset = 0; $this->pChartObject->drawLine($this->pChartObject->GraphAreaX1,$AxisPos["B"],$this->pChartObject->GraphAreaX2,$AxisPos["B"],array("R"=>$AxisR,"G"=>$AxisG,"B"=>$AxisB,"Alpha"=>$AxisAlpha)); }

+

+           if ( $DrawArrows ) { $this->pChartObject->drawArrow($this->pChartObject->GraphAreaX2-$AxisSettings["Margin"],$AxisPos["B"],$this->pChartObject->GraphAreaX2+($ArrowSize*2),$AxisPos["B"],array("FillR"=>$AxisR,"FillG"=>$AxisG,"FillB"=>$AxisB,"Size"=>$ArrowSize)); }

+

+           $Width = ($this->pChartObject->GraphAreaX2 - $this->pChartObject->GraphAreaX1) - $AxisSettings["Margin"]*2;

+           $Step   = $Width / $AxisSettings["Rows"]; $SubTicksSize = $Step /2; $MaxBottom = $AxisPos["B"];

+           $LastX  = NULL;

+           for($i=0;$i<=$AxisSettings["Rows"];$i++)

+            {

+             $XPos  = $this->pChartObject->GraphAreaX1 + $AxisSettings["Margin"] + $Step*$i;

+             $YPos  = $AxisPos["B"];

+             $Value = $this->pChartObject->scaleFormat($AxisSettings["ScaleMin"] + $AxisSettings["RowHeight"]*$i,$AxisSettings["Display"],$AxisSettings["Format"],$AxisSettings["Unit"]);

+

+             if ( $i%2 == 1 ) { $BGColor = array("R"=>$BackgroundR1,"G"=>$BackgroundG1,"B"=>$BackgroundB1,"Alpha"=>$BackgroundAlpha1); } else { $BGColor = array("R"=>$BackgroundR2,"G"=>$BackgroundG2,"B"=>$BackgroundB2,"Alpha"=>$BackgroundAlpha2); }

+             if ( $LastX != NULL && $CycleBackground  && ( $DrawXLines == ALL || in_array($AxisID,$DrawXLines) )) { $this->pChartObject->drawFilledRectangle($LastX,$this->pChartObject->GraphAreaY1+$FloatingOffset,$XPos,$this->pChartObject->GraphAreaY2-$FloatingOffset,$BGColor); }

+

+             if ( $DrawXLines == ALL || in_array($AxisID,$DrawXLines) ) { $this->pChartObject->drawLine($XPos,$this->pChartObject->GraphAreaY1+$FloatingOffset,$XPos,$this->pChartObject->GraphAreaY2-$FloatingOffset,array("R"=>$GridR,"G"=>$GridG,"B"=>$GridB,"Alpha"=>$GridAlpha,"Ticks"=>$GridTicks)); }

+             if ( $DrawSubTicks && $i != $AxisSettings["Rows"] )

+              $this->pChartObject->drawLine($XPos+$SubTicksSize,$YPos-$InnerSubTickWidth,$XPos+$SubTicksSize,$YPos+$OuterSubTickWidth,array("R"=>$SubTickR,"G"=>$SubTickG,"B"=>$SubTickB,"Alpha"=>$SubTickAlpha));

+

+             $this->pChartObject->drawLine($XPos,$YPos-$InnerTickWidth,$XPos,$YPos+$OuterTickWidth,array("R"=>$TickR,"G"=>$TickG,"B"=>$TickB,"Alpha"=>$TickAlpha));

+             $Bounds    = $this->pChartObject->drawText($XPos,$YPos+$OuterTickWidth+$LabelOffset,$Value,array("Angle"=>$XLabelsRotation,"Align"=>$LabelAlign));

+             $TxtBottom = $YPos+2+$OuterTickWidth+2+($Bounds[0]["Y"]-$Bounds[2]["Y"]);

+             $MaxBottom = max($MaxBottom,$TxtBottom);

+

+             $LastX = $XPos;

+            }

+

+           if ( isset($AxisSettings["Name"]) )

+            {

+             $YPos   = $MaxBottom+2;

+             $XPos   = $this->pChartObject->GraphAreaX1+($this->pChartObject->GraphAreaX2-$this->pChartObject->GraphAreaX1)/2;

+             $Bounds = $this->pChartObject->drawText($XPos,$YPos,$AxisSettings["Name"],array("Align"=>TEXT_ALIGN_TOPMIDDLE));

+             $MaxBottom = $Bounds[0]["Y"];

+

+             $this->pDataObject->Data["GraphArea"]["Y2"] = $MaxBottom + $this->pChartObject->FontSize;

+            }

+

+           $AxisPos["B"] = $MaxBottom + $ScaleSpacing;

+          }

+         elseif ( $AxisSettings["Position"] == AXIS_POSITION_TOP )

+          {

+           if ( $XLabelsRotation == 0 )					{ $LabelAlign = TEXT_ALIGN_BOTTOMMIDDLE; $LabelOffset = 2; }

+           if ( $XLabelsRotation > 0 && $XLabelsRotation < 190 )	{ $LabelAlign = TEXT_ALIGN_MIDDLELEFT; $LabelOffset = 2; }

+           if ( $XLabelsRotation == 180 )				{ $LabelAlign = TEXT_ALIGN_TOPMIDDLE; $LabelOffset = 5; }

+           if ( $XLabelsRotation > 180 && $SLabelxRotation < 360 )	{ $LabelAlign = TEXT_ALIGN_MIDDLERIGHT; $LabelOffset = 5; }

+

+           if ( $Floating )

+            { $FloatingOffset = $YMargin; $this->pChartObject->drawLine($this->pChartObject->GraphAreaX1+$AxisSettings["Margin"],$AxisPos["T"],$this->pChartObject->GraphAreaX2-$AxisSettings["Margin"],$AxisPos["T"],array("R"=>$AxisR,"G"=>$AxisG,"B"=>$AxisB,"Alpha"=>$AxisAlpha)); }

+           else

+            { $FloatingOffset = 0; $this->pChartObject->drawLine($this->pChartObject->GraphAreaX1,$AxisPos["T"],$this->pChartObject->GraphAreaX2,$AxisPos["T"],array("R"=>$AxisR,"G"=>$AxisG,"B"=>$AxisB,"Alpha"=>$AxisAlpha)); }

+

+           if ( $DrawArrows ) { $this->pChartObject->drawArrow($this->pChartObject->GraphAreaX2-$AxisSettings["Margin"],$AxisPos["T"],$this->pChartObject->GraphAreaX2+($ArrowSize*2),$AxisPos["T"],array("FillR"=>$AxisR,"FillG"=>$AxisG,"FillB"=>$AxisB,"Size"=>$ArrowSize)); }

+

+           $Width = ($this->pChartObject->GraphAreaX2 - $this->pChartObject->GraphAreaX1) - $AxisSettings["Margin"]*2;

+           $Step   = $Width / $AxisSettings["Rows"]; $SubTicksSize = $Step /2; $MinTop = $AxisPos["T"];

+           $LastX  = NULL;

+           for($i=0;$i<=$AxisSettings["Rows"];$i++)

+            {

+             $XPos  = $this->pChartObject->GraphAreaX1 + $AxisSettings["Margin"] + $Step*$i;

+             $YPos  = $AxisPos["T"];

+             $Value = $this->pChartObject->scaleFormat($AxisSettings["ScaleMin"] + $AxisSettings["RowHeight"]*$i,$AxisSettings["Display"],$AxisSettings["Format"],$AxisSettings["Unit"]);

+

+             if ( $i%2 == 1 ) { $BGColor = array("R"=>$BackgroundR1,"G"=>$BackgroundG1,"B"=>$BackgroundB1,"Alpha"=>$BackgroundAlpha1); } else { $BGColor = array("R"=>$BackgroundR2,"G"=>$BackgroundG2,"B"=>$BackgroundB2,"Alpha"=>$BackgroundAlpha2); }

+             if ( $LastX != NULL && $CycleBackground  && ( $DrawXLines == ALL || in_array($AxisID,$DrawXLines) )) { $this->pChartObject->drawFilledRectangle($LastX,$this->pChartObject->GraphAreaY1+$FloatingOffset,$XPos,$this->pChartObject->GraphAreaY2-$FloatingOffset,$BGColor); }

+

+             if ( $DrawXLines == ALL || in_array($AxisID,$DrawXLines) ) { $this->pChartObject->drawLine($XPos,$this->pChartObject->GraphAreaY1+$FloatingOffset,$XPos,$this->pChartObject->GraphAreaY2-$FloatingOffset,array("R"=>$GridR,"G"=>$GridG,"B"=>$GridB,"Alpha"=>$GridAlpha,"Ticks"=>$GridTicks)); }

+

+             if ( $DrawSubTicks && $i != $AxisSettings["Rows"] )

+              $this->pChartObject->drawLine($XPos+$SubTicksSize,$YPos-$OuterSubTickWidth,$XPos+$SubTicksSize,$YPos+$InnerSubTickWidth,array("R"=>$SubTickR,"G"=>$SubTickG,"B"=>$SubTickB,"Alpha"=>$SubTickAlpha));

+

+             $this->pChartObject->drawLine($XPos,$YPos-$OuterTickWidth,$XPos,$YPos+$InnerTickWidth,array("R"=>$TickR,"G"=>$TickG,"B"=>$TickB,"Alpha"=>$TickAlpha));

+             $Bounds = $this->pChartObject->drawText($XPos,$YPos-$OuterTickWidth-$LabelOffset,$Value,array("Angle"=>$XLabelsRotation,"Align"=>$LabelAlign));

+             $TxtBox = $YPos-$OuterTickWidth-4-($Bounds[0]["Y"]-$Bounds[2]["Y"]);

+             $MinTop = min($MinTop,$TxtBox);

+

+             $LastX = $XPos;

+            }

+

+           if ( isset($AxisSettings["Name"]) )

+            {

+             $YPos   = $MinTop-2;

+             $XPos   = $this->pChartObject->GraphAreaX1+($this->pChartObject->GraphAreaX2-$this->pChartObject->GraphAreaX1)/2;

+             $Bounds = $this->pChartObject->drawText($XPos,$YPos,$AxisSettings["Name"],array("Align"=>TEXT_ALIGN_BOTTOMMIDDLE));

+             $MinTop = $Bounds[2]["Y"];

+

+             $this->pDataObject->Data["GraphArea"]["Y1"] = $MinTop;

+            }

+

+           $AxisPos["T"] = $MinTop - $ScaleSpacing;

+          }

+        }

+       elseif ( $AxisSettings["Identity"] == AXIS_Y )

+        {

+         if ( $AxisSettings["Position"] == AXIS_POSITION_LEFT )

+          {

+

+           if ( $Floating )

+            { $FloatingOffset = $XMargin; $this->pChartObject->drawLine($AxisPos["L"],$this->pChartObject->GraphAreaY1+$AxisSettings["Margin"],$AxisPos["L"],$this->pChartObject->GraphAreaY2-$AxisSettings["Margin"],array("R"=>$AxisR,"G"=>$AxisG,"B"=>$AxisB,"Alpha"=>$AxisAlpha)); }

+           else

+            { $FloatingOffset = 0; $this->pChartObject->drawLine($AxisPos["L"],$this->pChartObject->GraphAreaY1,$AxisPos["L"],$this->pChartObject->GraphAreaY2,array("R"=>$AxisR,"G"=>$AxisG,"B"=>$AxisB,"Alpha"=>$AxisAlpha)); }

+

+           if ( $DrawArrows ) { $this->pChartObject->drawArrow($AxisPos["L"],$this->pChartObject->GraphAreaY1+$AxisSettings["Margin"],$AxisPos["L"],$this->pChartObject->GraphAreaY1-($ArrowSize*2),array("FillR"=>$AxisR,"FillG"=>$AxisG,"FillB"=>$AxisB,"Size"=>$ArrowSize)); }

+

+           $Height = ($this->pChartObject->GraphAreaY2 - $this->pChartObject->GraphAreaY1) - $AxisSettings["Margin"]*2;

+           $Step   = $Height / $AxisSettings["Rows"]; $SubTicksSize = $Step /2; $MinLeft = $AxisPos["L"];

+           $LastY  = NULL;

+           for($i=0;$i<=$AxisSettings["Rows"];$i++)

+            {

+             $YPos  = $this->pChartObject->GraphAreaY2 - $AxisSettings["Margin"] - $Step*$i;

+             $XPos  = $AxisPos["L"];

+             $Value = $this->pChartObject->scaleFormat($AxisSettings["ScaleMin"] + $AxisSettings["RowHeight"]*$i,$AxisSettings["Display"],$AxisSettings["Format"],$AxisSettings["Unit"]);

+

+             if ( $i%2 == 1 ) { $BGColor = array("R"=>$BackgroundR1,"G"=>$BackgroundG1,"B"=>$BackgroundB1,"Alpha"=>$BackgroundAlpha1); } else { $BGColor = array("R"=>$BackgroundR2,"G"=>$BackgroundG2,"B"=>$BackgroundB2,"Alpha"=>$BackgroundAlpha2); }

+             if ( $LastY != NULL && $CycleBackground && ( $DrawYLines == ALL || in_array($AxisID,$DrawYLines) )) { $this->pChartObject->drawFilledRectangle($this->pChartObject->GraphAreaX1+$FloatingOffset,$LastY,$this->pChartObject->GraphAreaX2-$FloatingOffset,$YPos,$BGColor); }

+

+             if ( ($YPos != $this->pChartObject->GraphAreaY1 && $YPos != $this->pChartObject->GraphAreaY2) && ($DrawYLines == ALL || in_array($AxisID,$DrawYLines) )) { $this->pChartObject->drawLine($this->pChartObject->GraphAreaX1+$FloatingOffset,$YPos,$this->pChartObject->GraphAreaX2-$FloatingOffset,$YPos,array("R"=>$GridR,"G"=>$GridG,"B"=>$GridB,"Alpha"=>$GridAlpha,"Ticks"=>$GridTicks)); }

+

+             if ( $DrawSubTicks && $i != $AxisSettings["Rows"] )

+              $this->pChartObject->drawLine($XPos-$OuterSubTickWidth,$YPos-$SubTicksSize,$XPos+$InnerSubTickWidth,$YPos-$SubTicksSize,array("R"=>$SubTickR,"G"=>$SubTickG,"B"=>$SubTickB,"Alpha"=>$SubTickAlpha));

+

+             $this->pChartObject->drawLine($XPos-$OuterTickWidth,$YPos,$XPos+$InnerTickWidth,$YPos,array("R"=>$TickR,"G"=>$TickG,"B"=>$TickB,"Alpha"=>$TickAlpha));

+             $Bounds  = $this->pChartObject->drawText($XPos-$OuterTickWidth-2,$YPos,$Value,array("Align"=>TEXT_ALIGN_MIDDLERIGHT));

+             $TxtLeft = $XPos-$OuterTickWidth-2-($Bounds[1]["X"]-$Bounds[0]["X"]);

+             $MinLeft = min($MinLeft,$TxtLeft);

+

+             $LastY = $YPos;

+            }

+

+           if ( isset($AxisSettings["Name"]) )

+            {

+             $XPos    = $MinLeft-2;

+             $YPos    = $this->pChartObject->GraphAreaY1+($this->pChartObject->GraphAreaY2-$this->pChartObject->GraphAreaY1)/2;

+             $Bounds  = $this->pChartObject->drawText($XPos,$YPos,$AxisSettings["Name"],array("Align"=>TEXT_ALIGN_BOTTOMMIDDLE,"Angle"=>90));

+             $MinLeft = $Bounds[2]["X"];

+

+             $this->pDataObject->Data["GraphArea"]["X1"] = $MinLeft;

+            }

+

+           $AxisPos["L"] = $MinLeft - $ScaleSpacing;

+          }

+         elseif ( $AxisSettings["Position"] == AXIS_POSITION_RIGHT )

+          {

+

+           if ( $Floating )

+            { $FloatingOffset = $XMargin; $this->pChartObject->drawLine($AxisPos["R"],$this->pChartObject->GraphAreaY1+$AxisSettings["Margin"],$AxisPos["R"],$this->pChartObject->GraphAreaY2-$AxisSettings["Margin"],array("R"=>$AxisR,"G"=>$AxisG,"B"=>$AxisB,"Alpha"=>$AxisAlpha)); }

+           else

+            { $FloatingOffset = 0; $this->pChartObject->drawLine($AxisPos["R"],$this->pChartObject->GraphAreaY1,$AxisPos["R"],$this->pChartObject->GraphAreaY2,array("R"=>$AxisR,"G"=>$AxisG,"B"=>$AxisB,"Alpha"=>$AxisAlpha)); }

+

+           if ( $DrawArrows ) { $this->pChartObject->drawArrow($AxisPos["R"],$this->pChartObject->GraphAreaY1+$AxisSettings["Margin"],$AxisPos["R"],$this->pChartObject->GraphAreaY1-($ArrowSize*2),array("FillR"=>$AxisR,"FillG"=>$AxisG,"FillB"=>$AxisB,"Size"=>$ArrowSize)); }

+

+           $Height = ($this->pChartObject->GraphAreaY2 - $this->pChartObject->GraphAreaY1) - $AxisSettings["Margin"]*2;

+           $Step   = $Height / $AxisSettings["Rows"]; $SubTicksSize = $Step /2; $MaxLeft = $AxisPos["R"];

+           $LastY  = NULL;

+           for($i=0;$i<=$AxisSettings["Rows"];$i++)

+            {

+             $YPos  = $this->pChartObject->GraphAreaY2 - $AxisSettings["Margin"] - $Step*$i;

+             $XPos  = $AxisPos["R"];

+             $Value = $this->pChartObject->scaleFormat($AxisSettings["ScaleMin"] + $AxisSettings["RowHeight"]*$i,$AxisSettings["Display"],$AxisSettings["Format"],$AxisSettings["Unit"]);

+

+             if ( $i%2 == 1 ) { $BGColor = array("R"=>$BackgroundR1,"G"=>$BackgroundG1,"B"=>$BackgroundB1,"Alpha"=>$BackgroundAlpha1); } else { $BGColor = array("R"=>$BackgroundR2,"G"=>$BackgroundG2,"B"=>$BackgroundB2,"Alpha"=>$BackgroundAlpha2); }

+             if ( $LastY != NULL && $CycleBackground  && ( $DrawYLines == ALL || in_array($AxisID,$DrawYLines) )) { $this->pChartObject->drawFilledRectangle($this->pChartObject->GraphAreaX1+$FloatingOffset,$LastY,$this->pChartObject->GraphAreaX2-$FloatingOffset,$YPos,$BGColor); }

+

+             if ( ($YPos != $this->pChartObject->GraphAreaY1 && $YPos != $this->pChartObject->GraphAreaY2) && ($DrawYLines == ALL || in_array($AxisID,$DrawYLines)) ) { $this->pChartObject->drawLine($this->pChartObject->GraphAreaX1+$FloatingOffset,$YPos,$this->pChartObject->GraphAreaX2-$FloatingOffset,$YPos,array("R"=>$GridR,"G"=>$GridG,"B"=>$GridB,"Alpha"=>$GridAlpha,"Ticks"=>$GridTicks)); }

+

+             if ( $DrawSubTicks && $i != $AxisSettings["Rows"] )

+              $this->pChartObject->drawLine($XPos-$InnerSubTickWidth,$YPos-$SubTicksSize,$XPos+$OuterSubTickWidth,$YPos-$SubTicksSize,array("R"=>$SubTickR,"G"=>$SubTickG,"B"=>$SubTickB,"Alpha"=>$SubTickAlpha));

+

+             $this->pChartObject->drawLine($XPos-$InnerTickWidth,$YPos,$XPos+$OuterTickWidth,$YPos,array("R"=>$TickR,"G"=>$TickG,"B"=>$TickB,"Alpha"=>$TickAlpha));

+             $Bounds  = $this->pChartObject->drawText($XPos+$OuterTickWidth+2,$YPos,$Value,array("Align"=>TEXT_ALIGN_MIDDLELEFT));

+             $TxtLeft = $XPos+$OuterTickWidth+2+($Bounds[1]["X"]-$Bounds[0]["X"]);

+             $MaxLeft = max($MaxLeft,$TxtLeft);

+

+             $LastY = $YPos;

+            }

+

+           if ( isset($AxisSettings["Name"]) )

+            {

+             $XPos    = $MaxLeft+6;

+             $YPos    = $this->pChartObject->GraphAreaY1+($this->pChartObject->GraphAreaY2-$this->pChartObject->GraphAreaY1)/2;

+             $Bounds  = $this->pChartObject->drawText($XPos,$YPos,$AxisSettings["Name"],array("Align"=>TEXT_ALIGN_BOTTOMMIDDLE,"Angle"=>270));

+             $MaxLeft = $Bounds[2]["X"];

+

+             $this->pDataObject->Data["GraphArea"]["X2"] = $MaxLeft + $this->pChartObject->FontSize;

+            }

+

+           $AxisPos["R"] = $MaxLeft + $ScaleSpacing;

+          }

+        }

+      }

+

+     $this->pDataObject->saveAxisConfig($Data["Axis"]);

+    }

+

+   /* Draw a scatter plot chart */

+   function drawScatterPlotChart($Format=NULL)

+    {

+     $PlotSize		= isset($Format["PlotSize"]) ? $Format["PlotSize"] : 3;

+     $PlotBorder	= isset($Format["PlotBorder"]) ? $Format["PlotBorder"] : FALSE;

+     $BorderR		= isset($Format["BorderR"]) ? $Format["BorderR"] : 250;

+     $BorderG		= isset($Format["BorderG"]) ? $Format["BorderG"] : 250;

+     $BorderB		= isset($Format["BorderB"]) ? $Format["BorderB"] : 250;

+     $BorderAlpha	= isset($Format["BorderAlpha"]) ? $Format["BorderAlpha"] : 30;

+     $BorderSize	= isset($Format["BorderSize"]) ? $Format["BorderSize"] : 1;

+     $Surrounding	= isset($Format["Surrounding"]) ? $Format["Surrounding"] : NULL;

+

+     $Data    = $this->pDataObject->getData();

+     $Palette = $this->pDataObject->getPalette();

+

+     $BorderColor = array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB,"Alpha"=>$BorderAlpha);

+

+     foreach($Data["ScatterSeries"] as $Key => $Series)

+      {

+       $SerieX = $Series["X"]; $SerieValuesX = $Data["Series"][$SerieX]["Data"]; $SerieXAxis = $Data["Series"][$SerieX]["Axis"];

+       $SerieY = $Series["Y"]; $SerieValuesY = $Data["Series"][$SerieY]["Data"]; $SerieYAxis = $Data["Series"][$SerieY]["Axis"];

+

+       if ( isset($Series["Picture"]) && $Series["Picture"] != "" )

+        { $Picture = $Series["Picture"]; list($PicWidth,$PicHeight,$PicType) = $this->pChartObject->getPicInfo($Picture); }

+       else

+        { $Picture = NULL; }

+

+       $PosArrayX = $this->getPosArray($SerieValuesX,$SerieXAxis);

+       if ( !is_array($PosArrayX) ) { $Value = $PosArrayX; $PosArrayX = ""; $PosArrayX[0] = $Value; }

+       $PosArrayY = $this->getPosArray($SerieValuesY,$SerieYAxis);

+       if ( !is_array($PosArrayY) ) { $Value = $PosArrayY; $PosArrayY = ""; $PosArrayY[0] = $Value; }

+

+       $Color = array("R"=>$Series["Color"]["R"],"G"=>$Series["Color"]["G"],"B"=>$Series["Color"]["B"],"Alpha"=>$Series["Color"]["Alpha"]);

+

+       foreach($PosArrayX as $Key => $Value)

+        {

+         $X = $Value; $Y = $PosArrayY[$Key];

+

+         if ( $X != VOID && $Y != VOID )

+          {

+           if ( $Picture == NULL )

+            {

+             if ( $PlotBorder ) { $this->pChartObject->drawFilledCircle($X,$Y,$PlotSize+$BorderSize,$BorderColor); }

+             $this->pChartObject->drawFilledCircle($X,$Y,$PlotSize,$Color);

+            }

+           else

+            { $this->pChartObject->drawFromPicture($PicType,$Picture,$X-$PicWidth/2,$Y-$PicHeight/2); }

+          }

+        }

+      }

+    }

+

+   /* Draw a scatter line chart */

+   function drawScatterLineChart($Format=NULL)

+    {

+     $Data    = $this->pDataObject->getData();

+     $Palette = $this->pDataObject->getPalette();

+

+     /* Parse all the series to draw */

+     foreach($Data["ScatterSeries"] as $Key => $Series)

+      {

+       $SerieX = $Series["X"]; $SerieValuesX = $Data["Series"][$SerieX]["Data"]; $SerieXAxis = $Data["Series"][$SerieX]["Axis"];

+       $SerieY = $Series["Y"]; $SerieValuesY = $Data["Series"][$SerieY]["Data"]; $SerieYAxis = $Data["Series"][$SerieY]["Axis"];

+       $Ticks  = $Series["Ticks"];

+       $Weight = $Series["Weight"];

+

+       $PosArrayX = $this->getPosArray($SerieValuesX,$SerieXAxis);

+       if ( !is_array($PosArrayX) ) { $Value = $PosArrayX; $PosArrayX = ""; $PosArrayX[0] = $Value; }

+       $PosArrayY = $this->getPosArray($SerieValuesY,$SerieYAxis);

+       if ( !is_array($PosArrayY) ) { $Value = $PosArrayY; $PosArrayY = ""; $PosArrayY[0] = $Value; }

+

+       $Color = array("R"=>$Series["Color"]["R"],"G"=>$Series["Color"]["G"],"B"=>$Series["Color"]["B"],"Alpha"=>$Series["Color"]["Alpha"]);

+       if ( $Ticks != 0 )  { $Color["Ticks"]  = $Ticks; }

+       if ( $Weight != 0 ) { $Color["Weight"] = $Weight; }

+

+       $LastX = VOID; $LastY = VOID;

+       foreach($PosArrayX as $Key => $Value)

+        {

+         $X = $Value; $Y = $PosArrayY[$Key];

+

+         if ( $X != VOID && $Y != VOID && $LastX != VOID && $LastY != VOID)

+          $this->pChartObject->drawLine($LastX,$LastY,$X,$Y,$Color);

+

+         $LastX = $X; $LastY = $Y;

+        }

+      }

+    }

+

+   /* Draw a scatter spline chart */

+   function drawScatterSplineChart($Format=NULL)

+    {

+     $Data    = $this->pDataObject->getData();

+     $Palette = $this->pDataObject->getPalette();

+

+     foreach($Data["ScatterSeries"] as $Key => $Series)

+      {

+       $SerieX = $Series["X"]; $SerieValuesX = $Data["Series"][$SerieX]["Data"]; $SerieXAxis = $Data["Series"][$SerieX]["Axis"];

+       $SerieY = $Series["Y"]; $SerieValuesY = $Data["Series"][$SerieY]["Data"]; $SerieYAxis = $Data["Series"][$SerieY]["Axis"];

+       $Ticks  = $Series["Ticks"];

+       $Weight = $Series["Weight"];

+

+       $PosArrayX = $this->getPosArray($SerieValuesX,$SerieXAxis);

+       if ( !is_array($PosArrayX) ) { $Value = $PosArrayX; $PosArrayX = ""; $PosArrayX[0] = $Value; }

+       $PosArrayY = $this->getPosArray($SerieValuesY,$SerieYAxis);

+       if ( !is_array($PosArrayY) ) { $Value = $PosArrayY; $PosArrayY = ""; $PosArrayY[0] = $Value; }

+

+       $SplineSettings = array("R"=>$Series["Color"]["R"],"G"=>$Series["Color"]["G"],"B"=>$Series["Color"]["B"],"Alpha"=>$Series["Color"]["Alpha"]);

+       if ( $Ticks != 0 )  { $SplineSettings["Ticks"]  = $Ticks; }

+       if ( $Weight != 0 ) { $SplineSettings["Weight"] = $Weight; }

+

+       $LastX = VOID; $LastY = VOID; $WayPoints = ""; $Forces = "";

+       foreach($PosArrayX as $Key => $Value)

+        {

+         $X = $Value; $Y = $PosArrayY[$Key];

+

+         $Force = $this->pChartObject->getLength($LastX,$LastY,$X,$Y)/5;

+

+         if ( $X != VOID && $Y != VOID )

+          { $WayPoints[] = array($X,$Y); $Forces[] = $Force; }

+

+         if ( $Y == VOID && $LastY != NULL )

+          { $SplineSettings["Forces"] = $Forces; $this->pChartObject->drawSpline($WayPoints,$SplineSettings); $WayPoints = ""; $Forces = "";}

+

+         $LastX = $X; $LastY = $Y;

+        }

+       $SplineSettings["Forces"] = $Forces; 

+       $this->pChartObject->drawSpline($WayPoints,$SplineSettings);

+      }

+    }

+

+   /* Return the scaled plot position */

+   function getPosArray($Values,$AxisID)

+    {

+     $Data = $this->pDataObject->getData();

+

+     if ( !is_array($Values) ) { $Values = array($Values); }

+

+     if ( $Data["Axis"][$AxisID]["Identity"] == AXIS_X )

+      {

+       $Height      = ($this->pChartObject->GraphAreaX2 - $this->pChartObject->GraphAreaX1) - $Data["Axis"][$AxisID]["Margin"]*2;

+       $ScaleHeight = $Data["Axis"][$AxisID]["ScaleMax"] - $Data["Axis"][$AxisID]["ScaleMin"];

+       $Step        = $Height / $ScaleHeight;

+

+       $Result = "";

+       foreach($Values as $Key => $Value)

+        {

+         if ( $Value == VOID ) 

+          $Result[] = VOID;

+         else

+          $Result[] = $this->pChartObject->GraphAreaX1 + $Data["Axis"][$AxisID]["Margin"] + ($Step * ($Value-$Data["Axis"][$AxisID]["ScaleMin"]));

+        }

+

+       if ( count($Result) == 1 ) { return($Result[0]); } else { return($Result); }

+      }

+     else

+      {

+       $Height      = ($this->pChartObject->GraphAreaY2 - $this->pChartObject->GraphAreaY1) - $Data["Axis"][$AxisID]["Margin"]*2;

+       $ScaleHeight = $Data["Axis"][$AxisID]["ScaleMax"] - $Data["Axis"][$AxisID]["ScaleMin"];

+       $Step        = $Height / $ScaleHeight;

+

+       $Result = "";

+       foreach($Values as $Key => $Value)

+        {

+         if ( $Value == VOID ) 

+          $Result[] = VOID;

+         else

+          $Result[] = $this->pChartObject->GraphAreaY2 - $Data["Axis"][$AxisID]["Margin"] - ($Step * ($Value-$Data["Axis"][$AxisID]["ScaleMin"]));