Merge branch 'master' of ssh://apples.lambdacomplex.org/git/contractdashboard
Merge branch 'master' of ssh://apples.lambdacomplex.org/git/contractdashboard

file:a/about.php -> file:b/about.php
--- a/about.php
+++ b/about.php
@@ -19,13 +19,12 @@
 orem ipsum dolor sit amet, consectetuer adipiscing elit orem ipsum dolor sit amet, consectetuer adipiscing elit

 </div>

 </div>

+<?php CNDistributionGraph(); ?>

+sourced from austender

 

-sourced from austender

 Government Agency Information (2009-07-10): National Archives of Australia, http://www.naa.gov.au under Creative Commons - Attribution 2.5 Australia (CC-BY)

-jpgraph for php

+

 ABR

-Redhat Liberation fonts

-

 

 <?php

 include_once("./lib/common.inc.php");


file:a/admin/displayUNSPSC.php (deleted)
--- a/admin/displayUNSPSC.php
+++ /dev/null
@@ -1,24 +1,1 @@
-<?php

-error_reporting(E_ALL);

-  include_once("../lib/common.inc.php");

-

-

-$unspscresult= $conn->prepare('select * from "UNSPSCcategories";');

-$unspscresult->execute();

-foreach ($unspscresult->fetchAll() as $row) {

-	$unspsc[$row['UNSPSC']] = $row['Title'];

-

-}

