Heuristic ranking analysis
[contractdashboard.git] / lib / pChart2.1.0 / class / pBubble.class.php
blob:a/lib/pChart2.1.0/class/pBubble.class.php -> blob:b/lib/pChart2.1.0/class/pBubble.class.php
  <?php
  /*
  pBubble - class to draw bubble 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.
  */
   
  /* pBubble class definition */
  class pBubble
  {
  var $pChartObject;
  var $pDataObject;
   
  /* Class creator */
  function pBubble($pChartObject,$pDataObject)
  {
  $this->pChartObject = $pChartObject;
  $this->pDataObject = $pDataObject;
  }
   
  /* Prepare the scale */
  function bubbleScale($DataSeries,$WeightSeries)
  {
  if ( !is_array($DataSeries) ) { $DataSeries = array($DataSeries); }
  if ( !is_array($WeightSeries) ) { $WeightSeries = array($WeightSeries); }
   
  /* Parse each data series to find the new min & max boundaries to scale */
  $NewPositiveSerie = ""; $NewNegativeSerie = ""; $MaxValues = 0; $LastPositive = 0; $LastNegative = 0;
  foreach($DataSeries as $Key => $SerieName)
  {
  $SerieWeightName = $WeightSeries[$Key];
   
  $this->pDataObject->setSerieDrawable($SerieWeightName,FALSE);
   
  if ( count($this->pDataObject->Data["Series"][$SerieName]["Data"]) > $MaxValues ) { $MaxValues = count($this->pDataObject->Data["Series"][$SerieName]["Data"]); }
   
  foreach($this->pDataObject->Data["Series"][$SerieName]["Data"] as $Key => $Value)
  {
  if ( $Value >= 0 )
  {
  $BubbleBounds = $Value + $this->pDataObject->Data["Series"][$SerieWeightName]["Data"][$Key];
   
  if ( !isset($NewPositiveSerie[$Key]) )
  { $NewPositiveSerie[$Key] = $BubbleBounds; }
  elseif ( $NewPositiveSerie[$Key] < $BubbleBounds )
  { $NewPositiveSerie[$Key] = $BubbleBounds; }
   
  $LastPositive = $BubbleBounds;
  }
  else
  {
  $BubbleBounds = $Value - $this->pDataObject->Data["Series"][$SerieWeightName]["Data"][$Key];
   
  if ( !isset($NewNegativeSerie[$Key]) )
  { $NewNegativeSerie[$Key] = $BubbleBounds; }
  elseif ( $NewNegativeSerie[$Key] > $BubbleBounds )
  { $NewNegativeSerie[$Key] = $BubbleBounds; }
   
  $LastNegative = $BubbleBounds;
  }
  }
  }
   
  /* Check for missing values and all the fake positive serie */
  if ( $NewPositiveSerie != "" )
  {
  for ($i=0; $i<$MaxValues; $i++) { if (!isset($NewPositiveSerie[$i])) { $NewPositiveSerie[$i] = $LastPositive; } }
   
  $this->pDataObject->addPoints($NewPositiveSerie,"BubbleFakePositiveSerie");
  }
   
  /* Check for missing values and all the fake negative serie */
  if ( $NewNegativeSerie != "" )
  {
  for ($i=0; $i<$MaxValues; $i++) { if (!isset($NewNegativeSerie[$i])) { $NewNegativeSerie[$i] = $LastNegative; } }
   
  $this->pDataObject->addPoints($NewNegativeSerie,"BubbleFakeNegativeSerie");
  }
  }
   
  function resetSeriesColors()
  {
  $Data = $this->pDataObject->getData();
  $Palette = $this->pDataObject->getPalette();
   
  $ID = 0;
  foreach($Data["Series"] as $SerieName => $SeriesParameters)
  {
  if ( $SeriesParameters["isDrawable"] )
  {
  $this->pDataObject->Data["Series"][$SerieName]["Color"]["R"] = $Palette[$ID]["R"];
  $this->pDataObject->Data["Series"][$SerieName]["Color"]["G"] = $Palette[$ID]["G"];
  $this->pDataObject->Data["Series"][$SerieName]["Color"]["B"] = $Palette[$ID]["B"];
  $this->pDataObject->Data["Series"][$SerieName]["Color"]["Alpha"] = $Palette[$ID]["Alpha"];
  $ID++;
  }
  }
  }
   
  /* Prepare the scale */
  function drawBubbleChart($DataSeries,$WeightSeries,$Format="")
  {
  $DrawBorder = isset($Format["DrawBorder"]) ? $Format["DrawBorder"] : TRUE;
  $DrawSquare = isset($Format["DrawSquare"]) ? $Format["DrawSquare"] : FALSE;
  $Surrounding = isset($Format["Surrounding"]) ? $Format["Surrounding"] : NULL;
  $BorderR = isset($Format["BorderR"]) ? $Format["BorderR"] : 0;
  $BorderG = isset($Format["BorderG"]) ? $Format["BorderG"] : 0;
  $BorderB = isset($Format["BorderB"]) ? $Format["BorderB"] : 0;
  $BorderAlpha = isset($Format["BorderAlpha"]) ? $Format["BorderAlpha"] : 30;
   
  if ( !is_array($DataSeries) ) { $DataSeries = array($DataSeries); }
  if ( !is_array($WeightSeries) ) { $WeightSeries = array($WeightSeries); }
   
  $Data = $this->pDataObject->getData();
  $Palette = $this->pDataObject->getPalette();
   
  if ( isset($Data["Series"]["BubbleFakePositiveSerie"] ) ) { $this->pDataObject->setSerieDrawable("BubbleFakePositiveSerie",FALSE); }
  if ( isset($Data["Series"]["BubbleFakeNegativeSerie"] ) ) { $this->pDataObject->setSerieDrawable("BubbleFakeNegativeSerie",FALSE); }
   
  $this->resetSeriesColors();
   
  list($XMargin,$XDivs) = $this->pChartObject->scaleGetXSettings();
   
  foreach($DataSeries as $Key => $SerieName)
  {
  $AxisID = $Data["Series"][$SerieName]["Axis"];
  $Mode = $Data["Axis"][$AxisID]["Display"];
  $Format = $Data["Axis"][$AxisID]["Format"];
  $Unit = $Data["Axis"][$AxisID]["Unit"];
   
  $XStep = ($this->pChartObject->GraphAreaX2-$this->pChartObject->GraphAreaX1-$XMargin*2)/$XDivs;
   
  $X = $this->pChartObject->GraphAreaX1 + $XMargin;
  $Y = $this->pChartObject->GraphAreaY1 + $XMargin;
   
  $Color = array("R"=>$Palette[$Key]["R"],"G"=>$Palette[$Key]["G"],"B"=>$Palette[$Key]["B"],"Alpha"=>$Palette[$Key]["Alpha"]);
   
  if ( $DrawBorder )
  {
  $Color["BorderAlpha"] = $BorderAlpha;
   
  if ( $Surrounding != NULL )
  { $Color["BorderR"] = $Palette[$Key]["R"]+$Surrounding; $Color["BorderG"] = $Palette[$Key]["G"]+$Surrounding; $Color["BorderB"] = $Palette[$Key]["B"]+$Surrounding; }
  else
  { $Color["BorderR"] = $BorderR; $Color["BorderG"] = $BorderG; $Color["BorderB"] = $BorderB; }
  }
   
  foreach($Data["Series"][$SerieName]["Data"] as $iKey => $Point)
  {
  $Weight = $Point + $Data["Series"][$WeightSeries[$Key]]["Data"][$iKey];
   
  $PosArray = $this->pChartObject->scaleComputeY($Point,array("AxisID"=>$AxisID));
  $WeightArray = $this->pChartObject->scaleComputeY($Weight,array("AxisID"=>$AxisID));
   
  if ( $Data["Orientation"] == SCALE_POS_LEFTRIGHT )
  {
  if ( $XDivs == 0 ) { $XStep = 0; } else { $XStep = ($this->pChartObject->GraphAreaX2-$this->pChartObject->GraphAreaX1-$XMargin*2)/$XDivs; }
  $Y = floor($PosArray); $CircleRadius = floor(abs($PosArray - $WeightArray)/2);
   
  if ( $DrawSquare )
  $this->pChartObject->drawFilledRectangle($X-$CircleRadius,$Y-$CircleRadius,$X+$CircleRadius,$Y+$CircleRadius,$Color);
  else
  $this->pChartObject->drawFilledCircle($X,$Y,$CircleRadius,$Color);
   
  $X = $X + $XStep;
  }
  elseif ( $Data["Orientation"] == SCALE_POS_TOPBOTTOM )
  {
  if ( $XDivs == 0 ) { $XStep = 0; } else { $XStep = ($this->pChartObject->GraphAreaY2-$this->pChartObject->GraphAreaY1-$XMargin*2)/$XDivs; }
  $X = floor($PosArray); $CircleRadius = floor(abs($PosArray - $WeightArray)/2);
   
  if ( $DrawSquare )
  $this->pChartObject->drawFilledRectangle($X-$CircleRadius,$Y-$CircleRadius,$X+$CircleRadius,$Y+$CircleRadius,$Color);
  else
  $this->pChartObject->drawFilledCircle($X,$Y,$CircleRadius,$Color);
   
  $Y = $Y + $XStep;
  }
  }
  }
  }
  }
  ?>