<?PHP

// ===========================================================
// Copyright (c) 2011-2011 Artica, info@artica.es

// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public License
// (LGPL) as published by the Free Software Foundation; version 2

// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU Lesser General Public License for more details.

if (file_exists('include/functions.php')) {
	// If is called from index
	include_once('include/functions.php');
	include_once('include/functions_html.php');
	include_once('include/graphs/functions_utils.php');
}
else if (file_exists('../functions.php')) {
	// If is called through url
	include_once('../functions.php');
	include_once('../functions_html.php');
	include_once('functions_utils.php');
}

$types = array('histogram', 'progressbar');

$id_graph = get_parameter('id_graph', false);
$graph_type = get_parameter('graph_type', '');

if($id_graph && in_array($graph_type, $types)) {
	
	if (!$id_graph) {
		exit;
	}
	
	$graph = unserialize_in_temp($id_graph);
	
	if (!isset($graph)) {
		exit;
	}
	
	if (!isset($graph['fontsize'])) {
		$graph['fontsize'] = 6;
	}
	
	switch ($graph_type) {
		case 'histogram': 
			gd_histogram ($graph['width'], 
				$graph['height'], 
				$graph['mode'], 
				json_decode($graph['data'], true), 
				$graph['max'], 
				$graph['font'], 
				$graph['title'],
				$graph['fontsize']);
			break;
		case 'progressbar':
			gd_progress_bar ($graph['width'], 
				$graph['height'], 
				$graph['progress'], 
				$graph['title'], 
				$graph['font'], 
				$graph['out_of_lim_str'],
				$graph['out_of_lim_image'], 
				$graph['mode'],
				$graph['fontsize']);
			break;
		case 'progressbubble':
			gd_progress_bubble ($graph['width'], 
				$graph['height'], 
				$graph['progress'], 
				$graph['title'], 
				$graph['font'], 
				$graph['out_of_lim_str'],
				$graph['out_of_lim_image'], 
				$graph['mode'],
				$graph['fontsize']);
			break;
	}
}


function gd_histogram ($width, $height, $mode, $data, $max_value, $font, $title, $fontsize = 8) {	
	// $title is for future use
	$nvalues = count($data);
	
	Header("Content-type: image/png");
	$image = imagecreate($width,$height);
	$white = ImageColorAllocate($image,255,255,255);
	imagecolortransparent ($image, $white);
	
	$black = ImageColorAllocate($image,0,0,0);
	
	$red = ImageColorAllocate($image,255,60,75);
	$blue = ImageColorAllocate($image,75,60,255);
	$green = ImageColorAllocate($image,0,120,0);
	$magent = ImageColorAllocate($image,179,0,255);
	$yellow = ImageColorAllocate($image,204,255,0);
	
	$colors = array($blue, $red, $green, $magent, $yellow);
	
	$margin_up = 2;
	
	if ($mode != 2) {
		$size_per = ($max_value / ($width-40));
	}
	else {
		$size_per = ($max_value / ($width));
	}
	
	if ($mode == 0) // with strips 
		$rectangle_height = ($height - 10 - 2 - $margin_up ) / $nvalues;
	else
		$rectangle_height = ($height - 2 - $margin_up ) / $nvalues;
	
	if ($size_per == 0)
		$size_per = 1;
		
	if ($mode != 2) {
		$leftmargin = 40;
	}
	else {
		$leftmargin = 1;
	}
	
	$c = 0;
	foreach($data as $label => $value) {
		ImageFilledRectangle($image, $leftmargin, $margin_up, ($value/$size_per)+$leftmargin, $margin_up+$rectangle_height -1 , $colors[$c]);
		if ($mode != 2) {
			ImageTTFText($image, $fontsize, 0, 0, $margin_up+8, $black, $font, $label);
		}
		
		$margin_up += $rectangle_height + 1;
		
		$c++;
		if(!isset($colors[$c])) {
			$c = 0;
		}
	}
	
	if ($mode == 0) { // With strips
		// Draw limits
		$risk_low =  ($config_risk_low / $size_per) + 40;
		$risk_med =  ($config_risk_med / $size_per) + 40;
		$risk_high =  ($config_risk_high / $size_per) + 40;
		imageline($image, $risk_low, 0, $risk_low , $height, $grey);
		imageline($image, $risk_med , 0, $risk_med  , $height, $grey);
		imageline($image, $risk_high, 0, $risk_high , $height, $grey);
		ImageTTFText($image, $fontsize, 0, $risk_low-20, $height, $grey, $font, "Low");
		ImageTTFText($image, $fontsize, 0, $risk_med-20, $height, $grey, $font, "Med.");
		ImageTTFText($image, $fontsize, 0, $risk_high-25, $height, $grey, $font, "High");
	}
	imagePNG($image);
	imagedestroy($image);
}

