Merge branch 'master' of ssh://apples.lambdacomplex.org/git/contractdashboard
--- 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");
--- 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 @@
}
}
?>
+
--- /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])));
+ }