-$catsresult = $conn->prepare('SELECT substr( "categoryUNSPSC"::text, 0, 2 ) as cat , SUM( "value" ) as value

-FROM contractnotice

-GROUP BY cat ;');

-echo "<table>";

-$catsresult->execute();

-foreach ($catsresult->fetchAll() as $row) {

-	$catName = $unspsc[$row['cat']."0000000"].$row['cat'];

-	if ($row['cat'] == "") $catName = "null";

-	

-	echo "<tr><td>$catName</td><td>".$row['value']."</td></tr>";

-}

-?>

 

--- a/admin/import.php
+++ b/admin/import.php
@@ -60,6 +60,7 @@
                       if (($datamapping0711[$headers[$c]]) == "parentCN" || ($datamapping0711[$headers[$c]]) == "CNID") {
                           $data[$c] = substr($data[$c], 2); // take off the "CN" prefix
                           $data[$c] = str_replace("-A","00",$data[$c]); // make amendments really big numbers
+                          if (!is_numeric($data[$c])) die ($data[$c]." is not numeric");
                           if ($data[$c] > 0) {
                               $contractNoticeInsert[] = $data[$c];
                           } else {
@@ -166,5 +167,13 @@
       echo "<br> $success records successfully created";
       flush();
   }
+  // run post import data processing
+  // cn
+  include("linkAmendments.php");
+  include("updateUNSPSC.php");
+// agency
+  include("setAgencyStatus.php");
+  include("setAgencyURLABN.php");
+  
 ?>
 

--- a/admin/importUNSPSC.php
+++ b/admin/importUNSPSC.php
@@ -1,5 +1,26 @@
 <?php
   include_once("../lib/common.inc.php");
+
+  // display existing
+
+$unspscresult= $conn->prepare('select * from "UNSPSCcategories";');
+$unspscresult->execute();
+foreach ($unspscresult->fetchAll() as $row) {
+  $unspsc[$row['UNSPSC']] = $row['Title'];
+
+}
+$catsresult = $conn->prepare('SELECT substr( "categoryUNSPSC"::text, 0, 2 ) as cat , SUM( "value" ) as value
+FROM contractnotice
+GROUP BY cat ;');
+echo "<table>";
+$catsresult->execute();
+foreach ($catsresult->fetchAll() as $row) {
+  $catName = $unspsc[$row['cat']."0000000"].$row['cat'];
+  if ($row['cat'] == "") $catName = "null";
+  
+  echo "<tr><td>$catName</td><td>".$row['value']."</td></tr>";
+}
+// import new from file
       $success = 0;
       $fname = "UNSPSC_ECCMA_V13.2_UNDP_V7.csv";
       echo " ============== $fname  ============== <br>";

--- a/admin/linkAmendments.php
+++ b/admin/linkAmendments.php
@@ -1,17 +1,22 @@
 <?php
 include_once ("../lib/common.inc.php");
-$query = 'SELECT "CNID","parentCN","amendmentReason" FROM contractnotice WHERE
-"parentCN" > 0 ';
+$query = 'SELECT c."CNID",c."parentCN",c."amendmentReason",p."childCN" FROM contractnotice as c  LEFT OUTER JOIN contractnotice as p on c."parentCN" = p."CNID"
+WHERE
+c."parentCN" > 0 AND p."childCN" IS NULL ';
 $query = $conn->prepare($query);
 	$query->execute();
 	if (!$query) {
 		databaseError($conn->errorInfo());
 	}
 foreach ($query->fetchAll() as $row) {
-  $conn->exec('UPDATE contractnotice SET childCN = "' .
-			 $row['CNID'] . '", amendmentReason = "' .
-			 $row['amendmentReason'] . '" where "CNID" = "' .
-			 $row['parentCN'] . '";');
+  $conn->exec('UPDATE contractnotice SET "childCN" = \'' .
+			 $row['CNID'] . '\', "amendmentReason" = \'' .
+			 $row['amendmentReason'] . '\' where "CNID" = \'' .
+			 $row['parentCN'] . '\';');
+			 echo 'UPDATE contractnotice SET "childCN" = \'' .
+			 $row['CNID'] . '\', "amendmentReason" = \'' .
+			 $row['amendmentReason'] . '\' where "CNID" = \'' .
+			 $row['parentCN'] . '\';';
     $errors = $conn->errorInfo();
               
               if ($errors[1] == 7 || $errors[1] ==0)
@@ -20,4 +25,5 @@
   else print_r($errors);
 
 }
+// also need to eliminate CN 100528/100529 - check for double parent CNs with no childCN, latest sequent CN id wins childCN = 0
 ?>

--- a/displayAgency.php
+++ b/displayAgency.php
@@ -4,9 +4,9 @@
     

 include_header("Agency");

   $agency = htmlentities(strip_tags($_REQUEST['agency']));

-  echo '<img src="graphs/displayMethodCountGraph.php?agency=' . stripslashes($agency) . '">';

-  echo '<img src="graphs/displayCnCGraph.php?agency=' . stripslashes($agency) . '">';

-  echo '<img src="graphs/displayMethodValueGraph.php?agency=' . stripslashes($agency) . '">';

+  MethodCountGraph($agency);

+  CnCGraph($agency);

+  MethodValueGraph($agency);

   /*biggest contracts

   spending by year

   spending by industry/category

@@ -63,6 +63,7 @@
      split by portfolio

     */

 include_header("Agencies");

+agenciesGraph();

   $query = 'SELECT SUM("value"), "agencyName"

 FROM contractnotice

 WHERE "childCN" = 0


--- a/displayBubbletree.php
+++ b/displayBubbletree.php
@@ -19,11 +19,17 @@
 		$(function() {
 		<?php
 include_once ("lib/common.inc.php");
+
+include("lib/Color.php");
+$color = new Lux_Color();
+
+
 $unspscresult = mysql_query("select * from UNSPSCcategories;");
 while ($row = mysql_fetch_assoc($unspscresult)) {
 	$unspsc[$row['UNSPSC']] = $row['Title'];
 }
 $total = 0;
+$cats = 0;
 $catsresult = mysql_query("SELECT LEFT( categoryUNSPSC, 1 ) as cat ,
 SUM( value ) as value
 FROM `contractnotice`
@@ -31,6 +37,8 @@
 GROUP BY cat ;");
 $nodes = Array();
 while ($row = mysql_fetch_assoc($catsresult)) {
+$cats++;
+$catColor = $color->hsl2hex(Array($cats/10, .7, .5));
 	$catName = $unspsc[$row['cat'] . "0000000"] . $row['cat'];
 	if ($row['cat'] == "") $catName = "null";
 	$subnodes = Array();
@@ -48,26 +56,27 @@
 FROM `contractnotice`
 WHERE childCN = 0 and LEFT( categoryUNSPSC, 2 ) = '{$tworow['cat']}'
 GROUP BY cat ;");
+		$subCatColor = $color->hsl2hex(Array($cats/10, rand(1,10)/10, .5));
 		while ($threerow = mysql_fetch_assoc($catthreesresult)) {
 			$subsubcatName = $unspsc[$threerow['cat'] . "00000"] . $threerow['cat'];
 			if ($threerow['cat'] == "") $subsubcatName = "null";
 			$subsubnodes[] = Array(
 				"label" => $subsubcatName,
 				"amount" => $threerow['value'],
-				"color" => "#000000"
+				"color" => "#".$subCatColor
 			);
 		}
 		$subnodes[] = Array(
 			"label" => $subcatName,
 			"amount" => $tworow['value'],
-			"color" => "#000000",
+			"color" => "#".$subCatColor,
 			"children" => $subsubnodes
 		);
 	}
 	$nodes[] = Array(
 		"label" => $catName,
 		"amount" => $row['value'],
-		"color" => "#000000",
+		"color" => "#".$catColor,
 		"children" => $subnodes
 	);
 	$total+= $row['value'];

--- a/displayCalendar.php
+++ b/displayCalendar.php
@@ -6,15 +6,23 @@
 if ($_REQUEST['month']) {

     echo "<center><h1>".$_REQUEST['month']."</h1></center>";

 $monthParts = explode("-",$_REQUEST['month']);

-  $query = "SELECT CNID, description, value, agencyName, category, contractStart, supplierName

-    FROM `contractnotice`

-    WHERE childCN = 0 

-    AND YEAR(contractStart) = {$monthParts[1]}

-    AND MONTH(contractStart)  = {$monthParts[0]}

-    ORDER BY value DESC";

-  $result = mysql_query($query);

-echo '<img src="graphs/displayMethodCountGraph.php?month=' . stripslashes($supplier) . '">';

-   echo '<img src="graphs/displayCnCGraph.php?month=' . stripslashes($supplier) . '">';

+  $query = 'SELECT "CNID", "description", "value", "agencyName", "category", "contractStart", "supplierName"

+    FROM contractnotice

+    WHERE "childCN" = 0 

+    AND extract(year from "contractStart") = :year

+    AND extract(month from "contractStart")  = :month

+    ORDER BY value DESC';

+$query = $conn->prepare($query);

+$query->bindParam(":month",  $monthParts[0]);

+

+$query->bindParam(":year",  $monthParts[1]);

+  $query->execute();

+  if (!$query) {

+    databaseError($conn->errorInfo());

+  }

+

+MethodCountGraph($supplier);

+CnCGraph($supplier);

 

   echo "<table>  <thead>

     <tr>

@@ -26,7 +34,7 @@
       <th>Supplier</th>

     </tr>

   </thead>";

-  while ($row = mysql_fetch_array($result, MYSQL_BOTH)) {

+  foreach ($query->fetchAll() as $row) {

     setlocale(LC_MONETARY, 'en_US');

     $value = number_format(doubleval($row['value']) , 2);

     echo ("<tr>

@@ -52,10 +60,14 @@
 echo '<img src="graphs/displayContractPublishedGraph.php">';

 

 

-$query = "SELECT YEAR(contractStart), MONTH(contractStart),

-SUM(value) as val, count(1) as count FROM `contractnotice` WHERE childCN = 0 GROUP BY MONTH(contractStart), YEAR(contractStart) ORDER BY YEAR(contractStart), MONTH(contractStart) ";

+$query = 'SELECT extract(year from "contractStart"), extract(month from "contractStart"),

+SUM(value) as val, count(1) as count FROM contractnotice WHERE "childCN" = 0 GROUP BY extract(year from "contractStart"), extract(month from "contractStart") ORDER BY extract(year from "contractStart"), extract(month from "contractStart") ';

+$query = $conn->prepare($query);

+  $query->execute();

+  if (!$query) {

+    databaseError($conn->errorInfo());

+  }

 

-$result = mysql_query($query);

   echo "<table>  <thead>

     <tr>

       <th>Month/Year</th>

@@ -63,7 +75,7 @@
       <th>Number of Contracts</th>

     </tr>

   </thead>";

-while ($row = mysql_fetch_array($result, MYSQL_BOTH)) {

+  foreach ($query->fetchAll() as $row) {

 setlocale(LC_MONETARY, 'en_US');

 $value = number_format(doubleval($row["val"]),2);

 $month_name = date( 'F', mktime(0, 0, 0, $row[1]) );


--- a/displayHeatmap.php
+++ b/displayHeatmap.php
@@ -1,7 +1,7 @@
 <?php

 

 

-include('../lib/common.inc.php');

+include('lib/common.inc.php');

 

 $year = 2006;

 $ZeroX = 112.5;

@@ -22,12 +22,17 @@
 $height = 457;

 //echo "http://dev.openstreetmap.org/~pafciu17/?module=map&bbox=".$ZeroX.",".$ZeroY.",".$MaxX.",".$MaxY."&width=".$width."&height=".$height;

 //$handle = ImageCreate ($width, $height) or die ("Cannot Create image");

-$handle = imagecreatefrompng('../images/australia.png');

+$handle = imagecreatefrompng('images/australia.png');

 $white = imagecolorallocate($handle, 0, 0, 0);

 imagecolortransparent($handle, $white);

 

-$query = "SELECT supplierPostcode, sum(value) as value, lat, lon FROM `contractnotice`,`postcodes` where childCN = 0 AND supplierCountry = 'Australia' AND YEAR(contractStart) >= '$year' AND supplierPostcode = postcode GROUP BY supplierPostcode";

-$result = mysql_query($query);

+$query = 'SELECT "supplierPostcode", sum("value") as value, max(lat) as lat, max(lon) as lon FROM contractnotice inner join postcodes on "supplierPostcode" = postcode::text where "childCN" = 0 AND "supplierCountry" = \'Australia\' GROUP BY "supplierPostcode"';

+$query = $conn->prepare($query);

+   $query->execute();

+   if (!$query) {

+      databaseError($conn->errorInfo());

+   }

+

 

 $left = "FFFF50";

 $right= "EF0050";

@@ -41,8 +46,7 @@
     $colorset[$i] = imagecolorallocatealpha($handle, $leftR + ($i*(($rightR-$leftR)/250)), $leftG + ($i*(($rightG-$leftG)/250)), $leftB + ($i*(($rightB-$leftB)/250)),117 - ($i/250)*40);

 }

 

-while ($row = mysql_fetch_array($result, MYSQL_BOTH))

-{

+  foreach ($query->fetchAll() as $row) {

    $xpage = round((($XRange - ($MaxX - $row['lon'])) / $xdivlength));

 	if ($row['lat'] < -40.25) $row['lat']-= 0.75;

    $ypage = round(($YRange - (abs($MaxY) - abs($row['lat']))) / $ydivheight);


--- a/displaySupplier.php
+++ b/displaySupplier.php
@@ -4,9 +4,9 @@
     
 include_header("Supplier");
   $supplierS = htmlentities(strip_tags($_REQUEST['supplier']));
-  echo '<img src="graphs/displayMethodCountGraph.php?supplier=' . stripslashes($supplierS) . '">';
-   echo '<img src="graphs/displayCnCGraph.php?supplier=' . stripslashes($supplierS) . '">';
-   echo '<img src="graphs/displayMethodValueGraph.php?supplier=' . stripslashes($supplierS) . '">';
+  MethodCountGraph($supplierS);
+   CnCGraph($supplierS);
+  MethodValueGraph($supplierS);
   /*lobbyist ties
   
   links to ABR/ASIC/Google News/ASX/Court records
@@ -62,6 +62,7 @@
      histograph of supplier size/value
     */
 include_header("Suppliers");
+suppliersGraph();
   $query = 'SELECT SUM("value") as val, MAX("supplierName") as supplierName, "supplierABN",(
  case when "supplierABN" != 0 THEN "supplierABN"::text ELSE "supplierName" END) as supplierID 
 FROM contractnotice

--- a/heuristics/heuristics.inc.php
+++ b/heuristics/heuristics.inc.php
@@ -3,13 +3,13 @@
 $heuristics = Array();
 //each heuristic adds self to description array
 include ("dateHeuristics.php");
-//include ("historyHeuristics.php");
+include ("historyHeuristics.php");
 //include ("metadataHeuristics.php");
 //include ("valueHeuristics.php");
 function runHeuristic($heuristicName, $cn)
 {
 	// check  if already ran
-	$query = "select count(*) from heuristic_results where heuristic_name = '$heuristicName' and CNID = '{$CN['CNID']}";
+	$query = "select count(*) from heuristic_results where heuristic_name = '$heuristicName' and CNID = '{$cn['CNID']}'";
 	$result = mysql_query($query);
 	$r = mysql_fetch_array($result);
 	if ($r[0] == 0) {
@@ -37,3 +37,4 @@
 	}
 }
 ?>
+

file:b/lib/Color.php (new)
--- /dev/null
+++ b/lib/Color.php
@@ -1,1 +1,502 @@
-
+<?php

+/**

+ *

+ * Color values manipulation utilities. Provides methods to convert from and to

+ * Hex, RGB, HSV and HSL color representattions.

+ *

+ * Several color conversion logic are based on pseudo-code from

+ * http://www.easyrgb.com/math.php

+ *

+ * @category Lux

+ *

+ * @package Lux_Color

+ *

+ * @author Rodrigo Moraes <rodrigo.moraes@gmail.com>

+ *

+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License

+ *

+ * @version $Id$

+ *

+ */

+class Lux_Color

+{

+    /**

+     *

+     * Converts hexadecimal colors to RGB.

+     *

+     * @param string $hex Hexadecimal value. Accepts values with 3 or 6 numbers,

+     * with or without #, e.g., CCC, #CCC, CCCCCC or #CCCCCC.

+     *

+     * @return array RGB values: 0 => R, 1 => G, 2 => B

+     *

+     */

+    public function hex2rgb($hex)

+    {

+        // Remove #.

+        if (strpos($hex, '#') === 0) {

+            $hex = substr($hex, 1);

+        }

+

+        if (strlen($hex) == 3) {

+            $hex .= $hex;

+        }

+

+        if (strlen($hex) != 6) {

+            return false;

+        }

+

+        // Convert each tuple to decimal.

+        $r = hexdec(substr($hex, 0, 2));

+        $g = hexdec(substr($hex, 2, 2));

+        $b = hexdec(substr($hex, 4, 2));

+

+        return array($r, $g, $b);

+    }

+

+    /**

+     *

+     * Converts hexadecimal colors to HSV.

+     *

+     * @param string $hex Hexadecimal value. Accepts values with 3 or 6 numbers,

+     * with or without #, e.g., CCC, #CCC, CCCCCC or #CCCCCC.

+     *

+     * @return array HSV values: 0 => H, 1 => S, 2 => V

+     *

+     */

+    public function hex2hsv($hex)

+    {

+        return $this->rgb2hsv($this->hex2rgb($hex));

+    }

+

+    /**

+     *

+     * Converts hexadecimal colors to HSL.

+     *

+     * @param string $hex Hexadecimal value. Accepts values with 3 or 6 numbers,

+     * with or without #, e.g., CCC, #CCC, CCCCCC or #CCCCCC.

+     *

+     * @return array HSL values: 0 => H, 1 => S, 2 => L

+     *

+     */

+    public function hex2hsl($hex)

+    {

+        return $this->rgb2hsl($this->hex2rgb($hex));

+    }

+

+    /**

+     *

+     * Converts RGB colors to hexadecimal.

+     *

+     * @param array $rgb RGB values: 0 => R, 1 => G, 2 => B

+     *

+     * @return string Hexadecimal value with six digits, e.g., CCCCCC.

+     *

+     */

+    public function rgb2hex($rgb)

+    {

+        if(count($rgb) < 3) {

+            return false;

+        }

+

+        list($r, $g, $b) = $rgb;

+

+        // From php.net.

+        $r = 0x10000 * max(0, min(255, $r));

+        $g = 0x100 * max(0, min(255, $g));

+        $b = max(0, min(255, $b));

+

+        return strtoupper(str_pad(dechex($r + $g + $b), 6, 0, STR_PAD_LEFT));

+    }

+

+    /**

+     *

+     * Converts RGB to HSV.

+     *

+     * @param array $rgb RGB values: 0 => R, 1 => G, 2 => B

+     *

+     * @return array HSV values: 0 => H, 1 => S, 2 => V

+     *

+     */

+    public function rgb2hsv($rgb)

+    {

+        // RGB values = 0 ÷ 255

+        $var_R = ($rgb[0] / 255);

+        $var_G = ($rgb[1] / 255);

+        $var_B = ($rgb[2] / 255);

+

+        // Min. value of RGB

+        $var_Min = min($var_R, $var_G, $var_B);

+

+        // Max. value of RGB

+        $var_Max = max($var_R, $var_G, $var_B);

+

+        // Delta RGB value

+        $del_Max = $var_Max - $var_Min;

+

+        $V = $var_Max;

+

+        // This is a gray, no chroma...

+        if ( $del_Max == 0 ) {

+           // HSV results = 0 ÷ 1

+           $H = 0;

+           $S = 0;

+        } else {

+           // Chromatic data...

+           $S = $del_Max / $var_Max;

+

+           $del_R = ((($var_Max - $var_R) / 6) + ($del_Max / 2)) / $del_Max;

+           $del_G = ((($var_Max - $var_G) / 6) + ($del_Max / 2)) / $del_Max;

+           $del_B = ((($var_Max - $var_B) / 6) + ($del_Max / 2)) / $del_Max;

+

+           if ($var_R == $var_Max) {

+               $H = $del_B - $del_G;

+           } else if ($var_G == $var_Max) {

+               $H = (1 / 3) + $del_R - $del_B;

+           } else if ($var_B == $var_Max) {

+               $H = (2 / 3) + $del_G - $del_R;

+           }

+

+           if ($H < 0) {

+               $H += 1;

+           }

+           if ($H > 1) {

+               $H -= 1;

+           }

+        }

+

+        // Returns agnostic values.

+        // Range will depend on the application: e.g. $H*360, $S*100, $V*100.

+        return array($H, $S, $V);

+    }

+

+    /**

+     *

+     * Converts RGB to HSL.

+     *

+     * @param array $rgb RGB values: 0 => R, 1 => G, 2 => B

+     *

+     * @return array HSL values: 0 => H, 1 => S, 2 => L

+     *

+     */

+    public function rgb2hsl($rgb)

+    {

+        // Where RGB values = 0 ÷ 255.

+        $var_R = $rgb[0] / 255;

+        $var_G = $rgb[1] / 255;

+        $var_B = $rgb[2] / 255;

+

+        // Min. value of RGB

+        $var_Min = min($var_R, $var_G, $var_B);

+        // Max. value of RGB

+        $var_Max = max($var_R, $var_G, $var_B);

+        // Delta RGB value

+        $del_Max = $var_Max - $var_Min;

+

+        $L = ($var_Max + $var_Min) / 2;

+

+        if ( $del_Max == 0 ) {

+            // This is a gray, no chroma...

+            // HSL results = 0 ÷ 1

+            $H = 0;

+            $S = 0;

+        } else {

+            // Chromatic data...

+            if ($L < 0.5) {

+                $S = $del_Max / ($var_Max + $var_Min);

+            } else {

+                $S = $del_Max / ( 2 - $var_Max - $var_Min );

+            }

+

+            $del_R = ((($var_Max - $var_R) / 6) + ($del_Max / 2)) / $del_Max;

+            $del_G = ((($var_Max - $var_G) / 6) + ($del_Max / 2)) / $del_Max;

+            $del_B = ((($var_Max - $var_B) / 6) + ($del_Max / 2)) / $del_Max;

+

+            if ($var_R == $var_Max) {

+                $H = $del_B - $del_G;

+            } else if ($var_G == $var_Max) {

+                $H = ( 1 / 3 ) + $del_R - $del_B;

+            } else if ($var_B == $var_Max) {

+                $H = ( 2 / 3 ) + $del_G - $del_R;

+            }

+

+            if ($H < 0) {

+                $H += 1;

+            }

+            if ($H > 1) {

+                $H -= 1;

+            }

+        }

+

+        return array($H, $S, $L);

+    }

+

+    /**

+     *

+     * Converts HSV colors to hexadecimal.

+     *

+     * @param array $hsv HSV values: 0 => H, 1 => S, 2 => V

+     *

+     * @return string Hexadecimal value with six digits, e.g., CCCCCC.

+     *

+     */

+    public function hsv2hex($hsv)

+    {

+        return $this->rgb2hex($this->hsv2rgb($hsv));

+    }

+

+    /**

+     *

+     * Converts HSV to RGB.

+     *

+     * @param array $hsv HSV values: 0 => H, 1 => S, 2 => V

+     *

+     * @return array RGB values: 0 => R, 1 => G, 2 => B

+     *

+     */

+    public function hsv2rgb($hsv)

+    {

+        $H = $hsv[0];

+        $S = $hsv[1];

+        $V = $hsv[2];

+

+        // HSV values = 0 ÷ 1

+        if ($S == 0) {

+            $R = $V * 255;

+            $G = $V * 255;

+            $B = $V * 255;

+        } else {

+            $var_h = $H * 6;

+            // H must be < 1

+            if ( $var_h == 6 ) {

+                $var_h = 0;

+            }

+            // Or ... $var_i = floor( $var_h )

+            $var_i = floor( $var_h );

+            $var_1 = $V * ( 1 - $S );

+            $var_2 = $V * ( 1 - $S * ( $var_h - $var_i ) );

+            $var_3 = $V * ( 1 - $S * ( 1 - ( $var_h - $var_i ) ) );

+

+            switch($var_i) {

+                case 0:

+                    $var_r = $V;

+                    $var_g = $var_3;

+                    $var_b = $var_1;

+                    break;

+                case 1:

+                    $var_r = $var_2;

+                    $var_g = $V;

+                    $var_b = $var_1;

+                    break;

+                case 2:

+                    $var_r = $var_1;

+                    $var_g = $V;

+                    $var_b = $var_3;

+                    break;

+                case 3:

+                    $var_r = $var_1;

+                    $var_g = $var_2;

+                    $var_b = $V;

+                    break;

+                case 4:

+                    $var_r = $var_3;

+                    $var_g = $var_1;

+                    $var_b = $V;

+                    break;

+                default:

+                    $var_r = $V;

+                    $var_g = $var_1;

+                    $var_b = $var_2;

+            }

+

+            //RGB results = 0 ÷ 255

+            $R = $var_r * 255;

+            $G = $var_g * 255;

+            $B = $var_b * 255;

+        }

+

+        return array($R, $G, $B);

+    }

+

+    /**

+     *

+     * Converts HSV colors to HSL.

+     *

+     * @param array $hsv HSV values: 0 => H, 1 => S, 2 => V

+     *

+     * @return array HSL values: 0 => H, 1 => S, 2 => L

+     *

+     */

+    public function hsv2hsl($hsv)

+    {

+        return $this->rgb2hsl($this->hsv2rgb($hsv));

+    }

+

+    /**

+     *

+     * Converts hexadecimal colors to HSL.

+     *

+     * @param array $hsl HSL values: 0 => H, 1 => S, 2 => L

+     *

+     * @return string Hexadecimal value. Accepts values with 3 or 6 numbers,

+     * with or without #, e.g., CCC, #CCC, CCCCCC or #CCCCCC.

+     *

+     */

+    public function hsl2hex($hsl)

+    {

+        return $this->rgb2hex($this->hsl2rgb($hsl));

+    }

+

+    /**

+     *

+     * Converts HSL to RGB.

+     *

+     * @param array $hsv HSL values: 0 => H, 1 => S, 2 => L

+     *

+     * @return array RGB values: 0 => R, 1 => G, 2 => B

+     *

+     */

+    public function hsl2rgb($hsl)

+    {

+        list($H, $S, $L) = $hsl;

+

+        if ($S == 0) {

+            // HSL values = 0 ÷ 1

+            // RGB results = 0 ÷ 255

+            $R = $L * 255;

+            $G = $L * 255;

+            $B = $L * 255;

+        } else {

+            if ($L < 0.5) {

+                $var_2 = $L * (1 + $S);

+            } else {

+                $var_2 = ($L + $S) - ($S * $L);

+            }

+

+            $var_1 = 2 * $L - $var_2;

+

+            $R = 255 * $this->_hue2rgb($var_1, $var_2, $H + (1 / 3));

+            $G = 255 * $this->_hue2rgb($var_1, $var_2, $H);

+            $B = 255 * $this->_hue2rgb($var_1, $var_2, $H - (1 / 3));

+        }

+

+        return array($R, $G, $B);

+    }

+

+    /**

+     *

+     * Support method for hsl2rgb(): converts hue ro RGB.

+     *

+     * @param

+     *

+     * @param

+     *

+     * @param

+     *

+     * @return int

+     *

+     */

+    protected function _hue2rgb($v1, $v2, $vH)

+    {

+        if ($vH < 0) {

+            $vH += 1;

+        }

+

+        if ($vH > 1) {

+            $vH -= 1;

+        }

+

+        if ((6 * $vH) < 1) {

+            return ($v1 + ($v2 - $v1) * 6 * $vH);

+        }

+

+        if ((2 * $vH) < 1) {

+            return $v2;

+        }

+

+        if ((3 * $vH) < 2) {

+            return ($v1 + ($v2 - $v1) * (( 2 / 3) - $vH) * 6);

+        }

+

+        return $v1;

+    }

+

+    /**

+     *

+     * Converts hexadecimal colors to HSL.

+     *

+     * @param array $hsl HSL values: 0 => H, 1 => S, 2 => L

+     *

+     * @return array HSV values: 0 => H, 1 => S, 2 => V

+     *

+     */

+    public function hsl2hsv($hsl)

+    {

+        return $this->rgb2hsv($this->hsl2rgb($hsl));

+    }

+

+    /**

+     *

+     * Updates HSV values.

+     *

+     * @param array $hsv HSV values: 0 => H, 1 => S, 2 => V

+     *

+     * @param array $values Values to update: 0 => value to add to H (0 to 360),

+     * 1 and 2 => values to multiply S and V (0 to 100). Example:

+     *

+     * {{{code:php

+     *     // Update saturation to 80% in the provided HSV.

+     *     $hsv = array(120, 0.75, 0.75);

+     *     $new_hsv = $color->updateHsv($hsv, array(null, 80, null));

+     * }}}

+     *

+     */

+    public function updateHsv($hsv, $values)

+    {

+        if (isset($values[0])) {

+            $hsv[0] = max(0, min(360, ($hsv[0] + $values[0])));

+        }

+