// ***************************************************************************
// Draw a dynamic progress bubble using GDlib directly
// ***************************************************************************
function gd_progress_bubble ($width, $height, $progress, $title, $font, $out_of_lim_str, $out_of_lim_image, $mode = 1, $fontsize=10, $value_text = '', $colorRGB = '') {
	if($out_of_lim_str === false) {
		$out_of_lim_str = "Out of limits";
	}
	
	if($out_of_lim_image === false) {
		$out_of_lim_image = "images_graphs/outlimits.png";
	}
	
	$color = array();
	if (!empty($colorRGB)) {
		$color = explode('|', $colorRGB);
	}
	
	Header("Content-type: image/png");
	
	switch ($mode)
	{
		//TODO: Understand the difernets between the modes.
		case 0:
		case 1:
		case 2:
			global $config;
			global $REMOTE_ADDR;
			
			if ($progress > 100 || $progress < 0) {
				// HACK: This report a static image... will increase render in about 200% :-) useful for
				// high number of realtime statusbar images creation (in main all agents view, for example
				$imgPng = imageCreateFromPng($out_of_lim_image);
				imageAlphaBlending($imgPng, true);
				imageSaveAlpha($imgPng, true);
				imagePng($imgPng); 
			}
			else {
				$ratingWidth = ($progress/100)*$width;
				$ratingHeight = ($progress/100)*$height;
				
				$image = imagecreate($width,$height);
				
				//colors
				$back = ImageColorAllocate($image,255,255,255);
				imagecolortransparent ($image, $back);
				
				$black = ImageColorAllocate($image,0,0,0);
				$red = ImageColorAllocate($image,255,60,75);
				$green = ImageColorAllocate($image,50,205,50);
				$blue = ImageColorAllocate($image,44,81,120);
				$soft_green = ImageColorAllocate($image,176, 255, 84);
				$soft_yellow = ImageColorAllocate($image,255, 230, 84);
				$soft_red = ImageColorAllocate($image,255, 154, 84);
				$other_red = ImageColorAllocate($image,238, 0, 0);
				if (!empty($color)) {
					$defined_color = ImageColorAllocate($image, $color[0], $color[1], $color[2]);
				}
				
				if (isset($defined_color)) {
					imagefilledellipse($image, $width / 2, $height / 2,
						$ratingWidth, $ratingHeight,  $defined_color);
				}
				elseif ($rating > 70) {
					imagefilledellipse($image, $width / 2, $height / 2,
						$ratingWidth, $ratingHeight,  $soft_green);
				}
				elseif ($rating > 50) {
					imagefilledellipse($image, $width / 2, $height / 2,
						$ratingWidth, $ratingHeight,  $soft_yellow);
				}
				elseif ($rating > 30) {
					imagefilledellipse($image, $width / 2, $height / 2,
						$ratingWidth, $ratingHeight, $soft_red);
				}
				else if($rating > 0) {
					imagefilledellipse($image, $width / 2, $height / 2,
						$ratingWidth, $ratingHeight, $other_red);
				}
				
				//Write the value
				$size = imagettfbbox ($fontsize, 0, $font, $value_text);
				ImageTTFText($image, $fontsize, 0, 
					($width/2) - ($size[4] / 2), ($height/2) + ($size[1] / 2), $black, $font, $value_text);
				
				imagePNG($image);
			}
			imagedestroy($image);
			break;
	}
}

// ***************************************************************************
// Draw a dynamic progress bar using GDlib directly
// ***************************************************************************

