<?php
/*
* 2007-2011 PrestaShop 
*
* NOTICE OF LICENSE
*
* This source file is subject to the Academic Free License (AFL 3.0)
* that is bundled with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://opensource.org/licenses/afl-3.0.php
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@prestashop.com so we can send you a copy immediately.
*
* DISCLAIMER
*
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
* versions in the future. If you wish to customize PrestaShop for your
* needs please refer to http://www.prestashop.com for more information.
*
*  @author PrestaShop SA <contact@prestashop.com>
*  @copyright  2007-2011 PrestaShop SA
*  @version  Release: $Revision: 8005 $
*  @license    http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
*  International Registered Trademark & Property of PrestaShop SA
*/

if (!defined('_PS_VERSION_'))
	exit;

class GraphGoogleChart extends ModuleGraphEngine
{
	private $_width;
	private $_height;
	private $_values;
	private $_legend;
	private $_titles;
	
    function __construct($type = null)
    {
		if ($type != null)
		{
			parent::__construct($type);
		}
		else
		{
			$this->name = 'graphgooglechart';
			$this->tab = 'administration';
			$this->version = 1.0;
			$this->author = 'PrestaShop';
			$this->need_instance = 0;

			Module::__construct();
				
			$this->displayName = $this->l('Google Chart');
			$this->description = $this->l('The Google Chart API lets you dynamically generate charts.');
		}
    }

	function install()
	{
		return (parent::install() AND $this->registerHook('GraphEngine'));
	}
    
	public static function hookGraphEngine($params, $drawer)
	{
		return '<img src="'.$drawer.'&width='.$params['width'].'&height='.$params['height'].'" />';
	}
	
	
	public function createValues($values)
	{		
		$this->_values = $values;
	}
	
	public function setSize($width, $height)
	{
		$this->_width = $width;
		$this->_height = $height;
	}
	
	public function setLegend($legend)
	{
		$this->_legend = $legend;
	}

	public function setTitles($titles)
	{
		$this->_titles = $titles;
	}
	
	private function getChbh($sizeof_values)
	{
		$chbh = 12;

		if ($sizeof_values < 25)
			$chbh += 4;
		if ($sizeof_values < 20)
			$chbh += 4;
		if ($sizeof_values < 15)
			$chbh += 8;
		if ($sizeof_values < 10)
			$chbh += 14;
		return ($chbh);
	}

	private function drawColumn($max_y)
	{
		if (!isset($this->_values[0]) || !is_array($this->_values[0]))
			$sizeof_values = sizeof($this->_values);
		else
			$sizeof_values = sizeof($this->_values[0]);
		$url = 'bvs&chxt=x,y&chxr=1,0,'.$max_y.'&chbh='.$this->getChbh($sizeof_values).'&chg=0,12.5&chxl=0:|';
		for ($i = 0; $i < $sizeof_values; $i++)
			if (!isset($this->_values[0]) || !is_array($this->_values[0]))
			{
				if (isset($this->_values[$i]))
					$this->_values[$i] = ($this->_values[$i] * 100) / $max_y;
				else
					$this->_values[$i] = 0;
			}
			else
				foreach ($this->_values as $k => $value)
				{
					if (!isset($this->_values[$k][$i]))
						$this->_values[$k][$i] = 0;
					$this->_values[$k][$i] = ($this->_values[$k][$i] * 100) / $max_y;
				}
		return ($url);
	}
	
	private function drawLine($max_y)
	{
		return ('lc'./*&chxt=x,y*/'&chbh='.$this->getChbh(sizeof($this->_values)).'&chg=0,12.5&chxl=0:|');
	}

	private function drawPie()
	{
		return ('p3&chl=');
	}

	public function draw()
	{
		$url = 'http://chart.apis.google.com/chart?cht=';
		$legend = '';
		$values = '';
		$scale = '';

		switch ($this->_type)
		{
			case 'pie':
				$url .= $this->drawPie();
				break;
			case 'line':
				$url .= $this->drawLine($this->getYMax($this->_values));
			case 'column':
			default:
				$url .= $this->drawColumn($this->getYMax($this->_values));
				break;
		}

		foreach ($this->_legend as $label)
			$legend .= $label.'|';
		$url .= htmlentities(urlencode(html_entity_decode(rtrim($legend, '|'))));

		if (!isset($this->_values[0]) || !is_array($this->_values[0]))
		{
			foreach ($this->_values as $label)
				$values .= ($label ? $label : '0').',';
			$url .= '&chd=t:'.urlencode(rtrim($values, ','));
		}
		else
		{
			$i = 0;
			$url .= '&chd=t:';
			foreach ($this->_values as $val)
			{
				$values = '';
				if ($i++ > 0)
					$url .= '|';
				foreach ($val as $label)
					$values .= ($label ? $label : '0').',';
				$url .= urlencode(rtrim($values, ','));
			}
		}
		
		$url .= '&chs='.(int)($this->_width).'x'.(int)($this->_height);
		if (!isset($this->_values[0]) || !is_array($this->_values[0]))
			$url .= (isset($this->_titles['main'])) ? '&chtt='.urlencode($this->_titles['main']) : '';
		else
		{
			$url .= $this->getStringColor(sizeof($this->_values));
			$i = 0;
			foreach ($this->_titles['main'] as $val)
			{
				if ($i == 0 && !empty($this->_titles['main']))
					$url .= '&chtt='.urlencode($this->_titles['main'][$i]);
				elseif ($i == 1)
					$url .= '&chdl=';
				elseif ($i > 1)
					$url .= '|';
				if ($i != 0)
					$url .= urlencode($this->_titles['main'][$i]);
				$i++;
			}
		}
		header("Content-type: image/png");
		readfile($url);
	}
	
	private function getYMax($values)
	{
		$max = 0;
		if (!isset($this->_values[0]) || !is_array($this->_values[0]))
		{
			foreach ($values as $k => $val)
				if ($val > $max)
					$max = $val;
		}
		else
		{
			foreach ($values as $value)
				foreach ($value as $val)
					if ($val > $max)
						$max = $val;
		}
		return ($max < 4) ? 4 : (round($max, 0));
	}
	
	private function getStringColor($nb_colors)
	{
		$tabColors = array('ffb649', '427fc3', 'ff0000', '55a339', 'ff2398');
		$color = '';
		if ($nb_colors > 1)
		{
			$color = '&chco=';
			for ($i = 0; $i < $nb_colors; $i++)
			{
				if ($i > 0)
					$color .= ',';
				$color .= $tabColors[$i % 5];
			}
		}
		return $color;
	}
}