function gd_progress_bar ($width, $height, $progress, $title, $font, $out_of_lim_str, $out_of_lim_image, $mode = 1, $fontsize=10, $value_text = '', $colorRGB = '') {
	if ($out_of_lim_str === false) {
		$out_of_lim_str = "Out of limits";
	}
	
	if ($out_of_lim_image === false) {
		$out_of_lim_image = "images_graphs/outlimits.png";
	}
	
	$color = array();
	if (!empty($colorRGB)) {
		$color = explode('|', $colorRGB);
	}
	
	// Copied from the PHP manual:
	// http://us3.php.net/manual/en/function.imagefilledrectangle.php
	// With some adds from sdonie at lgc dot com
	// Get from official documentation PHP.net website. Thanks guys :-)
	function drawRating($rating, $width, $height, $font, $out_of_lim_str, $mode, $fontsize, $value_text, $color) {
		global $config;
		global $REMOTE_ADDR;
		
		// Round corners defined in global setup
		if ($config["round_corner"] != 0) {
			$radius = ($height > 18) ? 8 : 0;
		}
		else {
			$radius = 0;
		}
		
		if ($width == 0) {
			$width = 150;
		}
		if ($height == 0) {
			$height = 20;
		}
		
		//$rating = $_GET['rating'];
		$ratingbar = (($rating/100)*$width)-2;
		$ratingbar30 = ((30/100)*$width)-2;
		
		$image = imagecreate($width,$height);
		
		
		//colors
		$back = ImageColorAllocate($image,255,255,255);
		imagecolortransparent ($image, $back);
		$bordercolor = ImageColorAllocate($image,174,174,174);
		$text = ImageColorAllocate($image,74,74,74);
		$red = ImageColorAllocate($image,255,60,75);
		$green = ImageColorAllocate($image,50,205,50);
		$blue = ImageColorAllocate($image,44,81,120);
		if (!empty($color)) {
			$defined_color = ImageColorAllocate($image, $color[0], $color[1], $color[2]);
		}
		
		$soft_green = ImageColorAllocate($image,176, 255, 84);
		$soft_yellow = ImageColorAllocate($image,255, 230, 84);
		$soft_red = ImageColorAllocate($image,255, 154, 84);
		$other_red = ImageColorAllocate($image,238, 0, 0);
		
		ImageRectangleWithRoundedCorners($image,0,0,$width-1,$height-1,$radius,$back,false);
		
		$x1 = 1;
		$y1 = 1;
		$x2 = $ratingbar;
		$y2 = $height - 1;
		
		switch ($mode)
		{
			case 0:
				if (isset($defined_color)) {
					ImageRectangleWithRoundedCorners($image, $x1, $y1, $x2, $y2, $radius, $defined_color);
				}
				elseif ($rating > 70)
					ImageRectangleWithRoundedCorners($image, $x1, $y1, $x2, $y2, $radius, $soft_green);
				elseif ($rating > 50)
					ImageRectangleWithRoundedCorners($image, $x1, $y1, $x2, $y2, $radius, $soft_yellow);
				elseif ($rating > 30)
					ImageRectangleWithRoundedCorners($image, $x1, $y1, $x2, $y2, $radius, $soft_red);
				else if($rating > 0) {
					if($radius != 0) {
						$x2 = $ratingbar30;
					}
					ImageRectangleWithRoundedCorners($image, $x1, $y1, $x2, $y2, $radius, $other_red);
				}
				break;
			case 1:
				if (isset($defined_color)) {
					ImageRectangleWithRoundedCorners($image, $x1, $y1, $x2, $y2, $radius,$defined_color);
				}
				elseif ($rating > 100)
					ImageRectangleWithRoundedCorners($image, $x1, $y1, $x2, $y2, $radius,$red);
				elseif ($rating == 100)
					ImageRectangleWithRoundedCorners($image, $x1, $y1, $x2, $y2, $radius,$green);
				else if($rating > 0){
					if($radius != 0 && $rating < 30) {
						$x2 = $ratingbar30;
					}
					ImageRectangleWithRoundedCorners($image, $x1, $y1, $x2, $y2, $radius,$blue);
				}
				
				if ($rating > 50)
					if ($rating > 100)
						ImageTTFText($image, $fontsize, 0, ($width/4), ($height/2)+($height/5), $back, $font, $out_of_lim_str);
					else
						ImageTTFText($image, $fontsize, 0, ($width/2)-($width/10), ($height/2)+($height/5), $back, $font, $value_text);
				else
					ImageTTFText($image, $fontsize, 0, ($width/2)-($width/10), ($height/2)+($height/5), $text, $font, $value_text);
				break;
			case 2:
				if (isset($defined_color)) {
					ImageRectangleWithRoundedCorners($image, $x1, $y1, $x2, $y2, $radius, $defined_color);
				}
				elseif ($rating > 70)
					ImageRectangleWithRoundedCorners($image, $x1, $y1, $x2, $y2, $radius, $other_red);
				elseif ($rating > 50)
					ImageRectangleWithRoundedCorners($image, $x1, $y1, $x2, $y2, $radius, $soft_red);
				elseif ($rating > 30)
					ImageRectangleWithRoundedCorners($image, $x1, $y1, $x2, $y2, $radius, $soft_yellow);
				else if($rating > 0) {
					if($radius != 0) {
						$x2 = $ratingbar30;
					}
					ImageRectangleWithRoundedCorners($image, $x1, $y1, $x2, $y2, $radius, $soft_green);
				}
				break;
		}
		
		if($bordercolor !== false) {
			$x1-=1;
			$x2 = $width-2;
			imageline($image, $x1+$radius, $y1, $x2-$radius, $y1, $bordercolor);
			imageline($image, $x1+$radius, $y2, $x2-$radius, $y2, $bordercolor);
			imageline($image, $x1, $y1+$radius, $x1, $y2-$radius, $bordercolor);
			imageline($image, $x2, $y1+$radius, $x2, $y2-$radius, $bordercolor);
			
			imagearc($image,$x1+$radius, $y1+$radius, $radius*2, $radius*2, 180 , 270, $bordercolor);
			imagearc($image,$x2-$radius, $y1+$radius, $radius*2, $radius*2, 270 , 360, $bordercolor);
			imagearc($image,$x1+$radius, $y2-$radius, $radius*2, $radius*2, 90 , 180, $bordercolor);
			imagearc($image,$x2-$radius, $y2-$radius, $radius*2, $radius*2, 360 , 90, $bordercolor);
		}
		
		imagePNG($image);
		imagedestroy($image);
	}
	
	function ImageRectangleWithRoundedCorners(&$im, $x1, $y1, $x2, $y2, $radius, $color)
	{
		// Draw rectangle without corners
		ImageFilledRectangle($im, $x1+$radius, $y1, $x2-$radius, $y2, $color);
		ImageFilledRectangle($im, $x1, $y1+$radius, $x2, $y2-$radius, $color);
		
		// Draw circled corners
		ImageFilledEllipse($im, $x1+$radius, $y1+$radius, $radius*2, $radius*2, $color);
		ImageFilledEllipse($im, $x2-$radius, $y1+$radius, $radius*2, $radius*2, $color);
		ImageFilledEllipse($im, $x1+$radius, $y2-$radius, $radius*2, $radius*2, $color);
		ImageFilledEllipse($im, $x2-$radius, $y2-$radius, $radius*2, $radius*2, $color);
	}
	Header("Content-type: image/png");
	
	switch ($mode)
	{
		case 0:
			drawRating($progress, $width, $height, $font, $out_of_lim_str, $mode, $fontsize, $value_text, $color);
			break;
		case 1:
			if ($progress > 100 || $progress < 0) {
				// HACK: This report a static image... will increase render in about 200% :-) useful for
				// high number of realtime statusbar images creation (in main all agents view, for example
				$imgPng = imageCreateFromPng($out_of_lim_image);
				imageAlphaBlending($imgPng, true);
				imageSaveAlpha($imgPng, true);
				imagePng($imgPng);
			}
			else 
				drawRating($progress, $width, $height, $font, $out_of_lim_str, $mode, 6,  $value_text, $color);
			break;
		case 2:
			if ($progress > 100 || $progress < 0) {
				// HACK: This report a static image... will increase render in about 200% :-) useful for
				// high number of realtime statusbar images creation (in main all agents view, for example
				$imgPng = imageCreateFromPng($out_of_lim_image);
				imageAlphaBlending($imgPng, true);
				imageSaveAlpha($imgPng, true);
				imagePng($imgPng); 
			}
			else 
			drawRating($progress, $width, $height, $font, $out_of_lim_str, $mode, 6, $value_text, $color);
			break;
	}
}

?>